Faster RCNN

Table of Contents

1. Faster RCNN

1.1. Region Proposal Network

rpn.png

faster rcnn 设计了一个很简单的 region proposal network (rpn), 代替 selective search 来生成 region proposal.

yolossd 的 anchor/cell 的设计直接参考了 rpn

1.1.1. anchor

对于 MxM 的 feature map, 使用 3x3 的 window 提前生成 N*9 个不同大小和长宽比的 anchor box.

1.1.2. output

MxM feature map 被交给两个独立的 conv 处理:

  • classification, 用来判断 anchor box 是否有物体
  • regression, 用来输出 region 的 bounding box

1.1.3. label

训练时需要先 assign label

  1. classification, 这个相当于 yolo 中 objectness confidence
    1. 如果 anchor box 和 gt_box 的 IOU > 0.7, 标记为 1
    2. 如果 anchor box 和 gt_box 的 IOU < 0.3, 标记为 -1
    3. 其它的 anchor box 不参与 loss 计算
  2. regression

    如果 classfication label 为 1, 则把 gt_box 的坐标做为 anchor box 的坐标 的 label

1.1.4. loss

rpn_loss.png

  • \(p_i\) 是 classfication 输出
  • \(p_i^*\) 来自 classfication 的 label: 当 label = -1 时, \(p_i^*=0\), 当 label = 1 时, \(p_i^*=1\)
  • \(t_i\) 是 regression 的输出
  • \(t_i^*\) 是 regression 的 label

计算 loss 时首先需要过滤掉 label 为 0 的 anchor box, 然后计算 regression loss 时只会考虑 \(p_i^*=1\) 的 anchor box, 因为 \(p_i^*=0\) 的 anchor box 没有和 box 对应, 不包含 bounding box 的 label

Backlinks

SSD (SSD > anchor): ssd 的 anchor 参考了 Region Proposal Network, 但不包含 objectness confidence.

YOLO (YOLO > Some Thoughts > Why Cell/Anchor): anchor 的思想来源到 Region Proposal Network.

1.2. ROIPooling

通过 RPN 得到 region 后, 后面需要做 classification, 即判断这个 region 里具体是什么物体.

在实践中, 并非所有的 rpn region 都会参与 roi_pooling:

  1. 通过 NMS (threshold 为 0.7) 保留大约 2000 个 region (NMS 在 faster-rcnn 中进行了两个, 一次在 rpn 之后, 另一次在输出最终结果时)
  2. 只选择 top-N 个 region
  3. 只选择 objectness confidence 超过一定 threshold 的 region

region 的尺寸是不确定的, 但 classifer 要求特定尺寸的输入, 有两种做法.

直观的做法可以是这样:

  1. 根据 region 从原始图片中截取一部分
  2. resize 成特定的尺寸
  3. 交给 classifier

但 faster rcnn 的做法是这样的:

  1. 把 region 缩放到 feature map 上
  2. 通过 roi pooling 得到特定尺寸的 feature map, 所谓的 roi pooling 实际上 GlobalAveragePoolingSpatial Pyramid Pooling 类似.

例如:

  1. 若输出是 10x10, roi_pooling(2,2) 会以 5x5 进行 pooling, 得到 2x2 的输出
  2. 若输出是 20x20, roi_pooling(2,2) 会以 10x10 进行 pooling, 同样得到 2x2 的输出

ROIPooling 实际相当于工作在 feature map 上的 resize

1.3. ROIAlign

roi_pooling 有两次取整的过程, 导致出现误差, 这种误差相当于一种量化误差.

  1. 需要把 region 缩放到 feature map 上, 如果不能整除, 会进行取整, 导致 region 出现偏移
  2. 计算 pooling 的 stride 时需要取整, 例如 region 为 (9,9), pooling要求输出 (2,2), 则会产生下面的 pooling 分割结果

    4 5
    5 4
    

为了解决上面的问题, 提出 roi_allign 的方法, 计算坐标时保留小数, 但最后使用双线性插值 (bilinear interpolation) 获得浮点数坐标上的像素值

roi_align.png

  1. 上图最外层的框是 region proposal 的结果, 左上角为 (1.3, 0.9), 右下角为 (3.3, 4.1)
  2. 假设需要生成 (2,2) 的 pooling, 所以 stride 为 (1, 1.6) (即 (3.3-1.3)/2, (4.1-0.9)/2)
  3. 左上角的小框的坐标为 (1.3, 0.9), (2.3, 2.5)
  4. 在左上角小框平均采样 4 个点 A, B, C, D (4 是可以配置的常量), 取决于框的大小
  5. 左上角的 A 为 (1.633, 1.433)
  6. 取和 A 相邻的四个点 (1,1), (1,2), (2,1), (2.2), 通过 bilinear interpolation 计算出 A 的值
  7. 对 B, C, D 进行同样的操作, 然后计算 A, B, C, D 的 max 做为 pooling 的结果
  8. 对另外三个小框做同样的操作

1.4. Selective Search

Selective Search for Object Recognition 2012

https://www.geeksforgeeks.org/selective-search-for-object-detection-r-cnn/

faster rcnn 之前的 fast rcnn, rcnn 都是使用 selective serch 来生成 region proposal, 基本思想是:

基于图片本身的数据(颜色, 纹理等), 通过不断合并相近的小区域生成较大的 region proposal.

selective search 需要迭代执行, 速度非常慢, 基本需要 1~3 秒, 而 rpn 大约只需要 10ms

Backlinks

Object Detection (Object Detection > Faster RCNN): Faster RCNN

Author: [email protected]
Date: 2022-01-07 Fri 00:00
Last updated: 2022-01-26 Wed 20:11

知识共享许可协议