Fast R-CNN 将 Cascade Tasks 变成了 One Stage Multi-tasks,从结构上再一次升级优化 R-CNN

论文:Fast R-CNN

核心思想

Fast R-CNN 兼收并蓄,把 SPPNet 有的优点和原来的 R-CNN 进行结合,并加以对结构上的优化,升级得到了儿子 Fast R-CNN 。

异步分类和回归

我们知道 R-CNN 的分类是用 SVM 来识别的,但是 SVM 在 CPU 上、卷积神经网络在 GPU 上,跨平台交互必定会有效率上的损失,所以这次 rbg 选择了 softmax 而不再使用 SVM ,且 softmax 这次没有让大家失望——比 SVM 好两个点左右。

这次将 R-CNN 的级联式操作,变成了并联式操作,成为了多任务同时进行的一个模型。毋庸置疑,并行处理任务比原本级联式处理任务会快上许多,这也是这篇论文标题叫做 Fast R-CNN 的原因。

添加 ROI Pooling

兼收并蓄,把 SPPNet 的 SPPooling 层改良成更优的 ROI Pooling 层,从此也不限制输入图像的尺寸大小了。原来 SPPooling 不能反向传播,因为组成 SPPooling 的 Pooling 可能有多个,没有办法传播。

ROI Pooling 是 SPPooling 的特例,仅有一个 Max Pooling,于是乎可以反向传播参与训练。

流程步骤


Fast R-CNN

一图胜千言,整个网络流程如上图所示。

核心部分

Fast R-CNN 最重要的两个核心是 多任务同时训练ROI Pooling 层,我们接下来分别探讨这两个核心。

多任务同时训练


Fast R-CNN Struct

简单的来说,就是对 Proposal 区域进行分类的同时,对 Bbox 进行回归。这次我们的 rbg 把 SVM 换成了 softmax,使用神经网络去预测分类,减少跨平台的损耗,这一部分有助于提高预测速度。

这次 Loss 的设计结合了分类和回归精确度的 Loss ,两个任务的 Loss 结合起来提供了更多的信息,达到提高模型准确度的效果。下面就是结合出来的 Loss

$$L(p, u, t^{u}, v) = L_{cls}(p, u) + \lambda[u ≥ 1]L_{loc}(t^{u}, v)$$

$p$ 是 softmax 输出 $K+1$ 个分类的概率,K 个类别加上 1 个背景,$u$ 是真实的类别。其中,分类的 Loss 如下:

$$L_{cls}(p, u)=-logp_{u}$$

对于 Bbox 回归的,$v$ 是真实框 $v=(v_{x},v_{y},v_{w},v_{h})$,$t^{u}$ 则是对于类别 $u$ 的区域生成框 $t^{u}=(t_{x}^{u},t_{y}^{u},t_{w}^{u},t_{h}^{u})$ 。其中,这里的 $u$ 必须要大于 $1$,$0$ 作为「背景」没有回归框。在这里回归使用 $smooth_{L_{1}}$ 来平滑误差:

$$L_{loc}(t^{u}, v)= \sum_{i\in(x,y,w,h)} smooth_{L1}(t_{i} − v_{i})$$

在这里使用 $L_1$ 而不使用 $L_2$ 的原因是前者对 outliers 不敏感,当物体没有被框框住的时候,用 $L_2$ 优化需要特殊处理,因此选择使用 $L_q$ 。

ROI Pooling


ROI Pooling

ROI Pooling 是 SPPooling 的特殊例子,只使用了一个 MaxPooling 层,根据输入和输出的关系,自适应 stride 和 padding 。

ROI 区域的坐标是 $(row,col,height,weight)$ ,$(r,c)$ 代表的是左上角的坐标点, $(h,w)$
是高度和宽度,而不是 R-CNN 中的 $(x,y,w,h)$ 。

上图就是最好的例子,假设我们的输出是固定 2x2 的 shape ,输入的是 $8*8$ 的图片,我们的 proposal 位置是 (0, 3), (7, 8) 。


ROI Proposal

我们对 Proposal 进行 ROI Pooling ,实际上是 MaxPooling 的自定义版本。由于我们输出的 shape 规定是 2x2 的,所以将 Proposal 划分成 2x2 的网格。


ROI Region Pooling

经过 ROI Pooling 得到的就是 4 个网格中最大的值,输出的 shape 也变成了 2x2,这就是 ROI Pooling 的过程,反向传播和 MaxPooling 层的一样,只对网格里的最大值进行传播。


ROI Region Result

这部分内容推荐看 参考资料 2 ,然后建议看看这个 RoI pooling in TensorFlow - Github 仓库,大概就可以理解了。

总结 Summary

Fast R-CNN 的 MultiTasks 给后面的 Mask R-CNN 有着很大的启发,ROI Pooling 吸收了 SPPooling 可以不定尺寸输入的优点。

这两点操作,使得 Fast R-CNN 比 R-CNN 和 SPPNet 又快、又准。

参考资料 Reference

  1. Fast R-CNN “Fast R-CNN”
  2. Region of interest pooling explained