目标检测学习总结之RCNN、SPP-net、Fast RCNN、Faster RCNN、YOLO、SSD的区别

目标检测学习总结之RCNN、SPP-net、Fast RCNN、Faster RCNN、YOLO、SSD的区别

在计算机视觉领域,“目标检测”主要解决两个问题:图像上多个目标物在哪里(位置),是什么(类别)。 
围绕这个问题,人们一般把其发展历程分为3个阶段: 
1. 传统的目标检测方法 
2. 以R-CNN为代表的结合region proposal和CNN分类的目标检测框架(R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN, R-FCN) 

3. 以YOLO为代表的将目标检测转换为回归问题的端到端(End-to-End)的目标检测框架(YOLO, SSD)

一、传统的目标检测方法

传统目标检测的方法一般分为三个阶段:首先在给定的图像上选择一些候选的区域,然后对这些区域提取特征,最后使用训练的分类器进行分类。分别如下: 
a)区域选择:利用不同尺寸的滑动窗口框住图中的某一部分作为候选区域。 
b)特征提取:提取候选区域相关的视觉特征。比如人脸检测常用的Harr特征;行人检测和普通目标检测常用的HOG特征等。由于目标的形态多样性,光照变化多样性,背景多样性等因素使得设计一个鲁棒的特征并不是那么容易,然而提取特征的好坏直接影响到分类的准确性。 
c)分类器:利用分类器进行识别,比如常用的SVM模型。

传统的目标检测中,多尺度形变部件模型DPM(Deformable Part Model)表现比较优秀,连续获得VOC(Visual Object Class)2007到2009的检测冠军。DPM把物体看成了多个组成的部件(比如人脸的鼻子、嘴巴等),用部件间的关系来描述物体,这个特性非常符合自然界很多物体的非刚体特征。DPM可以看做是HOG+SVM的扩展,很好的继承了两者的优点,在人脸检测、行人检测等任务上取得了不错的效果,但是DPM相对复杂,检测速度也较慢,从而也出现了很多改进的方法。

总结:传统目标检测存在的两个主要问题:

  • 基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余。
  • 手工设计的特征对于多样性的变化并没有很好的鲁棒性。

二、两阶段检测

1. RCNN

扫描二维码关注公众号,回复: 5407625 查看本文章

R-CNN的目标检测流程: 

a) 输入图像,用selective search(选择性搜索)算法在图像中提取2000个左右的region proposal(侯选框),并把所有region proposal warp(缩放)成固定大小(原文采用227×227) 。

补充:selective search

选择性搜索综合了蛮力搜索(exhaustive search)和分割(segmentation)的方法。选择性搜索意在找出可能的目标位置来进行物体的识别。

https://blog.csdn.net/charwing/article/details/27180421

https://blog.csdn.net/zizi7/article/details/70274050

 

我们首先用[13]得到一些初始化的区域R={r1,….rn}
计算出每个相邻区域的相似性s(ri,rj)
1.找出相似性最大的区域max(S)={ri,rj}
2.合并rt=ri∪rj
3.从S集合中,移走所有与ri,rj相关的数据
4.计算新集合rt与所有与它相邻区域的相似性s(rt,r*)
5.R=R∪rt

直到S集合为空,重复1~5。

Selective Search方法从一种图片生成约2000个候选区域,采用一种过分割的手段,将图像分割成小区域,然后bottom-up,合并可能性最高的两个区域,重复合并,直到整张图像上合并成一个区域为止。
输出所有曾经存在过的区域,就是候选区域。

相似度计算:考虑了颜色(颜色直方图,像素值统计)、纹理(梯度统计)、尺寸和空间交叠(交叠越大越相似)这4个参数

b) 将归一化后的region proposal输入CNN网络,提取特征 

c) 对于每个region proposal提取到的CNN特征,再用SVM分类来做识别,用线性回归来微调边框位置与大小,其中每个类别单独训练一个边框回归(bounding-box regression)器。

总结:R-CNN框架仍存在如下问题: 

a) 重复计算:我们通过regionproposal提取2000个左右的候选框,这些候选框都需要进行CNN操作,计算量依然很大,其中有不少其实是重复计算

b) multi-stage pipeline,训练分为多个阶段,步骤繁琐:region proposal、CNN特征提取、SVM分类、边框回归

c) 训练耗时,占用磁盘空间大:卷积出来的特征数据还需要单独保存

R-CNN 利用候选区域方法创建了约 2000 个 ROI。这些区域被转换为固定大小的图像,并分别馈送到卷积神经网络中(将原始图像根据ROI切割、reshape再送进NN学习)。该网络架构后面会跟几个全连接层,以实现目标分类并提炼边界框。

