目标检测学习--RCNN

论文地址:

《Rich feature hierarchies for accurate object detection and semantic segmentation》

RCNN(Region CNN)是将CNN引入目标检测领域的开山之作,在当时取得了一些好的效果。

算法流程

  1. 候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search算法);
  2. 特征提取: 对每个候选区域,使用深度卷积网络提取特征(CNN);
  3. 类别判断: 特征送入每一类的SVM分类器,判别是否属于该类;
  4. 位置精修: 使用回归器精细修正候选框位置。

这里写图片描述

 

详细解读

1. 候选区域生成:

输入一张图像;使用Selective Search方法提取大约2k个候选区域;对每个候选区域的图像进行拉伸形变,使之成为固定大小的正方形图像;

Selective Search算法流程

使用一种过分割手段,将图像分割成小区域;

查看所有小区域,合并可能性最高的两个区域,重复直到整张图像合并成一个区域位置;

输出所有曾经存在过的区域,即候选区域;

合并规则

  • 颜色(颜色直方图)相近的;
  • 纹理(梯度直方图)相近的;
  • 合并后总面积小的,以保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域;(例:设有区域a-b-c-d-e-f-g-h,较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh,不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh);
  • 合并后,总面积在其BBOX中所占比例大的,一保证合并后形状规则;

例:左图适于合并,右图不适于合并:

这里写图片描述

多样化与后处理

为尽可能不遗漏候选区域,上述操作在多个颜色空间中同时进行(RGB,HSV,Lab等)。在一个颜色空间中,使用上述四条规则的不同组合进行合并,所有颜色空间与所有规则的全部结果,在去除重复后,都作为候选区域输出;

调整尺寸

使用CNN提取特征之前,首先把候选区域归一化成同一尺寸227×227,在缩放的时候是否保存长宽比,如果保持原有的宽高比例,就是各向同性;如果不保持宽高比就是各向异性,图片在缩放时会出现扭曲;

  • 各向异性缩放:

不管图片的长宽比例,管它是否扭曲,全部缩放到CNN输入的大小227*227,如图D所示;

  • 各向同向缩放: 

先扩充后裁剪: 直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如上图(B)所示;

先裁剪后扩充:先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如上图(C)所示;

padding处理:上面的图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果;

经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高;

2. 特征提取

对每个候选区域使用CNN提取长度固定的特征;

CNN算法实现

网络结构设计阶段

网络架构两个可选方案:第一选择经典的Alexnet;第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。后面为了简单起见,我们就直接选用Alexnet,并进行讲解;Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中第5层神经元个数为9216、 fc6、fc7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量;

网络有监督预训练阶段

参数初始化部分:物体检测的一个难点在于,物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的是采用某些方法,把参数初始化了,然后在进行有监督的参数微调,这里文献采用的是有监督的预训练。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练,网络优化求解时采用随机梯度下降法,学习率大小为0.001;

所谓的有监督预训练也可以把它称之为迁移学习,如有一大堆标注好的人脸年龄分类的图片数据,训练了一个CNN,用于人脸的年龄识别。然后当你进行人脸性别识别项目任务时,那可以利用已经训练好的年龄识别CNN模型,去掉最后一层,然后其它的网络层参数就直接复制过来,继续进行训练,让它输出性别,即所谓的迁移学习,就是把一个任务训练好的参数,拿到另外一个任务,作为神经网络的初始参数值,这样相比于你直接采用随机初始化的方法,精度可以有很大的提高;

fine-tuning阶段 

采用 selective search 搜索出来的候选框继续对上面预训练的CNN模型进行fine-tuning训练:假设要检测的物体类别有N类,那么把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续SGD训练了。开始的时候,SGD学习率选择0.001,在每次训练的时候,我们batch size大小选择128,其中32个正样本、96个负样本。 

3. 类别判断

使用一系列的SVM进行分类;

