Object Detection - R-FCN

Paper
code: Python, MxNet, Pytorch

R-FCN 意在不降低太多准确率的同时,提高 R-CNN 系列网络的速度。该网络试图解决 ROIPooling 之后的单独卷积问题,从而大大提高了网络速度。

主要思想

该算法的主要思想是:

  1. 图片输入诸如 ResNet,VGG16 等 CNN 中,进行特征提取
  2. 使用 RPN (Region Proposal Network) 生成建议窗口
  3. 通过全卷积网络生成对应于九个区域(左上、中上、右上…)的目标感知图
  4. 经过对不同物体的九个感知图进行特殊的 ROI Pooling 将不同的尺寸的特征图变成同一尺寸
  5. 最后进行分类和目标框回归

网络结构

细节部分

为什么要这么做?

这牵扯到了平移不变性的问题。
我们知道在整张图片的分类任务中,是具有物体平移不变性的。意思就是我们把物体在图片上平移之后,是不影响我们的识别结果的。
但是在目标识别任务当中,目标的 bounding box 是位置敏感的,Faster R-CNN 类的方法在 ROI pooling 前都是卷积,是具备平移不变性的,但一旦插入 ROI pooling 之后,后面的网络结构就不再具备平移不变性了。同时作者认为,原始的 ROI pooling 之后的不共享的卷积,是导致网络变慢的原因,所以作者想让模型中的卷积操作尽可能的共享。为了解决这个问题,作者提出了这种方法,通过全卷积输出九个位置的感应图,试图将位置信息,融入到 ROI pooling 层中。

卷积和 RPN 部分

从上一章节网络结构部分来看。左侧第一部分,只是一个单纯的卷积网络,可以用时下流行了任何卷积网络,类似 ResNet 或者 VGGNet 等,目的也是提取特征。

之后依旧通过 RPN 网络生成 RoIs。需要注意的是下半部分。

感应图

  • 什么是感应图
    我们可以看到结构图中,九种不同颜色的部分,即代表了不同的九个位置(左上,中上,右上…)的感应图。所谓感应图就是目标在该区域的响应。可以从下图直观的感受一下。
    图中可以看到,对这个小孩的不同位置分别产生了九种不同的响应。对于所要识别的所有物体,都会产生这样的九张感应图

  • 如何产生感应图
    在原始卷积层输出的 feature map 的基础上,使用 (C+1)*K^2 个卷积核去卷积,就可以产生 C + 1(包括背景)类的 K^2 (K 代表 ROI pooling 的尺寸,此处为 3) 个感应图。
    得到感应图之后,再对不同的位置分别进行 ROI pooling,意思是,左上角只区左上角感应图部分,其他以此类推。接下来是投票部分。

  • vote
    投票的操作很简单,每个类别对 9 个区域直接求和,再进行 softmax 得到每一类的最终得分。
    类似的操作可以用在目标框的回归上,只需要在感应图之后加上 4*k^2 维的卷积就可以了。

有任何错误还请指正,谢谢