一文读懂目标检测之R-CNN系列,YOLO,SSD

一、目标检测常见算法

object detection,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别。所以,object detection要解决的问题就是物体在哪里以及是什么的整个流程问题。

然而,这个问题可不是那么容易解决的,物体的尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方,更何况物体还可以是多个类别。

目前学术和工业界出现的目标检测算法分成3类:

  1. 传统的目标检测算法:Cascade + HOG/DPM + Haar/SVM以及上述方法的诸多改进、优化;

  2. 候选区域/窗 + 深度学习分类:通过提取候选区域,并对相应区域进行以深度学习方法为主的分类的方案,如:
    R-CNN(Selective Search + CNN + SVM)
    SPP-net(ROI Pooling)
    Fast R-CNN(Selective Search + CNN + ROI)
    Faster R-CNN(RPN + CNN + ROI)
    R-FCN等

  3. 基于深度学习的回归方法:YOLO / SSD / DenseBox 等方法;以及最近出现的结合RNN算法的RRC detection;结合DPM的Deformable CNN等

一文读懂目标检测之R-CNN系列,YOLO,SSD_第1张图片
传统目标检测流程
1)区域选择(穷举策略:采用滑动窗口,且设置不同的大小,不同的长宽比对图像进行遍历,时间复杂度高)
2)特征提取(SIFT、HOG等;形态多样性、光照变化多样性、背景多样性使得特征鲁棒性差)
3)分类器分类(主要有SVM、Adaboost等)

二、传统的目标检测算法

2.1 从图像识别的任务说起

这里有一个图像任务:既要把图中的物体识别出来,又要用方框框出它的位置。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第2张图片
这个任务本质上就是这两个问题:一:图像识别,二:定位。

图像识别(classification)
输入:图片
输出:物体的类别
评估方法:准确率
一文读懂目标检测之R-CNN系列,YOLO,SSD_第3张图片
定位(localization)
输入:图片
输出:方框在图片中的位置(x,y,w,h)
评估方法:检测评价函数 intersection-over-union(IOU)
一文读懂目标检测之R-CNN系列,YOLO,SSD_第4张图片
卷积神经网络CNN已经帮我们完成了图像识别(判定是猫还是狗)的任务了,我们只需要添加一些额外的功能来完成定位任务即可。

定位的问题的解决思路有哪些?
思路一:看做回归问题
看做回归问题,我们需要预测出(x,y,w,h)四个参数的值,从而得出方框的位置。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第5张图片
步骤1:
  • 先解决简单问题, 搭一个识别图像的神经网络
  • 在AlexNet VGG GoogleLenet上fine-tuning一下

步骤2:
  • 在上述神经网络的尾部展开(也就说CNN前面保持不变,我们对CNN的结尾处作出改进:加了两个头:“分类头”和“回归头”)
  • 成为classification + regression模式

一文读懂目标检测之R-CNN系列,YOLO,SSD_第6张图片
步骤3:
  • Regression那个部分用欧氏距离损失
  • 使用SGD训练

步骤4:
  • 预测阶段把2个头部拼上
  • 完成不同的功能

这里需要进行两次fine-tuning
第一次在ALexNet上做,第二次将头部改成regression head,前面不变,做一次fine-tuning

Regression的部分加在哪?
有两种处理方法:
  • 加在最后一个卷积层后面(如VGG)
  • 加在最后一个全连接层后面(如R-CNN)

regression太难做了,应想方设法转换为classification问题。
regression的训练参数收敛的时间要长得多,所以上面的网络采取了用classification的网络来计算出网络共同部分的连接权值。

思路二:取图像窗口
  • 还是刚才的classification + regression思路
  • 咱们取不同的大小的“框”
  • 让框出现在不同的位置,得出这个框的判定得分
  • 取得分最高的那个框

