目标检测网络之 R-CNN系列

R-CNN

前言

目标检测(object detection)就是在给定的图片中精确找到物体所在位置,并标注出物体的类别。object detection要解决的问题就是物体在哪里,是什么这整个流程的问题。一般需要经过两个步骤:
  • 图像识别(classification)
    输入:图片
    输出:物体的类别
    评估方法:准确率

  • 定位(localization)

    输入:图片
    输出:方框在图片中的位置(x,y,w,h)
    评估方法:检测评价函数 intersection-over-union ( IOU )

思路

思路一:看做回归问题

看做回归问题,我们需要预测出(x,y,w,h)四个参数的值,从而得出方框的位置。

img步骤1:

  • 先解决简单问题, 搭一个识别图像的神经网络

  • 在AlexNet VGG GoogleLenet上fine-tuning一下

img

步骤2:

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

img

步骤3:

  • Regression那个部分用欧氏距离损失
  • 使用SGD训练

步骤4:

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

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

Regression的部分加在哪?

有两种处理方法:

  • 加在最后一个卷积层后面(如VGG)
  • 加在最后一个全连接层后面(如R-CNN)

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

思路二:取图像窗口

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

左上角的黑框:得分0.5
img
右上角的黑框:得分0.75

img

左下角的黑框:得分0.6
img
右下角的黑框:得分0.8

img

根据得分的高低,我们选择了右下角的黑框作为目标位置的预测。
注:有的时候也会选择得分最高的两个框,然后取两框的交集作为最终的位置预测。

疑惑:框要取多大?
取不同的框,依次从左上角扫到右下角。非常粗暴啊。

总结一下思路:
对一张图片,用各种大小的框(遍历整张图片)将图片截取出来,输入到CNN,然后CNN会输出这个框的得分(classification)以及这个框图片对应的x,y,h,w(regression)。

img

这方法实在太耗时间了,做个优化。
原来网络是这样的:

img

优化成这样:把全连接层改为卷积层,这样可以提提速。

img

候选框生成

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

那任务就变成了:多物体识别+定位多个物体
那把这个任务看做分类问题?
img

看成分类问题有何不妥?

  • 你需要找很多位置, 给很多个不同大小的框
  • 你还需要对框内的图像分类 
  • 当然, 如果你的GPU很强大, 恩, 那加油做吧…

看做classification, 有没有办法优化下?我可不想试那么多框那么多位置啊!
有人想到一个好方法:
找出可能含有物体的框(也就是候选框,比如选1000个候选框),这些框之间是可以互相重叠互相包含的,这样我们就可以避免暴力枚举的所有框了。

img

大牛们发明好多选定候选框的方法,比如EdgeBoxes和Selective Search。
以下是各种选定候选框的方法的性能对比。

img

有一个很大的疑惑,提取候选框用到的算法“选择性搜索”到底怎么选出这些候选框的呢?那个就得好好看看它的论文了,这里就不介绍了。

R-CNN

基于以上的思路,RCNN的出现了。

img

步骤一:训练(或者下载)一个分类模型(比如AlexNet)
img
步骤二:对该模型做fine-tuning

  • 将分类数从1000改为20
  • 掉最后一个全连接层

img
步骤三:特征提取
  - 提取图像的所有候选框(选择性搜索)
  - 对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘

img

步骤四:训练一个SVM分类器(二分类)来判断这个候选框里物体的类别
每个类别对应一个SVM,判断是不是属于这个类别,是就是positive,反之nagative
比如下图,就是狗分类的SVM

img

步骤五:使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。

img

回归器

回归器:对每一类目标,使用一个线性脊回归器进行精修。正则项λ=1000。 输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。 训练样本:判定为本类的候选框中和真值重叠面积大于0.6的候选框。

首先要明确目标检测不仅是要对目标进行识别,还要完成定位任务,所以最终获得的bounding-box也决定了目标检测的精度。 

这里先解释一下什么叫定位精度:定位精度可以用算法得出的物体检测框与实际标注的物体边界框的IoU值来近似表示。

如下图所示,绿色框为实际标准的卡宴车辆框,即Ground Truth;黄色框为selective search算法得出的建议框,即Region Proposal。即使黄色框中物体被分类器识别为卡宴车辆,但是由于绿色框和黄色框IoU值并不大,所以最后的目标检测精度并不高。采用回归器是为了对建议框进行校正,使得校正后的Region Proposal与selective search更接近, 以提高最终的检测精度。论文中采用bounding-box回归使mAP提高了3~4%。

那么问题来了,回归器如何设计呢?

如上图,黄色框口$P$表示建议框Region Proposal,绿色窗口$G$表示实际框Ground Truth,红色窗口$\widehat{G}$表示Region Proposal进行回归后的预测窗口,现在的目标是找到$P$到$\widehat{G}$的线性变换【当Region Proposal与Ground Truth的IoU>0.6时可以认为是线性变换】,使得$\widehat{G}$与$G$越相近,这就相当于一个简单的可以用最小二乘法解决的线性回归问题,具体往下看。
让我们先来定义P窗口的数学表达式:$Pi=(P^i_x,P^i_y,P^i_w,P^i_h)$,其中$(P^i_x,P^i_y)$表示第一个i窗口的中心点坐标,$P_iw$,$P_ih$分别为第i个窗口的宽和高;$G$窗口的数学表达式为:$G^i=(G^i_x,G^i_y,G^i_w,G^i_h)$;$\widehat{G}$窗口的数学表达式为:$\widehat{G}_i=(\widehat{G}^i_x,\widehat{G}^i_y,\widehat{G}^i_w,\widehat{G}^i_h)$。以下省去$i$上标。
这里定义了四种变换函数,$d_x(P)$,$d_y(P)$,$d_w(P)$,$d_h(P)$。$d_x(P)$和$d_y(P)$通过平移对x和y进行变化,$d_w(P)$和$d_h(P)$通过缩放对w和h进行变化,即下面四个式子所示:



$$\widehat{G}_x=P_wd_x(P)+P_x$$

$$\widehat{G}_y=P_hd_y(P)+P_y$$

$$\widehat{G}_w=P_w\text{exp}(d_w(P))$$

$$\widehat{G}_h=P_h\text{exp}(d_h(P))​$$

每一个$d_∗(P)$【*表示x,y,w,h】都是一个AlexNet CNN网络Pool5层特征$\phi_5(P)$的线性函数,即$d_∗(P)=w^T_∗\phi_5(P)$ ,这里$w^T_∗$就是所需要学习的回归参数。损失函数即为:

$$Loss=argmin\Sigma_{i=0}^N(t^i_∗−w^T_∗ϕ5(P^i))^2+λ||\widehat{w}∗||^2$$

损失函数中加入正则项$λ||\widehat{w}∗||^2$$ 是为了避免归回参数\widehat{w}∗过大。其中,回归目标$$t_*$由训练输入对$(P,G)$按下式计算得来:



$$ 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)$$

①构造样本对。为了提高每类样本框回归的有效性,对每类样本都仅仅采集与Ground Truth相交IoU最大的Region Proposal,并且IoU>0.6的Region Proposal作为样本对$(P^i,G^i)$,一共产生20对样本对【20个类别】;
②每种类型的回归器单独训练,输入该类型样本对N个:${(P^i,G^i)}{i=1⋯N}$以及$P^i{i=1⋯N}$所对应的AlexNet CNN网络Pool5层特征$\phi_5(P^i){i=1⋯N}$;
③利用输入样本对${(P^i,G^i)}
(i=1⋯N)$计算$t^i_{∗i=1⋯N}$;
④利用$\phi_5(P^i){i=1⋯N}$和$t^i{∗i=1⋯N}$,根据损失函数进行回归,得到使损失函数最小的参数$w^T_∗$。

RCNN的进化中SPP Net的思想对其贡献很大,这里也简单介绍一下SPP Net。

SPP Net

SPP:Spatial Pyramid Pooling(空间金字塔池化)
它的特点有两个:

1.结合空间金字塔方法实现CNNs的对尺度输入。
一般CNN后接全连接层或者分类器,他们都需要固定的输入尺寸,因此不得不对输入数据进行crop或者warp,这些预处理会造成数据的丢失或几何的失真。SPP Net的第一个贡献就是将金字塔思想加入到CNN,实现了数据的多尺度输入。

如下图所示,在卷积层和全连接层之间加入了SPP layer。此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。

img

 

2.只对原图提取一次卷积特征
在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。
所以SPP Net根据这个缺点做了优化:只对原图进行一次卷积得到整张图的feature map,然后找到每个候选框zaifeature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层。节省了大量的计算时间,比R-CNN有一百倍左右的提速。

img

Fast R-CNN

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

R-CNN与Fast RCNN的区别有哪些呢?
先说RCNN的缺点:即使使用了selective search等预处理步骤来提取潜在的bounding box作为输入,但是RCNN仍会有严重的速度瓶颈,原因也很明显,就是计算机对所有region进行特征提取时会有重复计算,Fast-RCNN正是为了解决这个问题诞生的。

img

大牛提出了一个可以看做单层sppnet的网络层,叫做ROI Pooling,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量,而我们知道,conv、pooling、relu等操作都不需要固定size的输入,因此,在原始图片上执行这些操作后,虽然输入图片size不同导致得到的feature map尺寸也不同,不能直接接到一个全连接层进行分类,但是可以加入这个神奇的ROI Pooling层,对每个region都提取一个固定维度的特征表示,再通过正常的softmax进行类型识别。另外,之前RCNN的处理流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression,而在Fast-RCNN中,作者巧妙的把bbox regression放进了神经网络内部,与region分类和并成为了一个multi-task模型,实际实验也证明,这两个任务能够共享卷积特征,并相互促进。Fast-RCNN很重要的一个贡献是成功的让人们看到了Region Proposal+CNN这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度,也为后来的Faster-RCNN做下了铺垫。

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

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

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

在性能上提升也是相当明显的:

img

Faster R-CNN

Fast R-CNN存在的问题:存在瓶颈:选择性搜索,找出所有的候选框,这个也非常耗时。那我们能不能找出一个更加高效的方法来求出这些候选框呢?
解决:加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。
做这样的任务的神经网络叫做Region Proposal Network(RPN)。

具体做法:
  - 将RPN放在最后一个卷积层的后面
  - RPN直接训练得到候选区域

img

RPN简介:
  - 在feature map上滑动窗口
  - 建一个神经网络用于物体分类+框位置的回归
  - 滑动窗口的位置提供了物体的大体位置信息
  - 框的回归提供了框更精确的位置

一种网络,四个损失函数;
  - RPN calssification(anchor good.bad)
  - RPN regression(anchor->propoasal)
  - Fast R-CNN classification(over classes)
  - Fast R-CNN regression(proposal ->box)

img

速度对比

img

Faster R-CNN的主要贡献是设计了提取候选区域的网络RPN,代替了费时的选择性搜索,使得检测速度大幅提高。

总结

最后总结一下各大算法的步骤:
RCNN

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

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

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

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