使用候选区域、CNN、仿射层来定位目标。以下是 R-CNN 整个系统的流程图:

通过使用更少且更高质量的 ROI,R-CNN 要比滑动窗口方法更快速、更准确。

ROIs = region_proposal(image)
for ROI in ROIs:
    patch = get_patch(image, ROI) 

    results = detector(pach)

 

2. SPP-net

SPP-net的主要思想是去掉了原始图像上的crop/warp等操作,换成了在卷积特征上的空间金字塔池化层(Spatial Pyramid Pooling,SPP)。

为何要引入SPP层?一部分原因是fast R-CNN里对图像进行不同程度的crop/warp会导致一些问题,比如上图中的crop会导致物体不全,warp导致物体被拉伸后形变严重。但更更更重要的原因是:fast R-CNN里我们对每一个region proposal都要进行一次CNN提取特征操作,这样带来了很多重复计算。试想假如我们只对整幅图像做一次CNN特征提取,那么原图一个regionproposal可以对应到featuremap(特征图)一个window区域,只需要将这些不同大小window的特征映射到同样的维度,将其作为全连接的输入,就能保证只对图像提取一次卷积层特征

SPP就是为了解决这种问题的。SPP使用空间金字塔采样(spatial pyramid pooling)将每个window划分为4*4, 2*2, 1*1的块,然后每个块使用max-pooling下采样,这样对于每个window经过SPP层之后都得到了一个长度为(4*4+2*2+1)*256维度的特征向量,将这个作为全连接层的输入进行后续操作。

总结:使用SPP-NET大大加快了目标检测的速度,但是依然存在着很多问题: 

a) 训练分为多个阶段,依然步骤繁琐 
b) SPP-NET在微调网络时固定了卷积层,只对全连接层进行微调,而对于一个新的任务,有必要对卷积层也进行微调。(分类的模型提取的特征更注重高层语义,而目标检测任务除了语义信息还需要目标的位置信息)(这一点其实不是很懂啊)

3. Fast-RCNN

Fast-RCNN在RCNN的基础上又做了一些改进:

  • 与SPP类似,它只对整幅图像做一次CNN特征提取,在后面加了一个类似于SPP的ROI pooling layer,其实就是下采样。不过因为不是固定尺寸输入,因此每次的pooling网格大小需要动态调整,从而实现区域归一化。
  • 用softmax替代SVM分类,同时利用Multi-task Loss(多任务损失函数)将边框回归和分类一起进行。

这里再说一下Fast-RCNN的主要步骤: 

a) 特征提取:以整张图片为输入利用CNN得到图片的特征层; 
b) region proposal:通过Selective Search等方法从原始图片提取区域候选框,并把这些候选框一一投影到最后的特征层; 
c) 区域归一化:针对特征层上的每个区域候选框进行RoI Pooling操作,得到固定大小的特征表示; ROI pooling可以 speed up both train and test time
d) 分类与回归:然后再通过两个全连接层,分别用softmax做多目标分类,用回归模型进行边框位置与大小微调。
 

总结:Fast-RCNN确实做得很棒,其缺点在于:region proposal的提取使用selective search,目标检测时间大多消耗在这上面(提region proposal 2~3s,而提特征分类只需0.32s),无法满足实时应用。

  • K+1:分别属于K类和背景的概率
  • 4*(K+1): 分别属于K类和背景时,应该平移缩放的参数

Fast-RCNN 使用特征提取器(CNN)先提取整个图像的特征,而不是从头开始对每个图像块提取多次。然后,我们可以将创建候选区域的方法直接应用到提取到的特征图上。例如,Fast-RCNN 选择了 VGG16 中的卷积层 conv5 输出的 Feture Map 来生成 ROI,这些关注区域随后会结合对应的特征图以裁剪为特征图块,并用于目标检测任务中。我们使用 ROI 池化将特征图块转换为固定的大小,并馈送到全连接层进行分类和定位。因为 Fast-RCNN 不会重复提取特征,因此它能显著地减少处理时间。

以下是 Fast-RCNN 的流程图:

在下面的伪代码中,计算量巨大的特征提取过程从 For 循环中移出来了,因此速度得到显著提升。Fast-RCNN 的训练速度是 RCNN 的 10 倍,推断速度是后者的 150 倍。

feature_maps = process(image)
ROIs = region_proposal(feature_maps)
for ROI in ROIs:
    patch = roi_pooling(feature_maps, ROI) 
    results = detector2(patch)

 

