目标检测算法(1)目标检测中的问题描述和R-CNN算法

目标检测(object detection)是计算机视觉中很是具备挑战性的一项工做,一方面它是其余不少后续视觉任务的基础,另外一方面目标检测不只须要预测区域,还要进行分类,所以问题更加复杂。最近的5年使用深度学习方法进行目标检测取得了很大的突破,所以想写一个系列来介绍这些方法。这些比较重要的方法能够分红两条主线,一条是基于区域候选(region proposal)的方法,即经过某种策略选出一部分候选框再进行后续处理,好比RCNN-SPP-Fast RCNN-Faster RCNN-RFCN等;另外一条是直接使用卷积神经网络将图像变换到一个小的尺度,在新的尺度上使用anchor box来预测目标区域,这一类方法包括SSD以及Yolo的各个版本等;另外这个系列中也会穿插一些其余的算法如OverFeat、DPM等。本文是目标检测系列的第一篇,主要说起目标检测中的基本问题,并详细地介绍了RCNN算法。算法

一 目标识别问题的基本描述api

目标检测是计算机视觉中很是具备挑战性的一项工做,它是其余不少后续视觉任务的基础,好比咱们一般所说的识别(分类)问题,以人脸识别为例,一般其不是一个彻底的端到端(end to end)的过程,若是想要得到很好的识别精度,通常状况下须要首先进行人脸检测,而后对检测获得的区域进行人脸定位(face landmark),而后再进行人脸对齐(face alignment),最后才进行分类或者验证,好的人脸检测算法对最后的识别精度提高很大,而有的算法会把检测和定位一步作出来;另外一方面,目标检测是一项相对比较有难度的工做,其考虑的问题比较多,好比咱们怎样合理选择定位区域?怎样对定位区域的图像内容进行分类?若是框柱的区域有偏差咱们怎么修正?网络

1. 目标检测中的一些基本概念架构

在回答上面几个问题以前,这里首先介绍目标识别过程当中常常说起的一些概念。咱们能够把分类任务和检测任务作一个比较(这几张图片都来源于\(RBG\)大神RCNN的ppt,戳这里):框架

图1 classification vs detection机器学习

左边一张是分类,右边一张是检测。能够看出分类只须要判断给定的图像属于哪一类,但很明显因为其余物体或者背景的干扰,直接这么作确定效果很差。相比较而言,检测则是判断某个固定的区域中是否包含物体,而且判断其中的物体属于哪一类,咱们把框住这个区域的矩形框叫作bounding box,那么目标检测的问题能够当作是:给定目标类别集合好比\(\left \{ airplane, bird, motorbike, person, sofa \right \}\),判断这些bounding box中是否包含目标,如图2所示:函数

图2 目标检测示例:左图是输入,右图是输出性能

另外,对于这些预测的bounding box是否真实包含物体,一般会有预测的置信度,也就是这个框出来的区域有多大几率属于某类的物体,因此目标检测实际的输出会包含三个内容:预测的bounding box,bounding box中物体的类别,以及属于这个类别的置信度。学习

图3 'person' detector predictions 和 ground truth 'person' boxes测试

图3中橙色的区域是咱们预测时的bounding box,而紫色的是真实物体包含的区域,一般叫作ground truth(GT),训练的目的是让咱们预测到的bounding box和GT的交并比(即两个区域的重叠部分除以相并的部分, Intersection over Union,简称IoU)的值比较高。那在测试阶段咱们到底应该怎样衡量预测的好坏呢?这里用到一个很是重要的概念mAP,即平mean Average Precision(平均AP)的值,注意这里的AP是针对每一个类别求出的,那每一个类的AP值究竟是怎样计算的呢?

首先在进行预测后,咱们能够按照置信度大小排序而且选择一个阈值做为预测的正负类的评判标准,大于阈值预测为正类不然为负类,以下图所示:

图4 置信度排序及precision和recall的计算方式

假如咱们选择置信度\(t=0.5\)为正负类的阈值,那么小于\(t\)的所有预测为负类,这里引出两个机器学习中很是常见的概念,也就是查准率(precision)值和查全率(recall)值,两者的计算方式以下

