window
spoticiL(amidpoolingIiser
含convolutionallayers
inputim;ige
fulh-c*winec(edlayers(ft?
)
上图对应的就是SPPNET的网络结构图,任意给一张图像输入到CNN,经过卷积操作我们可以得到卷积特征(比如VGG16最后的卷积层为conv5_3,共产生512张特征图)。
图中的window是就是原图一个regionproposal对应到特征图的区域,只需要将这些不同大小window的特征映射到同样的维度,将其作为全连接的输入,就能保证只对图像提取一次卷积层特征。
SPPNET使用了空间金字塔
采样(spatialpyramidpooling):
将每个window划分为4*4,2*2,1*1的块,然后每个块使用max-pooling下采样,这样对于每个window经过SPP层之后都得到了一个长度为(4*4+2*2+1)*512维度的特征向量,将这个作为全连接层的输入进行后续操作。
小结:
使用SPPNET相比于R-CNN可以大大加快目标检测的速度,但是依然存在着很多问题:
(1)训练分为多个阶段,步骤繁琐:
微调网络+训练SVM+训练训练边框回归器
⑵SPPNET在微调网络的时候固定了卷积层,只对全连接层进行微调,而对于一个新的任务,有必要对卷积层也进行微调。
(分类的模型提取的特征更注重
高层语义,而目标检测任务除了语义信息还需要目标的位置信息)针对这两个
问题,RBG又提出FastRCNN,—个精简而快速的目标检测框架。
3.FastR-CNN(ICCV2015)
有了前边R-CNN和SPPNET的介绍,我们直接看FastRCNN的框架图:
Deeo
ConvNet
project!
oriV
Comx
featuremap
softmax
Rolfeature
与R-CNN框架图对比,可以发现主要有两处不同:
一是最后一个卷积层后
加了一个ROIpoolinglaye,二是损失函数使用了多任务损失函数(multi-taskloss),
将边框回归直接加入到CNN网络中训练。
(1)ROIpoolinglayer实际上是SPPNET的一个精简版,SPPNET对每个
proposal使用了不同大小的金字塔映射,而ROIpoolinglayer只需要下采样到一
个7x7的特征图。
对于VGG16网络conv5_3有512个特征图,这样所有regionproposal对应了一个7*7*512维度的特征向量作为全连接层的输入。
(2)R-CNN训练过程分为了三个阶段,而FastR-CNN直接使用softmax替代SVM分类,同时利用多任务损失函数边框回归也加入到了网络中,这样整个的训练过程是端到端的(除去regionproposal提取阶段)。
3FastR-CNN在网络微调的过程中,将部分卷积层也进行了微调,取得了更好的检测效果。
小结:
FastR-CNN融合了R-CNN和SPPNET的精髓,并且引入多任务损失函数,使整个网络的训练和测试变得十分方便。
在PascalVOC2007训练集上训练,
在VOC2007测试的结果为66.9%(mAP)如果使用VOC2007+2012训练集训练,在VOC2007上测试结果为70%(数据集的扩充能大幅提高目标检测性能)。
使用VGG16每张图像总共需要3s左右。
缺点:
regionproposal的提取使用selectivesearch,目标检测时间大多消耗在这上面(提regionproposal2~3s,而提特征分类只需0.32s),无法满足实时应用,而且并没有实现真正意义上的端到端训练测试(regionproposal使用selectivesearch先提取处来)。
那么有没有可能直接使用CNN直接产生regionproposal并对其分类?
FasterR-CNN框架就是符合这样需要的目标检测框架。
4.FasterR-CNN(NIPS2015)(FasterR-CNN:
TowardsReal-TimeObjectDetectionwithRegionProposalNetworks)
在regionproposal+CNN分类的这种目标检测框架中,regionproposal质量好坏直接影响到目标检测任务的精度。
如果找到一种方法只提取几百个或者更少的高质量的预选窗口,而且召回率很高,这不但能加快目标检测速度,还能提高目标检测的性能(假阳例少)°RPN(RegionProposalNetwork网络应运而生。
RPN的核心思想是使用卷积神经网络直接产生regionproposal,使用的方法本质上就是滑动窗口。
RPN的设计比较巧妙,RPN只需在最后的卷积层上滑动一遍,因为anchor机制和边框回归可以得到多尺度多长宽比的regionproposal。
¥scores
4^coordinates
kanchorbo?
ces
/neglayer
c/jlayer
#
256-d
f
intennediiitelaxei-V---
我们直接看上边的RPN网络结构图(使用了ZF模型),给定输入图像(假设分辨率为600*1000),经过卷积操作得到最后一层的卷积特征图(大小约为40*60)。
在这个特征图上使用3*3的卷积核(滑动窗口)与特征图进行卷积,最后一层卷积层共有256个featuremap,那么这个3*3的区域卷积后可以获得一个256维的特征向量,后边接cislayer和reglayer分别用于分类和边框回归(跟FastRCNN类似,只不过这里的类别只有目标和背景两个类别)。
3*3滑窗对应的每个特征区域同时预测输入图像3种尺度(128,256,512),3种长宽比(1:
1,1:
2,2:
1)的regionproposal,这种映射的机制称为anchor。
所以对于这个40*60的featuremap,总共有约20000(40*60*9)个anchor,也就是预测20000个regionproposal0这样
设计的好处是什么呢?
虽然现在也是用的滑动窗口策略,但是:
滑动窗口操作是
在卷积层特征图上进行的,维度较原始图像降低了16*16倍(中间经过了4次
2*2的pooling操作);多尺度采用了9种anchor,对应了三种尺度和三种长宽比,加上后边接了边框回归,所以即便是这9种anchor外的窗口也能得到一个跟目标比较接近的regionproposaloNIPS2015版本的FasterRCNN使用的检测框架
是RPN网络+FastRCNN网络分离进行的目标检测,整体流程跟FastRCNN—样,只是regionproposal现在是用RPN网络提取的(代替原来的selectivesearch)o同时作者为了让RPN的网络和FastRCNN网络实现卷积层的权值共享,训练RPN和FastRCNN的时候用了4阶段的训练方法:
⑴使用在ImageNet上预训练的模型初始化网络参数,微调RPN网络;
(2)使用⑴中RPN网络提取regionproposal训练FastRCNN网络;
(3)使用⑵的FastRCNN网络重新初始化RPN,固定卷积层进行微调;
⑷固定⑵中FastRCNN的卷积层,使用⑶中RPN提取的regionproposal微调网络。
权值共享后的RPN和FastRCNN用于目标检测精度会提高一些。
使用训练好的RPN网络,给定测试图像,可以直接得到边缘回归后的regionproposal,根据regionproposal的类别得分对RPN网络进行排序,并选取前300个窗口作为FastR-CNN的输入进行目标检测,使用VOC07+12训练集训练,VOC2007测试集测试mAP达到73.2%(selectivesearch+Fast甩NN是70%),目标检测的速度可以达到每秒5帧(selectivesearch+Fast-CNN是2~3s一张))需要注意的是,最新的版本已经将RPN网络和FastRCNN网络结合到了一起一一将RPN获取到的proposal直接连到ROIpooling层,这才是一个真正意义上的使用一个CNN网络实现端到端目标检测的框架。
小结:
FasterRCNN将一直以来分离的regionproposal和CNN分类融合到了一起,使用端到端的网络进行目标检测,无论在速度上还是精度上都得到了不错的提高。
然而FasterRCNN还是达不到实时的目标检测,预先获取regionproposal,然后在对每个proposal分类计算量还是比较大。
比较幸运的是YOLC这类目标检测方法的出现让实时性也变的成为可能。
总的来说,从R-CNN,SPP-NET,FastR-CNN,FasterR-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。
可以说基于regionproposal的R-CNN系列目标检测方法是当前目标最主要的一个分支。
三、基于回归方法的深度学习目标检测算法
FasterRCNN的方法目前是主流的目标检测方法,但是速度上并不能满足实时的要求。
YOLO—类的方法慢慢显现出其重要性,这类方法使用了回归的思想,既给定输入图像,直接在图像的多个位置上回归出这个位置的目标边框以及目标类别。
1.YOLO(CVPR2016,oral)(YouOnlyLookOnce:
Unified,
5x5gridoninput
Boundingboxesh-confidence
Classprobabilitymap
Finaldetection?
Real-TimeObjectDetection)
我们直接看上面YOLO的目标检测的流程图:
(1)给个一个输入图像,首先将图像划分成7*7的网格
(2)对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
(3)根据上一步可以预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可。
可以看到整个过程非常简单,不需要中间的regionproposal在找目标,直接回归便完成了位置和类别的判定。
toil"LqyQr
Mocpc□!
L-oyep
2x2Jr2
Cflnr.SyurCo«vIfljfcn
3i3d?
IMil28
MdKRolLsytF1胡』$右
2*1+2hl^AA
MgRpeplL#)f#F
2n2>2
Cpnnla严rCvnnloytr
Con*loysnCcr™C«ri¥
1jIi256141j1ji512办"10如
3x3*5)213x3JO24J3^10^4
hU3)2J曲MO备
血曲1也丄Judidgl槪
Macpp^lla呷
2x2^2
那么如何才能做到直接在不同位置的网格上回归出目标的位置和类别信息呢?
上面是YOLO的网络结构图,前边的网络结构跟GoogLeNet的模型比较类似,主要的是最后两层的结构,卷积层之后接了一个4096维的全连接层,然后后边又
全连接到一个7*7*30维的张量上。
实际上这7*7就是划分的网格数,现在要在每个网格上预测目标两个可能的位置以及这个位置的目标置信度和类别,也就是每个网格预测两个目标,每个目标的信息有4维坐标信息(中心点坐标+长宽),1
个是目标的置信度,还有类别数20(VOC上20个类别),总共就是(4+1)*2+20=30维的向量。
这样可以利用前边4096维的全图特征直接在每个网格上回归出目标检测需要的信息(边框信息加类别)。
小结:
YOLO#目标检测任务转换成一个回归问题,大大加快了检测的速度,使得YOLO可以每秒处理45张图像。
而且由于每个网络预测目标窗口时使用的是全图信息,使得falsepositive比例大幅降低(充分的上下文信息)。
但是YOLO也存在问题:
没有了regionproposal机制,只使用7*7的网格回归会使得目标不能非常精准的定位,这也导致了YOLO的检测精度并不是很高。
2.SSD(SSD:
SingleShotMultiBoxDetector)
上面分析了YOLO存在的问题,使用整图特征在7*7的粗糙网格内回归对目标的定位并不是很精准。
那是不是可以结合regionproposal的思想实现精准一些的定位?
SSD吉合YOLO的回归思想以及FasterR-CNN的anchor机制做到了这点。
a
一4
1
Th
TI
11
1,(
1F1
n
H
J
■-S
L-4
C
三
曲-
■
Lj
1*1
L
■■
7
(l>)8x8featuremap(c)4X4fealwrinnp
h)[flWMl】GT
上图是SSD的一个框架图,首先SSD获取目标位置和类别的方法跟YOLC一
样,都是使用回归,但是YOLO预测某个位置使用的是全图的特征,SSD预测某
个位置使用的是这个位置周围的特征(感觉更合理一些)。
那么如何建立某个位
置和其特征的对应关系呢?
可能你已经想到了,使用FasterR-CNN的anchor机
制。
如SSD的框架图所示,假如某一层特征图(图b)大小是8*8,那么就使用3*3的滑窗提取每个位置的特征,然后这个特征回归得到目标的坐标信息和类别信息
(图c)。
不同于FasterR-CNN,这个anchor是在多个featuremap上,这样可以利用多层的特征并且自然的达到多尺度(不同层的featuremap3*3滑窗感受野不同)。
小结:
SSD结合了YOLO中的回归思想和FasterRCNN中的anchor机制,使用全图各个位置的多尺度区域特征进行回归,既保持了YOLO速度快的特性,也保证了窗口预测的跟FasterR-CNN一样比较精准。
SSD在VOC2OO7上mAP可以
达到72.1%,速度在GPU上达到58帧每秒。
总结:
YOLO的提出给目标检测一个新的思路,SSD的性能则让我们看到了目标检测在实际应用中真正的可能性。
四.提高目标检测方法R-CNN系列目标检测框架和YOLO目标检测框架给了我们进行目标检测的两个基本框架。
除此之外,研究人员基于这些框架从其他方面入手提出了一系列提高目标检测性能的方法。
(1)难分样本挖掘(hardnegativemining)R-CNN在训练SVM分类器时使
用了难分样本挖掘的思想,但FastRCNN和FasterRCNN由于使用端到端的训练策略并没有使用难分样本挖掘(只是设置了正负样本的比例并随机抽取)。
CVPR2016的TrainingRegion-basedObjectDetectorswith