4. Faster-RCNN:(RPN + Fast-RCNN)

Faster-RCNN用RPN获得的proposal替代Fast-RCNN中selective search获取的proposal(使用卷积神经网络直接产生region proposal)。

RPN网络的作用是输入一张图像,输出一批矩形候选区域,类似于以往目标检测中的Selective Search一步。网络结构是基于卷积神经网络,但输出包含二类softmax和bbox回归的多任务模型。

以ZF网络为例:

其中,虚线以上是ZF网络最后一层卷积层前的结构,虚线以下是RPN网络特有的结构。首先是3*3的卷积,然后通过1*1卷积输出分为两路,其中一路输出是目标和非目标的概率,另一路输出box相关的四个参数,包括box的中心坐标x和y,box宽w和长h。

从卷积运算本身而言,卷积相当于滑窗。假如输入图像是1000*600,则经过了几次stride后,map大小缩小了16倍,最后一层卷积层输出大约为60*40大小。因此,在对60*40的map进行滑窗时,以中心像素为基点构造9种anchor映射到原来的1000*600图像中,映射比例为16倍。那么总共可以得到60*40*9大约2万个anchor。

假如某anchor与任一目标区域的IoU>0.7,则判定为有目标。

RPN网络得到的大约2万个anchor不是都直接给Fast-RCNN,因为有很多重叠的框。文章通过非极大值抑制的方法,设定IoU为0.7的阈值,即仅保留覆盖率不超过0.7的局部最大分数的box(粗筛)。最后留下大约2000个anchor,然后再取前N个box(比如300个)给Fast-RCNN。Fast-RCNN将输出300个判定类别及其box,对类别分数采用阈值为0.3的非极大值抑制(精筛),并仅取分数大于某个分数的目标结果(比如,只取分数60分以上的结果)。

窗口分类和位置精修

1)分类层(cls_score)输出每一个位置上,9个anchor属于前景和背景的概率。

2)窗口回归层(bbox_pred)输出每一个位置上,9个anchor对应窗口应该平移缩放的参数(x,y,w,h)。

对于每一个位置来说,分类层从256维特征中输出属于前景和背景的概率;窗口回归层从256维特征中输出4个平移缩放参数。

在图5中,要注意,3*3卷积核的中心点对应原图(re-scale,源代码设置re-scale为600*1000)上的位置(点),将该点作为anchor的中心点,在原图中框出多尺度、多种长宽比的anchors。所以,anchor不在conv特征图上,而在原图上。对于一个大小为H*W的特征层,它上面每一个像素点对应9个anchor, 这里有一个重要的参数feat_stride = 16, 它表示特征层上移动一个点,对应原图移动16个像素点(看一看网络中的stride就明白16的来历了)。把这9个anchor的坐标进行平移操作,获得在原图上的坐标。之后根据ground truth label和这些anchor之间的关系生成rpn_labels

VGG16中,13个卷积层的最后一层和RPN提取的区域都输入到RCNN中进行检测。

Faster R-CNN的主要步骤如下: 

a) 特征提取:同Fast R-CNN; 
b) region proposal:在最终的卷积特征层上利用k个不同的矩形框(Anchor Box)进行region proposal;即对每个Anchor Box对应的区域进行object/non-object二分类,并用k个回归模型(各自对应不同的Anchor Box)微调候选框位置与大小 。
feature map上生成region proposal(通过RPN),每张图片大约300个建议窗口。
c) 区域归一化:同fast R-CNN;RoI pooling层 。

d) 分类与回归:进行目标分类,并做边框回归(感觉这一块再做一次边框回归是不是有点重复)。 利用SoftMax Loss和Smooth L1 Loss对分类概率和边框回归(Bounding Box Regression)联合训练。

Faster R-CNN的训练:为了让RPN的网络和Fast R-CNN网络实现卷积层的权值共享,其训练方法比较复杂,简而言之就是迭代的Alternating training。

feature_maps = process(image)
ROIs = region_proposal(feature_maps)  # Expensive!
for ROI in ROIs
    patch = roi_pooling(feature_maps, ROI) 

    results = detector2(patch)

Faster R-CNN 采用与 Fast R-CNN 相同的设计,只是它用内部深层网络代替了候选区域方法。新的候选区域网络(RPN)在生成 ROI 时效率更高,并且以每幅图像10 毫秒的速度运行。

三、单阶段检测(直接通过特征图检测)

1.  YOLO

1)YOLOv1

彻底端到端(End-to-End)的目标检测方法,不需要中间的region proposal在找目标,直接回归便完成了位置和类别的判定。

