R-CNN 系列笔记

2014年 Ross Girshick 首次提出 Regions with CNN features (R-CNN),可谓是将深度网络引入目标检测的开山之作。基于 R-CNN 的工作,后面又有学者提出SPP-net, Fast R-CNN,Faster R-CNN 以及 Mask R-CNN等改进方法。

基础知识

IOU 的定义

目标检测和图片分类是有区别的,前者不仅要正确识别物体,还需要定位出物体的位置框。因此有一个定位精度评价标准:IOU 定义两个 Bounding box 的重叠度。矩形框 A、B 的一个重合度IOU计算公式为:
$$
IOU = \frac{(A \cap B)}{(A \cup B)}
$$

mAP 的定义

mAP (Mean Average Precision)所有类别上平均准确率的平均值。

R-CNN

Ross Girshick 在文献[1]中开创性的提出了 R-CNN 方法来进行目标检测,效果明显优于传统的目标检测方法。
如图1 所示,R-CNN 算法主要分为 4个步骤:

图1 R-CNN 系统结构图

(1)使用 Selective Search 方法生成 2000-3000 个候选区域:使用一种过分割手段,将图像分成小区域;查看现有小区域,合并可能性最高的两个区域,重复知道整张图像合并成一个区域位置;输出所有曾经存在过的区域。
(2)对于每一个候选区域,处理到指定大小,使用深度网络提取特征,网络结构基本借鉴 AlexNet,先在 ImageNet ILSVC 2012 上进行预训练,然后再 PASCAL VOC 2007 上进行参数调优和评测。
(3)将上一步的特征输入每一个类的 SVM 二类分类器,判断是否属于该类。
(4)使用 Bounding-box 回归器精细修正候选框位置。

思考:
(1)既然应用了 CNN 网络,为什么不用 Softmax 进行多分类,而是选择继续训练 SVM ?
(2)候选区域的选择有其他替代方法吗?

R-CNN 的不足:

  • 训练过程是多级流水线;
  • 训练时,对每个候选区域都要提取特征,特征写入磁盘,耗时耗空间;
  • 测试时,每张图像的每个候选区域都要提取,速度慢。

SPP-Net

CNN 网络需要固定尺寸的图像输入,一般通过人工通过裁剪(crop)或包裹(wrap)把输入图片固定成设定的大小,裁剪的区域未涵盖整个目标或者缩放带来图像的扭曲,可能会降低目标检测的准确度。何恺明等人发现,其实 CNN 的卷积层并不需要固定尺寸的图像,只有全连接层需要固定大小的输入,因此在文献[2]中提出 SPP-net(Spatial Pyramid Pooling),帮助移除输入固定大小的图片的限制,如图2 所示。



图2 上边是通过裁剪和包裹固定图片大小,中间是传统的 CNN,下边是 SPP-net 结构

卷积层可以输入任意尺寸的图片,但是输出也是不同的尺寸。将最后一个卷积层替换成时空金字塔池化层,就可以多尺度提取出固定大小的特征向量。如图3 所示,一个 SPP 包含多个不同尺寸的池化层,每个池化层将上一层的特征图划分成固定的块进行池化,最后再进行聚合,形成一个固定大小的特征。



图3 带有 SPP 层的网络结构,256 表示最后卷积层的核数量

另外,文献[5]认为 R-CNN 提取的所有候选区域都要过一遍深层卷积网络提取特征,过程十分耗时。SPP-net 则对整张图像只进行一次卷积计算得到特征图,再截取出每个候选区域对应的特征图,使用 SPP 池化成一个固定长度的特征向量。

思考:如何将图像的候选区域框映射到特征图上呢?

论文中是将候选区域的左上角和右下角映射到特征图上,这样就能截取到候选区域的特征。

SPP-net 的优点:

  • 能够接受任意尺寸的图片输入,固定大小输出;
  • 空间金字塔结构能够进行多个级别的池化,增加尺度不变性,鲁棒性更好;
  • 可对任意尺寸提取的特征进行池化。

SPP-net 的缺点:

  • 训练过程是多级流水线;
  • 特征也写入磁盘,浪费空间;
  • 微调算法不能更新在空间金字塔池之前的卷积层。

Fast R-CNN

针对 R-CNN 和 SPP-net 的不足,Ross Girshick 在文献[3]中提出了 Fast R-CNN,使用多任务损失来进行单阶段训练,可以更新所有网络层参数,不需要磁盘空间缓存特征。

网络结构

如图 4 所示,Fast R-CNN网络将整个图像和一组候选框作为输入。网络首先使用几个卷积层(conv)和最大池化层来处理整个图像,以产生卷积特征图。然后,对于每个候选框,RoI(Region of Interest)池化层从特征图中提取固定长度的特征向量。每个特征向量被送入一系列全连接层中,其最终分支成两个同级输出层 :一个输出 K 个类别加上 1 个背景类别的 Softmax 概率估计,另一个输出为 K 个类别的 4 个实数值。每组 4 个值表示一个类别的检测框位置的修正。



图4 Fast R-CNN 架构,使用多任务损失的端到端训练

RoI 是卷积特征图中的一个矩形窗口,由左上角 $(r,c)$ 及其高度和宽度 $(h,w)$ 的四元组 $(r,c,h,w)$ 定义。RoI 池化层使用最大池化将大小为 $h \times w$ 的 RoI 窗口分割成 $H \times W$个子窗口,再对每个子窗口进行最大池化。

损失函数

