【论文解读】R-CNN 深入浅出理解目标检测开山之作
共 4634字,需浏览 10分钟
·
2021-01-13 15:28
因此,只要根据太长不看版本大致了解pipeline即可,不过这里还是满足以下好奇心宝宝(比如我自己),把内容细讲一下。
一、 太长不看版本
ps:这部分改编自《动手学深度学习》,内容很不错。
R-CNN[1]首先对图像选取若干提议区域Region Proposal(如锚框Anchor也是一种选取方法)并标注它们的类别和边界框(如偏移量)。然后,用卷积神经网络对每个提议区域做前向计算抽取特征。之后,我们用每个提议区域的特征预测类别和边界框。
具体来说,R-CNN主要由以下4步构成。
提议区域:对输入图像使用选择性搜索(selective search)来选取多个高质量的提议区域 [2]。这些提议区域通常是在多个尺度下选取的(@FPN提到的图像金字塔),并具有不同的形状和大小。每个提议区域将被标注类别和真实边界框。
提取特征:选取一个预训练的CNN,并将其在输出层之前截断。将每个提议区域变形为网络需要的输入尺寸,并通过前向计算给提议区域抽取特征。
目标分类:将每个提议区域的特征连同其标注的类别作为一个样本,训练多个支持向量机对目标分类。其中每个支持向量机用来判断样本是否属于某一个类别。
回归边框:将每个提议区域的特征连同其标注的边界框作为一个样本,训练线性回归模型来预测真实边界框。
R-CNN虽然通过预训练的卷积神经网络有效抽取了图像特征,但它的主要缺点是速度慢。想象一下,我们可能从一张图像中选出上千个提议区域,对该图像做目标检测将导致上千次的卷积神经网络的前向计算。这个巨大的计算量令R-CNN难以在实际应用中被广泛采用。
二、引言 Introduction
开始之前,注意这是14年的论文,不能苛求其有多么高大上。虽然我们现在觉得R-CNN非常笨重低效,但在R-CNN之前,是更加黑暗的时代,这体现在:
速度超慢:在R-CNN之前,目标检测多用滑动窗口检测法,约等于有多少个像素点,就要做多少次检测。R-CNN至少提前定好了提议区域。
计算超复杂:检测特征多为人工提取(Haar,HOG,SIFT…等等许多没学过数字图像处理的同学听都没听说过的算法)。R-CNN使用CNN提取特征,这至少在提取特征上做到了多快好省。
相比传统办法,因为RCNN的CNN在各个类别中共享特征所以内存占比和计算时间都贼低,和类别数量有关(随种类数量增大而增大)的部分只有非极大值抑制和线性SVM。R-CNN的贡献在于极大地缩短了监督学习(与Ground-Truth有关)的时间,涉及的运算只有CNN/svm/线性回归的矩阵运算与非极大值抑制(NMS)。当然,现在看来其最需要优化的地方,就是所谓“类别无关”的部分了(提议区域)。第二个贡献在于将在ImageNet上训练好的CNN作为“黑箱”特征提取,无需fine-tune省时省力。当然,现在看来,仅仅作为无需fine-tune的特征提取器也是其局限之一。
三、模型详解
1. 提议区域:选择性搜索
首先就是神秘的选择性搜索(Selective Search)了,我研究了算法的主页,其中有代码,还居然是用matlab写的……
选择性搜索流程:
图像分割(不是语义分割,属于数字图像处理中比较“低级”的手段) 成若干小区域。
按规则反复融合小区域,直到整张图片只剩一个区域为止。
输出所有曾经存在过的区域,即提议区域。
合并规则:
优先合并以下四种区域:
颜色(颜色直方图)相近的
纹理(梯度直方图)相近的
合并后总面积小的(使得合并均匀,避免出现过大的区域逐个吃掉剩下的小区域。比如你手里有斗地主里面的5连飞机,也不能一次性打出去,而是拆成三带二。)
合并后,总面积在其所属Ground-Truth边界框bounding box中所占比例大的。下面是例子
可见一二条规则是合并的基本原则,而第三条保证了区域大小分布均匀,第四条保证了区域形状规则
为尽可能不遗漏候选区域,上述操作在多个颜色空间中同时进行(RGB,HSV,Lab等)。在一个颜色空间中,使用上述四条规则的不同组合进行合并。所有颜色空间与所有规则的全部结果,在去除重复后,都作为候选区域输出。
2. 预处理与提取特征
众所周知,CNN只能接受特定大小的输入,因此需要对输入图片进行变形,使每个region proposal的大小都是227*227。
作者关于“如何变形”给出了大量讨论实验。比如直接先裁剪后变形,还是裁剪后零填充等等
事实上我认为区别不大……,直接变形还是正则化呢对不对
取得提取特征的模型的过程分为两步:
有监督预训练
调优训练
有监督预训练(Supervised pre-training)的过程:现在我们喜欢管这个过程叫迁移学习(transfer-learning),即使用别的数据集训练好模型(这里是ImageNet训练的CNN)。(稍加修改后)用于其他任务(这里是去掉最后一个用于输出的FC层,用于提取提议区域的特征)。
调优训练(fine-tune):使用选择性搜索得到的提议区域训练。设目标检测数据集中N类物体,就在上一步预训练的模型最后加上N+1个输出的神经元(还有一类背景类,比如VOC有20个类别,就有21个输出)。训练的batch size=128(32个正样本+96个负样本)
这里就已经体现出平衡数据的思想了,这也是目标检测的老大难问题之一。
稍等一下,什么是正样本,什么是负样本?
正负样本选择
对一张图片进行选择性搜索,即使以上述组合规则的办法,搜索出2000个候选框;出现一个和Ground Truth的边界框完全一致的概率也约等于0。
因此在一切开始之前,就需要先用IoU为2000个候选框打分。若其与Ground-Truth的边界框的IoU>0.5,那么我们就把这个候选框标注成物体类别(正样本),否则我们就把它当做背景类别(负样本)。
注:由上一部分的分析,通常情况下,正样本数量远远小于负样本,因此引出了后续的难例挖掘。(和后来的Focal Loss)
啥?你说你连IoU是啥都不知道?
啥是IoU
衡量边界框位置,常用交并比指标,交并比(Injection Over Union,IOU)发展于集合论的雅卡尔指数(Jaccard Index)[3],被用于计算真实边界框Bgt(数据集的标注)以及预测边界框Bp(模型预测结果)的重叠程度。
具体来说,它是两边界框相交部分面积与相并部分面积之比,如下所示:
3. SVM分类
对每一类目标,使用一个线性SVM二类分类器进行判别。输入为CNN输出的4096维特征,输出是否属于此类。由于负样本很多,使用难例挖掘(hard negative mining)方法。
正样本:本类的Ground-Truth标定框。
负样本:遍历所有的提议区域,如果和本类所有标定框的重叠都小于0.3,则认为其为负样本。
好的,问题又来了:
Fine-tune时已经有CNN的分类输出了,为什么还要再训练一堆SVM?
SVM与CNN的正负样本定义不同,导致CNN输出的精度差。这主要由于CNN的IoU只要高于0.5就算正样本,但SVM的正样本则是需要将整个物体包括在内。
0.3这个阈值是哪里来的?
试出来的,事实上,每个物体的正样本通常只有一个。负样本太多了就要筛选,IoU阈值选的太大了会让模型产生困惑,太小了呢负样本又太多了。反复实验对比才确定了0.3这个阈值。
什么是难例挖掘?
4. 回归边框
之前的区域提议只是大致的选出了物体在哪,本身也是一个无监督的过程。某种意义上框不狂得准完全是玄学。因此需要额外的回归器进行边框回归(精修)。
回归器:
对每一类目标,使用一个线性岭回归器进行精修。正则项λ=10000。输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。
训练样本:
判定为本类中和Ground Truth的IoU大于0.6的区域提议框。
岭回归我个人理解是个有正则的线性回归?还没开始凸优化课,不太了解……
四、测试阶段
在描述Object Dection算法时,测试阶段也是需要单独拎出来的,因为从训练过程可以看出,即使在训练时,我们也无法得到百分百准确的区域提议,需要经过繁琐的过程预处理数据。更别提被区域提议不知所措的测试阶段了。
测试阶段流程:
首先使用选择性搜索提取测试图片的区域提议(和训练时一样,2000+个)。
将所有区域提议变形为227*227(用和训练时一致的变形方法),并使用CNN获得特征。
对所有特征用SVM进行分类
对每个类,用非极大值抑制(NMS)筛选出最终的待回归的框
对NMS选出的边界框进行回归
那么什么是NMS呢?NMS又是如何在numpy/pytorch/C++上实现的呢,请移步
参考文献
[1] Girshick, R., Donahue, J., Darrell, T., & Malik, J. (2014). Rich feature hierarchies for accurate object detection and semantic segmentation. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 580-587).
[2] Uijlings, J. R., Van De Sande, K. E., Gevers, T., & Smeulders, A. W. (2013). Selective search for object recognition. International journal of computer vision, 104(2), 154-171.
[3] en.wikipedia.org/wiki/J
除此之外,本文参考了blog.csdn.net/shenxiaol这篇笔记
往期精彩回顾
获取本站知识星球优惠券,复制链接直接打开:
https://t.zsxq.com/qFiUFMV
本站qq群704220115。
加入微信群请扫码: