目标检测:R-CNN 论文阅读

R-CNN 是使用深度学习解决目标检测问题的里程碑,让我们感受一些这篇开山之作,回顾历史的开端。

论文:Rich feature hierarchies for accurate object detection and semantic segmentation

核心思想

在前一篇目标检测算法综述中,我们讲到传统的目标检测方法,先区域选择(滑窗)、然后手工提取特征、最后放入分类器。

而 R-CNN 相较于传统的目标检测方法:

  • 区域选择不再是滑窗提取特征,而是采用启发式的候选区域生成算法(Selective Search)
  • 提取特征也从手工,变成了卷积神经网络自动提取特征,增强了特征的鲁棒性

流程步骤


R-CNN

总共四个步骤:

1、使用 Selective Search 算法生成候选区域
2、使用 CNN 提取候选区域图像的特征
3、将特征输入到 SVM 分类器,判别输入类别
4、以回归的方式精修候选框

注:作者只是在众多生成算法中选择了 Selective Search 算法,并不是只有这一种。

核心部分

这篇论文主要的四个核心内容就是如何生成候选区域如何训练 CNN 提取特征如何给候选区域分类如何回归精修 Bbox

每一张图像生成约 2000~3000 个候选区域。基本思路如下:

  • 使用一种过分割手段,将图像分割成小区域
  • 查看现有小区域,合并可能性最高的两个区域,重复直到整张图像合并成一个区域位置
  • 输出所有处理完的区域,即候选区域

生成候选区域和合并候选区域是两个相对独立的过程,可以自定义处理的方式。

合并规则

优先合并以下四种区域:

  • 颜色(颜色直方图)相近的
  • 纹理(梯度直方图)相近的
  • 合并后总面积小的,并保证合并操作的尺度较为均匀
  • 合并后,总面积在其 Bbox 中所占比例大的,并保证形状比较规则

其中,第三条的保证合并操作的尺度较为均匀,主要是避免一个大区域“吃掉”其他小区域。

比如区域 a-b-c-d-e-f-g-h
较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh
较差的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h -> abcdef-gh -> abcdefgh

第四条中的保证形状比较规则,下图中右边不适合合并。

Selective Search Combine

Selective Search 为例的候选区域生成算法,都是基于 Low Level 的图像特征,比如纹理、颜色等,比较低等不具有抽象性,效果比较局限。

Feature extraction

候选区域生成完后,我们将区域内的图像全部 Resize 到 $227*227$ 大小,然后经过卷积神经网络提取出 $4096$ 维的特征出来。

Features are computed by forward propagating a mean-subtracted 227 × 227 RGB image through five convolutional layers and two fully connected layers

更具体的网络结构是由 5 层卷积层和 2 层全连接层组成,参考的是这篇 ImageNet Classification with Deep Convolutional
Neural Networks
论文的网络结构。


R-CNN ImageNet

在训练的过程中,先在 ImageNet 上训练跑到 SOTA(State-of-the-art)的水平,然后再根据我们预测物体类别的数量,微调训练最后一层。比如说 ImageNet 输出 1000 个类别,但是 VOC 只有 20 个,我们把原型最后一层输出 1000 个类别的预测层,换成输出 $20 + 1$ 个类别的预测层,其中多出的 1 个类别是判断是否为背景。

Aside from replacing the CNN’s ImageNet-specific 1000-way classification layer with a randomly initialized (N + 1)-way classification layer (where N is the number of object classes, plus 1 for background), the CNN architecture is unchanged.

特征提取完毕之后,将特征输入 线性 SVM ,值得注意的是每个分类训练一个 SVM

由于训练数据太大和内存限制,我们没有办法直接在内存训练,于是我们使用 Hard Negative Mining Method 来训练我们的模型结构。这个方法大致的意思就是筛选出一批最有代表性的和容易分辨错误的样本,然后对这批样本加强训练直到收敛。事实证明,这种方法收敛很快且较为有效。

Once features are extracted and training labels are applied, we optimize one linear SVM per class. Since the training data is too large to fit in memory, we adopt the standard hard negative mining method [17, 37]. Hard negative mining converges quickly and in practice mAP stops increasing after only a single pass over all images.

除此之外,使用 SGD 去优化整个网络,设置学习率 0.001。每一个 mini-batch 中有 128 个样本,其中 32 个正样本(属于20类)和 96 个背景。

在正负样本的标注上,自然而然的把物体标为正样本,背景标为负样本,且区域与所有物体的 IoU(重叠程度)小于 0.3 的也标记为负样本。

这个 IoU 的设定属于超参数(Hyper Parameter),作者使用了网格搜索对这一参数进行 fine-tuning ,发现 0.5 会比 0.3 降低 3 个百分点的准确度,最后确定了 0.3 。

The overlap threshold, 0.3, was selected by a grid search over {0,0.1,…,0.5} on a validation set.

Classification

接下来就到我们的分类环节,这一部分作者在 Appendix B 中特地写了他们的实验和总结。

既然 CNN 最后一层我们可以直接用 softmax 去做预测,为什么我们还要使用 SVM 来对每个类别进行二分类呢?

这其实就体现了炼丹是一门实践科学,实践出真知。结论是直接用 softmax 的性能比 SVM 掉了接近 4 个百分点(54.2% to 50.9%)。于是 R-CNN 最后使用的分类器就是 SVM ,输入的是 4096 维特征,即输入 softmax(预测层)的数据。