Fast R-CNN 网络之所以能够单阶段训练,就是因为巧妙地构造了损失函数。Fast R-CNN网络具有两个同级输出层。第一个输出 $K+1$ 个类别上的概率 $p=(p_{0},\cdots,p_{k})$ 。第二个输出检测框回归偏移,$t^{k}=(t^{k}_{x},k^{k}_{y},k^{k}_{w},k^{k}_{w}) ,k \in[0,\cdots,k]$。每个训练的 RoI 用类真值 $u$ 和检测框回归目标 $v$ 标记。多任务损失函数为:
$$
L(p, u, t^u, v) = L_{cls}(p, u) + \lambda \lbrack u \ge 1 \rbrack L_{loc}(t^u, v)
$$
其中 $L_{cls}(p, u) = -\log p_u$,是类真值 $u$ 的 log 损失。对于类真值 $u$,$L_{loc}$ 是定义在检测框回归目标真值元组 $u,v=(v_{x},v_{y},v_{w},v_{h})$ 和预测元组 $t^{u}=(t^{u}_{x},t^{u}_{y},t^{u}_{w},t^{u}_{h})$ 上的损失。Lversion 括号指示函数 $[ u \ge 1]$ 当 $u \ge 1$ 的时候值为1,否则为0。背景类标记为 $u=0$ 。对于背景 RoI,没有检测框真值的概念,因此 $L_{los}$ 被忽略。对于检测回归,使用损失:
$$
L_{loc}(t^u, v) = \sum_{i \in \lbrace x, y, w, h \rbrace}smooth_{L_1}(t^u_i - v_i)
$$
其中:
$$
smooth_{L_1}(x) = \begin{cases}0.5x^2 & if \vert x \vert \lt 1 \\ \vert x \vert - 0.5 & otherwise \end{cases}
$$
是鲁棒的 $L_{1}$ 损失,对于异常值比 $L_{2}$ 更加不敏感。

实验结论

论文中,作者进行比对实验,得出以下几点结论:

  • 多任务同步训练能够提高准确度;
  • 使用多尺度的图像金字塔,性能几乎没有提升;
  • 倍增训练数据,能够有 2%~3% 的准确度提升;
  • 直接输出用 softmax 输出各类概率,比 SVM 性能略好;
  • 更多候选区域不能提升性能。

Faster R-CNN

Fast R-CNN 使用 Selective Search 方法来选择区域,通常比较慢。Faster R-CNN 主要提出利用 Region Proposal Network(RPN) 来替代之前的区域选择方法,形成一个统一的端到端的框架。如图5 所示,可以将 Faster R-CNN 看成是 RPN + Fast R-CNN:



图5 Faster R-CNN 架构

RPN 网络结构

RPN 主要的思想是利用神经网络直接生成候选区域,本质方法是在卷积层输出的特征图上滑动窗口。如图6 所示,以特征图上的每个点位中心,生成 k 个 anchor boxes。这里的 Anchor boxes 是提前设定的多尺度多长宽比的矩形框。每个 anchor box 通过卷积后,生成一个 256 向量,再分别送往分类层和边框回归层。分类层输出 anchor box 属于背景和前景的概率,边框回归层输出对应边框平移缩放的参数。



图6 RPN 框架

RPN 损失函数

损失函数定义为:
$$
L(\{p_i\},\{t_i\}) = \frac{1}{N_{cls}} \sum_i L_{cls}(p_i, p_i^{*}) +\lambda \frac{1}{N_{reg}} \sum_i p_i^{*} L_{reg}(t_i, t_i^{*})
$$
其中 $i$ 表示一次 Mini-Batch 中 anchor 的索引, $p_i$ 是 anchor $i$ 是否是一个物体,是为1,否为0, $N_{cls}$ 和 $N_{reg}$ 是两个归一化项,分别表示 Mini-Batch 的大小和 Anchor 位置的数目。

Mask R-CNN

Mask R-CNN 是 ICCV2017 的最佳论文,主要是将 Faster R-CNN 从目标检测任务扩展到目标分割任务,后者不仅需要正确检测图像中的所有目标,还需要精确地分割每个目标。



图7 Mask R-CNN 框架

如图7 所示,Mask R-CNN 大体继承 Faster R-CNN 的结构,先通过 RPN 提取 RoI,再进行 ROIAlign,除了类别预测和边框回归,对于每个 ROI 会并行通过一个全卷积网络(FCN)输出一个二值 mask,判断每一个像素是否属于物体。

RoIAlign

RoIPool 每个RoI提取小特征图的标准操作,用以解决不同尺度的 RoI 提取成相同尺寸的特征大小的问题,类似 SPP-net 中 SPP层,但是只有一个尺度。这样做的一个缺点就是容易出现错位问题,对于掩码的生成有一定的影响。因此,Mask R-CNN 用 RoIAlign 替换 RoIPool,除掉所有四舍五入操作,如果计算得到的边框不是刚好在像素之间,通过双线性插值计算该位置的精确值。

损失函数

Mask R-CNN 的损失函数定义为:$L=L_{cls}+L_{box}+L_{mask}$ 。其中,对于每个 RoI 输出 $K$ 个 $m \times m$ 的二进制掩码,每个类别一个, $K$ 表示类别数量。对每个像素使用 Sigmoid 函数,并定义 $L_{mask}$ 为平均二进制交叉熵损失,并且只计算真实类别对应的掩码损失,其他的不计入损失。



图7 Mask R-CNN 框架示意

参考资料

请作者吃酒!