Object Detection - Faster R-CNN

Paper
code: Pytorch, Tensorflow

最近开始给学校的实验室写关于目标识别领域各大主要算法的综述,开一个长篇更新,今天简单说一说 Faster R-CNN。

Faster R-CNN 基于 Fast R-CNN 的基础上进行了相关改进,提高了运行的速度,同时提高了准确率。

主要思想

该算法的主要思想是:

  1. 图片输入诸如 ResNet,VGG16 等 CNN 中,进行特征提取
  2. 使用 RPN (Region Proposal Network) 生成建议窗口
  3. 将建议窗口映射到最后一层卷积层输出的特征图上
  4. 经过 ROI Pooling 将不同的尺寸的特征图变成同一尺寸
  5. 利用 Softmax 分类和 Smooth L1 Loss 进行类别修正和边框修正

网络结构

细节部分

如上图所示,整个网络的上半部分,不必过多的在意,只是一个用来提取特征的卷积神经网络,诸多代码中,目前应用最多的是 VGGNet 或者 ResNet。
我们从下半部分说起。当从卷积神经网络得到特征图之后,同时会记录卷积网络中所有会导致特征图缩小的操作,所以可以计算出原图到特征图的缩小比例。

Anchors

接下来我们介绍一个新的概念,Anchor。
原论文中,Anchors 就是三个比例,三种尺寸的矩形框,在代码中,你可以在配置文件中,修改任意比例,任意尺寸的矩形框,用这种矩形框来进行对目标 bounding box 的逼近,以及得到所属类别。


Anchor 示例图

前景背景

遍历最后一层的特征,每一个像素点都加上这九种尺寸的 Anchor。
最后一层卷积层输出的应该是之后进入 RPN 网络,网络分成了两部分。最后一层卷积层输出的是 256 个特征图,那么再经过 3x3 的卷积核之后融合周围信息,每一个像素点位置实际上可以看作一个 256 维的向量。之后网络分成了两部分,分别通过一个 1x1 的卷积核。将 256 维降低至 18 维。18 这个数字代表的是前景(即所有识别物体)和背景(非识别物体)两类的 9 种比例尺寸的 Anchor。这个 18 维的向量,通过一个 softmax 层就可以初步分类出所有的候选 Anchor 是前景还是背景,所有的信息都保存在这个 18xHxW 的矩阵中。H, W 代表了最后一层卷积层的长宽。

Bounding Box 回归

总的来说,F(Ax, Ay, Aw, Ah) = (G’x, G’y, G’w, G’h) 这样一个函就是我们学习的最终映射,Ax, Ay, Aw, Ah分别代表了 Anchor 的中心坐标和宽高。G 代表的是 ground truth。在做修正的时候,先做平移,后做缩放。底层来说这个映射就是一个和原始向量的乘法操作。分别学得四个对应于中心坐标和宽高的映射,不断的优化这个映射关系,达到最好的效果。每个 Anchor 对应 4 个不同的映射因子 [dx(A),dy(A),dw(A),dh(A)],正好对下半部分的 36 维向量。详细的计算步骤,请见论文。

Proposal Layer

之后两路汇总,进入到 Proposal Layer,对所有的 Anchors,根据前面得到的映射因子,修正 bounding box,按照前景中的 softmax 分数由大到小排序,提取前几千个 Anchors,这样就得到了初步修正位置的 Anchors,剔除掉那些超出边界的,太小的或者是重复位置的之后输出选定的 前 300 个Anchors。在计算是否超出边界是否太小等,都要映射回原图片大小,因为我们在一开始卷积的时候,保存了图片比例信息,所以可以很轻易的映射回原大小。

RoI Pooling

从 Proposal Layer 出来的 proposal 要映射到最后一层的特征图上。为了对应不同大小比例的区域,转换为固定尺寸的特征图,比如 WxH 大小的特征图长宽平均分为七个区域,每个区域都做 maxpooling,这样就可以将不同的尺寸转化为 7x7 的固定尺寸的特征图了。
最后经过一个分类器和再次回归一次 bounding box 就可以了。

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