paper:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Tensorflow-faster r-cnn github:Tensorflow Faster RCNN for Object Detection

前言

faster rcnn 是何凯明等大神在 2015 年提出目标检测算法,该算法在 2015 年的 ILSVRV 和 COCO 竞赛中获得多项第一。该算法在 fast rcnn 基础上提出了 RPN 候选框生成算法,使得目标检测速度大大提高。

R CNN 系列算法比较

R-CNN:

(1)image input;
(2) 利用 selective search 算法在图像中从上到下提取 2000 个左右的 Region Proposal;
(3)将每个 Region Proposal 缩放 (warp) 成 227*227 的大小并输入到 CNN,将 CNN 的 fc7 层的输出作为特征;
(4) 将每个 Region Proposal 提取的 CNN 特征输入到 SVM 进行分类;
(5) 对于 SVM 分好类的 Region Proposal 做边框回归,用 Bounding box 回归值校正原来的建议窗口,生成预测窗口坐标.
缺陷:
(1) 训练分为多个阶段,步骤繁琐:微调网络 + 训练 SVM + 训练边框回归器;
(2) 训练耗时,占用磁盘空间大;5000 张图像产生几百 G 的特征文件;
(3) 速度慢:使用 GPU,VGG16 模型处理一张图像需要 47s;
(4) 测试速度慢:每个候选区域需要运行整个前向 CNN 计算;
(5) SVM 和回归是事后操作,在 SVM 和回归过程中 CNN 特征没有被学习更新.

FAST-RCNN:

(1)image input;
(2) 利用 selective search 算法在图像中从上到下提取 2000 个左右的建议窗口 (Region Proposal);
(3) 将整张图片输入 CNN,进行特征提取;
(4) 把建议窗口映射到 CNN 的最后一层卷积 feature map 上;
(5) 通过 RoI pooling 层使每个建议窗口生成固定尺寸的 feature map;
(6)利用 Softmax Loss(探测分类概率) 和 Smooth L1 Loss(探测边框回归)对分类概率和边框回归 (Bounding box regression) 联合训练.

相比 R-CNN,主要两处不同:
(1) 最后一层卷积层后加了一个 ROI pooling layer;
(2) 损失函数使用了多任务损失函数 (multi-task loss),将边框回归直接加入到 CNN 网络中训练
改进:
(1) 测试时速度慢:R-CNN 把一张图像分解成大量的建议框,每个建议框拉伸形成的图像都会单独通过 CNN 提取特征. 实际上这些建议框之间大量重叠,特征值之间完全可以共享,造成了运算能力的浪费.
FAST-RCNN 将整张图像归一化后直接送入 CNN,在最后的卷积层输出的 feature map 上,加入建议框信息,使得在此之前的 CNN 运算得以共享.
(2) 训练时速度慢:R-CNN 在训练时,是在采用 SVM 分类之前,把通过 CNN 提取的特征存储在硬盘上. 这种方法造成了训练性能低下,因为在硬盘上大量的读写数据会造成训练速度缓慢.
FAST-RCNN 在训练时,只需要将一张图像送入网络,每张图像一次性地提取 CNN 特征和建议区域,训练数据在 GPU 内存里直接进 Loss 层,这样候选区域的前几层特征不需要再重复计算且不再需要把大量数据存储在硬盘上.
(3) 训练所需空间大:R-CNN 中独立的 SVM 分类器和回归器需要大量特征作为训练样本,需要大量的硬盘空间. FAST-RCNN 把类别判断和位置回归统一用深度网络实现,不再需要额外存储.
(4) 由于 ROI pooling 的提出,不需要再 input 进行 Corp 和 wrap 操作,避免像素的损失,巧妙解决了尺度缩放的问题.

FASTER -RCNN:

