参考:/Standing_On_Giant/article/details/60333329
参考:/xiaohu/article/details/79600037
从开始,目标检测取得了巨大的突破。目前业界出现的目标检测算法有以下几种:
1. 传统的目标检测算法:Cascade + Haar / SVM + HOG / DPM ;
2. 候选窗+深度学习分类:通过提取候选区域,并对相应区域进行以深度学习方法为主的分类的方案,如:RCNN / SPP-net/ Fast-RCNN / Faster-RCNN / R-FCN 系列方法;
3. 基于深度学习的回归方法:YOLO / SSD / DenseBox 等方法;
4. 结合RNN算法的RRC detection;结合DPM的Deformable CNN等方法;
本文针对目前主流的目标检测方法进行简单的介绍,文章分为四个部分:第一部分介绍目标检测领域常用的数据集以及性能指标;第二部分介绍R Girshick提出的以R-CNN为代表的结合region proposal和CNN分类的目标检测框架(R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN); 第三部分介绍以YOLO为代表的将目标检测转换为回归问题的目标检测框架(YOLO, SSD); 第四部分介绍一些最新的目标检测算法的进展。
1、数据集和性能指标
目标检测常用的数据集包括PASCAL VOC,ImageNet,MS COCO等数据集,这些数据集用于研究者测试算法性能或者用于竞赛。目标检测的性能指标要考虑检测物体的位置以及预测类别的准确性,下面我们会说到一些常用的性能评估指标。
1.1 数据集
PASCAL VOC(The PASCAL Visual Object Classification)是目标检测,分类,分割等领域一个有名的数据集。从到,共举办了8个不同的挑战赛。PASCAL VOC包含约10,000张带有边界框的图片用于训练和验证。但是,PASCAL VOC数据集仅包含20个类别,因此其被看成目标检测问题的一个基准数据集。
ImageNet在放出了包含边界框的目标检测数据集。训练数据集包含500,000张图片,属于200类物体。由于数据集太大,训练所需计算量很大,因而很少使用。同时,由于类别数也比较多,目标检测的难度也相当大。
另外一个有名的数据集是Microsoft公司建立的MS COCO(Common Objects in COntext)数据集。这个数据集用于多种竞赛:图像标题生成,目标检测,关键点检测和物体分割。对于目标检测任务,COCO共包含80个类别,每年大赛的训练和验证数据集包含超过120,000个图片,超过40,000个测试图片。测试集最近被划分为两类,一类是test-dev数据集用于研究者,一类是test-challenge数据集用于竞赛者。测试集的标签数据没有公开,以避免在测试集上过拟合。在COCO Detection Challenge中,旷视科技团队凭借提出的Light-Head R-CNN模型夺得冠军(AP为0.526 ),看来还是two-stage算法准确度更胜一筹。
COCO数据集的分割实例. 来源: T.-Y.Lin and al. ()
目标检测的主流数据集. 来源: /blog/
1.2 性能指标
目标检测问题同时是一个回归和分类问题。首先,为了评估定位精度,需要计算IoU(Intersection over Union,介于0到1之间),其表示预测框与真实框(ground-truth box)之间的重叠程度。IoU越高,预测框的位置越准确。因而,在评估预测框时,通常会设置一个IoU阈值(如0.5),只有当预测框与真实框的IoU值大于这个阈值时,该预测框才被认定为真阳性(True Positive, TP),反之就是假阳性(False Positive,FP)。
对于二分类,AP(Average Precision)是一个重要的指标,这是信息检索中的一个概念,基于precision-recall曲线计算出来。对于目标检测,首先要单独计算各个类别的AP值,这是评估检测效果的重要指标。取各个类别的AP的平均值,就得到一个综合指标mAP(Mean Average Precision),mAP指标可以避免某些类别比较极端化而弱化其它类别的性能这个问题。
对于目标检测,mAP一般在某个固定的IoU上计算,但是不同的IoU值会改变TP和FP的比例,从而造成mAP的差异。COCO数据集提供了官方的评估指标,它的AP是计算一系列IoU下(0.5:0.05:0.9)AP的平均值,这样可以消除IoU导致的AP波动。其实对于PASCAL VOC数据集也是这样,Facebook的Detectron上的有比较清晰的实现。
除了检测准确度,目标检测算法的另外一个重要性能指标是速度,只有速度快,才能实现实时检测,这对一些应用场景极其重要。评估速度的常用指标是每秒帧率(Frame Per Second,FPS),即每秒内可以处理的图片数量。当然要对比FPS,你需要在同一硬件上进行。另外也可以使用处理一张图片所需时间来评估检测速度,时间越短,速度越快。
2、从Rcnn到Faster-Rcnn
从Rcnn开始Girshick大神将深度学习引入目标检测领域,后来连续发力,最终将目标检测的所有步骤都统一在了深度学习框架之下,这就意味着所有的计算过程都可以在GPU内进行,从而计算精度和计算速度都有了很大提升。
2.1 Rcnn简介(原文连接)
R-CNN是基于region proposal(候选区域)方法的目标检测算法系列开山之作,其先进行区域搜索,然后再对候选区域进行分类。在R-CNN中,选用Selective search(选择性搜索)方法来生成候选区域,这是一种启发式搜索算法。它先通过简单的区域划分算法将图片划分成很多小区域,然后通过层级分组方法按照一定相似度合并它们,最后的剩下的就是候选区域,它们可能包含一个物体。
Selective Search方法:上面是分割结果,下面是候选框
对于一张图片,R-CNN基于selective search方法大约生成2000个候选区域,然后每个候选区域被resize成固定大小(227×227)并送入一个CNN模型中,最后得到一个4096-d的特征向量。然后这个特征向量被送入一个多类别SVM分类器中,预测出候选区域中所含物体的属于每个类的概率值。每个类别训练一个SVM分类器,从特征向量中推断其属于该类别的概率大小。为了提升定位准确性,R-CNN最后又训练了一个边界框回归模型。训练样本为(P,G),其中P=(Px,Py,Pw,Ph)为候选区域,而G=(Gx,Gy,Gw,Gh)为真实框,G是与P的IoU最大的真实框(只使用IoU大于0.6的样本),回归器的目标值定义为:
tx=(Gx−Px)/Pw,ty=(Gy−Py)/Ph
tw=log(Gw/Pw),th=log(Gh/Ph)
在做预测时,利用上述公式可以反求出预测框的修正位置。R-CNN对每个类别都训练了单独的回归器,采用最小均方差损失函数进行训练。
R-CNN模型的训练是多管道的,CNN模型首先使用 ImageNet中的图像分类竞赛数据集进行预训练。然后在检测数据集上对CNN模型进行finetuning(微调),其中那些与真实框的IoU大于0.5的候选区域作为正样本,剩余的候选区域是负样本(背景)。共训练两个版本,第一版本使用 PASCAL VOC数据集,第二个版本使用 ImageNet中的目标检测数据集。最后,对数据集中的各个类别训练SVM分类器(注意SVM训练样本与CNN模型的finetuning不太一样,只有IoU小于0.3的才被看成负样本)。
总体来看,R-CNN是非常直观的,就是把检测问题转化为了分类问题,并且采用了CNN模型进行分类,但是效果却很好。最好的R-CNN模型在 PASCAL VOC数据集的mAP为62.4%(比第二名高出了22个百分点),在 ImageNet上的mAP为31.4%(比第二名高出7.1个百分点)。
整体上看R-cnn比较简单,与此同时也有两个重大缺陷:
(1)selective search进行候选区域提取的过程在cpu内计算完成,占用了大量计算时间。
(2)对2000个候选框进行卷积计算,提取特征的时候,存在大量的重复计算,进一步增加了计算复杂度。
针对以上两个缺点,R Girshick分别在fast-Rcnn和faster-rcnn中进行了改进。注意fast rcnn解决的是缺陷(2),faster-rcnn解决的是缺陷(1)
2. 2 fast-rcnn (原文连接)
2.2.1 spp-net
由于fast-rcnn借鉴了ssp-net的思想,所以先来了解一下spp-net(原文连接)
在rcnn种需要对2000个候选框进行卷积特征计算,而这2000个候选框是来自与同一张图片的,所以,作者考虑到先对整张图片进行一次卷积计算,得到整张图片的卷积特征,然后依据每个候选框在原始图片中的位置,在卷积特征图中取出对应的区域的卷积特征。再将卷积图中得到的特征向量送入分类器,在这里产生了一个问题,就是每个候选框的大小是不一样的,得到的卷积特征的维度也会不一样,无法送入全连接层,导致分类无法进行,为了将所有候选框的特征维度统一起来,作者就设计了spp-net:
SPP层原理如下所所示,假定CNN层得到的特征图大小为a×a(比如13×13,随输入图片大小而变化),设定的金字塔尺度为n×n bins(对于不同大小图片是固定的),那么SPP层采用一种滑动窗口池化,窗口大小win_size=⌈a/n⌉,步为stride=⌊a/n⌋,采用max pooling,本质上将特征图均分为n×n个子区域,然后对各个子区域max pooling,这样不论输入图片大小,经过SPP层之后得到是固定大小的特征。一般设置多个金字塔级别,文中使用了4×4,2×2和1×1三个尺度。每个金字塔都得一个特征,将它们连接在一起送入后面的全连接层即可,这样就解决了变大小图片输入的问题了。SPP-net在ImageNet ILSVRC 图像分类大赛中夺得了第三名。
SPP-net中的空间金字塔池化层
那么SPP-net和R-CNN有什么关系呢?在R-CNN中,由于每个候选区域大小是不同,所以需要先resize成固定大小才能送入CNN网络,SPP-net正好可以解决这个问题。R-CNN每次都要挨个使用CNN模型计算各个候选区域的特征,这是极其费时的,不如直接将整张图片送入CNN网络,然后抽取候选区域的对应的特征区域,采用SPP层,这样可以大大减少计算量,并提升速度。基于SPP层的R-CNN模型在准确度上提升不是很大,但是速度却比原始R-CNN模型快24-102倍。
2.2.2 ROI pooling layer
在fast-rcnn中作者采用了spp-net的简化版:只对spp-net进行了一种尺度的切分,之后直接下采样,得到特征向量。
对于每个候选区域,使用RoI pooling层来从CNN特征图中得到一个固定长和宽的特征图(长和宽是超参数,文中选用7×77×7),RoI pooling的原理很简单,其根据候选区域按比例从CNN特征图中找到对应的特征区域,然后将其分割成几个子区域(根据要输出的特征图的大小),然后在每个子区域应用max pooling,从而得到固定大小的特征图,这个过程是可导的。RoI pooling层相比SPP层看起来主要是只使用一个金字塔级别。然后RoI pooling层得到的特征图送入几个全连接层中,并产生新的特征向量,这些特征向量分别用于一个softmax分类器(预测类别)和一个线性回归器上(用于调整边界框位置)来进行检测。在实现上是使用两个不同的全连接层,第一个全连接层有N+1N+1个输出(NN是类别总数,11是背景),表示各个类别的概率值;第二个全连接层有4N4N个输出,表示坐标回归值(tx,ty,tw,th)(tx,ty,tw,th),这个与R-CNN是一样的,每个类别都预测4个位置坐标值。
2.2.3 fast-rcnn整体框架
Fast R-CNN(FastRegion-based Convolutional Network, R. Girshick )的提出主要是为了减少候选区域使用CNN模型提取特征向量所消耗的时间,其主要借鉴了SPP-net的思想。在R-CNN中,每个候选区域都要单独送入CNN模型计算特征向量,这是非常费时的,而对于Fast R-CNN,其CNN模型的输入是整张图片,然后结合RoIs(Region of Interests)pooling和Selective Search方法从CNN得到的特征图中提取各个候选区域的所对应的特征。
用selective search 方法从原始图片中提取2000个候选框(ROI),对整张图片进行卷积计算,得到卷积特征图(conv feature map),然后利用ROI pooling layer从卷积特征图种提取每个候选框的特征向量,通过全连接层之后,特征向量进入两个输出层:一个进行分类,判断该候选框内的物体种类,另一个进行边框回归,判断目标在图中的准确位置。
Fast R-CNN的分类与回归预测. 来源
RoI pooling原理图,特征图大小为8x8,候选区域为5x7,输出2x2. 来源
所以容易看见,Fast RCNN相对于RCNN的提速原因就在于:不过不像RCNN把每个候选区域给深度网络提特征,而是整张图提一次特征,再把候选框映射到conv5上,而SPP只需要计算一次特征,剩下的只需要在conv5层上操作就可以了。
Fast R-CNN模型结构图
最好的Fast R-CNN模型在 PASCAL VOC测试集上的mAp为70%,在 PASCAL VOC测试集上的mAP为68.8%,而在 PASCAL VOC测试集上的mAP为68.4%,准确度相比R-CNN略有提升,主要是速度更快。
2.3 faster-rcnn (原文连接)
2.3.1 PRN网络
对于Fast R-CNN,其仍然需要selective search方法来生产候选区域,这是非常费时的。我们能不能找出一个更加高效的方法来求出这些候选框呢?为了解决这个问题,我们加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了,做这样的任务的神经网络叫做Region Proposal Network(RPN),用RPN来直接产生候选区域。Faster R-CNN可以看成是RPN和Fast R-CNN模型的组合体,即Faster R-CNN = RPN + Fast R-CNN。
对于RPN网络,先采用一个CNN模型(一般称为特征提取器)接收整张图片并提取特征图。然后在这个特征图上采用一个N×NN×N(文中是3×33×3)的滑动窗口,对于每个滑窗位置都映射一个低维度的特征(如256-d)。然后这个特征分别送入两个全连接层,一个用于分类预测,另外一个用于回归。对于每个窗口位置一般设置kk个不同大小或比例的先验框(anchors, default bounding boxes),这意味着每个位置预测kk个候选区域(region proposals)。对于分类层,其输出大小是2k2k,表示各个候选区域包含物体或者是背景的概率值,而回归层输出4k4k个坐标值,表示各个候选区域的位置(相对各个先验框)。对于每个滑窗位置,这两个全连接层是共享的。因此,RPN可以采用卷积层来实现:首先是一个n×nn×n卷积得到低维特征,然后是两个1×11×1的卷积,分别用于分类与回归。
为了提取候选框,作者使用了一个小的神经网络也即就是一个n×n的卷积核(文中采用了3×3的网络),在经过一系列卷积计算的特征图上进行滑移,进行卷积计算。每一个滑窗计算之后得到一个低维向量,得到的特征向量,送入两种层:一种是边框回归层进行定位,另一种是分类层判断该区域是前景还是背景。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。
可以看到RPN采用的是二分类,仅区分背景与物体,但是不预测物体的类别,即class-agnostic(无视类别)。由于要同时预测坐标值,在训练时,要先将先验框与ground-truth box进行匹配,原则为:(1)与某个ground-truth box的IoU最高的先验框;(2)与某个ground-truth box的IoU值大于0.7的先验框,只要满足一个,先验框就可以匹配一个ground-truth,这样该先验框就是正样本(属于物体),并以这个ground-truth为回归目标。对于那些与任何一个ground-truth box的IoU值都低于0.3的先验框,其认为是负样本。RPN网络是可以单独训练的,并且单独训练出来的RPN模型给出很多region proposals。由于先验框数量庞大,RPN预测的候选区域很多是重叠的,要先进行NMS(non-maximum suppression,非极大抑制)操作来减少候选区域的数量,然后按照置信度降序排列,选择top-N个region proposals来用于训练Fast R-CNN模型。
Faster R-CNN模型采用一种4步迭代的训练策略:
(1)首先在ImageNet上预训练RPN,并在PASCAL VOC数据集上finetuning;
(2)使用训练的PRN产生的region proposals单独训练一个Fast R-CNN模型,这个模型也先在ImageNet上预训练;
(3)用Fast R-CNN的CNN模型部分(特征提取器)初始化RPN,然后对RPN中剩余层进行finetuning,此时Fast R-CNN与RPN的特征提取器是共享的;
(4)固定特征提取器,对Fast R-CNN剩余层进行finetuning。
这样经过多次迭代,Fast R-CNN可以与RPN有机融合在一起,形成一个统一的网络。其实还有另外一种近似联合训练策略,将RPN的2个loss和Fast R-CNN的2个loss结合在一起,然后共同训练。注意这个过程,Fast R-CNN的loss不对RPN产生的region proposals反向传播,所以这是一种近似(如果考虑这个反向传播,那就是非近似联合训练)。应该来说,联合训练速度更快,并且可以训练出同样的性能。
2.3.2 faster-rcnn 整体思路
首先对整张图片进行卷积计算,得到卷积特征,然后利用RPN进行候选框选择,再返回卷积特征图取出候选框内的卷积特征利用ROI提取特征向量最终送入全连接层进行精确定位和分类,总之:RPN+fast-rcnn=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系列目标检测方法是当前目标最主要的一个分支。
2.4 各算法步骤总结
最后总结一下各大算法的步骤:
RCNN
1. 在图像中确定约1000-2000个候选框 (使用选择性搜索)
2. 每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取
3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4. 对于属于某一特征的候选框,用回归器进一步调整其位置
Fast RCNN
1. 在图像中确定约1000-2000个候选框 (使用选择性搜索)
2. 对整张图片输进CNN,得到feature map
3. 找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层
4. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
5. 对于属于某一特征的候选框,用回归器进一步调整其位置
Faster RCNN
1. 对整张图片输进CNN,得到feature map
2. 卷积特征输入到RPN,得到候选框的特征信息
3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4. 对于属于某一特征的候选框,用回归器进一步调整其位置
3 使用回归方法进行目标检测
尽管faster-rcnn在计算速度方面已经取得了很大进展,但是仍然无法满足实时检测的要求,因此有人提出力基于回归的方法直接从图片种回归的出目标物体的位置以及种类。具有代表性的两种方法是YOLO和SSD。
3.1 YOLO (原文连接)
3.1.1 整体思路
(1) 给个一个输入图像,首先将图像划分成7*7的网格(2) 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
(3)根据上一步可以预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后非极大值抑制去除冗余窗口即可。
可以看到整个过程非常简单,不需要中间的region proposal在找目标,直接回归便完成了位置和类别的判定。
3.1.2 网络结构
YOLO的网络结构图,前边的网络结构跟GoogLeNet的模型比较类似,主要的是最后两层的结构,卷积层之后接了一个4096维的全连接层,然后后边又全连接到一个7*7*30维的张量上。实际上这7*7就是划分的网格数,现在要在每个网格上预测目标两个可能的位置以及这个位置的目标置信度和类别,也就是每个网格预测两个目标,每个目标的信息有4维坐标信息(中心点坐标+长宽),1个是目标的置信度,还有类别数20(VOC上20个类别),总共就是(4+1)*2+20 = 30维的向量。这样可以利用前边4096维的全图特征直接在每个网格上回归出目标检测需要的信息(边框信息加类别)。
Yolo方法的缺点显而易见,虽然舍弃了Region proposal阶段,加快了速度,但是定位精度比较低,与此同时带来的问题是,分类的精度也比较低。
3.2 SSD(原文连接)
鉴于yolo定位精度低的缺陷,SSD 结合faster-rcnn的archor机制和yolo的回归思想进行目标检测,使得定位精度和分类精度相较与yolo都有了大幅度的提高。
3.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滑窗感受野不同).
3.2.2 SSD整体框架
首先第一步和其他方法一样利用卷积操作提取卷积特征,在最后级层卷积时候开始对与每一种尺度上的特征图运用archor方法进行候选框提取,依据archor在不同尺度上得到的候选框,进行目标种类和位置的判断。
3.2.3 小结
ssd和yolo采用了回归方法进行目标检测使得目标检测速度大大加快,ssd引入faster-rcnn的archor机制使得目标定位和分类精度都较yolo有了大幅度提高。基于回归方法的目标检测基本达到了实时的要求,是目标检测的另一个主要思路。
4 目标检测方法最新进展
1、结合上下文特征进行目标检测。对于某一类物体,它的周围出现的内容将很好的对其位置进行锁定。
2、多特征融合。除了利用高维的卷积操作之后的特征之外,同时应该结合低维的卷积特征进行目标检测检测,以便更好的利用细节信息。
3、使用循环神经网络(RNN)进行目标检测。目前主流的图像处理方法一般都是基于cnn的,其实RNN的很多特性或许能在目标检测问题上产生意想不到的效果。例如Girshick的Inside-Outside-Net。
如果觉得《深度学习目标检测方法综述》对你有帮助,请点赞、收藏,并留下你的观点哦!