输入为深度网络输出的4096维特征,输出是否属于此类,即二分类问题:本类的真值标定框为正样本,当IoU小于0.3时标注为负样本,由于负样本较多,因此使用hard negative mining方法;

hard negative mining(难分样本挖掘)

由于负样本的数量远远大于正样本的数量,许多在实际真实框附近的负样本框容易被判别为正例,因此把false positive(假正例)中得分较高的样本,重新放入网络中训练,从而加强网络对于false positive的判断能力:

如上图:其中黑色为ground-truth box,蓝色的为positive sample,红色和黄色为false negative sample。可以看到红色是很容易被判断成背景的,即true negative。而黄色部分就很容易被判断成 false positive,其中小黄色矩形被误判的概率更高;

首先hard negative mining方法针对的是negative的样本,其次这样的样本很难判断hard。上图中的红色就属于easy negative,应该他们特别容易判断,在分类器训练之后,得到了得分最高的false positive,即mining出了这些hard negative,即上图小的黄色矩形,所以叫hard negative mining。最后在把这些hard negative重新送入网络中训练;

实现步骤参考如下:地址

hard negative mining的实现贯穿于网络的训练过程,简单来说有以下三个步骤
1. 目标检测中如何根据有标签的数据划分正负训练集?
用带标签的图像随机生成图像块,iou大于某一个阈值的图像块做为正样本,否则为负样本。但一般负样本远远多于正样本,为避免训练出来的模型会偏向预测为负例,需要保持样本均衡,所以初始负样本训练集需要选择负样本集的子集,一般正:负=1:3;
2. 有了正负训练集就可以训练神经网络了。经过一轮训练,就可以用这个训练出的模型预测其余的负样本了(就是没有加入训练集的那些负样本)。模型在预测一张图像块后会给出其属于正负的概率,在这里设置一个阈值,预测为正的概率大于这个阈值,就可以把这个图像块加入负样本训练集了;
3. 正样本训练集不变,负样本训练集除了初始的那些,还有新加入的。拿着这个新的训练集,就可以开始新的一轮训练了;
4. 跳到第二步,进入循环,直到所有数据集训练完。

矩阵计算:

CNN提取2000个候选框,可以得到2000(候选区域)*4096维的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096*N点乘(N为分类类别数目,因为我们训练的N个svm,每个svm包含了4096个权值w),得到结果评分矩阵,也可称为概率矩阵,维度为2000*N:

分别对2000*N维矩阵中的每一列即每一类进行NMS(非极大值抑制)以剔除重叠建议框proposal;

非极大值抑制,NMS(non-maximum suppression):抑制不是极大值的值,该方法是一个区域搜索算法,该方法的流程如下:

  • 首先对产生的矩形区域按得分进行降序排序,筛选出得分最好的矩形
  • 然后将与得分最高的区域 IoU 高于某一阈值的矩形删除
  • 重复上面步骤,知道没有矩形可选为止,最终得到想要的矩形区域

4. 位置精修

使用线性回归器精细修正候选框位置,使用全连接进行回归,回归得到平移和缩放参数的结果为Px、Py、Pw、Ph;

目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小,故需要一个位置精修步骤; 回归器:对每一类目标,使用一个线性脊回归器(脊回归器又称岭回归器(Ridge Regression),表示该回归器加了L2正则化)进行精修。正则项λ=10000; 输入为深度网络pool5层的4096维特征,输出为x、y方向的缩放和平移; 训练样本:判定为本类的候选框中和真值重叠面积大于0.6的候选框;

Bounding-box回归

Bounding-box Regression训练的过程中,输入数据为N个训练对{(Pi,Gi)},i=1,2,…,N,其中,Pi=(Pix,Piy,Piw,Pih)为proposal(先验框)的位置,前两个坐标表示proposal的中心坐标,后面两个坐标分别表示proposal的width和height,而 Gi=(Gix,Giy,Giw,Gih)表示groundtruth的位置,
regression的目标就是学会一种映射将P转换为G;作者认为P到G的过程是通过平移变换和缩放变换得到的。设平移因子为dx(Pi),dy(Pi)缩放因子dw(Pi),dh(Pi)。在平移变换时添加一项平移系数Pw, Ph;

G_{x}^{i} = P_{w}d_{x}(P^{i})+P_{x}^{i}

G_{y}^{i} = P_{h}d_{y}(P^{i})+P_{y}^{i} 

G_{w}^{i} = P_{w}exp(d_{w}(P^{i})) 

G_{h}^{i} = P_{h}exp(d_{h}(P^{i})) 

G _{i}= (G_{x}^{i} , G_{y}^{i}, G_{w}^{i} , G_{h}^{i})

在上面的公式中,我们唯一不知道的是平移因子为dx(Pi),dy(Pi)缩放因子dw(Pi),dh(Pi)。因此我们要利用回归学习这四个参数,作者使用的是线性回归,作者认为当先验框与真实框很接近时(二者的IOU值>0.6)他们之间的变换可以近似为一个线性变换;假设学习出来的结果为d’x(Pi)、d’y(Pi)、d’w(Pi)、d’h(Pi),Φ(P)为第i个先验框的特征向量则:

{d}'(P^{i})={d}'_{x}(P^{i}), {d}'_{y}(P^{i}), {d}'_{w}(P^{i}), {d}'_{h}(P^{i})=W^{T}\Phi (P^{i}) 

在学习时我们使用的标签是根据上面的平移变换和缩放变换公式得到的:

d_{x}(P^{i}) = (G_{x}^{i}- P_{x}^{i})/P_{w}

d_{y}(P^{i}) = (G_{y}^{i}- P_{y}^{i})/P_{h} 

d_{w}(P^{i}) = log(G_{w}^{i} /P_{w}) 

d_{h}(P^{i}) = log(G_{h}^{i}/P_{h}) 

 d(P^{i}) =(d_{x}(P^{i}), d_{y}(P^{i}), d_{w}(P^{i}), d_{h}(P^{i})) 

回归损失可以写成:

loss = \sum_{i=1}^{N}( (d(P^{i}) - W^{T}\Phi (P^{i}))^{2}) 

loss = \sum_{i=1}^{N}( (d(P^{i}) - {d}'(P^{i}))^{2}) 

优化目标函数可以写成:

W^{*}=\arg min_{w}(loss+\lambda ||W||^{2}) 

然后使用梯度下降算法或者最小二乘法就可以求得W^{*}。  

测试

使用selective search算法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来,然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用NMS去除相交的多余的框,再对这些框进行canny边缘检测,就可以得到bounding-box。

(非极大值抑制(NMS)先计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空,然后再将score小于一定阈值的选定框删除得到这一类的结果,然后继续进行下一个分类。

结论

作者提到花费在region propasals和提取特征的时间是13s/张-GPU和53s/张-CPU,可以看出时间还是很长的,不能够达到及时性;

分类器的输入是特征提取器AlexNet的fc6的输出结果,回归器的输入是特征提取器AlexNet的pool5的输出结果。之所以这样取输入,是因为分类器不依赖坐标信息,所以取fc6全连接层的结果是没有问题的。但是回归器依赖坐标信息(要输出坐标的修正量),必须取坐标信息还没有丢失前的层,而fc6全连接层已经丢失了坐标信息;

本文将深度学习引入检测领域,一举将PASCAL VOC上的检测率从35.1%提升到53.7%;

候选区域提取+特征提取与待检测类别无关,可以在不同类之间共用;同时检测多类时,需要倍增的只有判别分类+位置精修,都是简单的线性运算,速度较快。

参考文献

RCNN 论文阅读记录

(二十五)深度学习目标检测:RCNN 

讲透RCNN, Fast-RCNN, Faster-RCNN,将CNN用于目标检测  

代码实现 

仅为学习记录,侵删! 

猜你喜欢

转载自blog.csdn.net/panghuzhenbang/article/details/125128764