\(precision=\frac{true positive}{true positive+false positive}\)

\(recall=\frac{true positive}{ground truth}\)

(1) true positive表示正确的预测为正类,在目标检测中就是指预测的bounding box和ground truth的IoU超过0.5的box的个数;

(2) false positive表示错误的预测为正类,对应于bounding box和ground truth的IoU小于等于0.5的box的个数,还有那些重复预测同一个ground truth的box的个数。

还有两种预测行为true negative和false negative也很容易根据(1)、(2)推断出来,这里的AP值重点考察(1)和(2)因此没列出来。从precision和recall值的定义来看,它们衡量分类性能的角度不同,precision侧重于考察预测的结果为正类样本中的准确程度,而recall侧重于考察真实的正类样本是被预测正确的全面程度。如今咱们知道怎样计算precision和recall的值,那么对于每一类样本咱们能够依照某个采样规则画出precision和recall关系的序列图,以下图所示,横坐标为recall值,纵坐标为precision值,根据采样的recall值的不一样来获得不一样的precision值,而后画出相应的点连成曲线,这里的曲线下方面积就是这个类的AP值,AP值越高代表在给定recall的状况下precision的值也比较高。注意到咱们选取不一样的阈值\(t\)能够获得不一样的曲线,此时的AP值也不一样。

 图5 mAP计算示意图

以上是关于目标检测的基本概念,在实际应用中到底怎样进行检测,又有哪些难点呢?咱们接下来要讲的RCNN主要会解决一下三个问题:

(1) 怎样找出这些预测的bounding box?

容易想到的很笨的方法是选择大小、比例不一样的滑窗,让这个滑窗遍历整个图像,对每一个滑过的位置都进行预测分类,判断是否有物体存在,像下图同样:

 

图6 使用大小比例不一样的bounding box滑窗通过每一个图像的位置进行预测,致使须要检测不少个窗口

这样操做的缺点十分明显:选区的滑窗的大小和比例不一样以及须要滑过图像中每个位置,致使须要检测的窗口数量巨大。那么咱们是否能想出一个间接的方法,即并非一步处理全部的窗口,而是首先经过相对比较“粗糙”的方法过滤那些确定不包含物体的区域?

(2) 假如咱们已经找到了一个bounding box,怎样判断属于哪个类?

这个问题能够当作是一个分类的问题,对于指定区域的图像,咱们能够用传统的手工特征提取方法,好比LBP、HOG、Haar特征等等,更好的方法是经过卷积神经网络能够自动选择特征,而且效果很是好,提取到特征以后再进行分类。

(3) 是否须要对找到的包含物体的box进行修正?

因为选择的bounding box的位置一般会有必定程度的误差,那么须要对这个位置进行修正,此问题能够当作是一个回归的问题,回归预测的值一般是这个box左上角的坐标,区域的宽和高。

 带着这三个问题,这篇文章主要介绍目标检测领域一个里程碑的算法RCNN,即基于区域的卷积神经网络方法。

二 R-CNN算法

R-CNN(region with CNN feature)于13年被Ross Girshick(江湖人称RBG大神)提出,是使用深度学习进行目标检测的里程碑式的工做,RBG主页:http://www.rossgirshick.info,主页中列出的关于目标检测及相关领域的工做都很是经典,能够说这些工做很大程度推进了深度学习在目标检测中的应用。废话很少说,首先咱们看看RCNN算法的动机。

1. 动机及解决的问题

(1) 与分类任务不一样,目标检测须要框出指定的区域,有相关paper直接使用回归的方法获得区域的位置,但实际应用起来效果并很差;另外,有方法直接使用滑窗加深度学习的方法,不过这一类方法一般网络层次并不深,主要考虑到的是一旦网络层次加深,最后输出的特征图对应的原始图像的感觉野太大,形成检测精度不高;