作者也在此给出了推测,SVM 使用了 hard negative 策略而 softmax 只是对随机的负样本进行训练,并且针对的是里面是否有物体,对物体的位置不关心。综合上述因素,这就是为什么最后使用 SVM 而不是直接 softmax 的原因。

This performance drop likely arises from a combination of several factors including that the definition of positive examples used in fine-tuning does not emphasize precise localization and the softmax classifier was trained on randomly sampled negative examples rather than on the subset of “hard negatives” used for SVM training.

Bounding Box Refine

目标检测的评价指标是「和真实面积的重叠程度」,很多预测结果是对的,但是他们的 IoU 比较小,即物体的框定范围不够精确。于是本文提出了对 Bounding Box 位置的精修,在这篇论文的 Appendix C 给了较为详细的细节。

直观来讲,我们让预测框和真实标注框完全一致的难度是非常大的,所以我们就退而求其次,尽可能的提高预测框和真实框的重叠程度。又因为线性回归问题只适用于简单的问题,也就是说预测框和真实框的差距不能太大,如果完全不挨着的话,这就不是一个简单的问题。

幸运的是,我们前驱算法优异的性能满足这一要求,所以我们就可以使用回归器对位置进行精修,回归的算法如下:


Bbox Regress

如上图所示,红色的框 $P$ 是我们的候选区域,绿色的框 $G$ 是真实区域,蓝色的框 $\hat{G}$ 是我们要拟合的回归窗口。我们可以看到,要拟合的回归窗口并不是和真实区域完全重叠,。

我们约定给定一个区域,用 $(x,y,w,h)$ 表示,$x,y$ 表示区域的中心,$w,h$ 表示区域的宽和高。

我们要找到一个映射关系 $f$ ,使得 $f(P_{x},P_{y},P_{w},P_{h})=(\hat{G_{x}},\hat{G_{y}},\hat{G_{w}},\hat{G_{h}})$,且$(\hat{G_{x}},\hat{G_{y}},\hat{G_{w}},\hat{G_{h}})\approx(G_{x},G_{y},G_{w},G_{h})$。

1、先做平移 $(\delta{x},\delta{y})$,$\delta{x}=P_{w}d_{x}(P)$,$\delta{y}=P_{h}d_{y}(P)$

$$\hat{G_{x}} = P_{w}d_{x}(P)+P_{x}$$

$$\hat{G_{y}} = P_{h}d_{y}(P)+P_{y}$$

2、再做尺度缩放 $(S_{w},S_{h})$,$S_{w}=P_{w}exp(d_{w}(P))$,$S_{h}=P_{h}exp(d_{h}(P))$

$$\hat{G_{w}} = P_{w}exp(d_{w}(P))$$

$$\hat{G_{h}} = P_{h}exp(d_{h}(P))$$

由此我们可以发现,我们需要学习的函数是 $d_{*}(P)$ ,接下来我们就要设计回归算法来得到这四个映射关系。当输入的候选区域框和真实框的 IoU 大于 0.6 的时候,我们判定这是一个简单的问题,可以用线性回归算法来解决。

线性回归就是 $y = W*x$ ,给定输入 $x$ 通过与 $W$ 相乘得到要拟合的参数 $y$ 。放到我们这里,线性回归的形式就是 $y \approx \hat{y} = W*x$ 。

我们输入的特征是 $P$ 经过卷积神经网络提取出来的特征,即 $pool_5$ 处理后的特征,标记这个输出为 $\phi_{5}(P)$ 。那么根据线性回归的定义,我们可以得到 $d_{*}(P) = w_{*}^{T} * \phi_{5}(P)$ ,其中 $w_{*}^{T}$ 是可以学习的模型参数。接下来我们通过 ridge regression(岭回归),即加了正则项的最小二乘法来优化得到我们的模型参数 $w_{*}^{T}$ 。

$$w_{*} = \arg\min_{\hat{w_{*}}} \sum_{i}^{n} (t_{*}^{i} − w_{*}^{T} * \phi_{5}(P^{i}))^2 + \lambda ||\hat{w_{*}}||^2$$

其中 $*$ 代表着 $x,y,w,h$ 的任意一个,拟合的目标 $t_{*}$ 有如下定义:

$t_{x}=(G_{x} - P_{x})/P_{w}$
$t_{y}=(G_{y} - P_{y})/P_{h}$
$t_{w}=log(G_{w}/P_{w})$
$t_{h}=log(G_{w}/P_{h})$

最后作者经过实验发现在引入回归器的时候,要注意两个点:其一是设置正则项,$\lambda=1000$;其二是选择合适的训练参数和样本很重要,本例中使用 IoU 大于 0.6 的候选框作为训练样本。

这就是 R-CNN 系列最基础的 Bbox 回归,这个回归将会贯穿整个 R-CNN 系列算法,如果吃透了将会对后面的理解有很大的帮助,可以拓展阅读 Bounding-box Regression 详解 加深理解。

总结 Summary


Cascade Pipeline

将 CNN 引入目标检测,创建「两刀流」流派,先提出候选区域、再对候选区域进行分类和精修。使用串联 pipeline ,先判断候选框内是否有物体,再对候选框进行精修回归。

无论如何,这篇论文开历史之先河,利用深度学习技术帮助人们实现目标检测,为我们后来者打下了坚实的基础。

参考资料 Reference

  1. R-CNN “Rich feature hierarchies for accurate object detection and semantic segmentation”
  2. 【目标检测】RCNN算法详解
  3. Bounding-box Regression 详解