如果两个小目标同时落入一个格子中,模型也只能预测一个。大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近,因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。YOLO采用了多个下采样层,网络学到的物体特征并不精细,因此也会影响检测效果。

与Faster-RCNN相比,YOLOv1有更加明显的优势,首先fFaster-RCNN需要一个rpn网络代替selective search来找出候选区域,而YOLOv1则直接将7x7这49个区域作为候选区域

(1) 给个一个输入图像,首先将图像划分成7 * 7的网格。
(2) 对于每个网格,每个网格预测2个bounding box(每个box包含5个预测量)以及20个类别概率,总共输出7×7×(2*5+20)=1470个tensor
(3) 根据上一步可以预测出7 * 7 * 2 = 98个目标窗口,然后根据阈值去除可能性比较低的目标窗口,再由NMS去除冗余窗口即可。

YOLOv1使用了end-to-end的回归方法,没有region proposal步骤,直接回归便完成了位置和类别的判定。种种原因使得YOLOv1在目标定位上不那么精准,直接导致YOLO的检测精度并不是很高。

YOLOv1是单阶段方法的开山之作。它将检测任务表述成一个统一的、端到端的回归问题,并且以只处理一次图片同时得到位置和分类而得名。

YOLOv1的主要优点:

  • 快。
  • 全局处理使得背景错误相对少,相比基于局部(区域)的方法, 如Fast-RCNN。
  • 泛化性能好,在艺术作品上做检测时,YOLOv1表现比Fast-RCNN好。

YOLOv1的工作流程如下:

1.准备数据:图片缩放,划分为等分的网格,每个网格按跟GroundTruth的IoU分配到所要预测的样本。

2.卷积网络:由GoogLeNet更改而来,每个网格对每个类别预测一个条件概率值,并在网格基础上生成B个box,每个box预测五个回归值,四个表征位置,第五个表征这个box含有物体(注意不是某一类物体)的概率和位置的准确程度(由IoU表示)。测试时,分数如下计算:

等式左边第一项由网格预测,后两项由每个box预测,以条件概率的方式得到每个box含有不同类别物体的分数。因而,卷积网络共输出的预测值个数为S×S×(B×5+C),其中S为网格数,B为每个网格生成box个数,C为类别数

3.后处理:使用NMS(Non-MaximumSuppression,非极大抑制)过滤得到最后的预测框

损失函数的设计

YOLOv1的损失函数分解,来源:https://zhuanlan.zhihu.com/p/24916786

损失函数被分为三部分:坐标误差、物体误差、类别误差。为了平衡类别不均衡和大小物体等带来的影响,损失函数中添加了权重并将长宽取根号。

小结

YOLOv1提出了单阶段的新思路,相比两阶段方法,其速度优势明显,实时的特性令人印象深刻。但YOLOv1本身也存在一些问题,如划分网格较为粗糙,每个网格生成的box个数等限制了对小尺度物体和相近物体的检测。

2)YOLOv2

YOLOv2与YOLOv1的区别

1)将dropout层去掉,在每个卷积层添加了bach-normalization,mAP提高了2%。

2)高分辨率分类器,输入为高分辨率数据由224*224变为448*448,mAP提高了4%。
3)删除一个pooling层,得到高分辨率数据,在卷积层之后使用anchor代替全连接层,把输入448*448转为416*416,这样得到的feature map为奇数,feature map会有一个中心单元,物体落在中心位置的可能是比较大的,这样可以使用一个中心单元代替四个来预测物体。
4)anchorbox是使用K-mean聚类来确定,聚类的距离计算使用来代替欧式距离。

5)不像YOLOv1使用grid来预测每个grid属于哪种类别的概率Pr(Classi|Object),YOLOv2预测物体类别选用anchorbox的来预测。

6) 预测box坐标是延续YOLOv1预测boundingboxes相对栅格左上角的坐标, 为了确保bounding boxes的中心落在栅格中(即坐标落在0到1之间),boundingbox中心送入到激活函数中来。

对于每个边框预测5个坐标值,tx、ty、tw、th、to。若单元相对图像左上角的偏移为(cx,cy),并且窗口的先验宽高为pw、ph。
7)添加一个passthrough层提高对小物体的检测,此层将高分辨率的feature和低分辨率的feature进行信息融合,通过堆叠不同通道中相邻的特征而非空间位置实现融合高低分辨率的特征,使得26×26×512的特征图转换为与原始特征相连接的13×13×2048的特征图,mAP值提高了1%。

