摘要:
从2014年开始,目标检测取得了巨大的突破。本文针对目前主流的目标检测方法进行简单的介绍,文章分为两个部分:第一部分介绍R Girshick提出的以R-CNN为代表的结合region proposal和CNN分类的目标检测框架(R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN); 第二部分介绍以YOLO为代表的将目标检测转换为回归问题的目标检测框架(YOLO, SSD); 第三部分介绍一些最新的目标检测算法的进展。
一、从Rcnn到Faster-Rcnn
从Rcnn开始Girshick大神将深度学习引入目标检测领域,后来连续发力,最终将目标检测的所有步骤都统一在了深度学习框架之下,这就意味着所有的计算过程都可以在GPU内进行,从而计算精度和计算速度都有了很大提升。
1、 Rcnn简介
原文连接:http://people.eecs.berkeley.edu/~rbg/papers/r-cnn-cvpr.pdf
首先使用selective search算法,从图片中提取出2000个可能包含有目标的区域,再将这2000个候选区(ROI:region of interest)压缩到统一大小(227*227)送入卷积神经网络中进行特征提取,在最后一层将特征向量输入svm分类器,得到该候选区域的种类。整体上看R-cnn比较简单,与此同时也有两个 重大缺陷:
(1)selective search进行候选区域提取的过程在cpu内计算完成,占用了大量计算时间。
(2)对2000个候选框进行卷积计算,提取特征的时候,存在大量的重复计算,进一步增加了计算复杂度。针对以上两个缺点,R Girshick分别在fast-Rcnn和faster-rcnn中进行了改进。
2、 fast-rcnn
原文连接:http://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Girshick_Fast_R-CNN_ICCV_2015_paper.pdf
2.1 spp-net
由于fast-rcnn借鉴了ssp-net的思想,所以先来了解一下spp-net。
原文连接:http://vc.cs.nthu.edu.tw/home/paper/codfiles/melu/201604201227/Spatial%20Pyramid%20Pooling%20in%20Deep%20Convolutional%20Networks%20for%20Visual%20Recognition.pdf
在rcnn种需要对2000个候选框进行卷积特征计算,而这2000个候选框是来自与同一张图片的,所以,作者考虑到先对整张图片进行一次卷积计算,得到整张图片的卷积特征,然后依据每个候选框在原始图片中的位置,在卷积特征图中取出对应的区域的卷积特征。再将卷积图中的到的特征向量送入分类器,在这里产生了一个问题,就是每个候选框的大小是不一样的,得到的卷积特征的维度也会不一样,无法送入全连接层,导致分类无法进行,为了将所有候选框的特征维度统一起来,作者就设计了spp-net:
在得到卷积特征图之后,对卷积特征图进行三种尺度的切分:4×4,2×2,1×1,对于切分出来的每个小块进行max-pooling下采样,之后再将下采样的结果全排列成一个列向量,送入全连接层,例如每个候选区域在最后的512张卷积特征图中得到了512个该区域的卷积特征图,通过spp-net下采样后得到了一个512×(4×4+2×2+1×1)维的特征向量,这样就将大小不一的候选区的特征向量统一到了一个维度。
2.2 ROI pooling layer
在fast-rcnn中作者采用了ssp-net的简化版:只对ssp-net进行了一种尺度的切分,之后直接下采样,得到特征向量。
2.3 fast-rcnn整体框架
在rcnn中进行卷积特征提取的时候,需要对图片中的2000个候选框进行卷积计算,其中很多计算是重复的,同时spp-net和rcnn都需要多阶段的训练包括特征提取、微调网络、训练svm分类器、边框回归等,不仅过程繁杂而且中间会产生大量的中间结果文件,占用大量内存。为此作者除了采用roi-pooling layer以外还设计了多任务损失函数(multi-task loss),将分类任务和边框回归统一到了一个框架之内,整体思路如下:
用selective search 方法从原始图片中提取2000个候选框(ROI),对整张图片进行卷积计算,得到卷积特征图(conv feature map),然后利用ROI pooling layer从卷积特征图种提取每个候选框的特征向量,通过全连接层之后,特征向量进入两个输出层:一个进行分类,判断该候选框内的物体种类,另一个进行边框回归,判断目标在图中的准确位置。
fast-rcnn缺陷在于仍然没有解决selective search进行候选框选择的时候计算速度慢的问题。
3、 faster-rcnn
原文连接:http://machinelearning.wustl.edu/mlpapers/paper_files/NIPS2015_5638.pdf
针对selective search在cpu内进行计算速度慢等问题,作者创建了RPN网络替代selective search算法进行候选框选择,使得整个目标识别真正实现了端到端的计算,将所有的任务都统一在了深度学习的框架之下,所有计算都在GPU内进行,使得计算的速度和精度都有了大幅度提升。
3.1 RPN网络
RPN 网络的全称region proposal network,目的是利用神经网络进行候选框的选择,其实RPN也可以看做是一个分类网络,不过他的目标是分开前景(包含有ROI的部分)和背景(包含有ROI的部分),也就是一个二分类问题。
为了提取候选框,作者使用了一个小的神经网络也即就是一个n×n的卷积核(文中采用了3×3的网络),在经过一系列卷积计算的特征图上进行滑移,进行卷积计算。每一个滑窗计算之后得到一个低维向量(例如VGG net 最终有512张卷积特征图,每个滑窗进行卷积计算的时候可以得到512维的低维向量),得到的特征向量,送入两种层:一种是边框回归层进行定位,另一种是分类层判断该区域是前景还是背景。3*3滑窗对应的每个特征区域同时预测输入图像3种尺度(128,256,512),3种长宽比(1:1,1:2,2:1)的region proposal,这种映射的机制称为anchor。所以对于40*60图图,总共有约20000(40*60*9)个anchor,也就是预测20000个region proposal。
3.2 faster-rcnn 整体思路
首先对整张图片进行卷积计算,得到卷积特征,然后利用RPN进行候选框选择,再返回卷积特征图取出候选框内的卷积特征利用ROI提取特征向量最终送入全连接层进行精确定位和分类,总之:RPN+fast-rcnn=faster-rcnn。
4、 faster-rcnn小结
Faster R-CNN将一直以来分离的region proposal和CNN分类融合到了一起,使用端到端的网络进行目标检测,无论在速度上还是精度上都得到了不错的提高。然而Faster-RCNN还是达不到实时的目标检测,预先获取region proposal,然后在对每个proposal分类计算量还是比较大。比较幸运的是YOLO这类目标检测方法的出现让实时性也变的成为可能。总的来说,从R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于region proposal的R-CNN系列目标检测方法是当前目标最主要的一个分支。
二、使用回归方法进行目标检测
尽管faster-rcnn在计算速度方面已经取得了很大进展,但是仍然无法满足实时检测的要求,因此有人提出力基于回归的方法直接从图片种回归的出目标物体的位置以及种类。具有代表性的两种方法是YOLO和SSD。
1、YOLO
原文连接:http://ai2-website.s3.amazonaws.com/publications/YOLO.pdf
1.1 整体思路:
(1) 给个一个输入图像,首先将图像划分成7*7的网格
(2) 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
(3)根据上一步可以预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后非极大值抑制去除冗余窗口即可。
可以看到整个过程非常简单,不需要中间的region proposal在找目标,直接回归便完成
了位置和类别的判定。
1.2 网络结构:
YOLO的网络结构图,前边的网络结构跟GoogLeNet的模型比较类似,主要的是最后两层的结构,卷积层之后接了一个4096维的全连接层,然后后边又全连接到一个7*7*30维的张量上。实际上这7*7就是划分的网格数,现在要在每个网格上预测目标两个可能的位置以及这个位置的目标置信度和类别,也就是每个网格预测两个目标,每个目标的信息有4维坐标信息(中心点坐标+长宽),1个是目标的置信度,还有类别数20(VOC上20个类别),总共就是(4+1)*2+20 = 30维的向量。这样可以利用前边4096维的全图特征直接在每个网格上回归出目标检测需要的信息(边框信息加类别)。
Yolo方法的缺点显而易见,虽然舍弃了Region proposal阶段,加快了速度,但是定位精度比较低,与此同时带来的问题是,分类的精度也比较低。
2、SSD
原文连接:http://xueshu.baidu.com/s?wd=paperuri%3A%283fb2fe83b7fa301bbb46202d467010d6%29&filter=sc_long_sign&tn=SE_xueshusource_2kduw22v&sc_vurl=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.717.8707%26rep%3Drep1%26type%3Dpdf&ie=utf-8&sc_us=7947683645999184457
鉴于yolo定位精度低的缺陷,SSD 结合faster-rcnn的archor机制和yolo的回归思想进行目标检测,使得定位精度和分类精度相较与yolo都有了大幅度的提高。
2.1 The Single Shot Detector
上图是SSD的一个框架图,首先SSD获取目标位置和类别的方法跟YOLO一样,都是使用回归,但是YOLO预测某个位置使用的是全图的特征,SSD预测某个位置使用的是这个位置周围的特征(感觉更合理一些)。那么如何建立某个位置和其特征的对应关系呢?可能你已经想到了,使用Faster R-CNN的anchor机制。如SSD的框架图所示,假如某一层特征图大小是8*8,那么就使用3*3的滑窗提取每个位置的特征,然后这个特征回归得到目标的坐标信息和类别信息(图c)。不同于Faster R-CNN,这个anchor是在多个feature map上,这样可以利用多层的特征并且自然的达到多尺度(不同层的feature map 3*3滑窗感受野不同).
2.2 SSD整体框架
首先第一步和其他方法一样利用卷积操作提取卷积特征,在最后级层卷积时候开始对与每一种尺度上的特征图运用archor方法进行候选框提取,依据archor在不同尺度上得到的候选框,进行目标种类和位置的判断。
2.3 小结
ssd和yolo采用了回归方法进行目标检测使得目标检测速度大大加快,ssd引入faster-rcnn的archor机制使得目标定位和分类精度都较yolo有了大幅度提高。基于回归方法的目标检测基本达到了实时的要求,是目标检测的另一个主要思路。
三、目标检测方法最新进展
1、结合上下文特征进行目标检测。对于某一类物体,它的周围出现的内容将很好的对其位置进行锁定。
2、多特征融合。除了利用高维的卷积操作之后的特征之外,同时应该结合低维的卷积特征进行目标检测检测,以便更好的利用细节信息。
3、使用循环神经网络(RNN)进行目标检测。目前主流的图像处理方法一般都是基于cnn的,其实RNN的很多特性或许能在目标检测问题上产生意想不到的效果。例如Girshick的Inside-Outside-Net。
四、总结
自从深度学习方法被引入图像处理领域,目标检测已经取得很大的进步。本文主要针对目前主流的深度学习目标检测算法进行了介绍。其中提高精度的方法除了进行算法原理上的创新以外,在训练方式等方面很多比较好的idea,本文限于篇幅并未具体介绍,参照原始论文将可以看到很多精彩的细节。所以,小伙伴们有时间还是多读读原始论文吧。
最后水平有限,欢迎讨论、批评、指正。