(2) 一个更好地解决方案是是使用所谓“区域建议(region proposal)”的方法给出一堆候选区域,这些候选区域可以先过滤掉那些大几率不包含物体的区域,而后选择一个深度神经网络抽取特征;

(3) 一旦抽取特征以后能够设计一个SVM分类器,即对每个类别的物体都当作是一个单独的二元分类问题;

(4) 最后使用回归的方法对包含物体的bounding box进行回归,回归的目的是修正bounding box的误差。

值得一提的是,RCNN论文中的细节不少,怎样获得region proposal,怎样把候选获得的区域缩放到统一尺寸以使其适配CNN网络的输入大小,怎样进行多阶段的训练(CNN网络的“pre-training”和“fine-training”,SVM分类器的训练以及回归器的训练)等等,CNN网络为何不直接接入一个softmax层转而使用SVM进行分类,等等这些会在下文中介绍。

2. 算法架构

图7 RCNN算法框架

RCNN的算法框架如图7所示,算法过程描述以下:

(1) 第一步,即图7中的1~2,对于给定的输入图像,使用选择性搜索(selective search)的区域建议方法提取出大约2000个候选区域,即首先过滤掉那些大几率不包含物体的区域,经过这一阶段将原始图像中须要处理的区域大大减小;

(2) 第二步,分为两个小步:

  • 第一小步,须要对第一阶段中抽取获得的候选区域,通过一个叫作"warp"的过程,这个warp实际就是一个缩放的过程,由于第一步咱们提取出的候选区域大小不一,可是后续接入的深度网络的输入是固定的,所以这些区域的大小须要适配CNN网络固定大小的输入;
  • 第二小步,把第一小步中warp以后的候选区域接入到卷积神经网络,抽取一个相对低维的特征;

(3) 第三步,对应图中的3~4,对每一个类都训练一个二元的线性SVM,而后判断上一步抽取的特征是否包含物体。

(4) 第四步,这一步图上并无画出,这一步用于对包含物体的候选区域位置进行回归,以修正误差。

3. 算法具体流程

经过算法框架咱们可以大体了解RCNN运做的流程,但真正实施起来会包含不少问题,咱们一一来看。

(1) 怎样使用selective search方法提取候选区域

RCNN一大创新点是对原始图像抽取一些候选区域,再使用深度学习进行特征抽取,文中列举了一些区域建议的方法,最后使用的是selective search的方法:“Selective Search for Object Recognition”。selective search是一种“hierarchical bottom-up grouping”的方法,即层次、自底向上的分组方法,简单来讲就是先找出图像中的相邻区域,而后定义一个领域相识度的计算规则,使用这些规则一直合并类似度较高的区域而且更新,最后知道覆盖至整张图像,完成处理的图像中不一样的区域就是这些“region proposal”。如下是示意图:

图8 selective search算法示意图

了解一个算法最好的方法就是看原始的paper,原始的paper对算法的描述步骤以下:

输入:一张图像(彩色) 输出:候选的box区域

算法开始须要初始化一些区域的集合:\(R=\left \{ r_{1},r_{2},...r_n{} \right \}\),文章中使用paper:“Efficient graph-based image segmentation”来作这件事;同时还初始化一个空的类似度区域的集合\(S=\varnothing \)

a. 对于全部的相邻区域\((r_{i},r_{j})\),按照类似度规则计算类似度\(s(r_{i},r_{j})\),而且计算\(S=S\cup s(r_{i},r_{j})\),即计算全部领域的类似度集合;

b. 假如\(S\neq \varnothing \):

  • 获取\(S\)中类似度最高的一对区域\(s(r_{i},s_{j})=max(S)\);
  • 对最类似的两个区域进行合并\(r_{t}=r_{i}\cup r_{j}\);
  • 从\(S\)集合中去除和\(r_{i}\)及\(r_{j}\)相邻的类似区域;
  • 计算合并后的区域和其邻域的类似度集合\(S=S\cup S_{t}\)及\(R=R\cup R_{t}\)
  • 重复以上步骤直至\(S= \varnothing \)

c. 从集合\(R\)中提取出全部的boxes,即定位的矩形区域

对于类似度的计算方法selective search的原始论文中定义为颜色、纹理、尺寸等几种不一样度量方式的叠加之和:

\(s(r_{i},r_{j})=a_{1}s_{colour}(r_{i},r_{j})+a_{2}s_{texture}(r_{i},r_{j})+a_{3}s_{size}(r_{i},r_{j})+a_{4}s_{fill}(r_{i},r_{j})\)    \(a\in \left \{ 0,1 \right \}\)   

对每种具体的计算方式这里就很少提了。

(2) CNN网络输入

使用选择性搜索提取出大小不一的候选区域以后,而后通过卷积神经网络提取特征,文中提到的是使用12年的AlexNet,此网络的输入是固定大小的\(227\times 227\),输出是\(4096\)维的特征向量,因为输出的尺寸固定,而RCNN第一步抽取的候选区域大小不一,所以给出了几种方法对候选区域的大小进行变换以适配网络输入:

a. 各向异性(anisotropically)缩放,即对候选区域缩放的高和宽的倍数不一样,直接拉成CNN中输入大小的形式,这种变换在文中称为“warp”;

b. 各向同性(isotropically)缩放,即缩放的高和宽的比例倍数相同,这里又分为两种:一种对原始的图像按等比例缩放后的灰色区域进行填充,另外一种不进行填充。

以下图所示,其中(A)为原始图像;(B)、(C)分别对应各向同性的两种方法;(D)对应的是各向异性的方法。另外每种方法在下图中有两行,上面的一行表示缩放以后若是候选区域超出了边界不进行padding,即不使用周围的像素进行填充,下一行是进行16像素的padding。文中进行的实验代表使用padding为16像素的“warp”方法效果最好。

 图9 几种候选区域缩放的方法对比

(3) CNN网络训练

训练分红“pre-training”+“fine-tuning”:首先选用caffe中已经训练好的模型在大的数据集上进行预训练(ILSVRC2012图像分类的数据集 )获得一个初始的网络,而后在此网络的基础上细调:替换网络最后的输出层,由于ImageNet分类数据集的输出层包含1000个类,这里进行目标检测的类别不一致,好比VOC使用的是20个类,而ILSVRC2013 的目标检测使用的是200个类,把背景也当成一类的话,实际的网络输出层的个数应该是\(N+1\),\(N\)为目标的类别。在细调的时候考虑与ground truth(也就是真实的包含物体的区域)的IoU超过0.5的为正类,其他的均为负类,迭代的时候使用SGD方法,选取0.001的学习率,使用包含32个正类样本和96个负类样本组成mini-bacth。

(4) SVM分类器的训练

一旦CNN网络训练完成,去除网络中的最后的输出层,以全链接层的输出获得新的特征向量,以供训练SVM。这里文中提到了SVM训练阶段正负样本的划分,注意的是这里的正负类的选择和CNN网络训练时的不一样,训练SVM时正类定义为ground truth,候选区域中与ground truth的IoU小于0.3的定义为负类,其他的候选区域忽略;文中附录探讨了为何这样作的两个问题:一个是为何不直接在CNN网络后面用softmax进行分类,而使用SVM;一个是正负类样本的定义方式,咱们放在第(8)点专门介绍。

(5) 非极大值抑制过滤重叠的bounding box

在test阶段,候选区域通过CNN提取特征以后最后使用SVM进行分类评分,获得不少的bounding box,因为这些bounding box包含不少重叠的部分,以下:

图8 左图是预期的bounding box,右图是实际获得的bounding box

文中使用非极大值抑制(non-maximum suppression,NMS)方法去除那些输出的重叠程度比较高的bounding box,NMS是目标检测中用的很是频繁的一种算法,大体的步骤是:

首先对输出的bounding box进行打分,找出评分最高的bounding box,计算其余的bounding box和它的IoU值,选取一个阈值,从输出的bounding box中移除那些IoU小于这个阈值的box,而后重复这个步骤,直至仅存在保留的bounding box。文中使用NMS基于每一个单独的类。

(6) 检测时间分析

整个检测阶段的时间包含:选择性搜索获得一系列region proposal,而后经过CNN抽取这些region proposal的特征,使用SVM分类打分,最后使用NMS去除重叠部分;做者认为有两个特性让检测比较有效,其一是网络共享,其二是使用CNN进行了降维;主要的时间开销时间在计算候选区域和特征(GPU上13s一张,CPU上53秒一张,如今看来真的是很是慢。。。);做者也提到了和DPM算法的比较,精度和速度都有大幅度提高。可想而知,别看如今咱们能作到实时高精度的检测,前几年这些深度学习方法在目标检测中的突破真的是巨大。

(7) 回归器修正box误差

候选区域通过SVM打分以后,须要通过回归器进行修正,修正的目的是获得一个新的bounding box,新的bounding box预测的误差减少,文中使用的回归器修正启发于deformable part models(DPM,深度学习火热以前比较重要的一种目标检测方法,在之后的blog中有时间会详细解释这种方法),并且回归是基于每一个特定类的。具体来讲给定预测的bounding box和ground truth的集合\({(P^{i},G^{i})}_{i=1,...,N}\),其中\(P^{i}=(p_{x}^{i},p_{y}^{i},p_{w}^{i},p_{h}^{i})\),\(G^{i}=(g_{x}^{i},g_{y}^{i},g_{w}^{i},g_{h}^{i})\),\(x,y,w,h\)分别表示左上角的坐标以及box的宽和高,修正的目的是把\(P\)变换到预测的ground truth\(\hat{G}\),变换的的函数有四个分别是\(d_{x}(P),d_{y}(P),d_{w}(P),d_{h}(P)\),变换的具体公式以下:

\(\hat{G}_{x}=P_{w}d_{x}(P)+P_{x}\)

 \(\hat{G}_{y}=P_{h}d_{y}(P)+P_{y}\)

\(\hat{G}_{w}=P_{w}exp(d_{w}(P))\)

\(\hat{G}_{h}=P_{h}exp(d_{h}(P))\)

这里的四个\(d_{x}(P)\),\(d_{y}(P)\),\(d_{w}(P)\),\(d_{h}(P)\)由CNN最后一层的pooling层的特征通过线性变换获得:\(d_{*}(P)=w_{*}^{T}\varnothing (P)\),所以这里咱们须要学习的参数变成\(w_{*}\),此问题能够当作是一个标准的岭回归问题:

 \(w_{*}=\underset{\hat{w}_{*}}{argmin}\sum_{i}^{N}(t_{*}^{i}-\hat{w}_{*}\varnothing(P^{i}) )+\lambda \left \| \hat{w}_{*} \right \|^{2}\)

而上式中回归的目标\(t\)能够由给定的\(P\)和\(G\)及公式(1)~(4)反推获得:

 \( t_{x}=(G_{x}-P_{x})/P_{w}\)

\( t_{y}=(G_{y}-P_{y})/P_{h}\)

\(t_{w}=log(G_{w}/P_{w})\)

\(t_{h}=log(G_{h}/P_{h})\)

这里带正则项的标准回归问题很容易获得封闭解。

(8) 为何RCNN使用SVM替代softmax层进行分类?

对于这个问题做者分两点进行了解释:

其一,做者作过实验代表,在微调阶段尝试使用和SVM相同定义的正负类样本数,效果比较差,对此做出假设:怎样定义正负类样本数并不重要,重要的是形成这种结果的差别源于微调中数据的有限,当使用IoU0大于0.5的样本做为正类时(文中用“jittered”形容这些数据),样本增长了接近30倍,避免了过拟合;而且,这些jittered的数据致使了fine-tuning阶段的结果并非最优的,由于如今选的正类样本并非“精准定位”的(显然这是因为IoU阈值变高致使正类样本的门槛变“低”了);

