目标检测(object detection)是计算机视觉领域重要研究内容之一,主要解决图像中包含哪些物体及物体在图像中位置的问题,如下图所示(图片来源于Yolo实验输出),物体的位置使用一个矩形框标注。由于图片中物体的尺寸不一,位置不定,角度多变,而且经常存在重叠问题,所以早期基于特征工程的方法难以从图片中提取有效的特征,检测效果一直不佳。
Pascal VOC Challenge是目标检测领域的基准竞赛,从下图可以看出,从2007年到2012年,夺冠的方法均采用DPM,检测精度在2011和2012年陷入瓶颈,难以继续提升,但是模型却越来越复杂,导致检测速度始终较慢。
近几年深度学习方法的成功应用使目标检测的精度上了一个新的台阶,下图中个人统计了几种主流方法提出的时间、VOC07精度(mAP)和速度(FPS),这些数值并非绝对,因为每个方法均有多个模型,以对精度和速度进行trade-off。另外,最新的RetinaNet和Yolov3没有报告在VOC2007上的结果,所以并未计入其中,文末附各方法的参考文献。这些方法均以卷积神经网络(CNN)为基础,模型复杂度相差无几,精度逐步提升,有些方法的检测速度能达到50ms一张图片,可以称为是实时检测。
目前基于深度学习的目标检测方法主要分为两类:
1. 基于候选区域的分类方法:首先提取候选区域,然后对该区域进行分类(识别)和回归(定位)
R-CNN (Selective Search + CNN + SVM + Regression)
SPP-net (Selective Search + CNN + Spatial Pyramid Pooling + SVM + Regression)
Fast R-CNN (Selective Search + CNN + RoI Pooling + Softmax/Regression)
Faster R-CNN (CNN + RPN + RoI Pooling + Softmax/Regression)
R-FCN
RetinaNet
2. 基于回归的方法:将分类和定位均作为回归任务
Yolo
SSD
Yolov2
Yolov3
最早将深度学习成功应用于目标检测的方法就是R-CNN(Regions with CNN features),在此之前,也有将CNN用于目标检测的研究,如OverFeat、Deep Neural Networks for Object Detection,多是基于滑动窗的方法,即从小到大每个尺寸的滑动窗均在图片上遍历一遍,既耗时,效果又不好,所以并没有引起注意。R-CNN的主要特点是提取候选区域(Region Proposal),即预先找出可能包含目标的区域,然后将每个候选区域进行分类和位置调优。
R-CNN是一个多阶段方法,主要步骤如下:
1. 提取一些可能存在物体的候选区域(下图步骤2);
2. 将不同大小的候选区域缩放到固定大小(warped region),以适合CNN的输入;
3. 选择一个固定大小的候选区域,输入到CNN中进行特征提取(下图步骤3);
4. 对于每个类别,将CNN提取的特征输入到二分类SVM中,判别该候选区域是否属于该类别(yes/no,下图步骤4);
5. 对于与ground-truth box重叠部分较大的候选区域,进行线性回归,对其位置进一步调整,使其更加准确(这一步在论文中附录C给出)。
下面对R-CNN的每一个步骤进行详细解释。
第一步,候选区域选择。因为以前用滑动窗进行逐个遍历的方法比较耗时,所以R-CNN中预先用其他方法选择一部分可能存在物体的候选区域,论文中选择了约2000个候选区域,虽然是个较大的数目,但是仍然比滑动窗遍历要小很多,而且用区域选择的方法提取的候选框包含物体的概率比较大,相当于给了CNN一个较大的先验概率,这样在训练CNN时就不会被过多的无意义区域所影响。
生成候选区域的方法有多种,如selective search, edge boxes,在生成候选区域的时候是不需要图像的类别信息作为指导或训练的,即生成候选区域的方法是与类别无关的,论文使用了selective search方法,以便与早期使用selective search进行目标检测的方法进行比较。Selective search综合考虑图像的颜色、纹理、尺寸相似性和空间重合度来划分区域,并将小区域按照相似性合并为大区域,根据多种相似性的组合得到的图像划分,能够有效适应图像中物体的多样性,因此生成的候选区域与物体真实区域重合的概率较大。Selective search选择候选框的效果如下,此处只设置了200个候选框,所以,2000个候选框足以覆盖所有的目标。
第二步,将每个候选区域缩放为固定大小。因为R-CNN中的CNN需要固定大小的输入,而第一步中所提取的候选区域大小不一,所以需要将每个候选区域缩放为固定大小,论文中设置为224×224。候选区域大小调整选择最简单的各向异性缩放,如下图所示,第一行为原图,矩形框为目标的bounding box,第二行左图为提取的bounding box区域,右图为warp之后的结果,即CNN的输入图像,这种方法会导致物体扭曲。此外,论文中在缩放之前,还对原候选区域增加了一个边缘(padding),大小为16个像素,用原始图像中的点进行填充,这样使候选区域边缘有一定的缓冲。
第三步,每个候选区域输入到CNN进行特征提取。将第二步得到的固定大小的图像作为CNN的输入,得到该候选区域的特征,作为下一步分类的依据。在论文中设置的候选区域个数为2000个,相当于将2000张图像分别输入到CNN中,进行2000次CNN计算,再加上后面的SVM分类和bounding-box regression,所以处理一张图片的计算量是相当大的,这是导致R-CNN效率低的重要因素,如下图所示。
后续SPPnet和Fast R-CNN就是针对该问题进行改进,速度能达到几十倍、上百倍的提升。另外,现今计算机视觉盛行,有很多在图像分类任务上预训练的模型可迁移到目标检测上使用,因为目标检测的数据集相对较少(VOC2007只有5000张训练图像),而图像分类的数据集则非常大(ImageNet有上百万张图像),所以,我们认为在大量样本的训练下,图像分类的模型能有效提取图像的特征,可以直接迁移到其他图像识别任务上。
论文采用了AlexNet[12]的网络结构,作者在ILSVRC 2012图像分类数据集上重新训练了该网络,得到了比原方法更好一点的结果,直接采用原方法训练好的模型是一种更省时省力的方式。由于当时还未出现VGGnet、GoogLeNet、ResNet等结构,采用这些模型应该能获得更好的结果。预训练好模型之后,再迁移到VOC分类任务上,就是将原网络最后1000分类层变为21分类(20个类别加1一个背景),然后在VOC数据集上再进一步fine-tune,使其适用于该数据集的分类。
有一点需要注意的就是训练集的构造,在ImageNet的分类任务中,每一个图片对应一个类别,而VOC数据集中,每个图片上有多个物体,需要判定每个物体的类别,CNN的数据集其实是selective search生成的一系列候选区域(region proposal),对于一个类别,如car,如果某个候选区域与gound-truth box的IoU大于某个设定的阈值(论文中设定为0.5),则该候选区域为该类别的正例,其他候选区域为该类别的负例。
第四步,对每个类别,将每个候选区域经CNN得到的特征,使用二分类SVM判断是否属于该类别。这里有一个疑问,第三步做任务迁移的时候,已经用CNN的输出做了分类,为何这里又用SVM做分类?作者在论文附录中做了解释,主要原因还是用SVM分类效果好。用SVM分类的时候,训练数据的选取与上一步CNN分类不同,在这里,每个类别的正例为ground-truth box,负例为与ground-truth的IoU<0.3的候选区域。在测试阶段,对每个候选区域,用SVM计算其属于每个类别的得分(score)或置信度(confidence),然后用NMS(non-maximum suppression)只保留置信度最高的预测结果。
第五步,对于与ground-truth box重叠部分较大的候选区域,进行bounding-box regression,对其位置进一步调整。用selective search选取的候选框仍然存在一定的偏差,在最后,对预测的候选框做线性回归,使其位置更加精确。在回归训练时,只选取与某个ground-truth bounding box的IoU>0.6的候选框进行训练。记预测候选框为
P=(Px,Py,Pw,Ph)
P
=
(
P
x
,
P
y
,
P
w
,
P
h
)
,四个分量分别代表候选框的中心坐标以及宽度和高度,ground-truth bounding box为
G=(Gx,Gy,Gw,Gh)
G
=
(
G
x
,
G
y
,
G
w
,
G
h
)
,回归计算表达式为:
G^x=Pwdx(P)+Px
G
^
x
=
P
w
d
x
(
P
)
+
P
x
G^y=Phdy(P)+Py
G
^
y
=
P
h
d
y
(
P
)
+
P
y
G^w=Pwexp(dw(P))
G
^
w
=
P
w
e
x
p
(
d
w
(
P
)
)
G^h=Phexp(dh(P))
G
^
h
=
P
h
e
x
p
(
d
h
(
P
)
)
其中,每个等式中的
d∗(P)
d
∗
(
P
)
是候选区域P在CNN的
pool5
p
o
o
l
5
层特征的线性函数,记
pool5
p
o
o
l
5
层的特征为
ϕ5(P)
ϕ
5
(
P
)
,它是一个向量,那么
d∗(P)=wT∗ϕ5(P)
d
∗
(
P
)
=
w
∗
T
ϕ
5
(
P
)
。在回归中,
ϕ5(P)
ϕ
5
(
P
)
是自变量,
w∗
w
∗
是要学习的参数,回归的目标值是:
tx=(Gx−Px)/Pw
t
x
=
(
G
x
−
P
x
)
/
P
w
ty=(Gy−Py)/Ph
t
y
=
(
G
y
−
P
y
)
/
P
h
tw=log(Gw/Pw)
t
w
=
l
o
g
(
G
w
/
P
w
)
th=log(Gh/Ph)
t
h
=
l
o
g
(
G
h
/
P
h
)
前两个等式除以
Pw
P
w
和
Ph
P
h
对目标的宽和高进行归一化,表示对目标的大小不敏感,后两个等式将比例误差变换到对数空间,表示目标越大,对误差越不敏感。最后,回归就是求解L2正则化的最小二乘问题:
w∗=argminw^∗∑i=1N(ti∗−w^T∗ϕ5(P))2+λ∥w^∗∥2
w
∗
=
a
r
g
m
i
n
w
^
∗
∑
i
=
1
N
(
t
∗
i
−
w
^
∗
T
ϕ
5
(
P
)
)
2
+
λ
‖
w
^
∗
‖
2
使用bounding-box regression能使R-CNN的mAP提升3-4个百分点,还是有很大作用的。
至此,R-CNN的详细过程已经介绍完毕,R-CNN是目标检测领域的一个里程碑,它引入了一种新的目标检测思路,它最大的缺点就是速度慢,在GPU上也要十几秒才能识别一张图片,因此也催生了R-CNN的升级版SPPnet、fast R-CNN和Faster R-CNN。
参考文献:
[1] DP}M: Object Detection with Discriminatively Trained Part-Based Models, PAMI, 2010.
[2] R-CNN: Rich feature hierarchies for accurate object detection and semantic segmentation, CVPR, 2014.
[3] SPPnet: Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition, ECCV, 2014.
[4] Fast R-CNN: Fast R-CNN, ICCV, 2015.
[5] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks, NIPS, 2015.
[6] Yolo: You Only Look Once: Unified, Real-Time Object Detection, CVPR, 2016.
[7] SSD: Single Shot MultiBox Detector, ECCV, 2016.
[8] R-FCN: Object Detection via Region-based Fully Convolutional Networks, NIPS, 2016.
[9] Yolov2: YOLO9000: Better, Faster, Stronger, CVPR, 2017.
[10] RetinaNet: Focal Loss for Dense Object Detection, ICCV,2017.
[11] Yolov3:YOLOv3: An Incremental Improvement, 2018.
[12] AlexNet: ImageNet Classification with Deep Convolutional Neural Networks, NIPS, 2012.