深度篇——目标检测史(四) 细说 从 Fast R-CNN 到 Faster R-CNN 目标检测

返回主目录

返回 目标检测史 目录

上一章:深度篇——目标检测史(三)  细说 SPP-Net 目标检测

下一章:深度篇——目标检测史(五) 细说 SSD 目标检测

 

论文地址:《Fast R-CNN》《Faster R-CNN》  

代码地址: faster-rcnn

 

本小节,细说 从 Fast R-CNN 到 Faster R-CNN 目标检测,下一小节细说 SSD 目标检测

 

四. Fast R-CNN 目标检测 (2015 年)

为了解决 R-CNN 和 SPP-Net 2k 个左右 bounding boxes 带来的重复计算问题,于是 R-CNN 的作者 研发出了 Fast R-CNN。

1. Fast R-CNN 的主要思想

   (1). 使用一个简化的 SPP 层

         使用 ROI pooling 层,操作与 SPP 类似

   (2). 训练和测试是不再分多步

          不再需要额外的硬盘来存储中间层的特征,梯度能够通过 ROI pooling 层直线传播。此外,分类和回归用 Multi-task 的方式一起进行

   (3). SVD

         使用 SVD 分解全连接层的参数矩阵,压缩为两个规模小很多的全连接层。

 

2. Fast R-CNN 的主要步骤

   (1). region proposal 区域提名

        通过 selective search 等方法从原始图像中提取 region proposal bounding boxes

   (2). 特征提取

          将整张图像输入到 CNN 网络中,得到相关的 feature maps

   (3). 映射

          将 bounding boxes 一一 映射到最后的 feature maps 上

   (4). 区域归一化

          针对 feature maps 上的每个 region proposal bounding boxes 进行 ROI pooling 操作(这个过程类似于简化版的 SPP 层操作),得到固定大小的 feature maps。

          ROI pooling 的具体操作,可以参考我前面写的:深度篇—— CNN 卷积神经网络(三) 关于 ROI pooling 和 ROI Align 与 插值

   (5). 分类与回归

         然后再通过两个全连接层,分别用 softmax 多分类的目标检测(这里做了重大改变,以前都是用 SVM 做分类),用回归模型进行边框位置与大小的微调。

    SPP-Net 是个好方法,R-CNN 进阶成 Fast R-CNN 就是在 R-CNN 的基础上采纳了 SPP-Net 方法,对 R-CNN 做了改进,使得性能进一步提高。Fast R-CNN 其实就是用 ROI pooling 替换掉 SPP layer,用 multi-task loss 替换掉 SVM 的 SPP-Net。

 

3. Fast R-CNN 的流程图

 

 

