论文原文地址: Rich feature hierarchies for accurate object detection and semantic segmentation
RCNN的全称是Regions with CNN features。整个方法的大致思路是先用Selective Search来生成2000个bounding box。然后利用AlexNet对这些Region提取特征,注意此AlexNet需要去掉最后一个softmax层。然后训练出 K K 个(线性 svm s v m )作为分类器(每个目标一个 svm s v m 分类器,总共 K K 个目标)。
图像分类和物体检测的区别:
- 图片分类不需要定位,而物体检测需要定位出物体的位置,也就是相当于把物体的bbox检测出来
- 物体检测是要把所有图片中的物体都识别定位出来。
1. Region Proposals
本文中,作者试用了Selective Search方法来提出2K+的Region Proposals
2. 特征抽取
本文试用了AlexNet进行特征抽取。将每一个区域抽取一个4096维的特征向量。然后通过前向传播一个大小的RGB图像到5个卷积层和2个全连接层。变形的方法是用周围的像素填充。
作者经过实验,发现直接先在周围padding上16个像素,然后进行直接缩放效果最好。
3. 训练
物体检测的一个难点在于,物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的是采用某些方法,把参数初始化了,然后在进行有监督的参数微调,这边文献采用的是有监督的预训练。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。
网络优化求解:采用随机梯度下降法,学习速率大小为0.001;
作者采用了fine tuning的方法。因为这样做准确性更高。那么作者为什么不直接用softmax分类,而要使用svm来分类。主要是因为svm训练和cnn训练过程的正负样本定义不一样。导致softmax精度比svm要低。
采用svm主要是因为cnn容易过拟合。因为cnn训练需要大量的数据。而cnn在训练阶段对bounding box的限制比较松(IoU大于0.5就可以被标注为正样本)。而svm不需要大量数据,对于训练样本的IoU要求比较严格。只有bounding box把整个物体都包含了才算是正样本。
3.1 CNN阶段的训练
如果用selective search挑选出来的候选框与物体的人工标注矩形框的重叠区域IoU大于0.5,那么我们就把这个候选框标注成物体类别,否则我们就把它当做背景类别。即:把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景) 。
SVM阶段的正负样本标签问题是,选择阈值为0.3,即IoU大于0.3标注为正样本否则标注为负样本。注意每个svm都是一个二分类器。
注意这里所说的svm的IoU要求更加严格是说:正样本必须是IoU=1。而IoU<0.3被标注为负样本。至于0.3~1.0之间的,不予采用。
3.2 svm阶段的训练
将CNN提取到的4096个feature送入到svm中进行二分类。svm在训练阶段采用的是0/1二分类。在预测阶段采用的是概率输出。但是普通的svm是不存在输出概率的,因此需要做一个小的调整:
将svm的输出值经过一个映射,映射成0到1之间,即:
其中:
为svm的输出。
4. NMS非最大抑制
定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。(怎么用svm输出概率见上文。)
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
5. bounding box回归
如上图所示,绿色的框为飞机的Ground Truth,红色的框是提取的Region Proposal。那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5)。那么这张图相当于没有正确的检测出飞机。如果我们能对红色的框进行微调,使得经过微调后的窗口跟Ground Truth更接近,这样岂不是定位会更准确。确实,Bounding-box regression 就是用来微调这个窗口的。
那么如何才能进行上图所示的变换呢?简单的思路就是平移和尺度缩放。
只有当Proposal和Ground Truth比较接近时(线性问题),我们才能将其作为训练样本训练我们的线性回归模型,否则会导致训练的回归模型不work(当Proposal跟GT离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。
线性回归就是给定输入的特征向量X,学习一组参数W,使得经过线性回归后的值跟真实值Y(Ground Truth)非常接近。即。那么Bounding-box中我们的输入以及输出分别是什么呢?
真正的输入是这个窗口对应的CNN特征,也就是R-CNN中的Pool5feature(特征向量)。(注:训练阶段输入还包括 Ground Truth)。输出:需要进行的平移变换和尺度缩放。那么目标函数可以表示为:
其中 Φ5(P) Φ 5 ( P ) 是输入Proposal得到的特征向量。 w∗ w ∗ 是需要学习的参数( ∗ ∗ 表示x, y, w, h)。即每一个变换对应一个目标函数。要让预测值跟真实值差距最小,损失函数为:
函数优化目标为: