说明
本笔记由个人在学习过程中整理而得,所以难免会有一些错误或者与其它博客雷同情况,请大家多多包涵。
一、R-CNN
R-CNN论文原文:https://arxiv.org/abs/1311.2524v3
1.1 算法流程
- 输入一张多目标图像,采用selective search算法提取约2000个候选框;
- 将每个候选框变形为227×227的大小;
- 对每个候选框进行去均值的预处理操作,然后再送进AlexNet网络提取特征,最后2000个建议框的CNN特征组合成2000×4096维矩阵;
- 将提取的特征送进20个SVM分类器,输出每个候选框对应每个类别的得分;
- 对每一个类别进行NMS非极大值抑制剔除重叠度较高的候选框;
- 对剩下的候选框进行Bounding Box Regression精细修正候选框的位置。
1.2 算法细节
selective search算法
①使用 Efficient Graph-Based Image Segmentation的方法获取原始分割区域R={r1,r2,…,rn};
②初始化相似度集合S=∅;
③计算两两相邻区域之间的相似度(颜色,纹理,尺寸,交叠等相似度),将其添加到相似度集合S中;
④从相似度集合S中找出,相似度最大的两个区域 ri 和rj,将其合并成为一个区域 rt,从相似度集合中除去原先与ri和rj相邻区域之间计算的相似度,计算rt与其相邻区域(原先与ri或rj相邻的区域)的相似度,将其结果添加的到相似度集合S中。同时将新区域 rt 添加到 区域集合R中;
⑤重复④步骤,直到S为空;
⑥获取每个区域的Bounding Boxes,这个结果就是物体位置的可能结果L。-
怎么样将候选框crop成227×227大小?
①各向异性缩放
这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示;
②各向同性缩放
因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。这个有两种办法
A、直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如下图(B)所示;
B、先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如下图(C)所示;
对于上面的异性、同性缩放,文献还有个padding处理,下面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的效果最好,能使mAP提升3-5%。
NMS非极大值抑制
①根据分类器类别得分从大到小进行排序,分别为F、E、D、C、B、A;
②以最大得分候选框F为标准,判断A-E与F的IOU是否大于某个阈值,假设B、D超过阈值,那么就扔掉B、D,并标记第一个候选框F,保留下来。
③从剩下的候选框A、C、E中,选择概率最大的E框为标准,重复②中步骤;
④重复上述步骤,直到处理完所有类的候选框。Bounding Box Regression(边框回归)
边框回归(Bounding Box Regression)详解 这篇文章对边框回归做了很详细的解释。正负样本的选择
①AlexNet的微调:IOU>0.5的候选框为正样本,IoU≤0.5的候选框为负样本。
②SVM训练:Ground Truth框为正样本,IoU<0.3的候选框为负样本由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本。
③回归器训练:与Ground Truth相交IoU最大的候选框,并且IoU>0.6的候选框。网络训练
先在ILSVRC 2012数据集上进行有监督预训练,然后在PASCAL VOC 2007数据集(既有图像中物体类别标签,也有图像中物体位置标签)上进行微调。为什么微调时和训练SVM时所采用的正负样本阈值0.5和0.3不一致?
微调阶段是由于CNN对小样本容易过拟合,需要大量训练数据,故对IoU限制宽松,与Ground Truth相交IoU>0.5的建议框为正样本,否则为负样本;
SVM这种机制是由于其适用于小样本训练,故对样本IoU限制严格:Ground Truth为正样本,与Ground Truth相交IoU<0.3的建议框为负样本。其它
Bounding Box Regression时使用的是pool5层输出的特征,SVM分类器使用的是fc7层输出的特征。
1.3 算法缺点
- selective search算法耗时;
- selective search算法得出的约2k个建议框每一个都需要经过变形处理后由CNN前向网络计算一次特征,耗时而且冗余;
- 最后做边框回归时要保留pool5层输出的特征或者再进行一次前向运算,耗时且浪费磁盘空间。
二、Fast R-CNN
Fast R-CNN论文原文:https://arxiv.org/abs/1504.08083
2.1 算法流程
- 一张图片输入CNN网络,经过若干卷积层与池化层,得到特征图;
- 在图片上采用selective search算法提取约2k个候选框;
- 根据原图中候选框到特征图映射关系,在特征图中找到每个候选框对应的特征框(深度和特征图一致),并在RoI池化层中将每个特征框池化到H×W(VGG-16网络是7×7)的size;
- 固定H×W【VGG-16网络是7×7】大小的特征框经过全连接层得到固定大小的特征向量
- 第4步所得特征向量经由各自的全连接层,分别得到两个输出向量:一个是softmax的分类得分,一个是Bounding-box窗口回归;
- 利用窗口得分分别对每一类物体进行非极大值抑制剔除重叠候选框,最终得到每个类别中回归修正后的得分最高的窗口。
2.2 算法细节
-
ROI pooling
ROI Pooling的作用是对不同大小的region proposal,从最后卷积层输出的feature map提取大小固定的feature map。因为全连接层的输入需要尺寸大小一样,所以不能直接将不同大小的region proposal映射到feature map作为输出,需要做尺寸变换。
针对上图
①Conv layers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800×800,最后一层特征图feature map大小:25×25;
②假定原图中有一region proposal,大小为665×665,这样,映射到特征图中的大小:665/32=20.78,即20.78×20.78,如果你看过Caffe的Roi Pooling的C++源码,在计算的时候会进行取整操作,于是,进行所谓的第一次量化,即映射的特征图大小为20×20;
③假定pooled_w=7,pooled_h=7,即pooling后固定成7×7大小的特征图,所以,将上面在 feature map上映射的20*20的 region proposal划分成49个同等大小的小区域,每个小区域的大小20/7=2.86,即2.86×2.86,此时,进行第二次量化,故小区域大小变成2×2;
④每个2×2的小区域里,取出其中最大的像素值,作为这一个区域的‘代表’,这样,49个小区域就输出49个像素值,组成7×7大小的feature map
总结,所以,通过上面可以看出,经过两次量化,即将浮点数取整,原本在特征图上映射的20×20大小的region proposal,偏差成大小为7×7的,这样的像素偏差势必会对后层的回归定位产生影响。所以后面有人提出ROI Align这一改进的方法。 Multi-task loss
损失函数的定义是将分类的loss和回归的loss整合在一起,其中分类采用log loss,即对真实分类的概率取负log,而回归的loss和R-CNN基本一样。分类层输出K+1维,表示K个类和1个背景类。
smooth L1损失函数相比于L2损失函数,其对离群点、异常值不敏感,可控制梯度的量级使训练时不容易跑飞;
约定 为背景分类,那么 函数表示背景候选区域即负样本不参与回归损失,不需要对候选区域进行回归操作;
控制分类损失和回归损失的平衡,论文中所有实验 。SVD分解加速全连接层
如果是一个普通的分类网络,那么全连接层的计算应该远不及卷积层的计算,但是针对object detection,Fast RCNN在ROI pooling后每个region proposal都要经过几个全连接层,这使得全连接层的计算占网络的计算将近一半,所以作者采用SVD分解来加速全连接层的计算。使用softmax分类器
Fast R-CNN去掉了SVM这一步,所有的特征都暂存在显存中,就不需要额外的磁盘空间;而且比SVM分类器性能好。网络训练
先在ILSVRC 2012数据集上进行有监督预训练,然后在PASCAL VOC 2007数据集(既有图像中物体类别标签,也有图像中物体位置标签)上进行微调。
微调前,需要对有监督预训练后的模型进行3步转化:
①RoI池化层取代有监督预训练后的VGG-16网络最后一层池化层;
②两个并行层取代上述VGG-16网络的最后一层全连接层和softmax层,并行层之一是新全连接层1+原softmax层1000个分类输出修改为21个分类输出【20种类+背景】,并行层之二是新全连接层2+候选区域窗口回归层,如下图所示;
③上述网络由原来单输入:一系列图像修改为双输入:一系列图像和这些图像中的一系列候选区域;正负样本的选择
CNN微调:与Ground Truth相交IoU∈[0.5,1]的候选框为正样本,与Ground Truth相交IoU中最大值∈[0.1,0.5]的候选框,保证正负样本比为1:3。微调哪些层?
SPPnet论文中采用ZFnet【AlexNet的改进版】这样的小网络,其在微调阶段仅对全连接层进行微调,就足以保证较高的精度,论文作者文中采用VGG-16【L for large】网路,若仅仅只对全连接层进行微调,mAP会从66.9%降低到61.4%, 所以文中也需要对RoI池化层之前的卷积层进行微调;
论文作者经过实验发现仅需要对conv3_1及以后卷积层【即9-13号卷积层】进行微调,才使得mAP、训练速度、训练时GPU占用显存三个量得以权衡; 作者说明所有AlexNet【S for small】、VGG_CNN_M_1024【M for medium】的实验结果都是从conv2往后微调,所有VGG-16【L for large】的实验结果都是从conv3_1往后微调。
2.3 算法缺点
- selective search算法耗时,而且Fast R-CNN并没有实现真正意义上的端到端训练模式。
三、Faster R-CNN
Faster R-CNN论文原文:https://arxiv.org/abs/1506.01497
3.1 算法流程
- 将一张图片送进CNN网络提取特征,提取的feature maps被共享用于后续RPN层和全连接层;
- 第一步提取的特征进入RPN网络用于生成region proposals。该层通过softmax判断anchors属于前景或者背景,再利用bounding box regression修正anchors获得精确的proposals;
- 根据第二步得到的候选框和第一步提取的feature maps,通过映射关系提取候选框所对应的特征图,进入RoI池化层中将每个特征框池化到固定H×W的size;
- 然后通过两个并行的全连接层,输出该区域的分类得分以及对候选框再次进行bounding box regression获得检测框最终的精确位置。
3.2 算法细节
-
anchors
对经过共享卷积层计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框。9个anchors框,三种尺度三种长宽比{1:1,1:2,2:1}。
对于1000×600的一张图像,大约有20000(~60×40×9)个anchors,忽略超出边界的anchors剩下6000个anchors,利用非极大值抑制去掉重叠区域,剩2000个区域建议用于训练; 测试时在2000个区域建议中选择Top-N【300】个区域建议用于Fast R-CNN检测。 -
Region Proposal Networks(RPN)
对经过共享卷积层提取的feature maps,假设特征图大小为W×H,用3×3的卷积核在特征图上滑动卷积,特征图上每个点通过卷积得到一个低维的特征向量(ZF网络:256维;VGG-16网络:512维)。然后分为两路,左边一条通过softmax分类anchors获得positive和negative分类,右边一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。分类那一路原来W×H×256的特征图经过1×1卷积输出W×H×18的特征图(2类9个anchors框),然后进入softmax得到每个框是前景还是背景的概率。回归那一路原来W×H×256的特征图经过1×1卷积输出W×H×36的特征图(4个关于anchors框的偏移量9个anchors框),只有被判断为前景的anchors框才做bbox regression。
如何断定anchor是否为前景:
①与GT相比,拥有最高的IOU的anchor为前景(可以低于0.7);
②与任意GT相比,IOU>0.7为前景;
③与任意GT相比,IOU<0.3为背景;
④其余的非负非正,则没有用;
对于前景框,按照输入的positive softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的positive anchors,限定超出图像边界的positive anchors为图像边界,弃用所有超出图像边界的anchors,剔除尺寸非常小的positive anchors,对剩余的positive anchors进行NMS。最终一张图有2000个anchors用于训练。
RPN网络使用如下损失:
其中分类损失函数 是一个二值【是物体或者不是物体】函数:
回归损失函数,函数定义如下:
ROI pooling层后面跟Fast R-CNN一样。
-
训练过程
Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。
第一步:用model初始化RPN网络,然后训练RPN,在训练后,model以及RPN的unique会被更新。
第二步:用model初始化Fast-rcnn网络,注意这个model和第一步一样。然后使用训练过的RPN来计算proposal,再将proposal给予Fast-rcnn网络。接着训练Fast-rcnn。训练完以后,model以及Fast-rcnn的unique都会被更新。说明:第一和第二步,用同样的model初始化RPN网络和Fast-rcnn网络,然后各自独立地进行训练,所以训练后,各自对model的更新一定是不一样的(论文中的different ways),因此就意味着model是不共享的(论文中的dont share convolution layers)。
第三步:使用第二步训练完成的model来初始化RPN网络,第二次训练RPN网络。但是这次要把model锁定,训练过程中,model始终保持不变,而RPN的unique会被改变。说明:因为这一次的训练过程中,model始终保持和上一步Fast-rcnn中model一致,所以就称之为着共享。
第四步:仍然保持第三步的model不变,初始化Fast-rcnn,第二次训练Fast-rcnn网络。其实就是对其unique进行finetune,训练完毕,得到一个文中所说的unified network。