作者Rgb
在这之前大部分物体检测算法都是基于传统的图像处理方法,这是第一篇将深度学习用到物体检测上的文章,直接影响是2012年ALEXNET在比赛中的重大成功。
简单来说,RCNN使用以下四步实现目标检测:
a. 在图像中用slective search 方法 确定约1000-2000个候选框
具体为什么使用这个方法,原文在第三页中有说While R-CNN is agnostic to the particular region proposal method, we use selective search to enable a controlled comparison with prior detection work。意思是R-CNN和区域选择方法并没有联系,对任何选择方法都是兼容的,这里选用SS目的是方便于同之前别人的工作进行对比。
b. 对于每个候选框内图像块,使用深度网络提取特征,得到一个固定长度的特征向量
We extract a 4096-dimensional feature vector from each region proposal using the Caffe implementation of the CNN described by Krizhevsky etal.这里很清楚的说了,作者就是用了AlexNet的网络结构最好提取4096维的一维向量,作为特征向量。
输入去均值化的227×227 RBG通道图片,然后经过5个卷积2个全连接。因为经过SS得到的候选框大小不一,但是CNN要求的输入必须是227×227的。这里就涉及到几种归一化方法。原论文在第11页给出了几种填充和缩放方法。这里方法的选择会影响3-5mAP。作者这里使用了在得到原始的proposal region之后,再在原始图片中选取p=16的像素作为背景扩充,即向外扩展BBX的边界,然后进行wrap到227*227。
这里设计到CNN模型的训练问题。
论文中采用的办法是直接使用alexnet之前训练好的模型参数,去掉最后一层1000个分类,换成你想要的分类数量 1,因为背景也要算是一类。这里使用了迁移学习,在alexnet的基础上进行finetune。训练数据使用的是进行wrap之后得到的proposal region,对于某个类别,认为iou大于0.5为正样本,否则为负样本,每个batch为128,32个正样本(包含20个类别),96个负样本。然后使用SGD进行训练。这样我们就完成了对CNN的调优,这样得到的CNN模型,可以用于提取特征。将提取到的特征在用于SVM训练。这里论文中提到了一句说训练SVM时,样本很大内存无法容纳,使用了一种hard negative mining method的方法,这里还没有搞清楚。
c. 对候选框中提取出的特征,使用SVM二分类器判别是否属于一个特定类
这里对SVM进行训练也涉及到正负样本的问题,这里的对于负样本的判断同CNN不同,从0-0.5,间距为0.1,发现0.3的效果最好,即IOU低于0.3则为负样本。正样本的定义也不一样,当BBX把整个物体都包括进去的时候,才认为是正样本。
论文的附录B讨论了,为什么这里CNN的finetune和SVM的训练使用不同的正负样本标准?
因为作者最初训练SVM的时候,并没有使用cnn上进行 finetune之后的特征,而是直接使用ImageNet pre-trained CNN,发现论文中现在使用的SVM的训练样本标准是最优的;然后后来又考虑使用finetune之后,发现使用同样的正负样本标准,结果很差。
还讨论了最后为什么要用SVM,而不是直接使用softmax分类回归?因为这样mAP下降了。
对于每个类别的物体,将提取的特征使用SVM进行打分。对于所有打分超过阈值的区域进行极大值抑制算法再次进行筛选,排除同一个物体出现多个回归框的问题。
d. 对于属于某一特征的候选框,用回归器进一步调整其位置
给定了一个目标函数,好像用了岭回归和权值的L2范数,来确定BBX的映射结果。
遗留问题:
1 SVM具体训练实现细节
2 回归框的训练方法
来源:http://www.icode9.com/content-4-31701.html