(1) 输入测试图像;
(2) 将整张图片输入 CNN,进行特征提取;
(3)用 RPN 先生成一堆 Anchor box,对其进行裁剪过滤后通过 softmax 判断 anchors 属于前景 (foreground) 或者后景(background),即是物体 or 不是物体,所以这是一个二分类;同时,另一分支 bounding box regression 修正 anchor box,形成较精确的 proposal(注:这里的较精确是相对于后面全连接层的再一次 box regression 而言)
(4) 把建议窗口映射到 CNN 的最后一层卷积 feature map 上;
(5) 通过 RoI pooling 层使每个 RoI 生成固定尺寸的 feature map;
(6)利用 Softmax Loss(探测分类概率) 和 Smooth L1 Loss(探测边框回归)对分类概率和边框回归 (Bounding box regression) 联合训练.

相比 FASTER-RCNN,主要两处不同:
(1) 使用 RPN(Region Proposal Network) 代替原来的 Selective Search 方法产生建议窗口;
(2) 产生建议窗口的 CNN 和目标检测的 CNN 共享

改进:
(1) 如何高效快速产生建议框?
FASTER-RCNN 创造性地采用卷积网络自行产生建议框,并且和目标检测网络共享卷积网络,使得建议框数目从原有的约 2000 个减少为 300 个,且建议框的质量也有本质的提高.

Faster R CNN 结构详解

Faster RCNN详解_小白的深度学习的博客-CSDN博客_faster rcnn - 图1

Faster RCNN详解_小白的深度学习的博客-CSDN博客_faster rcnn - 图2

Faster RCNN详解_小白的深度学习的博客-CSDN博客_faster rcnn - 图3

从上面的三张图可以看出,Faster R CNN 由下面几部分组成:

  1. 数据集,image input
  2. 卷积层 CNN 等基础网络,提取特征得到 feature map
    3-1.RPN 层,再在经过卷积层提取到的 feature map 上用一个 3x3 的 slide window,去遍历整个 feature map, 在遍历过程中每个 window 中心按 rate,scale(1:2,1:1,2:1)生成 9 个 anchors,然后再利用全连接对每个 anchors 做二分类(是前景还是背景)和初步 bbox regression,最后输出比较精确的 300 个 ROIs。
    3-2. 把经过卷积层 feature map 用 ROI pooling 固定全连接层的输入维度。
  3. 然后把经过 RPN 输出的 rois 映射到 ROIpooling 的 feature map 上进行 bbox 回归和分类。

概念详解

SSP-NET

SPP-Net 是出自论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》
由于一般的网络结构中都伴随全连接层,全连接层的参数就和输入图像大小有关,因为它要把输入的所有像素点连接起来, 需要指定输入层神经元个数和输出层神经元个数,所以需要规定输入的 feature 的大小。而 SPP-NET 正好解决了这个问题。
Faster RCNN详解_小白的深度学习的博客-CSDN博客_faster rcnn - 图4

如果原图输入是 224x224,对于 conv5 出来后的输出,是 13x13x256 的,可以理解成有 256 个这样的 filter,每个 filter 对应一张 13x13 的 activation map. 如果像上图那样将 activation map pooling 成 4x4 2x2 1x1 三张子图,做 max pooling 后,出来的特征就是固定长度的 (16+4+1)x256 那么多的维度了. 如果原图的输入不是 224x224,出来的特征依然是(16+4+1)x256;直觉地说,可以理解成将原来固定大小为(3x3) 窗口的 pool5 改成了自适应窗口大小,窗口的大小和 activation map 成比例,保证了经过 pooling 后出来的 feature 的长度是一致的.

总结而言,当网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量)。

ROI pooling

ROI pooling layer 实际上是 SPP-NET 的一个精简版,SPP-NET 对每个 proposal 使用了不同大小的金字塔映射,而 ROI pooling layer 只需要下采样到一个 7x7 的特征图. 对于 VGG16 网络 conv5_3 有 512 个特征图,这样所有 region proposal 对应了一个 7_7_512 维度的特征向量作为全连接层的输入.