左上角的黑框:得分0.5
一文读懂目标检测之R-CNN系列,YOLO,SSD_第7张图片
右上角的黑框:得分0.75
一文读懂目标检测之R-CNN系列,YOLO,SSD_第8张图片
左下角的黑框:得分0.6
一文读懂目标检测之R-CNN系列,YOLO,SSD_第9张图片
右下角的黑框:得分0.8

一文读懂目标检测之R-CNN系列,YOLO,SSD_第10张图片
总结一下思路:
对一张图片,用各种大小的框(遍历整张图片)将图片截取出来,输入到CNN,然后CNN会输出这个框的得分(classification)以及这个框图片对应的x,y,h,w(regression)。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第11张图片
这方法实在太耗时间了,做个优化。
原来网络是这样的:
一文读懂目标检测之R-CNN系列,YOLO,SSD_第12张图片
优化成这样:把全连接层改为卷积层,这样可以提提速。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第13张图片

2.2 物体检测(Object Detection)

当图像有很多物体怎么办的?难度可是一下暴增啊。

那任务就变成了:多物体识别+定位多个物体
那把这个任务看做分类问题?
一文读懂目标检测之R-CNN系列,YOLO,SSD_第14张图片
看成分类问题有何不妥?
  • 你需要找很多位置, 给很多个不同大小的框
  • 你还需要对框内的图像分类
  • 当然, 如果你的GPU很强大, 恩, 那加油做吧…

所以,传统目标检测的主要问题是:
1)基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余
2)手工设计的特征对于多样性的变化没有很好的鲁棒性

看做classification, 有没有办法优化下?我可不想试那么多框那么多位置啊!

三、候选区域/窗 + 深度学习分类

3.1 R-CNN横空出世

有人想到一个好方法:预先找出图中目标可能出现的位置,即候选区域(Region Proposal)。利用图像中的纹理、边缘、颜色等信息,可以保证在选取较少窗口(几千甚至几百)的情况下保持较高的召回率(Recall)。

所以,问题就转变成找出可能含有物体的区域/框(也就是候选区域/框,比如选2000个候选框),这些框之间是可以互相重叠互相包含的,这样我们就可以避免暴力枚举的所有框了。

一文读懂目标检测之R-CNN系列,YOLO,SSD_第15张图片
大牛们发明好多选定候选框Region Proposal的方法,比如Selective Search和EdgeBoxes。那提取候选框用到的算法“选择性搜索”到底怎么选出这些候选框的呢?具体可以看一下PAMI2015的“What makes for effective detection proposals?”

以下是各种选定候选框的方法的性能对比。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第16张图片
下面简单介绍一下选择性搜索( selective search )
在 Two-Stage 的目标检测中,一般是分为两个步骤,1) 先选取有可能存在目标的候选框,2) 然后对候选框进行预测,判断是否是对应的类别。所以选择性搜索干的就是第一步:选取候选框。当然候选框的选取也有很多算法,比如滑窗等,建议读者去看相应的资料。如下图,选择性搜索就是在输入图中找出可能存在目标的候选框,具体步骤如下:
一文读懂目标检测之R-CNN系列,YOLO,SSD_第17张图片
首先通过将图像进行过分割得到若干等区域组成区域的集合 S,这是一个初始化的集合;然后利用颜色、纹理、尺寸和空间交叠等特征,计算区域集里每个相邻区域的相似度;找出相似度最高的两个区域,将其合并为新集并从区域集合中删除原来的两个子集。重复以上的迭代过程,直到最开始的集合 S 为空,得到了图像的分割结果,得到候选的区域边界,也就是初始框。

下图就是上述过程的可视化,难怪有大佬会说,学目标检测,应该先学分割,哈哈哈~
一文读懂目标检测之R-CNN系列,YOLO,SSD_第18张图片

