前言
R-CNN(Reigions with CNN features)是老牌的目标检测算法,趁此机会一块总结下各个版本,R-CNN 2014 → → fast R-CNN 2015 → → faster R-CNN 2016,看看处理速度由慢变快都做了什么样的改进。
R-CNN
R-CNN的主要思路是:先提取出候选检测区域,再用CNN提取各个候选区域的特征,最后用分类器判别类别,用回归拟合边界。基本结构和步骤如下:


Region Proposal
生成目标检测的候选区域集合,方法见selective search(参考7),先将图片切分成小块,每两块中间计算相似度(有4种不同定义),再决定合并与否,逐层向上合并(分层分组算法)。候选域的抽取方法在R-CNN方法中占据着重要的位置,对目标的位置识别严重依赖这里,这种依赖持续到Fast R-CNN(只要将候选域抽取独立出来的,都有这种依赖,即便对目标边缘也做训练预测)。

Fine Tuning and Feature Extraction
Fine Tuning: CNN结构,5个Conv+2个FC+softmax,输入[227x227] RGB。预训练的分类模型,为适应当前的目标检测任务,需要在目标检测数据集上做微调。替换最后的softmax层为新的softmax(N+1)层,输出节点数量为:当前检测任务的所有物品类型N,再+1(背景也占一个节点)。
问题一:怎么标记目标检测时的物品类别?
对每个候选域,计算IOU,其中IOU>=0.5的则认为label是目标检测的标记类别。否则,则认为label=0。
问题二: CNN模型的输入尺寸是固定的,而候选域的尺寸是大小不一的。
将候选区域尺寸warp成固定尺寸。使用这些处理过的图像做输入,微调模型。
Feature Extraction: 借助CNN,对候选区域抽提取高维特征feature-map【第5层的pooling输出】。注意,这里使用的候选域仍然是上面的wrap之后的图像。这样就搞到了图像的高维表示,接下来可以拿来做分类判断和边缘预测了。
Linear Classifier and Bounding-box Regression
1) 上面处理得到的feature,每个类别都单独训练一个SVM分类器。
注意:这里的分类label,使用IOU>=0.3来做标记阈值。
2) 分类预测好了,边缘怎么预测呢?做回归训练。
并不是直接预测边缘值,而是经过一次转折,预测候选域与真实边缘的比例 t t ,这个比例的计算也是精心设计的。中心坐标值是线性的比例,长宽值是log的比例。
将目标的真实边缘
与候选域的边缘 P={
Px,Py,Pw,Ph} P = { P x , P y , P w , P h } 比例确定出来,作为要拟合的值 t t ,关系如下: