概述
R-CNN是将CNN用于目标检测领域的开山之作
(虽然不一定是最早的,但确实最早出现好效果的),也是两阶段目标检测技术的开山之作,是后面一个系列的第一篇文章。
细节
检测流程
流程概述:
- 在原图上进行选择性搜索,获得2000个候选框
- 将每个候选框进行缩放,通过网络进行特征提取
- 每个候选框对应一个特征,借助这些特征,通过SVM进行分类,通过NMS剔除部份候选框
- 通过一个bbox回归器(bbox回归可以参考这里)对比原始候选框进行微调
详细流程:
- 首先从输入图片中使用选择性搜索获得2000个与类别无关的候选框
- 将这些候选框缩放到固定尺寸(227x227)逐一喂到同一个网络中(如AlexNet)进行特征提取,得到
2000*4096
维的矩阵 - 之后使用各个类别的线性SVM基于这些特征对候选框进行打分,判断是否为该类。如voc数据集20个类别就有20个SVM,他们对应的权重矩阵就是
4096*20
,经过SVM之后我们就得到了2000*20
的矩阵,接着使用NMS剔除部分候选框。 - 首先是对于NMS之后的候选框进一步剔除,只保留与GT相交并且IOU大于一定阈值的候选框,接着20个回归器对20个类别中剩余的候选款进行回归操作,最终得到每个类别得分最高的bbox。
第三步补充一:
中间过程如下图所示:左边的每一行都代表一个候选框的特征,中间的每一列代表一个分类器的权重,那么他们相乘得到的就是某个候选框为某个类别的概率。因此右边的每一行代表的是每个候选框在各个类别下的概率,每一列表示某个类别下各个候选框的概率。而NM
S就是对于每一列(也就是每一类)做的,每次取这一列得分最高的候选框,然后与该列其他框计算IOU,若是该IOU大于我们给定的阈值,就将后者的剔除(得分置0),得分最高的候选框处理完之后就是得分第二高的候选框,以此类推。
一些细节
预训练:
首先是特征提取网络会在ImageNet上预训练,然后将最后的分类层替换成随机初始化的参数,接着在当前数据集上微调(固定前面层的参数,只训练最后的分类层)。
选择性搜索:
是一个类似于聚类的过程,开始根据颜色、纹理、大小等找到一些相似的初始区域,然后慢慢加权合并,最终得到2000+的候选框。
缩放:
文中列举了三种方式:1、包含临近的像素,保留长宽比例进行等比例缩放;2、不包含临近的像素,保留长宽比例进行等比例缩放;3、不包含临近的像素,强行缩放不等比例,如下面的BCD,但是最终作者选用的包含临近的像素,强行缩放不等比例的方式,其实就相当于是将候选框放大一点(捕捉上下文信息),然后调整大小放入网络。
缩放结果如下:
为什么不用softmax分类而是采用SVM呢?
好像也没有看到很信服的解释,可能是作者实验下来,确实是SVM效果会好一点。
网络微调和SVM训练时的正负样本:
网络微调时候的正样本是与GT的IOU最大并且大于0.5的候选框,其余样本是负样本;训练SVM时候的正样本是与GT完全重合的候选框,而负样本是与GT的IOU小于0.3的候选框,而IOU在0.3到1之间的候选框就被忽略了。(训练SVM的最优策略实验得到的,且采用困难错误样本挖掘的方式姿训练)
存在的问题
时间消耗大:
检测的速度很慢,由图可见,主要的耗时来自于选择性搜索、候选框预处理(缩放裁剪)以及每个候选框的特征提取,并且这些操作是与类别无关的,相对而言,后面的候选框分类打分以及NMS虽然与类别相关,但是耗时很少很少。
流程臃肿:
算法中的每个流程对于算法性能都是至关重要的,严重依赖上下游,不端到端,所以需要对每个流程都进行优化,才能得到最终的效果。