有了候选区域,剩下的工作实际就是对候选区域进行图像分类的工作(特征提取+分类)。对于图像分类,不得不提的是2012年ImageNet大规模视觉识别挑战赛(ILSVRC)上,机器学习泰斗Geoffrey Hinton教授带领学生Krizhevsky使用卷积神经网络将ILSVRC分类任务的Top-5 error降低到了15.3%,而使用传统方法的第二名top-5 error高达 26.2%。此后,卷积神经网络CNN占据了图像分类任务的绝对统治地位。

2014年,RBG(Ross B. Girshick)使用Region Proposal + CNN代替传统目标检测使用的滑动窗口+手工设计特征,设计了**R-CNN(Region-based Convolutional Neural Networks)**框架,使得目标检测取得巨大突破,并开启了基于深度学习目标检测的热潮。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第19张图片
R-CNN的简要步骤如下

  • (1) 输入测试图像
  • (2) 利用选择性搜索Selective Search算法在图像中从下到上提取2000个左右的可能包含物体的候选区域Region Proposal(因为传统的算法这一步产生了非常多的框,由于很多是无效的,所以导致计算资源浪费)
  • (3) 因为取出的区域大小各自不同,所以需要将每个Region Proposal缩放(warp)成统一的227x227的大小(同时在论文中进行缩放之前会将边框扩大 p=16 个像素)并输入到CNN,将CNN的fc7层的输出作为特征
  • (4) 将每个Region Proposal提取到的CNN特征输入到SVM进行分类

具体步骤则如下
步骤一:训练(或者下载)一个分类模型(比如AlexNet)
一文读懂目标检测之R-CNN系列,YOLO,SSD_第20张图片
步骤二:对该模型做fine-tuning
  • 将分类数从1000改为20,比如20个物体类别 + 1个背景
  • 去掉最后一个全连接层
一文读懂目标检测之R-CNN系列,YOLO,SSD_第21张图片
步骤三:特征提取
  • 提取图像的所有候选框(选择性搜索Selective Search)
  • 对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘
一文读懂目标检测之R-CNN系列,YOLO,SSD_第22张图片
步骤四:训练一个SVM分类器(二分类)来判断这个候选框里物体的类别
每个类别对应一个SVM,判断是不是属于这个类别,是就是positive,反之nagative。
比如下图,就是狗分类的SVM
一文读懂目标检测之R-CNN系列,YOLO,SSD_第23张图片
步骤五:使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第24张图片
关键设计点
1、目标区域提案缩放
由于特征提取存在全连接层,故要将目标区域缩放到指定大小,在论文中,使用到了两种缩放方案:

  • 各向异性缩放:比较粗暴的方法:直接 resize 到所需大小
  • 各向同性缩放:(1) 向外扩充至正方形 (2) 用固定的背景颜色填充
    一文读懂目标检测之R-CNN系列,YOLO,SSD_第25张图片
    2、边框回归Bounding-Box regression
    以下图检测猫为例,蓝色的框是 selective search 提取出的 region proposal 经过评分以后得到的边框,红色的框是 ground truth。当图中红色的框被分类器识别为猫,但是由于蓝色框的定位不准 (IoU<0.5),相当于没有正确检测出猫。所以为了使定位更准确,即使得 region proposal 更接近于 ground truth,我们可以对蓝色的框进行微调,微调就需要使用 bounding box regression。 边框回归.
    一文读懂目标检测之R-CNN系列,YOLO,SSD_第26张图片

细心的同学可能看出来了问题,R-CNN虽然不再像传统方法那样穷举,但R-CNN流程的第一步中对原始图片通过Selective Search提取的候选框region proposal多达2000个左右,而这2000个候选框每个框都需要进行CNN提特征+SVM分类,计算量很大,导致R-CNN检测速度很慢,一张图都需要47s。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第27张图片
有没有方法提速呢?答案是有的,这2000个region proposal不都是图像的一部分吗,那么我们完全可以对图像提一次卷积层特征,然后只需要将region proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要提一次卷积层特征,然后将每个region proposal的卷积层特征输入到全连接层做后续操作。

但现在的问题是每个region proposal的尺度不一样,而全连接层输入必须是固定的长度,所以直接这样输入全连接层肯定是不行的。SPP Net恰好可以解决这个问题。

R-CNN 优缺点
优点

  • 使用 selective search 方法大大提高候选区域的筛选速度(对比传统算法)。
  • 用在 ImageNet 数据集上进行学习的参数对神经网络进行预处理,解决了在目标检测训练过程中标注数据不足的问题。
  • 使用 CNN 对 region proposals(候选框) 计算 feature vectors。从经验驱动特征(SIFT、HOG)到数据驱动特征(CNN feature map),提高特征对样本的表示能力。
  • 通过线性回归模型对边框进行校准,减少图像中的背景空白,得到更精确的定位

缺点

  • R-CNN 存在冗余计算, 因为 R-CNN 的方法是先生成候选区域,再对区域进行卷积,其中候选区域会有一定程度的重叠,造成后续 CNN 提取特征时出现重复运算,同时,由于 R-CNN 是将提取的特征存储下来,然后用 SVM 进行分类,所以需要大的存储空间
  • 由于使用的是 CNN 进行特征提取,所以需要对候选框进行缩放操作,但实际情况是 selective search 方法选取的框有各种尺寸,所以会造成目标变形

注意
1、rcnn 框架中需要几个 svm 模型?几个边框回归模型?
有多少个类别就需要多少个 svm 模型,多少个回归模型

2、 rcnn 框架中边框回归为什么要做对数变换?使用时有哪些注意事项?
缩放的大小必须大于 0,约束到对数空间方便训练优化

3、 rcnn 框架中 nms 是每一类单独进行还是所有框一起进行?
对每一类单独进行 NMS 操作

4、rcnn 框架中正负样本如何定义的?为什么 finetune cnn 和训练 svm 时不同?
rcnn 中候选区与 ground truth 的 iou 大于等于 0.5 为正样本,小于 0.5 为负样本。svm 中全部包含了目标体为正样本,iou 小于 0.3 为负样本。finetune 时的正负样本定义是为了增加样本数量,因为 cnn 对小样本容易过拟合,所以需要大量样本训练。svm 是为了提高精度。

5、rcnn 框架中如何进行难负样本挖掘的?
训练 SVM 时,负样本远远大于正样本,因此,对每个候选区,只有和 ground truth 的 IoU 小于 0.3 的时候,才为负样本。

3.2 SPP Net

SPP:Spatial Pyramid Pooling(空间金字塔池化)

SPP-Net是出自2015年发表在IEEE上的论文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。

众所周知,CNN一般都含有卷积部分和全连接部分,其中,卷积层不需要固定尺寸的图像,而全连接层是需要固定大小的输入。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第28张图片
所以当全连接层面对各种尺寸的输入数据时,就需要对输入数据进行crop(crop就是从一个大图扣出网络输入大小的patch,比如227×227),或warp(把一个边界框bounding box的内容resize成227×227)等一系列操作以统一图片的尺寸大小,比如224224(ImageNet)、3232(LenNet)、96*96等。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第29张图片
所以才如你在上文中看到的,在R-CNN中,“因为取出的区域大小各自不同,所以需要将每个Region Proposal缩放(warp)成统一的227x227的大小并输入到CNN”。

但warp/crop这种预处理,导致的问题要么被拉伸变形、要么物体不全,限制了识别精确度。没太明白?说句人话就是,一张16:9比例的图片你硬是要Resize成1:1的图片,你说图片失真不?

SPP Net的作者Kaiming He等人逆向思考,既然由于全连接FC层的存在,普通的CNN需要通过固定输入图片的大小来使得全连接层的输入固定。那借鉴卷积层可以适应任何尺寸,为何不能在卷积层的最后加入某种结构,使得后面全连接层得到的输入变成固定的呢?

