目标检测算法之RCNN
首先我们看我们要实现的什么:
我们要实现第3张图的Object Detection.不仅需要将图片上所有物体识别出来还需要画出它们的位置。我们知道将物体识别,通过CNN是可以实现的,那么这里关键的部分就是定位了。基于CNN和定位的思想,算法界出现了RCNN,即Region Convolution Neural Network. 之后,基于RCNN,相继出现了改进的算法:Fast RCNN, Faster RCNN, Mask RCNN.
本文讲解RCNN。
RCNN
RCNN的论文在此:https://arxiv.org/pdf/1311.2524v3.pdf
模型如下:
初次接触目标检测算法的读者可能一下子很难适应它的思路,它跟之前讲的CNN分类算法不同。之前的CNN分类算法,比如手写数字识别,是CNN做计算机视觉处理的最基本形态,就是暴力计算。把每个像素(无论这个像素是物体还是没有意义的背景)作为一个数据维度,通过一层层解释性极差的卷积,池化,全连接,进行大量的训练,强行得出那些像素和分类结果之间的联系,并用大量的参数表达这个联系。
做目标检测,也利用了CNN的暴力来进行物体分类,但在此之前,我们拿什么输入给CNN?我们需要把一张图片上,存在物体的一个个部分(即使有误差)框出来,然后把每个框出来的部分分别送到CNN里去做物体分类。于是这里有一个关键环节:怎么把那些物体的位置框出来?
RCNN的想法是:先把可能存在物体的部分都框出来,框多了没关系,框错了没关系,很多框互相重叠也没关系。反正把这些框送到CNN去做物体识别,CNN会给出物体的概率,最后经过概率比较,会留下来最可能框。
可是要是一开始框出来的框就是偏的,即使最后留下来的框是概率最大的但它也是偏的怎么办?比如3个框,第1个框框住了一只猫但是猫的耳朵在框外,第2,3个框更糟糕,缺胳膊少腿的,最后概率最大的1号框被保留了。针对这种情况,我们不能信任框的覆盖能力,所以需要进行框的位置再调整。
综上,1)筛选框并进行框内物体分类 2)调整框的位置 ,这两点就是RCNN要做的。
RCNN预测流程
它的预测流程是:
1)使用Selective Search方法选中很多proposal框
Selective Search方法的具体原理这里不讲了,但是要知道这是一个成熟的训练好的模型,RCNN是直接拿来用的。之后的文章中,我将介绍RCNN的改进版本,届时将介绍不同于Selective Search的改进方法。
2)将每一个选出来的proposal框resize到固定大小,然后输入到CNN(比如AlexNet)物体分类网络。但是不用完整通过该CNN网络,走到全连接之前获得了4096个特征就停止。之所以不用通过完整的CNN网络,是因为我们不用它进行分类,而只是需要它输出的4096个特征作为输入,使用SVM进行分类(为什么?因为这样精度更高,这是RCNN作者从实验结果得出的结论)。
我们先看完整的CNN网络:
截取上面的网络,在第5个池化之后就停止,以获得4096个特征:
如果图片一共有2000个proposal框,那么经过这一步骤之后我们得到了一个2000*4096的特征矩阵。
3)将每个proposal框的4096个特征分别经过20个SVM二分类器(每个分类器有4096个系数)进行物体识别分类。
这个过程可以用2000*4096的矩阵和4096*20的矩阵相乘来表示,求得一个2000*20的矩阵。这个矩阵每一行表示某个proposal框在是各种类别的打分(或者概率)。
4) 使用非极大抑制方法来去除无用的框。
所谓无用的框是因为2000个proposal框中其实只有很少的框是最终需要留下来的。这里的非极大抑制方法是保留(想象上面2000*20矩阵中的每一个元素)打分最高的框,同时与该框框重叠度(称作IOU)超过设定阈值(比如0.6)的框被删除。它的思想是抑制局部非最大的,保留局部极值。
这种方法之所以有效是因为:首先打分最高的框是可能框得最合理的(因为我们相信CNN识别器的准确度),而与该框重叠度比较高的框很可能是框住了该物体的很大一部分,却框偏了的。
可以思考一种实际情况:当图片里面有两只猫在不同的位置。这时候,在“猫”的这个分类下面,会有两个框被保留下来,因为尽管这两个框的打分有大有小,但是它们的IOU是远小于阈值(比如0.6)的。
另一种实际情况是:如果待识别的图片里面只有一只猫(虽然选出了很多个proposal框),而SVM分类器有猫、狗、鱼等20个类别。那么这些proposal框中会有非常多的框在任何分类下的打分都是非常低。如果根据非极大抑制方法,那么在“狗”这个分类下会保留至少一个框,这是不符合要求的。可见,非极大抑制还需要设置打分阈值,即不是所有局部极值都能保留,如果没有到达打分阈值,该类别下所有值都可能被删除。
5)将留下来的框,通过回归器来进行位置微调。
我们不信任最开始的Selective Search方法选出来的框有多精准的定位度,所以要进行微调。
每个类别会有4个被训练好的回归器,分别用来回归4个值:框的左上顶点的x坐标,y坐标,框的宽,框的高。每个类别都有,意思是比如猫有猫的框位置回归器4个,狗也有狗的4个。按类别分的思想是:系统认为框柱一只胖猫和一只很高的长颈鹿,用的框是不一样的。
在预测的时候,如果一张图上有3只猫和2只狗,那么猫的3个框会分别输入猫的位置回归器,狗的2个框分别输入狗的位置回归器。
至此目标检测就完成了。
三个子模型的训练
在RCNN中有三个互相独立的部分:CNN分类器,SVM分类器,位置回归器。
CNN分类器的训练
上面说过,RCNN里使用的CNN不是完全的CNN,而是做了fine-tuning,从第5个池化层后截断的后面接了SVM分类器以实现物体分类。
那么我们怎么训练它呢?可以直接将CNN+SVM整体当做一个物体分类网络进行训练吗?是可以的,但是使用迁移学习进行多段训练会使得模型更强大。
这里多说一句,对习惯传统机器学习或者普通神经网络的人来说,可能会形成一个“预测用这个网络,那么就事先训练好这个网络”的思维定式。这在RCNN以及之后大量的深度学习算法中,是不work的。因为事实是,我们经常通过复杂的训练方法,辗转多个网络,才训练出最后的预测网络。你用的模型的样子,并非我训练它的样子,它只是我训练的最后一个环节而已。
好,回到RCNN的训练。
RCNN使用了2次迁移学习。
第1次迁移学习就是先使用通用的分类数据集ImageNet对完整的CNN分类器进行训练,使它具有识别1000种物体的能力:
然后开始第1次迁移。即从第5个池化层后截断(保留了这之前的训练好的网络参数), 接上一个4096*21的全连接,再次训练这个新的21类分类网络。
注意,训练该21类分类器时,使用的数据是用于目标检测的数据库,也就是人为标注了框,带有类别标签的图片。确切地说,是被框出来的那些图像。之所以如此,是因为我们终究需要它适应目标检测的图片,而不是ImageNet数据库里的广义图像。
不过等等,我们可以用一种类似数据增强的方法:使用selective search之后proposal框出来的图像,而不是作为label的框出来的图像。把与label框的IOU大于0.5的proposal框图像抠出来作为数据,把label作为它的label;把与label框的IOU小于0.5的proposal框图像抠出来作为数据,把“背景”作为它的label(这就是为什么有第21个类)。这样我们就充分利用了大量的selective search出来的图像。
然后进行第2次迁移。这里训练出来的21类分类器仍然没有被用到最后的预测网络中,因为我们要的不是它的21类预测能力,而是它在进行21类预测前所训练出来的提取特征的能力。所以我们再次截断21分类器的输出部分,使用提取出来的特征(每个框是4096个特征),接上SVM进行21类分类。这么做是因为RCNN的作者通过实验得出的结论是:SVM的识别率高于全连接加softmax的输出。
SVM分类器的训练
正如上面所说,SVM分类器的数据来自于被中断的CNN输出,中断点是在全连接之前,第5个池化之后的4096个特征的输出。上面的预测过程中已经给出了图。
在训练过程中,SVM的数据来自于带框和label的数据。但是与上面CNN网络的训练不同的是,正向样本严格来自于label数据中框出的数据及其label,将它们输入CNN中,中途输出4096个特征,就是SVM的正向样本;而负向样本可以来自于selective search得到的且与label框的IOU小于0.3的proposal框。 当然这里会导致负样本远远大于正样本个数,可以通过hard negative mining来解决。 具体请自行搜索
位置回归器的训练
位置回归器的训练完全独立于物体识别和分类而存在,可以并行。它的输入是目标检测训练数据集的图片在selective search之后的且与标注好的框的IOU大于0.6的proposal框,而它的label就是已经标注好的框。
以上。
参考
https://www.cnblogs.com/skyfsm/p/6806246.html
https://zhuanlan.zhihu.com/p/43619815
https://blog.csdn.net/lanran2/article/details/54376126
https://zhuanlan.zhihu.com/p/30720870