赞
踩
目录
1)、非极大抑制(Non-Maximum Suppression,NMS)
2)、边框回归(Bounding Box Regression)
2、SPPNet (Spatial Pyramid Pooling 空间金字塔池化)
3、RoI Pooling(Region of Interest)
最近学习了深度学习在目标检测上的应用,为了梳理知识点和思路,又因为我笔记本不够用了,故写下本文作为我的学习笔记。这次先写已经过时了的老古董R-CNN、Fast R-CNN、Faster R-CNN,后面写相对不那么过时的YOLO。
相信大家都知道目标检测任务是要干啥,我就不介绍它了,我们直接开始。
Tips:本文默认大家已经学习过神经网络和CNN卷积神经网络等深度学习的基本知识,这些不会在此文中介绍,建议不熟悉的同学先去补一下基础。本文重点是梳理知识点思路和对疑惑点的解释。
RCNN(Region Based Convolutional Neural Networks)首次将深度学习应用在目标检测上,大幅提升了目标检测的识别精度,使得CNN在目标检测领域成为常态,也使得大家开始探索CNN在其他计算机视觉领域的巨大潜力。
为了实现目标检测,首先我们得找到图像中的物体在哪,最简单的思路就是用滑动窗口(slide window)从头到尾看完整张图,也就是下面这个动图:
但不同物体有不同的大小和不同的长宽比例,这就要求这个滑动窗口还要以不同大小和不同长宽比例去从头到尾看完整个图像,用脚趾头想都知道这有很多很多的情况,运算量很大,实现目标检测几乎是不可能的。
显然滑动窗口法这种暴力的“穷举法”是不可行的,这时就有人想到一个好方法:我们可以预先找出图中目标可能出现的位置,即候选区域(Region Proposal)。目前已有不少成熟的候选区域产生算法:
由于Selective Search速度又快召回率又高,这个方法是最常用的。我们就来讲讲它。
选择性搜索算法需要先使用《Efficient Graph-Based Image Segmentation》里的方法产生原始分割区域,即产生过度分割的图像,如下面两张图:
然后我们使用贪心策略,计算每两个相邻的区域的相似度,然后每次合并相似度最小的两块,直到这块区域包含整张图像。这其中每次产生的图像块包括合并的图像块我们都保存下来,这样就得到图像的分层表示了。可以说,我们通过自底向上的方法创建了越来越大的候选区域,如图:
这里的相似度包含有颜色相似度、纹理相似度、大小相似度和形状相似度,最终的相似度就是这4个的线性加权组合:
具体每个相似度怎么定义的可以看OpenCV官网的介绍,在这里就不讲了。
同时我们还得给每个候选区域打分,因为不是所有区域都可以作为目标(具体怎么打分也不讲了,可以看看这篇论文或者这篇blog)。有了分数之后,我们只需要分数在前多少名的区域作为候选区域,并用矩形框表示它们,这些矩形框就叫候选框(Bounding Box)。比如下面这图就画出了前200名的候选框,一般来说,1000-1200 个区域足以获得所有正确的候选区域。在RCNN中,会选出1000-2000个候选框,跟滑动窗口那种相比是不是好多了。
这里提醒一下, 选择性搜索得到的候选区域是在原图像上的,不是特征图上的,后面可别混淆
有了这1000-2000个候选区域后,我们就可以送进CNN来进行特征提取。因为CNN有全连接层,所以要求CNN的输入必须得是固定大小的,大家也能看到这些候选区域都是大小不固定的,我们还要调整候选区域的大小resize成固定的大小(AlexNet是227×227大小),才能送进CNN。
至于怎么resize,这里先不讲,大家就简单理解是调整大小就行,介绍SPPNet的时候引入会比较好。
我们将CNN提取到的特征(AlexNet的fc7全连接层的输出)送进每一个类别的SVM进行分类,就可以识别出每个候选区域里面含有物体的类别,还有对应的置信度。
在这里,需要为每个类别都训练一个SVM分类器。在训练时IoU小于0.3的作为负样本,Ground Truth(后面会讲到)作为正样本,中间的去掉。这样才能使超平面更清晰。
虽然我们已经实现了类别分类,但大家可以发现候选区域有很多是冗余的,同时也不能非常准确地框处物体的实际位置。为了能剔除冗余区域和准确框处物体的位置,RCNN采用了以下做法。
NMS的思想就是搜索局部极大值,抑制非极大值元素。讲到NMS就得介绍交并比(Intersection over Union,IoU),交并比其实就是两区域交集的面积比上并集的面积,如下图所示:
下面这图就展示了IoU取不同值的情况:
NMS的具体实现步骤如下:
先去掉置信度小于一定阈值的区域,比如置信度阈值为0.5,先筛掉它们。
设置IoU的阈值,一般是0.5或0.7
根据置信度降序排列候选区域列表,比如得到ABCDE
选取候选区域列表中置信度最高的框A添加到输出列表,并将其从候选区域列表中删除
计算A与候选区域列表中的所有框BCDE的IoU值,删除大于阈值的候选区域
重复上述步骤,直到候选区域列表为空,最后返回输出列表
实现效果就是这样,如下图:
上述的经典NMS算法在图片中只有单个物体被检测的情况下具有很好的效果。但当图像中存在两个重叠度较高的物体时,经典NMS会过滤掉其中置信度较低的一个,出现下图情况,但我们希望两个物体都被检测出来。
在经典NMS算法基础上,Soft-NMS仅仅修改了一行代码。当选取了置信度最大的Bounding Box之后,计算其余每个候选框与它的的IoU值,经典NMS算法的做法是直接删除IoU大于阈值的框;而Soft-NMS则是使用一个基于IoU的衰减函数,降低IoU大于阈值Nt的Bounding Box的置信度,IoU越大,置信度的衰减程度越大。
换一个角度来理解,经典NMS也用了一个基于IoU的衰减函数来表示,只是这个衰减函数是个0-1指示函数,当IoU大于阈值Nt,直接降低该Bounding Box的置信度到0。关于经典NMS和Soft-NMS的衰减函数区别,可以通过如下的公式来表示:
Soft-NMS的实现效果如下图,可以检测出两个物体了:
但是,这里也有一个问题就是置信度的阈值如何选择,在这里依然使用手工设置的值,阈值的选择很大程度决定了剔除效果,依然存在很大的局限性,所以该算法依然存在改进的空间。NMS还有其他算法,这里就不介绍了,想继续了解的可以看这篇博客,通过这两个算法就已经能理解NMS的思想了。
用NMS剔除冗余区域后,一般图片上只会剩下几个框,这些框能把物体大概框出来,但很多时候准确度不够,比如下面这个飞机,即使分类器能识别出它是飞机,但由于定位不准确,相当于没识别出来是飞机。为了进一步提高定位的准确率,我们在NMS后进行边框回归(Bounding Box Regression),去微调(Fine-tuning)Bounding Box的位置。(大家得清楚这里是微调,后面会讲到为什么要强调是微调)。
像图上绿色的框我们叫它Ground Truth,是训练集中人工标记的准确的框。红色的框就是经过NMS后的候选框。
一般我们使用四维向量(x,y,w,h)来表示一个框, 分别是框的中心点坐标xy、宽w和高h。 下图中红色框 P 代表原始的Proposal(就是候选框的中心坐标和宽高), 绿色框 G 代表真实的 Ground Truth, 我们的目标是寻找一种关系使得输入原始 P 经过映射得到一个跟真实 G 更接近的回归框。
将目标数学抽象一下就是:
给定寻找一种映射, 使得并且。
从框P变换到框,有一个思路就是中心平移加大小缩放,我们先要定义一些与尺度大小无关的转换参数,(*表示xywh):
变换关系就是:(公式&)
只要我们学习到这4个参数,对于一个候选框,我们就可以将候选框的位置映射到预测是真实的位置。那我们用什么去训练呢?用候选框的CNN特征和Ground Truth去训练,自变量X是候选区域P对应(AlexNet的)Pool5层特征经过全连接层线性函数得到的,因变量Y就是,同时我们假设它们满足线性关系Y=WX,这样我们就可以看成是训练一个线性回归模型:
也就是要训练出线性回归模型的参数,有了,对于任意候选区域P的特征,我们都可预测出将映射到。
训练这个线性回归模型的损失函数就是:
函数优化目标是:
根据(公式&)我们可以得到Ground Truth t 的表达式:
需要注意的一点是我们需要候选区域和Ground Truth比较接近,也就是重合度比较高时(RCCN中这里IoU>0.6)这个回归模型才能有效,也正因如此边框回归是在做微调。每个类别都得训练一个回归器。
为什么要求候选区域和Ground Truth比较接近呢?
首先我们得清楚我们做微调所调整的变化量是由什么决定的?是候选区域的特征,而非它的框的,框是由图像内容决定的,仅仅是一种坐标表示,所以框的不决定怎么去调整,而是由特征决定。举个例子(只能想到这个了)就是如果我们看一辆车的轮胎,如果一看它是轿车的轮胎,那我就能大概知道这辆轿车有多大。
其实整个边框回归的线性回归模型应该是这样的(把表达式代入公式&):
真正的自变量(输入)是特征,因变量(输出)就是变换得到的Ground Truth,是满足线性关系的。大家会发现这模型只符合x和y的时候,w和h不能推出这模型呀。回顾高数等价无穷小的知识:
对公式&中h的式子变换一下得(w的也是一样的):
当,时,即候选区域和Ground Truth比较接近时:
这样就能得到线性回归模型了。
所以如果候选区域和Ground Truth离得比较远时(IoU<0.6),w和h是不满足线性变换的,这样做的话微调效果就会很不好(模型都是不正确的效果肯定不好);只有候选区域和Ground Truth离得比较近时(IoU>0.6),才满足到Ground Truth的线性变换,微调效果才会比较好。
推荐这一篇博客,但讲得可能不一定好懂,所以我这里换了一种方式理解,可以互补着看。
R-CNN的主要步骤总结如下:
性能瓶颈中说到的候选区域要resize成固定大小。resize一般采用裁剪(crop)或缩放(warp)的操作,看下图就很容易懂:
warp/crop这种预处理,会导致图片被拉伸变形或物体不全,像素信息的损失限制了识别精确度,造成性能瓶颈。
那为什么CNN需要固定的输入呢?CNN网络可以分解为卷积网络部分以及全连接网络部分。卷积网络的参数主要是卷积核,能够适用任意大小的输入,并产生任意大小的输出。但全连接层部分的参数是神经元对于所有输入的连接权重,如果输入尺寸不固定的话,全连接层参数的个数也不能固定。所以全连接层需要固定输入,倒推回去CNN就需要固定输入。
大神何恺明的SPPNet给出的解决方案是,既然只有全连接层需要固定的输入,那么我们在全连接层前加入一个网络层,让它对任意的输入产生固定的输出就行了。这个网络层就是spatial pyramid pooling layer,与CNN的比较如下图:
具体的结构如下图:
SPP层做的事情就是将最后一层卷积层conv5层输出的任意大小m×n×256维特征分别分成1份,4份,16份,然后对它们进行池化,拼接得到21×256维的固定特征,实现任意大小输入,固定大小输出。
同时SPPNet只需对原图进行一次卷积计算,得到整张图的feature map,然后找到原始图片中每个候选区域在feature map上的映射区域patch(原始图片到feature map的映射),将此patch作为每个候选框的卷积特征输入到SPP层和后面的层,完成特征提取工作。如此这般,SPPNet实现了共享卷积计算,相比RCNN要对每个区域计算卷积,节省了大量的计算时间,比R-CNN有几十到一百倍的提速。
SPPNet网络的训练就是训练多尺寸识别网络用以提取区域特征,具体就不讲了,可以看这篇blog和这一篇博客。
顺带提一下,SPPNet是一个网络结构,SPP层只是SPPNet中的一个网络层,别搞混了。
Fast R-CNN就是在R-CNN的基础上借鉴了SPPNet结构,但又不完全照搬,Fast R-CNN将其中的SPP层改成了RoI Pooling层。RoI Pooling可以看成是SPP的简易版。
RoI Pooling拆开就是RoI和Pooling。RoI其实也就是选择性搜索得到的Region Proposal映射到feature map上的区域;Pooling是池化,RoI Pooling的池化和SPP的池化不一样的地方在于RoI Pooling对feature map只划分成w×h份,然后池化得到固定的w×h×256维的特征(256只是为了跟上面SPP那张图的256对应,方便对比w×h和21),操作如下动图(w和h都取2):
我们也很容易知道SPP的特征是多尺度的,而RoI Pooling是单一尺度的。
因为SVM和边框回归是各自训练的,并不能达到整体识别率最优。而且在RCNN中,我们不能够使用CNN的样本去训练SVM,是因为两个分类器对于样本的需求是不同的,必须得用SVM的训练样本来训练它,也会影响整体识别率。因此直接使用Fast RCNN的训练样本去训练SVM也是不好的。通过RCNN中SVM的训练方式和参数设计对比SVM和SoftMax的结果,发现SoftMax结果优于SVM 0.1-0.8,也就是说将分类及回归放到一个网络中去做,并没有影响到网络的精度。
Fast RCNN就将SVM和边框回归都纳入卷积神经网络中,因此损失函数必定是多任务损失函数:
其中分类任务还是我们常用的对数交叉熵损失。边框回归使用的是Smooth L1损失函数,的定义方式与RCNN中一致,为区域的中心坐标、宽和高,需要注意的每个候选区域对于每个类都要回归训练。λ则控制分类损失和回归损失的权重。指示函数则表明若训练集所给的区域标签是背景类别(也就是没有物体)则不需要边框回归,若是物体标签则要进行边框回归。
Fast RCNN的主要步骤总结如下:
Fast RCNN模型已经很好了,识别检测全部放到了卷积神经网络的框架里面,速度也相当快。但美中不足的是,候选区域选取还是Selective Search,网络其他部分都能在GPU中运行,而这部分需要在CPU中运行(Selective Search几乎没矩阵运算),速度还是有点拖后腿,不能达到实时识别。解决办法就是把候选区域提取也做成卷积神经网络,在Faster RCNN中就是RPN(Region Proposal Networks)。
对于候选区域算法一般分为两类:一类是基于超像素合并的(Selective Search、CPMC、MCG等),另一类是基于滑动窗口的,也就是那个穷举法。
自从卷积网络出现后,滑动窗口法也自然高级了一点,比如说可以在卷积后的特征上滑窗,由于特征一般不大,总的滑窗数目也少很多,但是准确度也就差了很多,因为感受野也相应大了很多。Faster RCNN的做法是,既然在特征上滑窗精度不够,那么类似于Fast RCNN,我们给每一个通过在特征上滑窗选出的候选区域再来个回归得到更加精细化的位置就可以啦。RPN做的就是这个。
RPN最核心的东西其实是anchor,搞懂它,RPN就很容易理解了。
所谓anchor就是锚点,是一个点,anchor boxes 就是一组以anchor为中心点的矩形(很多博客都不区分开它俩,导致很多人看不懂RPN的操作)。这一组矩形有3种形状,每种形状有3种不同大小共9个矩形。3种形状长宽比大约为1:1 , 1:2 , 2:1,这9个不同的矩形相当于引入了常用的多尺度检测方法,如下图:(至于它们的大小,是根据检测图像大小而设置的)
这些anchor boxes有什么用呢,我们来看Faster RCNN的论文中RPN网络结构的原图:
解释一下上面这个结构的:
看完上面这张图我们再来讲一下anchor和anchor boxes会更清晰一些:上面这张图中说的anchor是feature map上滑窗(卷积核)的中心点,这个anchor映射在原图上会有对应的点(把这个原图上的点说成anchor也行),anchor boxes就是在原图上以anchor为中心的一组矩形框,注意是“原图”,就像上面说的region proposal一样是对应原图来说的。清楚这个后面就好办了,对应于原图上就会有密密麻麻的anchor boxes,如果anchor boxes超出了原图范围,去掉超出的部分就可以了,如下图:
我们已经结合RPN的网络结构讲清楚了anchor,知道了RPN网络要训练的就是分类层和回归层,RPN的损失函数就是:
上述公式中 i 表示anchor boxes index,表示第i个anchor box是positive(即有物体)的概率,代表对应的Ground Truth 预测概率(与Ground Truth的IoU>0.7的anchor box是positive,;IoU<0.3的是negative,;至于那些0.3<IoU<0.7的anchor则不参与训练),代表预测的 bounding box,代表positive anchor box对应的Gound Truth bounding box。由于在实际过程中,和差距过大,用参数λ平衡二者,使总的网络Loss计算过程中能够均匀考虑2种Loss。同Fast RCNN一样分类部分使用对数交叉熵损失,回归部分也使用soomth L1 loss。
Faster RCNN的主要步骤总结如下:
可以说Faster RCNN的速度已经很快了。
其实以上讲的东西已经过时了,但想入门学习目标检测,我觉得还是得把这些搞明白(细节搞不明白也不要紧,反正已经不会用到它们了),毕竟后续更多新技术的发展都一定程度上借鉴了其中的一些思想,搞懂这些对后面学新技术也会更通透。下一篇文章会讲相对没那么过时的YOLO。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。