RCNN的革新在于:
1. 使用region proposals 以及 边界框回归 提升定位精度 。边界框回归就是一种充分利用CNN强大的特征提取能力的范例。
2. 使用CNN提升分类效果。
R-CNN的步骤是相当繁琐的,首先是训练过程,训练过程分为四步: 1. 在分类的数据集预训练,2. 微调, 3. 训练SVM, 4. 训练边界框回归。
由于预训练最后的分类是1000类,VOC 2012是21类,因此进行fine-tuning。这里的2,3步骤容易让人感到困惑,明明在第二步微调的时候设置为21类的输出,经过softmax不就能得到分类结果了吗?为什么偏要增加一个训练步骤,使用额外的SVM作为分类器?这是训练样本的质量问题,在训练卷积网络时通常需要较多的数据,因此在训练CNN时 region proposals与groundtruth的IOU大于等于0.5的都被认为正样本,其余的为负样本。这是一种比较宽松的策略,但对分类的精准度会产生阻碍,于是重新定义了正负样本,正样本为groundtruth, region proposals与groundtruth的IOU小于0.3的为负样本。由于SVM适用较少样本的学习,于是就有了CNN+SVM的构造,也就是说CNN只作为特征提取器,SVM作为分类器,SVM的输入是CNN f7的特征,在训练SVM时,CNN是固定的权重。
其实到这里目标检测的任务已经实现了,第四步训练边界框回归只是为了提升定位精度,边界回归本质上就是根据region proposal的CNN特征对其边框位置进行调整,具体的原理可以看这篇文章。注意是对每个类别分别训练一个边界框回归器,文中所选取的CNN特征是pool5处的特征 (6x6x256),训练的样本只选择那些跟ground truth的IOU超过某个阈值(论文为0.6)且IOU最大的proposal。
测试过程:测试过程比训练过程多了non-maximun suppression(非极大值抑制,NMS)去剔除冗余的框
一张图片经过region proposals ,CNN,SVM得到2000 x 20维度的打分(2000个proposals,每个proposal进行20个分类,训练时为21是因为添加了背景类别),NMS原理是这样:对于2000*20中的某一列得分,找到分数最高的一个region proposal,然后只要该列中其他region proposal和分数最高的IOU超过某一个阈值,则剔除该region proposal。这一轮剔除完后,再从剩下的region proposal找到分数最高的,然后计算别的region proposal和该分数最高的IOU是否超过阈值,超过的继续剔除,直到没有剩下region proposal。对每一列都这样操作,这样最终每一列(即每个类别)都可以得到一些region proposals。[1]
最后 这些region proposals在pool5处的特征经过对应类别的线性回归(class-specific bounding-box regressor )得到修正后的bounding box。
最后再总结一下:
RCNN首先通过selective search 得到大约2K region proposals,然后用CNN提取特征结合SVM对每个proposal进行分类, 再使用NMS剔除冗余的框,对剩下的框用线性回归进行修正得到最终结果。
疏漏错误之处,烦请多多指正!:D
[1]原文链接:https://blog.csdn.net/u014380165/article/details/72851035
[2] https://zhuanlan.zhihu.com/p/23006190