目标检测:R-CNN
最近实习的时候接触了目标检测类的任务,在使用这些算法的同时了解一下算法整体的流程和内容。作为RCNN算法系列的开山鼻祖,采用了CNN网络用于图像特征的提取,而不是之前的人工设定的特征提取。但是RCNN应该有很多细节都被后面的算法改进了(产生了一系列RCNN的算法)。所以这里只对算法的流程做一个大概的理解。
RCNN的基本流程
RCNN算法有4个步骤:
- 候选区域生成: 一张图像生成约2K个候选区域 (Selective Search 方法)
- 特征提取: 对每个候选区域,使用深度卷积网络提取特征
- 类别判断: 特征送入每一类的SVM 分类器,判别是否属于该类
- 位置精修: 使用回归器精细修正候选框位置
步骤一:候选区域的生成
Selective Search方法用于生成候选区域,其流程如下:
- 采取过分割手段,将图像分割成小区域
- 再通过颜色直方图,梯度直方图相近等规则进行区域合并
- 输出所有曾经存在过的区域,即为候选区域
其中区域合并的算法跟非极大值抑制(NMS)有些类似:
- 初始化相似度集合S
- 计算两两相邻区域之间的相似度,将其添加到相似度集合S中
- 从相似度集合S中找出,相似度最大的两个区域 ri 和rj,将其合并成为一个区域 rt,从相似度集合中除去原先与ri和rj相邻区域之间计算的相似度,计算rt与其相邻区域(原先与ri或rj相邻的区域)的相似度,将其结果添加的到相似度集合S中。同时将新区域 rt 添加到 区域集合R中。
- 获取每个区域的Bounding Boxes,这个结果就是物体位置的可能结果L
而合并的规则有以下几种条件:
- 优先颜色直方图相近的区域
- 优先纹理(梯度直方图)相近的
- 优先合并后总面积小的: 保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”
- 合并后,总面积在其BBOX中所占比例大的: 保证合并后形状规则。
步骤二:特征的提取
我们现在已经获得了约2k个候选区域,下面要做的就是使用CNN来提取这2k个候选区域中的特征,用于步骤三中的分类。
CNN网络使用的是Alex net,其特征提取部分包括5个卷积层、2个全连接层,最后的fc7有4096个神经元,也就是说每个候选区域输入网络后的输出是一个4096维的特征向量。假设我们有2000个候选区域,那么最终步骤二得到的就是一个$2000 \times 4096$的矩阵
这一步骤有两个对于CNN网络的训练过程:
有监督预训练(迁移学习):
样本 | 来源 |
---|---|
正样本 | ILSVRC2012 |
负样本 | ILSVRC2012 |
ILSVRC样本集上仅有图像类别标签,没有图像物体位置标注。该网络输入为227×227的ILSVRC训练集图像,输出最后一层为4096维特征->1000类的映射,训练的是网络参数。
特定样本下的微调
样本 | 来源 |
---|---|
正样本 | Ground Truth+与Ground Truth相交IoU>0.5的建议框 |
负样本 | 负样本为与Ground Truth相交IoU≤0.5的建议框 |
PASCAL VOC 2007样本集上既有图像中物体类别标签,也有图像中物体位置标签。
batch为32个正样本和96个负样本。
该网络输入为建议框【由selective search而来】变形后的227×227的图像,修改了原来的1000为类别输出,改为21维【20类+背景】输出。
这里我一开始有一个疑问,既然在特定样本下的微调已经训练了网络进行21分类,为什么不直接使用这个结果,而是fc7输出的特征给SVM再进行分类呢?后来在查找资料的时候看到了这样一段话:
因为微调时和训练SVM时所采用的正负样本阈值不同,微调阶段正样本定义并不强调精准的位置,而SVM正样本只有Ground Truth;并且微调阶段的负样本是随机抽样的,而SVM的负样本是经过hard negative mining方法筛选的;导致在采用SoftMax会使PSACAL VOC 2007测试集上mAP从54.2%降低到50.9%。
步骤三:类别判断
现在通过CNN获得了候选区域的特征,即一个$2000 \times 4096$的矩阵,下面就是使用SVM对2000个候选区域进行分类。SVM组成的权值矩阵为$4096 \times 20$,那么最后获得一个$2000 \times 20$的矩阵,表示每个候选区域是某种类别的得分。
这里对SVM的训练:
| 样本 | 来源 |
| —- | —— |
|正样本|Ground Truth|
|负样本|与Ground Truth相交IoU<0.3的建议框|
步骤四:位置精修
在使用回归器精细修正候选框位置修正位置之前,我们需要使用NMS剔除重叠的候选区域,因为同一个物体可能被多个候选区域覆盖,NMS就是找到对每个物体置信度最高的那个候选区域,并去掉置信度低的。
然后就可以使用回归器来对BBox进行校正。
如上图,黄色框口P表示建议框Region Proposal,绿色窗口G表示实际框Ground Truth,红色窗口$\hat{G}$表示Region Proposal进行回归后的预测窗口,现在的目标是找到P到$\hat{G}$的线性变换,,使得$\hat{G}$与G越相近。
先来定义P窗口的数学表达式:
其中$\left(P_{x}^{i}, P_{y}^{i}\right)$表示第一个i窗口的中心点坐标,$\left(P_{w}^{i}, P_{h}^{i}\right)$分别为第i个窗口的宽和高。$G$和$\hat{G}$同理。
再定义四种变换函数:
$d_{x}(P)$和$d_{y}(P)$通过平移对x和y进行变化,$d_{x}(P)$和$d_{y}(P)$通过缩放对w和h进行变化,即下面四个式子所示:
每一个$d_{/}(P)$(\表示x,y,w,h)都是一个AlexNet CNN网络Pool5层特征$\phi_{5}(P)$的线性函数,即$d_{}(P)=w_{}^{T} \phi_{5}(P)$,那么$w_{*}^{T}$就是所需要学习的回归参数。损失函数即为:
其中,回归目标$t_{*}$由训练输入对按下式计算得来:
从上面的式子可以看出来,优化的目标是让变换函数$d_{}(P)$趋近于偏移值$\Delta$,也就是$t_{}$。至于$t$的定义中为什么要除以高或者宽,网上资料有认为是为了消除BBox大小对于偏移值的影响(较大的bbox偏移值也可能更大,都除以bbox的宽或高后相当于转换成一种相对的偏移值)。
而宽高的尺度加$log$可能是需要限制缩放尺度必需大于0,所以在偏移值上加了exp函数,那么反推回来在t上就是log函数。
另外,在看资料的时候一直有点困惑,为什么$\hat{G}_{x} =P_{w} d_{x}(P)+P_{x}$ 要在$d_{x}(P)$上乘一个$P_{w}$而不是直接是$\hat{G}_{x} = d_{x}(P)+P_{x}$。现在大概可以按照这样的思路来理清一下:
- 最终目标是得到一个线性变换,输入pool5的特征,输出偏移值。
- 优化目标是$d_{x}(P)$和$t_{}$的平方误差最小。也就是$d_{}(p) \rightarrow t_{*}$
- 将$d_{*}$带入 $\hat{G}$中得到等式
需要注意的是,当候选区域和GT相差较小的时候(IoU > 0.6),我们才将其作为样本进行bbox回归训练,因为IoU足够大的时候我们才假设这个变换是一个线性问题。
Two-Stage类的算法
RCNN是一个典型的two stage算法。需要先生成若干候选区域,再对候选区域进行检测和分类。训练的时候同样也要分开训练RPN网络和CNN网络。
参考资料: