cs231n学习笔记-关于目标检测(Object Detection)近些年的发展

一、 传统目标检测方法



传统目标检测流程:


1)区域选择(穷举策略:采用滑动窗口,且设置不同的大小,不同的长宽比对图像进行遍历,时间复杂度高)


2)特征提取(SIFT、HOG等;形态多样性、光照变化多样性、背景多样性使得特征鲁棒性差)


3)分类器(主要有SVM、Adaboost等)


传统目标检测的主要问题:


1)基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余


2)手工设计的特征对于多样性的变化没有很好的鲁棒性。

二、目标检测技术近年来的发展

大致分类:

1.使用region proposal的,目前是主流,比如RCNN、SPP-Net、Fast-RCNN、Faster-RCNN以及MSRA的R-FCN。


2.不使用region proposal的,YOLO,SSD。


我觉得,这些工作都体现的一个趋势:如何让不同ROI(Region of Interest)之间尽量多的共享计算量,并充分利用CNN得到


的特征,使得整个detection的速度变快。


下面就大致介绍一下上面提到的一些算法


三、基于侯选区域(Region Proposal)的深度学习目标检测法

Region Proposal:顾名思义,就是 在图片中预先找出物体可能出现的位置,利用颜色、纹理、边缘等信息选取比穷举窗口少很


多的目标区域(大约2k个)。


常见的Region Proposal方式:

-Selective Search
-Edge Boxes

1.R-CNN
步骤:

(1) 输入测试图像


(2) 利用selective search算法在图像中从下到上提取2000个左右的Region Proposal


(3) 将每个Region Proposal缩放(warp)成227x227的大小并输入到CNN,将CNN的fc7层的输出作为特征


(4) 将每个Region Proposal提取到的CNN特征输入到SVM进行分类


注:

1)对每个Region Proposal缩放到同一尺度是因为CNN全连接层输入需要保证维度固定。


2)对于SVM分好类的Region Proposal做边框回归(bounding-box


regression),边框回归是对region proposal进行纠正的线性回归算法,为了让region


proposal提取到的窗口跟目标真实窗口更吻合。因为region proposal提取到的窗口不可能跟人手工标记那么准,如果region


proposal跟目标位置偏移较大,即便是分类正确了,但是由于IoU(region


proposal与Ground Truth的窗口的交集比并集的比值)低于0.5,那么相当于目标还是没有检测到。


3)R-CNN缺点:


(1) 训练分为多个阶段,步骤繁琐: 微调网络+训练SVM+训练边框回归器


(2) 训练耗时,占用磁盘空间大:5000张图像产生几百G的特征文件


(3) 速度慢: 使用GPU, VGG16模型处理一张图像需要47s。


(4) 测试速度慢:每个候选区域需要运行整个前向CNN计算


(5) SVM和回归是事后操作:在SVM和回归过程中CNN特征没有被学习更新


2.SPP-NET
SSP-Net:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition


 RCNN使用CNN作为特征提取器,首次使得目标检测跨入深度学习的阶段。但是RCNN对于每一个区域候选都需要首先将图片放

缩到固定的尺寸(224*224),然后为每个区域候选提取CNN特征。容易看出这里面存在的一些性能瓶颈:


  • 速度瓶颈:重复为每个region proposal提取特征是极其费时的,Selective Search对于每幅图片产生2K左右个region proposal,也就是意味着一幅图片需要经过2K次的完整的CNN计算得到最终的结果。
  • 性能瓶颈:对于所有的region proposal防缩到固定的尺寸会导致我们不期望看到的几何形变,而且由于速度瓶颈的存在,不可能采用多尺度或者是大量的数据增强去训练模型。


 但是,这2000个RegionProposal不都是图像的一部分吗,那么我们完全可以对图像提一次卷积层特征,然后只需要将

Region  Proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要提一次卷积层特征,然后将每个Region

Proposal 的卷积层特征输入到全连接层做后续操作。(对于CNN来说,大部分运算都耗在卷积操作上,这样做可以节省大量时

间)。 现在的问题是每个Region Proposal的尺度不一样,直接这样输入全连接层肯定是不行的,因为全连接层输入必须是固定

的长 度。SPP-NET恰好可以解决这个问题。


 具体思路为:CNN的卷积层是可以处理任意尺度的输入的,只是在全连接层处有限制尺度——换句话说,如果找到一个方法,在全连接层之前将其输入限制到等长,那么就解决了这个问题。

具体方案如下图所示:



 如果原图输入是224x224,对于conv5出来后的输出,是13x13x256的,可以理解成有256个这样的filter,每个filter对应一

张13x13的activation map。如果像上图那样将activationmap pooling成4x4 2x2 1x1三张子图,做max pooling后,出来的特

征就是固定长度的(16+4+1)x256那么多的维度了。如果原图的输入不是224x224,出来的特征依然是(16+4+1)x256;直觉地

说,可以理解成将原来固定大小为(3x3)窗口的pool5改成了自适应窗口大小,窗口的大小和activation map成比例,保证了经过

pooling后出来的feature的长度是一致的。


使用SPP-NET相比于R-CNN可以大大加快目标检测的速度,但是依然存在着很多问题:


(1) 训练分为多个阶段,步骤繁琐: 微调网络+训练SVM+训练训练边框回归器


(2) SPP-NET在微调网络的时候固定了卷积层,只对全连接层进行微调,而对于一个新的任务,有必要对卷积层也进行微调。(分类的模型提取的特征更注重高层语义,而目标检测任务除了语义信息还需要目标的位置信息)


针对这两个问题,RBG又提出Fast R-CNN, 一个精简而快速的目标检测框架。

3.Fast R-CNN
有了前边R-CNN和SPP-NET的介绍,我们直接看Fast R-CNN的框架图:



与R-CNN框架图对比,可以发现主要有两处不同:一是最后一个卷积层后加了一个ROI pooling layer,二是损失函数使用了多任务

损失函数(multi-task loss),将边框回归直接加入到CNN网络中训练。

(1) ROI pooling layer实际上是SPP-NET的一个精简版,SPP-NET对每个proposal使用了不同大小的金字塔映射,而ROI pooling

layer只需要下采样到一个7x7的特征图。对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个7*7*512

维度的特征向量作为全连接层的输入。

(2) R-CNN训练过程分为了三个阶段,而Fast R-CNN直接使用softmax替代SVM分类,同时利用多任务损失函数边框回归也加入到

了网络中,这样整个的训练过程是端到端的(除去region proposal提取阶段)。

(3) Fast R-CNN在网络微调的过程中,将部分卷积层也进行了微调,取得了更好的检测效果。



性能对比数据:


1)Fast R-CNN优点:


 Fast R-CNN融合了R-CNN和SPP-NET的精髓,并且引入多任务损失函数,使整个网络的训练和测试变得十分方便。在

Pascal VOC2007训练集上训练,在VOC2007测试的结果为66.9%(mAP),如果使用VOC2007+2012训练集训练,在VOC2007上

测试结果为70%(数据集的扩充能大幅提高目标检测性能)。使用VGG16每张图像总共需要3s左右。


2)Fast R-CNN 缺点:


 Region Proposal的提取使用selective search,目标检测时间大多消耗在这上面(提Region Proposal2~3s,而提特征分类只

需0.32s),无法满足实时应用,而且并没有实现真正意义上的端到端训练测试(region proposal使用selective search先提取处

来)。那么有没有可能直接使用CNN直接产生Region Proposal并对其分类?Faster R-CNN框架就是符合这样需要的目标检测框

架。


4.Faster R-CNN

(1)输入测试图像;


(2)将整张图片输入CNN,进行特征提取;


(3)用RPN生成建议窗口(proposals),每张图片生成300个建议窗口;


(4)把建议窗口映射到CNN的最后一层卷积feature map上;


(5)通过RoI pooling层使每个RoI生成固定尺寸的feature map;


(6)利用Softmax Loss(探测分类概率) 和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练.


 

相比FASTER-RCNN,主要两处不同:


(1)使用 RPN(Region Proposal Network)代替原来的Selective Search方法产生建议窗口;


(2)产生建议窗口的CNN和目标检测的CNN共享


效率对比:





RPN的核心思想

 是使用卷积神经网络直接产生Region Proposal,使用的方法本质上就是滑动窗口。RPN的设计比较巧妙,RPN只需在最后

的卷积层上滑动一遍,因为Anchor机制和边框回归可以得到多尺度多长宽比的Region Proposal。

小结:

 Faster R-CNN将一直以来分离的region proposal和CNN分类融合到了一起,使用端到端的网络进行目标检测,无论在速度上

还是精度上都得到了不错的提高。然而Faster R-CNN还是达不到实时的目标检测,预先获取Region Proposal,然后在对每个

Proposal分类计算量还是比较大。比较幸运的是YOLO这类目标检测方法的出现让实时性也变的成为可能。

 总的来说,从R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精

度越来越高,速度也越来越快。可以说基于Region Proposal的R-CNN系列目标检测方法是当前目标最主要的一个分支。


5.R-FCN
论文地址:https://arxiv.org/pdf/1605.06409.pdf

顾名思义:全卷积网络,就是全部是卷积层,而没有全连接层(fc)。

 R-FCN(基于区域的检测器)的方法是:在整个图像上共享计算,通过移除最后的fc层实现(即删除了所有的子网络)。使用“位

置敏感的得分图”来解决了图像分类平移不变性与对象检测平移变化之间的矛盾。

 此矛盾为:物体分类要求平移不变性越大越好 (图像中物体的移动不用区分),而物体检测要求有平移变化。所以,ImageNet

分类领先的结果证明尽可能有平移不变性的全卷积结构更受亲睐。另一方面,物体检测任务需要一些平移变化的定位表示。比

如,物体的平移应该使网络产生响应,这些响应对描述候选框覆盖真实物体的好坏是有意义的。我们假设图像分类网络的卷积层

越深,则该网络对平移越不敏感。

 

k^2(C+1)的conv: ResNet101的输出是W*H*1024,用K^2(C+1)个1024*1*1的卷积核去卷积即可得到K^2(C+1)个大小为W*H

的position sensitive的score map。这步的卷积操作就是在做prediction。k = 3,表示把一个ROI划分成3*3,对应的9个位置分

别是:上左(左上角),上中,上右,中左,中中,中右,下左,下中,下右(右下角),如下图。





k^2(C+1)个feature map的物理意义: 共有k*k = 9个颜色,每个颜色的立体块(W*H*(C+1))表示的是不同位置存在目标的概率值

(第一块黄色表示的是左上角位置,最后一块淡蓝色表示的是右下角位置)。共有k^2*(C+1)个feature map。每个feature map,

z(i,j,c)是第i+k(j-1)个立体块上的第c个map(1<= i,j <=3)。(i,j)决定了9种位置的某一种位置,假设为左上角位置(i=j=1),c决定

了哪一类,假设为person类。在z(i,j,c)这个feature map上的某一个像素的位置是(x,y),像素值是value,则value表示的是原图对

应的(x,y)这个位置上可能是人(c=‘person’)且是人的左上部位(i=j=1)的概率值。
 
ROI pooling: 就是faster RCNN中的ROI pooling,也就是一层的SPP结构。主要用来将不同大小的ROI对应的feature map映射成

同样维度的特征,思路是不论对多大的ROI,规定在上面画一个n*n 个bin的网格,每个网格里的所有像素值做一个pooling(平

均),这样不论图像多大,pooling后的ROI特征维度都是n*n。注意一点ROI pooling是每个feature map单独做,不是多个channel

一起的。
 
ROI pooling的输入和输出:ROI pooling操作的输入(对于C+1个类)是k^2*(C+1)*W' *H'(W'和H'是ROI的宽度和高度)的score 

map上某ROI对应的那个立体块,且该立体块组成一个新的k^2*(C+1)*W' *H'的立体块:每个颜色的立体块(C+1)都只抠出对应

位置的一个bin,把这k*k个bin组成新的立体块,大小为(C+1)*W'*H'。例如,下图中的第一块黄色只取左上角的bin,最后一块

淡蓝色只取右下角的bin。所有的bin重新组合后就变成了类似右图的那个薄的立体块(图中的这个是池化后的输出,即每个面上

的每个bin上已经是一个像素。池化前这个bin对应的是一个区域,是多个像素)。ROI pooling的输出为为一个(C+1)*k*k的立体

块。



以上就是所有关于Region Proposal的目标检测方法,下面来谈一谈基于回归方法的深度学习目标检测算法

1.YOLO

YOLO:You Only Look Once: Unified, Real-Time Object Detection

论文链接:https://arxiv.org/abs/1506.02640

YOLO检测网络包括24个卷积层和2个全连接层,如下图所示。


其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。

YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception
module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。

YOLO论文中,作者还给出一个更轻快的检测网络fast YOLO,它只有9个卷积层和2个全连接层。使用titan x GPU,fast YOLO可以达到155fps的检测速度,但是mAP值也从YOLO的63.4%降到了52.7%,但却仍然远高于以往的实时物体检测方法(DPM)的mAP值。

YOLO全连接输出层的定义

 YOLO将输入图像分成SxS个格子,每个格子负责检测‘落入’该格子的物体。若某个物体的中心位置的坐标落入到某个格

子,那么这个格子就负责检测出这个物体。如下图所示,图中物体狗的中心点(红色原点)落入第5行、第2列的格子内,所以这

个格子负责预测图像中的物体狗。


每个格子输出B个bounding box(包含物体的矩形区域)信息,以及C个物体属于某种类别的概率信息。

 Bounding box信息包含5个数据值,分别是x,y,w,h,和confidence。其中x,y是指当前格子预测得到的物体的bounding box

的中心位置的坐标。w,h是bounding box的宽度和高度。注意:实际训练过程中,w和h的值使用图像的宽度和高度进行归一化

到[0,1]区间内;x,y是bounding box中心位置相对于当前格子位置的偏移值,并且被归一化到[0,1]。confidence反映当前

bounding box是否包含物体以及物体位置的准确性。


 YOLO将目标检测任务转换成一个回归问题,大大加快了检测的速度,使得YOLO可以每秒处理45张图像。而且由于每个网

络预测目标窗口时使用的是全图信息,使得false positive比例大幅降低(充分的上下文信息)。但是YOLO也存在问题:没有了

Region Proposal机制,只使用7*7的网格回归会使得目标不能非常精准的定位,这也导致了YOLO的检测精度并不是很高。

2.SSD
SSD:Single Shot MultiBox Detector
论文链接:http://www.eccv2016.org/files/posters/O-1A-02.pdf
 使用整图特征在7*7的粗糙网格内回归对目标的定位并不是很精准。那是不是可以结合Region Proposal的思想实现精准一些
的定位? SSD结合YOLO的回归思想以及Faster R-CNN的anchor机制做到了这点。

SSD的特殊之处主要体现在以下3点:


(1)多尺度的特征图检测(Multi-scale),如SSD同时使用了上图所示的8*8的特征图和4*4特征图。


(2)相比于YOLO,作者使用的是卷积层来代替了YOLO的全连接层做预测。(如下图所示)


(3)SSD使用了默认的边界框+(1,2/1,3/1,1/2,1/3)6个框来做检测(aspect ratios)


SSD和YOLO的比较如下:


 小结:
 SSD结合了YOLO中的回归思想和Faster R-CNN中的anchor机制,使用全图各个位置的多尺度区域特征进行回归,
既保持了YOLO速度快的特性,也保证了窗口预测的跟Faster R-CNN一样比较精准。SSD在VOC2007上mAP可以达到72.1%,
速度在GPU上达到58帧每秒。

总结:YOLO的提出给目标检测一个新的思路,SSD的性能则让我们看到了目标检测在实际应用中真正的可能性。

参考资料:
https://zhuanlan.zhihu.com/p/24954433?refer=xiaoleimlnote
http://blog.csdn.net/qq_14845119/article/details/53331581
http://www.cnblogs.com/dudumiaomiao/p/6560841.html
http://www.cnblogs.com/lillylin/p/6277094.html


  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值