这个“化腐朽为神奇”的结构就是spatial pyramid pooling layer。下图便是R-CNN和SPP Net检测流程的比较:
一文读懂目标检测之R-CNN系列,YOLO,SSD_第30张图片
它的特点有两个:
1.结合空间金字塔方法实现CNNs的多尺度输入
SPP Net的第一个贡献就是在最后一个卷积层后,接入了金字塔池化层,保证传到下一层全连接层的输入固定。
换句话说,在普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。

简言之,CNN原本只能固定输入、固定输出,CNN加上SSP之后,便能任意输入、固定输出。神奇吧?

ROI池化层一般跟在卷积层后面,此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出则是固定维数的向量,然后给到全连接FC层。

SPP 其实就是一系列最大池化操作,那么池化操作就必须有两个参数,窗口的大小 win 和步长 stride,那么这两个是怎么计算的呢?我们需要说明几个变量的含义:

  • 金字塔层级的 bins 大小:n×n 。如下图所示的三个正方形(n×n=4×4 蓝色、n×n=2×2 绿色和 n×n=1×1 的灰色正方形)
  • conv5 提取的 feature maps 的大小是 a×a(下图那块黑色的东东,a 代表是可以任意值)

我们就以 a×a=13×13 为例来计算 win 的大小和 stride 的大小。win = a/n 向上取整,stride=a/n 向下取整,如 n=4 时 win = 13/4=3.25 向上取整就是 4,stride=13/4=3.25 向下取整就是 3。当 n=2 和 n=1 时计算也是类似。当不同 level 的池化计算结束后,就将其展开成一个向量,如这里的 4×4=16、2×2=4、1×1=1 并将其合并成一个长向量,得到的是一个 21 维度的向量,然后输入后续的全连接层。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第31张图片
2.只对原图提取一次卷积特征
在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。
而SPP Net根据这个缺点做了优化:只对原图进行一次卷积计算,便得到整张图的卷积特征feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层,完成特征提取工作。

如此这般,R-CNN要对每个区域计算卷积,而SPPNet只需要计算一次卷积,从而节省了大量的计算时间,比R-CNN有一百倍左右的提速。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第32张图片
SPP 的使用虽然在目标检测取得了和 R-CNN 差不多的效果,但是,对于模型来说,使其可以接受更多尺度的输入,其速度也比较 R-CNN 快 24-102 倍

优缺点
创新点:计算整幅图像的 the shared feature map,然后根据 object proposal 在 shared feature map 上映射到对应的 feature vector(就是不用重复计算 feature map 了)。
缺点:和 R-CNN 一样,训练是多阶段(multiple-stage pipeline)的,速度还是不够 “快”,特征还要保存到本地磁盘中。

3.3 Fast R-CNN

SPP Net真是个好方法,R-CNN的进阶版Fast R-CNN就是在R-CNN的基础上采纳了SPP Net方法,对R-CNN作了改进,使得性能进一步提高。

R-CNN与Fast R-CNN的区别有哪些呢?
先说R-CNN的缺点:即使使用了Selective Search等预处理步骤来提取潜在的bounding box作为输入,但是R-CNN仍会有严重的速度瓶颈,原因也很明显,就是计算机对所有region进行特征提取时会有重复计算,Fast-RCNN正是为了解决这个问题诞生的。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第33张图片
与R-CNN框架图对比,可以发现主要有两处不同:一是最后一个卷积层后加了一个ROI pooling layer,二是损失函数使用了多任务损失函数(multi-task loss),将边框回归Bounding Box Regression直接加入到CNN网络中训练

(1) ROI pooling layer实际上是SPP-NET的一个精简版,SPP-NET对每个proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采样到一个7x7的特征图。对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个 7 ∗ 7 ∗ 512 7*7*512 77512维度的特征向量作为全连接层的输入。

换言之,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量,而我们知道,conv、pooling、relu等操作都不需要固定size的输入,因此,在原始图片上执行这些操作后,虽然输入图片size不同导致得到的feature map尺寸也不同,不能直接接到一个全连接层进行分类,但是可以加入这个神奇的ROI Pooling层,对每个region都提取一个固定维度的特征表示,再通过正常的softmax进行类型识别。

