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