为什么要 pooling 成 7×7 的尺度?是为了能够共享权重。Faster RCNN 除了用到 VGG 前几层的卷积之外,最后的全连接层也可以继续利用。当所有的 RoIs 都被 pooling 成(512×7×7)的 feature map 后,将它 reshape 成一个一维的向量,就可以利用 VGG16 预训练的权重,初始化前两层全连接.

Bbox 回归

Faster RCNN详解_小白的深度学习的博客-CSDN博客_faster rcnn - 图5

那么经过何种变换才能从图 11 中的窗口 P 变为窗口呢?比较简单的思路就是:
Faster RCNN详解_小白的深度学习的博客-CSDN博客_faster rcnn - 图6

Faster RCNN详解_小白的深度学习的博客-CSDN博客_faster rcnn - 图7

注意:只有当 Proposal 和 Ground Truth 比较接近时(线性问题),我们才能将其作为训练样本训练我们的线性回归模型,否则会导致训练的回归模型不 work(当 Proposal 跟 GT 离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理). 这个也是 G-CNN: an Iterative Grid Based Object Detector 多次迭代实现目标准确定位的关键. 线性回归就是给定输入的特征向量 X,学习一组参数 W,使得经过线性回归后的值跟真实值 Y(Ground Truth) 非常接近. 即. 那么 Bounding-box 中我们的输入以及输出分别是什么呢?
Faster RCNN详解_小白的深度学习的博客-CSDN博客_faster rcnn - 图8

Faster RCNN详解_小白的深度学习的博客-CSDN博客_faster rcnn - 图9

RPN

Faster RCNN详解_小白的深度学习的博客-CSDN博客_faster rcnn - 图10

Feature Map 进入 RPN 后,先经过一次 3_3 的卷积,同样,特征图大小依然是 60_40, 数量 512,这样做的目的应该是进一步集中特征信息,接着看到两个全卷积, 即 kernel_size=1_1,p=0,stride=1;
Faster RCNN详解_小白的深度学习的博客-CSDN博客_faster rcnn - 图11

如上图中标识:
① rpn_cls:60_40_512-d ⊕ 1_1_512_18 > 60_40_9_2 逐像素对其 9 个 Anchor box 进行二分类
② rpn_bbox:60_40_512-d ⊕ 1_1_512_36>60_40_9*4 逐像素得到其 9 个 Anchor box 四个坐标信息

逐像素对 Anchors 分类标记
① 去除掉超过 1000*600 这原图的边界的 anchor box
② 如果 anchor box 与 ground truth 的 IoU 值最大,标记为正样本,label=1
③ 如果 anchor box 与 ground truth 的 IoU>0.7,标记为正样本,label=1
④ 如果 anchor box 与 ground truth 的 IoU<0.3,标记为负样本,label=0
剩下的既不是正样本也不是负样本,不用于最终训练,label=-1

逐像素 Bbox 回归纠正
除了对 anchor box 进行标记外,另一件事情就是计算 anchor box 与 ground truth 之间的偏移量
令:ground truth: 标定的框也对应一个中心点位置坐标 x,y和宽高 w,h
anchor box: 中心点位置坐标 xa,y_a 和宽高 w_a,h_a
所以,偏移量:
△x=(x
-xa)/w_a △y=(y-ya)/h_a
△w=log(w
/wa) △h=log(h/h_a)
通过 ground truth box 与预测的 anchor box 之间的差异来进行学习,从而是 RPN 网络中的权重能够学习到预测 box 的能力

接着进一步对 Anchors 进行越界剔除和使用 nms 非最大值抑制,剔除掉重叠的框;比如,设定 IoU 为 0.7 的阈值,即仅保留覆盖率不超过 0.7 的局部最大分数的 box(粗筛)。最后留下大约 2000 个 anchor,然后再取前 N 个 box(比如 300 个);这样,进入到下一层 ROI Pooling 时 region proposal 大约只有 300 个。

参考文献:

  1. faster-rcnn 原理及相应概念解释
  2. Faster RCNN 学习笔记
    https://blog.csdn.net/weixin_43198141/article/details/90178512