(2) R-CNN训练过程分为了三个阶段,而Fast R-CNN直接使用softmax替代SVM分类,同时利用多任务损失函数边框回归也加入到了网络中,这样整个的训练过程是端到端的(除去Region Proposal提取阶段)。

也就是说,之前R-CNN的处理流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression,而在Fast R-CNN中,作者巧妙的把bbox regression放进了神经网络内部,与region分类和并成为了一个multi-task模型,实际实验也证明,这两个任务能够共享卷积特征,并相互促进。

所以,Fast-RCNN很重要的一个贡献是成功的让人们看到了Region Proposal + CNN这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度,也为后来的Faster R-CNN做下了铺垫。

画一画重点:
R-CNN有一些相当大的缺点(把这些缺点都改掉了,就成了Fast R-CNN)。
大缺点:由于每一个候选框都要独自经过CNN,这使得花费的时间非常多。
解决:共享卷积层,现在不是每一个候选框都当做输入进入CNN了,而是输入一张完整的图片,在第五个卷积层再得到每个候选框的特征

原来的方法:许多候选框(比如两千个)–>CNN–>得到每个候选框的特征–>分类+回归
现在的方法:一张完整图片–>CNN–>得到每张候选框的特征–>分类+回归

所以容易看见,Fast R-CNN相对于R-CNN的提速原因就在于:不过不像R-CNN把每个候选区域给深度网络提特征,而是整张图提一次特征,再把候选框映射到conv5上,而SPP只需要计算一次特征,剩下的只需要在conv5层上操作就可以了。

在性能上提升也是相当明显的:
一文读懂目标检测之R-CNN系列,YOLO,SSD_第34张图片
注意
Fast rcnn 与 SPPnet 的异同点?

  • 相同
    都是使用选择性搜索来得到候选框
    都只是在原图上提取一次特征
  • 不同
    SPPnet 使用的是金字塔结构来解决全连接层输入问题,Fast R-CNN 使用的是 RoI Pooling 解决全连接层输入问题
    SPPnet 还是需要分步骤训练,且需要额外的空间
    2、fast rcnn 框架中正负样本如何定义?
    Fast-rcnn 中当候选区与一个 gt 的 iou 大于 0.5 时为正样本,与所有的 gt 的 iou 小于 0.5 时为负样本。

3.4 Faster R-CNN

Fast R-CNN存在的问题:存在瓶颈:选择性搜索,找出所有的候选框,这个也非常耗时。那我们能不能找出一个更加高效的方法来求出这些候选框呢?

解决:加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。

所以,rgbd在Fast R-CNN中引入Region Proposal Network(RPN)替代Selective Search,同时引入anchor box应对目标形状的变化问题(anchor就是位置和大小固定的box,可以理解成事先设置好的固定的proposal)。

具体做法:
  • 将RPN放在最后一个卷积层的后面
  • RPN直接训练得到候选区域
一文读懂目标检测之R-CNN系列,YOLO,SSD_第35张图片
RPN简介:
  • 在feature map上滑动窗口
  • 建一个神经网络用于物体分类+框位置的回归
  • 滑动窗口的位置提供了物体的大体位置信息
  • 框的回归提供了框更精确的位置
一文读懂目标检测之R-CNN系列,YOLO,SSD_第36张图片

一种网络,四个损失函数;
  • RPN calssification(anchor good.bad)
  • RPN regression(anchor->propoasal)
  • Fast R-CNN classification(over classes)
  • Fast R-CNN regression(proposal ->box)
一文读懂目标检测之R-CNN系列,YOLO,SSD_第37张图片
速度对比
一文读懂目标检测之R-CNN系列,YOLO,SSD_第38张图片
Faster R-CNN的主要贡献就是设计了提取候选区域的网络RPN,代替了费时的选择性搜索selective search,使得检测速度大幅提高。

