R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN 系列论文解读

R-CNN

论文地址:Rich feature hierarchies for accurate object detection and semantic segmentation

发布时间:2014.10.22

背景

伴随着AlexNet的横空出世,卷积神经网络开始进入人们的视线,R-CNN便是将卷积神经网络运用于目标检测和语义分割的一个成功典范,其在 VOC 2012 将最佳mAP提高了30%。其成绩对卷积神经网络在目标检测的运用产生了深远的影响。

但在这之前,需要解决两个主要的问题:

  1. 与图片分类不同,目标检测需要在图片上定位目标的位置。那么如何利用深度的神经网络去做目标的定位?
  2. 如何在一个小规模的数据集上训练能力强劲的网络模型?

R-CNN全称为Regions with CNN features,其名字来源于其主要使用的两项技术:卷积神经网络(CNN)和区域推荐(Region Proposals),而区域推荐正是第一个问题的解决方法。当时已有许多现成的区域推荐算法,本文作者使用的是选择性搜索(selective search)算法

选择性搜索

KwZVHS.png

大概就是根据临近颜色的相似度将左边的原图变成像右边由色块组成的图片,然后根据色块选出候选框。这样可以减少对一些不必要的区域进行卷积运算,比如左图左上角那个框。该算法被后续几代网络沿用,直到 Faster R-CNN 使用神经网络进行区域推荐。

整体架构

R-CNN整体过程如下:

  1. 给定一张输入图片,使用selective search从图片中提取 2000 个类别独立的候选区域。
  2. 将每个候选区域缩放到227×227,输入到 CNN中抽取一个固定长度的特征向量。
  3. 使用各个类别对应的SVM对特征向量进行二分类,判断该候选区域是否包含该类别,之后对每个类别的窗口进行极大值抑制。

对于第二个问题,作者给出的解决方法是:在大型图片分类数据集ILSVRC上预训练卷积神经网络,并微调(fine-tuning)到小型目标检测数据集PASCAL上,这使得mAP上升了8个百分点。

R-CNN高效的原因:

  1. 所有类别共享CNN参数
  2. 特征维度相对较小

SPP-Net

论文地址:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

发布时间:2015.4.23

背景

由于 CNN 需要固定大小的输入,在将图片输入到神经网络之前需要对图片进行缩放(warp)或裁剪(crop)。缩放会造成图片几何失真,而裁剪则可能损失部分目标物像素,这将会对图片识别精确度有所影响。

K8nKrd.png

CNN 只能接收固定尺寸图片的原因是其全连接层节点数目固定,而其卷积层是可以接收不同尺寸的图片的。于是作者设计了用于神经网络中的 SPP (spatial pytamid pooling, 空间金字塔池化) 模块,位于卷积层和全连接层之间,用于接收任意尺寸的图片、提取其特征并产生固定大小的输出。而且实验表明,训练时使用不同尺寸的输入,可以提高测试精度。

空间金字塔池化层

KGQ98P.png

作者将 CNN 中的最后一个池化层用 SPP 替代。如图所示,SPP 将最后一层卷积层输出的特征图分割成不同尺寸的网格,分别为4×4、2×2、1×1,然后对每个小格进行max pooling,再将池化后的结果连接起来,就能得到(16+4+1)× 256 的固定长度的输出(这里的256为256个channel)。

SPP 在目标检测中的应用

前面提到,R-CNN 在图像中选出2000个候选窗口,并将每个窗口缩放后输入到神经网络中,这样对一张图片反复使用深度卷积网络十分耗时。测试时,特征提取是其主要的时间瓶颈。

论文中提到,特征图的ROI与原图中的目标物的位置存在一定的映射关系,如下图:

KG6IIA.png

于是对于一张图片,只需要提取一次特征,然后将特征图的2000个候选区域输入 SPP 模块就能得到固定长度的表示。由于只需要进行一次卷积操作,节省了大量候选区域通过神经网络的时间。

Fast R-CNN

论文地址:Fast R-CNN

发布时间:2015.9.27

背景

SPPnet 虽然对R-CNN进行了一些改进,但仍然存在许多问题:

  • 需要大量产生候选框
  • 对目标的定位只能靠候选框来粗略定位
  • 多阶段pipeline,特征提取、模型训练、SVM分类器训练、边框回归要分别进行
  • 特征图要存在本地磁盘,影响速度