4. Fast R-CNN 的多任务损失函数

   (1). Fast R-CNN 有两个输出 loss 结果

   (2). 一个输出结果是离散型的概率分布(对每个 ROI),对于 k + 1 个分类(k 为 ROI 的目标分类,1 为背景) 有:\large p = (p_{0},\; ......,\; p_{k})

   (3). 另一个输出是 bounding boxes 回归补偿 (bounding boxes regression effsets)。对于 k 个目标类中的每个目标类 k 有:\large t^{k} = (t_{x}^{k},\; t_{y}^{k},\; t_{w}^{k},\; t_{h}^{k})

   (4). 在每个标记的 ROI 上使用一个多任务损失 L 来联合训练用于分类和 bounding boxes 回归。

             \LARGE L(p, \mu, t^{\mu}, v) = \left\{\begin{matrix} L_{cls}(p, \mu) + \lambda L_{loc}(t^{\mu}, v) & (\mu \; is \; foreground) \\ L_{cls}(p, \mu) & (\mu \; is \; background) \end{matrix}\right.

              \LARGE L_{cls} (p, \mu) = -log_{2} p_{\mu}

              \LARGE L_{loc}(t^{\mu}, v) = \sum_{i \in (x, y, w, h)} smooth_{L_{1}} (t_{i}^{\mu} - v_{i})

              \LARGE smooth_{L_{1}} (x) = \left\{\begin{matrix} 0.5 x^{2} & |x| < 1 \\ |x| - 0.5 & |x| \geq 1 \end{matrix}\right.

              \large \mu:为一个 ground truth 所对应的每个训练的 ROI,分为前景和背景

              \large v:为一个 ground truth 的真实坐标,\large v = (v_{x},\; v_{y},\; v_{w},\; v_{h}) 

              \large t^{\mu}:为第 \large \mu 个目标类的 bounding boxes 回归补偿,\large t^{\mu} = (t_{x}^{\mu},\; t_{y}^{\mu},\; t_{w}^{\mu},\; t_{h}^{\mu})

              \large p:为每个 ROI 做 softmax 的 k + 1 分类计算出来的概率,\large p = (p_{0}, p_{1}, ......, p_{k})。这 k + 1 中,其中 k 为 k 个目标分类,1 为背景分类。

              \large L_{cls}(p, \mu):为第 \large \mu 个类别的真实对数损失 (交叉熵)

              \large L_{loc}(t^{\mu}, v):为每个 \large \mu 的预测元组 \large t^{\mu} = (t_{x}^{\mu},\; t_{y}^{\mu},\; t_{w}^{\mu},\; t_{h}^{\mu}) 与 ground truth 所对应的真实坐标元组 \large v = (v_{x},\; v_{y},\; v_{w},\; v_{h})  的损失。

              \large L_{1}:为一个强健的 \large L_{1} 损失,对异常值没那么敏感(在 R-CNN 和 SPP-Net 中使用了 \large L_{2} 损失)

              \large \lambda:为超参数,用来平衡两个损失函数。对 ground truth 常态化回归目标 \large v_{i} 的均值和单位方差都为零,并且在这些实验中都使用 \large \lambda = 1

 

5. Fast R-CNN VS R-CNN & SPP-Net

    由于 Fast R-CNN 是对 input image 是整张图像进行 CNN 操作,并使用了 ROI pooling 所以,它在效率上,比 R-CNN 和 SPP-Net 都要快,并且没有 R-CNN crop 或 warp 导致的误差。再者,Fast R-CNN 使用了 softmax 替代 SVM,使得模型训练和测试的分类效率更好了,而且,效果也明显提升。对于有限的数据,使用 SVM 的效果会好点,但是,当用户拥有海量数据去做模型的时候,SVM 的处境就非常尴尬了。因为,它的计算方式是 把目标一个个分开来计算的,而不是像 softmax 一样,是一起计算的;这也导致在分类类别比较多的时候,SVM 的模型会相对比较大。

 

五. Faster R-CNN 目标检测 (2015 年)

1. Fast R-CNN 使用 selective search 来进行区域提名,速度依然不够快。Faster R-CNN 则直接利用 RPN (Region Proposal Networks, RPN) 网络来计算 bounding boxes。RPN 以一张任意大小的图像为输入,输出一批矩形 区域提名,每个区域对应一个目标分类和位置信息。

 

2. RPN 区域提名网络

    RPN 的输出是一组 boxes/proposal,分类器和回归器将对这些 boxes/proposal 进行检查,最终检查对象的出现情况。更精确地说,RPN 网络预测了一个 anchor 是前景还是背景,并对 anchor 进行了细化。

    (1). RPN 网络的具体做法

       ①. 在最后一个卷积层的后面加入 RPN 网络,在 feature maps 上进行滑动窗口。

       ②. 建一个神经网络用于物体分类 + 框位置的回归

       ③. 滑动窗口的位置,提供了物体的大体位置信息

       ④. 框的回归提供了框更精确的位置

       ⑤. 通过训练得到 bounding boxes region。

    (2). 前景和背景分类器

         训练一个分类器的第一步是建立一个训练数据集,训练数据集是 RPN 过程和那些 ground truth boxes 来标记出所有的 anchors。基本思路是:希望将具有较高重叠的 anchors 标记为前景,将具有较低重叠的 anchors 标记为背景。显然,这需要一些调整和折中来分离前景和背景。在现实中可以查询到这些细节,于是便有了标记的 anchors。

    (3). 关于 anchors 处的 feature

          例如 600 x 800 image 在应用 CNN 后,每 16 步闪烁一次,从而得到 1989 (39 x 51) feature maps。在这 1989 feature maps 中,每个位置有 9 个 anchors,而每个 anchor 又有两种可能 labels (前景和背景)。如果将 feature maps 的深度设置为 18 (9 个 anchors x 2 个 labels),将每个 anchor 定义为一个向量,其中有两个值 (通常称为 logit) 表示为前景和背景。如果将 logit 输入 softmax / logistic 回归激活函数中,将可以得到预测的 labels。于是训练数据便已包含了 features 和 labels 了。即 anchors 处 的 feature maps 既包含 features,也包含 labels。

 

3. anchor 锚点

    (1). 一个 anchor 就是一个 box,在 Faster R-CNN 中默认一张图像中的一个位置(像素点) 就有 9 个 anchors。

    (2). 一个位置 (像素点) 的 9 个 anchor:

         标出的红色框的长宽比例为 1:1,1:2 和 2:1,这三组框都是这样的比例。

    (3). 如果 input image 为 600 x 800,在每 16 步选择一个位置(像素点),将会有 1989 (39 x 51) 个位置。这就需要考虑 17906 (1989 x 9) 个 boxes。它的绝对尺寸并不滑动窗口和金字塔小多少。或者可以根据这推断出这就是为什么它的覆盖率与其他最先进的方法一样好。而且它好的一面是在 Fast R-CNN 中可以使用 RPN 网络的方法显著减少数量。这些 anchors 对 Pascal VOC 数据集和 COCO 数据集都非常有效。也可以根据需求自由设计不同类型的 anchor boxes。

 

4. Faster R-CNN 的主要步骤:

   (1). 特征提取

        将整张图像输入 CNN 网络中,利用 CNN 得到图像的 feature maps

   (2). region proposal 区域提名

        将上面 CNN 得到的 feature maps 输入 RPN 网络中,利用 k 个不同的 anchor boxes 进行滑动窗口卷积操作,通过 RPN 网络的分类与回归进行提名(在 RPN 网络中,会将 ground truth boxes 和 anchors 映射到其 feature maps 上,k 一般为 9),每张图像大约生成 300 个建议窗口

   (3). ROI pooling

        将生成的建议窗口一一映射到上面 CNN 得到的 feature maps 上,通过 ROI pooling 使每个 ROI 生成固定尺寸的 feature maps

   (4). 分类与回归

         利用 softmax loss (探测分类概率) 和 \large smooth_{L_{1}} \; loss (探测边框回归) 对分类概率和边框回归的联合训练。

 

5. Faster R-CNN 流程图

 

 

6. Faster R-CNN 抛弃了 selective search,引入了 RPN 网络。在 RPN 中,当 RPN 与目标网络共享最大计算量时,生成 region proposals 区域提名 的世界开销比 selective search 选择性搜索 小得多。简单地说,RPN 对区域框 (或理解为 anchor 框) 进行排序,并提出最有可能包含对象的区域框。这使得 region proposals、分类、回归 一起共享卷积特征,从而得到了进一步加速。

 

7. Faster R-CNN 损失函数

   遵循 multi-task loss 定义,最小化目标函数。Faster R-CNN 中对一个图像的函数定义为:

            \large L(\{p_{i}\}, \{t_{i}\}) = \left\{\begin{matrix} \frac{1}{N_{cls}} \sum_{i} L_{cls}(p_{i}) + \lambda \frac{1}{N_{reg}} \sum_{i} L_{reg} (t_{i}, t_{i}^{*}) & (foreground) \\ \frac{1}{N_{cls}} \sum_{i} L_{cls}(p_{i}) & (background) \end{matrix}\right.

            \large L_{cls} (p_{i}) = \left\{\begin{matrix} -log \; p_{i} & (foreground) \\ -log \; (1 - p_{i}) & (background) \end{matrix}\right.

            \large L_{reg} (t_{i}, t_{i}^{*}) = smooth_{L_{1}} (t_{i} - t_{i}^{*})

            \large smooth_{L_{1}} (x) = \left\{\begin{matrix} 0.5 x^{2} & |x| < 1 \\ |x| - 0.5 & |x| \geq 1 \end{matrix}\right.

          \large p_i:为 anchors 预测为目标的概率

          \large t_i:为预测的 bounding boxes 的 4 个参数化坐标的向量 \large t_{i} = (t_{x}, t_{y}, t_{w}, t_{h})

          \large t_{i}^{*}:为与前景 anchors 对应的 ground truth boxes 对应的 4 个参数化坐标向量 \large t_{i}^{*} = (t_{x}^{*}, t_{y}^{*}, t_{w}^{*}, t_{h}^{*})

          \large i:为 mini-batch 中 anchors 的索引

          \large \lambda:为超参,在早期实现及公开的代码中 \large \lambda = 10

          \large N_{cls}:为 mini-batch size,

          \large N_{reg}:为 anchors 位置的数量

          \large L_{cls}(p_{i}):为两个类别(目标与非目标) 的对数损失

          \large L_{reg}(t_{i}, t_{i}^{*}):为 bounding boxes 的回归损失

 

8. 在 Faster R-CNN 中有 四个 损失函数

   (1). RPN classification loss (anchor good or bad)

   (2). RPN regression loss (anchor ---> proposal )

   (3). Faster R-CNN classification loss (over classes)

   (4). Faster R-CNN regression loss (proposal ---> box)

   RPN loss 分别与 Faster R-CNN 对应的 loss 相似。

 

9. 在训练的过程中,需要关注它的感受野。确保 feature maps 上的每个未知的感受野都能覆盖它所表示的所有的 anchors,否则这些 anchors 的特征向量将没有足够的信息来进行预测。在 Faster R-CNN 中,不同的 anchors 之间的感受野经常重叠在一起,它让 RPN 保持位置感知。

 

10. 除了遵循标记 anchors 的过程,还可以根据回归器要细化的类似标准来选择 anchors。这里有一点要注意的是,被标记为 foreground 的 anchors 不应包含在回归中,因为并没有用于背景的 ground truth boxes。

 

11. Faster R-CNN 虽然效率和精度相对于 Fast R-CNN 都提高了不少,但是,由于 它的 高 anchors (9 个),总体来说,效率还是有点慢的。在以后的发展中,人们想到了,既然 9 个 anchors 拉慢了效率,那么,就尝试着减少 anchors 的使用,在 SSD 和 YOLO 中,为了提高效率,都减少了 anchors 的使用。为了在减少 anchors 的使用提高效率,但是又想精度有所保留或提升,所以,SSD 使用了 inception-style 的 MultiBox 结构,而 YOLO-V3 则使用了全卷积 + 3 个尺度的上采样 来平衡和提醒效率和精度。

 

 

                  

 

返回主目录

返回 目标检测史 目录

上一章:深度篇——目标检测史(三)  细说 SPP-Net 目标检测

下一章:深度篇——目标检测史(五) 细说 SSD 目标检测

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值