Notes on RCNN

  • 使用region proposal 方法获取一系列 candidate bounding box
  • 对每一个candidate bounding box 使用 CNN 提取特征
  • 对 candidate bounding boxes 进行 regression 获得最后的 bounding boxes
  • 根据一些阈值条件对获得的 bounding boxes 进行合并

过程详解

<img src=”/content/images/rcnn/rcnn-global.png”, width=350>

如上图所示, 首先, 通过某种 region proposal 方法(原论文中使用的是 selective search)来获取candidate bounding boxes. 接着把这些bounding boxes wrap 到 CNN 网络输入要求的大小. 然后把所有的 bounding boxes 进行 forward. 输出成有两个, 一个是 classifier, 一个 是bounding box regressor. 对每一个 bounding box 都可以获得一个类别概率和一组bounding box值, 然后根据类别概率决定是不是留下这个bounding box. 之后再把留下的bounding box 进行 merge.

# 具体操作
<img src=”/content/images/rcnn/rcnn.png”, width=350>
  1. 自己训练或者现在一个图像识别的模型, 例如 vgg16 等
    <img src=”/content/images/rcnn/step1.png”, width=360>
  2. 如果是下载的模型, 要对模型进行 finetune, 例如, vgg16 的模型是1000类, 论文中使用的是VOC 数据集, 该数据集中共有 20 类, 那么, finetune 之后的类别应该是 21 类(其中 1 类是background)
    <img src=”/content/images/rcnn/step2.png”, width=360>
  3. 特征提取. 首先通过 region proposal 方法获取 candidate, 然后, 把每一个 candidate wrap 到 CNN 的输入大小, 之后 forward through the CNN, 取得最后一个 pooling 层的输出作为 feature 并存储
    <img src=”/content/images/rcnn/step3.png”, width=360>
  4. 对于每一类, 训练一个分类器用来对 region features 识别(论文中训练的是 SVM)
    <img src=”/content/images/rcnn/step4.png”, width=360>
  5. Bounding box regression. 对于每一类, 训练一个回归模型, 用来 map cached features to offset to ground truth boxes.
    <img src=”/content/images/rcnn/step5.png”, width=360>

    当进行预测的时候, 设置一个classify 的 threshold, 只有当class score 大约这个 threshold 的时候才保留结果

缺点

  1. 在 test/predict 的时候需要对所有的 region proposal 进行 forward, 因此, 速度比较慢
  2. 特征提取与 SVM 和 bounding box regressor 的训练是完全隔离的两个阶段, 因此, CNN 提取的特征不一定对 SVM 和 regressor 的训练非常合适
  3. 训练过程比较复杂

Reference

Rich feature hierarchies for accurate object detection and semantic segmentation
cs231n