于是 Fast R-CNN 改进了在目标检测任务中的性能,其优势如下:

  • 相比 R-CNN、SPPnet 有着更高的 mAP
  • 单阶段(single-stage)训练,使用多任务损失(multi-task loss)
  • 训练可以更新网络每一层的参数
  • 无需使用磁盘缓存特征

架构细节和模型训练

KtoCi6.png

从上图直观上来看,Fast R-CNN 与 SPPnet 的结构有两个区别:

  1. SPP模块被换成了RoI池化层
  2. 网络末端有两个输出,分别用于图像分类和边框回归。分类器被换成了softmax。使用softmax的好处在于不用单独训练一个SVM分类器;缺点在于对于一个候选框最多只能分出一类物体,即使一个候选框包含了多个类别的目标(大概)。

另外值得一提的是,Fast R-CNN 采用的是固定大小的输入,而不像SPPnet使用任意大小的输入。

RoI 池化层

RoI 池化层实质上就是单层的 SPP 模块。其将一个候选窗口划分为 H×W 的网格,对每个网格内进行最大池化,最后输出一个长度为 H×W 的特征。超参数 H 和 W 视具体网络结构而定。

多任务损失

多任务损失由分类任务损失和边框回归任务损失线性组合而成:

其中:

Mini-batch sampling

(其实这一段我没看太懂,以下仅作参考)

在调优(fine tuning)训练时,每个mini-batch中首先加入 N 张完整图片,从 N 张图片中选出一共 R 个 IoU>0.5 的候选区域,然后将这 R 个候选区域作为训练样本放入网络训练。

Faster R-CNN

论文地址:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

发布时间:2016.1.6

概述

性能优越的目标检测网络都依赖区域推荐(region proposal)算法来假定目标位置,比如R-CNN中的选择搜索(search selective)算法,而这些区域推荐的计算消耗正是整个网络性能的瓶颈。本文作者引入了区域推荐网络(Region Proposal Network, RPN),尝试使用神经网络来进行区域提取。并将 RPN 和 Fast R-CNN 融合在一起,共享卷积特征,成为一个端到端的神经网络。

架构概览

KdqldS.png

Fast R-CNN 大致结构如图。可以看出,网络由四步组成:

  1. 输入的图片经过卷积层输出一张特征图
  2. 将特征图输入 RPN,得到候选区域
  3. 将特征图上候选区域的对应位置输入到 RoI 池化层
  4. 输入到分类器得出分类结果

那么 RPN 具体是怎样的呢?

RPN

KdIwZQ.png

从上图中可以看到Faster R-CNN更具体的结构,包括左下方的RPN模块。RPN具体流程如下:

  1. 使用滑动窗口(slide window)遍历整个特征图(feature map),遍历过程中以每个window中心产生9个预设锚框(anchor),9个锚框分别对应3种尺寸和3种长宽比。

    KwJZQS.png

  2. 将锚框分别输入到线性分类层(cls layer)边框回归层(reg layer)中。分类层通过softmax对锚框进行二分类,初步判断该锚框是前景还是背景(锚框里是否包含目标物);回归层通过边框回归进一步修正锚框,使锚框定位更精确。

    K0RaZ9.png

  3. 将筛选、修正后的锚框映射到特征图上,输入到ROI池化层。后续操作和Fast R-CNN一样。

Faster R-CNN 的训练步骤

  1. 训练一个用于分类的 CNN(用于特征提取)
  2. 使用 CNN 的特征图作为输出,端到端的fine-tune RPN + CNN。IoU>0.7的作为正样本,IoU<0.3的为负样本。
  3. 固定RPN的权值,训练整个网络。
  4. 固定其余部分的权值,训练RPN
  5. 固定CNN、RPN,训练其余部分
  6. 重复步骤4、5直到满意为止

由于Faster R-CNN的训练步骤过于繁杂,促使了后续的SSD网络对其进行改进。

R-CNN 家族的总结

57KD5.png

图源:贪心学院

Mask R-CNN

(待更新)

相关面试题

Q:讲下faster-rcnn?Faster-rcnn里面的NMS的算法原理是什么?

-------------本文结束感谢您的阅读-------------