0%

Notes on Fast RCNN

Fast R-CNN 比 R-CNN 主要的优点就是速度快。
那么,具体是通过什么样的操作使得 Fast R-CNN 的速度要比 R-CNN 快很多呢?答案就是:在 R-CNN 中,在 region proposal 的 forward 中,每一个 region proposal 都需要单独计算,而在 Fast R-CNN 中,region proposal 的计算过程是 share 的,这样就减少了很多重复的计算。
另外一个优点是 Fast RCNN 的训练过程是 end-to-end 的,这样有两个好处,一个是解决了在 RCNN 中的 post-hoc training 问题,另外一个就是简化了训练过程。

过程详解

Fast RCNN 中非常重要的一个技术是 RoI pooling(Region of Interest pooling), 名字很高大上,实际上很简单。其实和 SPP(spatial pyramid pooling) 是一样的。后面有可能会详细讲一下 SPP, 这里做个简单介绍。我门想一下,是什么限制了 CNN 的输入必须是固定维度的?在 CNN 中,pooling 和 convolution 操作都不需要固定维数的数据。唯一导致输入维数要是固定的操作就是 Full Connection. 那么,这就说明,只需要通过某种方法,保证 FC 的输入的维数是固定就可以了,这时候 RoI Pooling 就盛大登场了。RoI Pooling 不管你来的 feature map 长和宽是多少,一律按照切分到固定的维数 \(H \times W\). RoI Pooling 是 SPP 的一个特例,在 RoI Pooling 中只有一个 pyramid. 引用一下 SPP 论文中图如下:

具体操作

  1. 通过 region proposal 方法,得到一些 candidate bounding boxes.
  2. 把整幅图片进行 forward, 在最后进行 full connect 之前,对每个 bounding boxes 在 feature map 中对应的区域进行 SPP
  3. SPP 的结果 feed 到 full connect 中

训练技巧

MiniBatch 抽取方法

在 SPP 中,如果 training example(也就是 RoI) 来自不同的图片,结果仍然是无法 share computing, 所以,没有任何加速效果。为了能够 share computing, 作者在 load training minibatch 的时候做了一些手脚。

  1. 从所有的图片中 sample 得到 \(N\) 张图片

  2. 对这 \(N\) 张图片,每张图片中再 sample \(R/N\) 个 RoI

  3. 把这 \(R\) 个 RoI 作为一个 minibatch 进行训练

这个做法的一个潜在缺点是网络收敛的速度非常慢 (因为在每个 minibatch 内部样本类别都差不多,是 correlated 的), 然而,在作者的实验中发现这种担心是多余的,原论文中 \(N=2, R=128\)

Multi-task Loss

上面已经讲到,Fast R-CNN 的一个优点是 end-to-end 的训练,这一特点是通过 Multi-task Loss 来实现的。
第一个 Loss 是用来训练 bounding box 的类别的。输出是一个离散的概率分布,输出的节点个数是 \(K+1\), \(p=\left(p_0,…,p_k\right)\), 其中\(K\) 数据集中的类别数,\(1\) 是 background
第二个 Loss 是用来训练 bounding box regression offset 的,\(t^k=\left(t^k_x, t^k_y, t^k_w, t^k_h\right)\).
每一个 RoI 都有两个 label, 一个是类别 \(u\), 另外一个是 bounding box regression target \(v\). Multi-task loss 定义为:

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

其中,\(L_{cls}(p,u)=-\log{p_u}\) 是针对 classify 的 loss
另外一部分,\(L_{loc}\) 是定义在一个四元组上面的 bounding box 的损失函数。对于类别 \(u\), 其 ground truth 的 bounding box 为 \(v=\left(v_x, v_y, v_w, v_h\right)\), 其 predict 得到的结果是 \(t^u={t^u_x, t^u_y, t^u_w, t^u_h}\).
针对 bounding box regression 的 loss 定义是:

$$ L_{loc}\left(t^u,v\right)=\sum_{i \in {x,y,w,h}}{\text{smooth}_{L_1}\left(t^u_i-v_i\right)} $$

在这里,

\[ \text{smooth}_{L_1}\left(x\right) = \begin{cases} 0.5x^2 & \text{if } \lvert x \rvert < 1 \cr \lvert x \rvert -0.5 & \text{otherwise} \end{cases} \]

Reference

Fast R-CNN
cs231n