其二,根据第一点解释刚好引出了第二个点,即为何使用SVM而不是直接使用softmax层进行分类,做者认为按照刚才的解释,微调阶段CNN并不能进行“精准定位”,而且softmax训练的时候只是随机采样负类样本,而SVM训练阶段能够考虑那些“hard negative”的样本。这里使用了“hard negative mining”的思想,以目标检测为例,第一轮训练的时候先按照预先定义好的正负类样本进行分类;第二轮对于那些自己是负类却被误判为正类的样本,即一般咱们所说的“false positive”样本,计入负类样本从新进行训练,这个过程重复几回最终获得的效果会比较好。

基于以上两点考虑,做者认为有必要在CNN后面接上SVM进行分类。

三 RCNN中的对比实验分析、特征可视化、“Ablation studies”、偏差分析等工做

除了这篇博客第二节中分析的模型架构流程外,做者在实验分析、数据可视化以及“Ablation studies”、偏差分析等多个方面都进行了很详尽的分析,这里的内容太多不细说,而是稍微说起。

1. 在Pascal VOC10-12以及ILSVRC2013 detection 的实验结果
在VOC10上做者主要和DPM类方法(DPM以及SegDPM)以及UVA系统(主要是selective search方法,使用四层空间金字塔的sift方法+核SVM)进行了对比,RCNN在实验精度上从35.1mAP提高到了53.7mAP,而且速度上也有必定程度提升,而在VOC12上也得到了53.3的mAP;在ILSVRC2013数据集上和OverFeat方法进行对比(实际列举的对比方法比较多)从24.3mAP提高到31.4mAP。

2. 特征学习可视化

做者使用了一种非参数的方法来显示网络到底学习到了什么,重点分析了最后一个pooling层的激活值的可视化。

3. Ablation studies
Ablation studies 能够当作是去除算法中的某些结构,而后进行实验并比较分析实验的对比效果,比较了没有fine-tuning和有fine-tuning的效果对比;同时还分析了RCNN和两种不一样的DPM方法(HOG+DPM和稀疏编码直方图+DPM,简称HSC+DPM),得出的结论是RCNN的性能也要好于两者。

4. 关于网络结构

做者除了使用AlexNet之外,还使用了VGG代替进行实验,结果从58.5%mAP提高到66.0%mAP,代价是因为网络变深很多致使计算时间提高。

5. 关于偏差分析

这里的偏差分析使用了paper“Diagnosing error in object detector”的方法,而减少偏差的方法就是以前提到的DPM中使用的回归修正误差。

除以上外做者还详细地讨论了在ILSVRC2013上从训练、验证、Ablation studies等等很是详细的实验对比和讨论,工做量很是的丰富,有兴趣的同窗能够直接看原始paper。

四 RCNN算法总结及其缺点

RCNN是使用深度学习进行目标检测中很是有意义的一项工做,它首先利用选择性搜索选取一些区域候选框,而后经过CNN抽取特征并使用SVM进行分类,而后使用NMS排除重叠的bounding box,最后使用回归器对box的位置进行修正。一方面,RCNN在精度上和速度上相比较传统方法均有很大的提高,是一个有里程碑意义的研究;另外一方面咱们应该也能够看到,RCNN这篇论文中的工做量很是大,了解其中的细节便于咱们理解目标识别领域的关键问题,同时RCNN也结合或借鉴了以前的算法,好比选择性搜索进行区域候选、使用NMS筛选窗口、DPM中的回归修正的思想等等,能够说是“站在前人的肩膀上”。经过分析咱们能够得出RCNN的一些缺点:

(1) RCNN的耗时体如今两个阶段,一个是区域候选须要必定时间,另外一个是对于每个区域候选框都须要从新丢进网络里才能抽取特征,特别是后者致使RCNN很是的慢;

(2) RCNN在网络的输入是使用的warp方法,这种缩放会不会对最终的精度有影响?

(3) RCNN显然并非一个端到端的工做,一般状况下咱们认为端到端的工做能够达到更好的效果,由于不一样模块之间的衔接可能会存在必定的信息损失。

本文是目标检测系列的第一篇,主要介绍目标检测中的基本问题以及RCNN算法,下篇将介绍SPP算法。

相关文章
相关标签/搜索