论文文献:Rich feature hierarchies for accurate object detection and semantic segmentation
算法流程图
1、产生目标区域候选
滑窗:
为了检测目标物体的可能位置,我们采用不同尺度的矩形方块,在图像上水平、垂直移动,以便能够检测到可能目标位置。而这个矩形方块就是滑窗。
这种方法的缺陷:我们不知道目标物体的大小,而使用这种方法进行穷举,计算量太大。
selective search:
R-CNN目标检测所采用的方法。
selective search的策略,既然是不知道尺度是怎样的,那我们就尽可能遍历所有的尺度好了,但是不同于暴力穷举,我们可以先得到小尺度的区域,然后一次次合并得到大的尺寸就好了,这样也符合人类的视觉认知。既然特征很多,那就把我们知道的特征都用上,但是同时也要照顾下计算复杂度,不然和穷举法也没啥区别了。最后还要做的是能够对每个区域进行排序,这样你想要多少个候选我就产生多少个,不然总是产生那么多你也用不完不是吗?
2、CNN目标特征提取
选择2K个置信度最高的区域候选之后,首先是用AlexNet模型,进行无监督的预训练初始化CNN的参数。之后进行迁移学习,RCNN使用ImageNet的有标签数据进行有监督的预训练,然后再在本数据集上微调最后一层全连接层。训练CNN的样本量还是不能少的,因此RCNN将正样本定义的很宽松,为了尽可能获取最多的正样本,RCNN将IOU>0.5(IoU 指重叠程度,计算公式为:A∩B/A∪B)的样本都称为正样本。并且CNN对于输入的图片大小都要求尺寸一致,所以对于每一个候选区域缩放到227*227。
CNN特征层选取
现在CNN已经能够提取到目标的特征了,但是CNN的层数很多,选择哪一层作为特征提取层呢?RCNN进行了宽泛的实验,最终选择的fc层。
3、目标种类分类器
通过R-CNN提取了特征之后,使用SVM进行分类,由于SVM要进行精确的分类,所以将IOU>0.3的样本作为负样本,这样也是SVM困难样本挖掘的方法。
4、贪婪非极大值抑制
由于最后得到的目标区域肯定不会是一个,所以RCNN使用贪婪非极大值抑制的方法,假设ABCDEF五个区域候选,首先根据概率从大到小排列。假设为FABCDE。然后从最大的F开始,计算F与ABCDE是否IoU是否超过某个阈值,如果ABC超过则将ABC舍弃。然后再从D开始,直到遍历结束。而这个阈值是筛选得到的,通过这种处理之后一般只会剩下几个区域候选了。
5、BoundingBox回归
为了能够提高准确度,让方框准确的框住所要检测的目标,RCNN在贪婪非极大值抑制后进行BoundingBox回归,进一步微调BoundingBox的位置。
R-CNN缺点
RCNN虽然效果很好,但是存在一些问题,比如时间代价太高了,网络训练是分阶段的,太麻烦了等。