8)YOLOv2网络只用到了卷积层和池化层,因此可以进行动态调整输入图像的尺寸。根据自己的要求调节精度和速度。

2. SSD

YOLO预测某个位置使用的是全图的特征,SSD预测某个位置使用的是这个位置周围的特征。使用Faster R-CNN的anchor机制。

不同于Faster R-CNN,这个anchor是在多个feature map上,这样可以利用多层的特征并且自然的达到多尺度(不同层的feature map 3*3滑窗感受野不同)。

个人感觉SSD模型与Faster RCNN中的RPN很类似。SSD中的dafault bounding box类似于RPN中的anchor,但是,SSD在不同的特征层中考虑不同的尺度,RPN在一个特征层考虑不同的尺度。

提出了 SSD 物体检测模型,与现在流行的检测模型一样,将检测过程整个成一个 single deep neural network。便于训练与优化,同时提高检测速度。SSD 将输出一系列 离散化(discretization) 的 bounding boxes,这些 bounding boxes 是在 不同层次(layers) 上的 feature maps 上生成的,并且有着不同的 aspect ratio。

在 prediction 阶段:

  • 要计算出每一个 default box 中的物体,其属于每个类别的可能性,即 score,得分。如对于 PASCAL VOC 数据集,总共有 20 类,那么得出每一个 bounding box 中物体属于这 20 个类别的每一种的可能性。
  • 同时,要对这些 bounding boxes 的 shape 进行微调,以使得其符合物体的 外接矩形。
  • 还有就是,为了处理相同物体的不同尺寸的情况,SSD 结合了不同分辨率的 feature maps 的 predictions。

刚开始的层使用图像分类模型中的层,称为base network,在此基础上,添加一些辅助结构:

1)       Mult-scale feature map fordetection

在base network后,添加一些卷积层,这些层的大小逐渐减小,可以进行多尺度预测

2)       Convolutional predictorsfor detection

每一个新添加的层,可以使用一系列的卷积核进行预测。对于一个大小为m*n、p通道的特征层,使用3*3的卷积核进行预测,在某个位置上预测出一个值,该值可以是某一类别的得分,也可以是相对于default bounding boxes的偏移量,并且在图像的每个位置都将产生一个值。

3)       Default boxes and aspectratio

在特征图的每个位置预测K个box。对于每个box,预测C个类别得分,以及相对于default bounding box的4个偏移值,这样需要(C+4)*k个预测器,在m*n的特征图上将产生(C+4)*k*m*n个预测值。这里,default bounding box类似于FasterRCNN中anchors。

在训练时,本文的 SSD 与那些用 region proposals + pooling 方法的区别是,SSD 训练图像中的groundtruth 需要赋予到那些固定输出的 boxes 上。在前面也已经提到了,SSD 输出的是事先定义好的,一系列固定大小的 bounding boxes

如下图中,狗狗的 groundtruth 是红色的 bounding boxes,但进行 label 标注的时候,要将红色的 groundtruth box 赋予 图(c)中一系列固定输出的boxes 中的一个,即 图(c)中的红色虚线框。

当这种将训练图像中的groundtruth 与固定输出的 boxes 对应之后,就可以 end-to-end 的进行 lossfunction 的计算以及back-propagation 的计算更新了。

SSD相比YOLO有以下突出的特点:

  • 多尺度的feature map:基于VGG的不同卷积段,输出feature map到回归器中。这一点试图提升小物体的检测精度。
  • 更多的anchor box,每个网格点生成不同大小和长宽比例的box,并将类别预测概率基于box预测(YOLO是在网格上),得到的输出值个数为(C+4)×k×m×n,其中C为类别数,k为box个数,m×n为feature map的大小。

SSD是单阶段模型早期的集大成者,达到跟接近两阶段模型精度的同时,拥有比两阶段模型快一个数量级的速度。后续的单阶段模型工作大多基于SSD改进展开。

总结

两阶段(2-stage)检测模型

两阶段模型因其对图片的两阶段处理得名,也称为基于区域(Region-based)的方法,我们选取RCNN系列工作作为这一类型的代表。

单阶段(1-stage)检测模型

单阶段模型没有中间的区域检出过程,直接从图片获得预测结果,也被成为Region-free方法。

相关资源

目标检测学习总结:

https://blog.csdn.net/NNNNNNNNNNNNY/article/details/68483053

https://www.cnblogs.com/guoyaohua/p/8994246.html

SSD:

https://blog.csdn.net/u013989576/article/details/73439202

猜你喜欢

转载自blog.csdn.net/hyl999/article/details/87891819