注意
faster rcnn 中 rpn 中使用了怎样的正负样本策略?

Faster rcnn 中 iou 大于 0.7 或者与一个 gt 的 iou 最大的 anchor 为正样本,iou 小于 0.3 的 anchor 为负样本。

最后总结一下各大算法的步骤:
RCNN
1.在图像中确定约1000-2000个候选框 (使用选择性搜索Selective Search)
2.每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一类别的候选框,用回归器进一步调整其位置

Fast R-CNN
1.在图像中确定约1000-2000个候选框 (使用选择性搜索Selective Search)
2.对整张图片输进CNN,得到feature map
3.找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层
4.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
5.对于属于某一类别的候选框,用回归器进一步调整其位置

Faster R-CNN
1.对整张图片输进CNN,得到feature map
2.卷积特征输入到RPN,得到候选框的特征信息
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一类别的候选框,用回归器进一步调整其位置

简言之,即如本文开头所列
R-CNN(Selective Search + CNN + SVM)
SPP-net(ROI Pooling)
Fast R-CNN(Selective Search + CNN + ROI)
Faster R-CNN(RPN + CNN + ROI)

总的来说,从R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于Region Proposal的R-CNN系列目标检测方法是当前目标检测技术领域最主要的一个分支。

四、基于深度学习的回归方法

4.1 YOLOv1 (CVPR2016, oral)

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

Faster R-CNN的方法目前是主流的目标检测方法,但是速度上并不能满足实时的要求。YOLO一类的方法慢慢显现出其重要性,这类方法使用了回归的思想,利用整张图作为网络的输入,直接在图像的多个位置上回归出这个位置的目标边框,以及目标所属的类别。

我们直接看上面YOLO的目标检测的流程图:
一文读懂目标检测之R-CNN系列,YOLO,SSD_第39张图片
(1) 给个一个输入图像,首先将图像划分成77的网格
(2) 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
(3) 根据上一步可以预测出7
7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可

可以看到整个过程非常简单,不再需要中间的Region Proposal找目标,直接回归便完成了位置和类别的判定。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第40张图片
小结:YOLO将目标检测任务转换成一个回归问题,大大加快了检测的速度,使得YOLO可以每秒处理45张图像。而且由于每个网络预测目标窗口时使用的是全图信息,使得false positive比例大幅降低(充分的上下文信息)。

但是YOLO也存在问题:没有了Region Proposal机制,只使用7*7的网格回归会使得目标不能非常精准的定位,这也导致了YOLO的检测精度并不是很高。当然,后面的v2,v3,v4做了很多改进。

4.2 SSD

(SSD: Single Shot MultiBox Detector)

上面分析了YOLO v1存在的问题,使用整图特征在7*7的粗糙网格内回归对目标的定位并不是很精准。那是不是可以结合Region Proposal的思想实现精准一些的定位?SSD结合YOLO的回归思想以及Faster R-CNN的anchor机制做到了这点。
一文读懂目标检测之R-CNN系列,YOLO,SSD_第41张图片

一文读懂目标检测之R-CNN系列,YOLO,SSD_第42张图片
上图是SSD的一个框架图,首先SSD获取目标位置和类别的方法跟YOLO一样,都是使用回归,但是YOLO预测某个位置使用的是全图的特征,SSD预测某个位置使用的是这个位置周围的特征(感觉更合理一些)。

那么如何建立某个位置和其特征的对应关系呢?可能你已经想到了,使用Faster R-CNN的anchor机制。如SSD的框架图所示,假如某一层特征图(图b)大小是88,那么就使用33的滑窗提取每个位置的特征,然后这个特征回归得到目标的坐标信息和类别信息(图c)。

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

总体而言:SSD相比YOLOv1有以下突出的特点:

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

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

参考
链接: 一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD.

你可能感兴趣的:(计算机视觉,人工智能,计算机视觉)