R-CNN 系列模型是目标检测里的经典模型,同时也是 Caffe 的经典模型,所以为了学习 Caffe 和目标检测算法的知识,通过观看论文、网上的资料以及试着用自己的数据训练一个 Faster R-CNN 后,对于 Faster R-CNN 有了初步的了解,在此把论文内容和自己的理解整理并写下来。
一、R-CNN 的历史
R-CNN 是一个经典的目标检测模型,发展到现在已经成为了一个系列,从一开始的 R-CNN 模型,到 Fast R-CNN 模型,一直到 Faster R-CNN 模型,代表了目标检测的前沿水平。
R-CNN 模型出现较早,一开始使用了 Selective Search 算法来生成区域建议候选框,在当时是一个创新,但是现在看起来,无论是从速度还是准确率上看,都不算是很好的。在随后推出的 Fast R-CNN 中,参考了 SPPnet 的特点,大幅提高了模型的训练速度和检测速度。而在 Faster R-CNN 中,采用共享的卷积网组成 RPN(Region Proposal Network),使用 RPN 可以直接预测出建议候选框,平均每张图片 300 个,大部分计算在 GPU 中完成,且卷积网络和 Fast R-CNN 共享,大幅提升了目标检测的速度。
二、区域建议网络 —— Region Proposal Network
在 Faster R-CNN 中引入了一个新的网络 —— 区域建议网络(Region Proposal Network,RPN), RPN 是一个全卷积网络,可以在每个位置同时预测物体边界和 objectness scores 。RPN 通过端到端的训练来生成高质量的区域建议,然后被 Fast R-CNN 用来做检测。通过一种简单的交替优化方法, RPN 和 Fast R-CNN 可以共享卷积特征。在 VGG-16 模型上,能够达到 5 FPS 的帧率(使用GPU),在 PASCAL VOC 2007 和 2012 上分别取得了 73.2% 和 70.4% 的 mAP 。
(一)Region Proposal Network
为了生成区域建议,在最后的共享卷积层所输出的特征映射(feature map) 上滑动一个小网络。这个网络被全连接到输入卷积特征映射的一个 $n\times n$(在论文中 $n = 3$) 的空间窗口上,每个滑动窗口被映射到一个更低维向量(在 ZF 上为 256 维,在 VGG 上为 512 维)。这个向量被喂进两个同级的全连接层 —— a box-regression layer ( $reg$ ) and a box-classification layer ( $cls$ ) .注意输入图片的有效感受野很大(ZF 上为 171 像素,VGG 上为 228 像素)。Figure 3 在其中一个位置上说明了一个迷你网络。要注意的是,因为这个迷你网络以滑动窗口的方式运作,全连接层在所有空间位置上共享。这种结果由一个后接两个同级的 $1 \times 1$ 的卷积层的 $n\times n$ 的卷积层自然地实现。ReLUs 应用在 $n\times n$ 的卷积层的输出。
(二)具有平移不变性(Translation-Invariant)的 Anchors
在每个滑动窗口的位置,同时预测 $k$ 个区域建议,所以 $reg$ 层有 $4k$ 个输出代表了 $k$ 个 boxes 的坐标。$cls$ 层输出 $2k$ 个得分(scores)来估计每个建议选框的为 目标/非目标 的概率。$k$ 个建议选框被 $k$ 个对应的 boxes 参数化,这些 boxes 就称为 anchors 。每一个 anchor 都在上述滑动窗口的中心,对应着一种尺度和一种宽高比(aspect ratio),在每个滑动位置上都有 3 个尺度和 3 个宽高比的 anchors,总共就有 9 个。
(三)给 anchors 分配正负标签
在训练 RPN 时,给每个 anchor 分配一个二元标签(是否为目标)。
给两种 anchor 分配正标签:
- 与 ground-truth box 重叠有最高的 IoU(Intersection-over-Union) 的 anchor。
- 与任何一个 ground-truth box 重叠都有高于 0.7 的 IoU 的 anchor。
一个 ground-truth box 可能会分配正标签给多个 anchor。
- 给与所有的 ground-truth boxes 的 IoU 都小于 0.3 的 anchor 分配负标签。
即不为正也不为负的 anchor 对于训练没有贡献。
(四)学习区域建议时的损失函数
根据上面的定义,我们根据 Fast R-CNN 的多任务损失(multi-task loss)来最小化目标函数。对于一张图片,其损失函数(loss function)定义如下:
$$ L({\lbrace p_i \rbrace},{\lbrace t_i \rbrace})=\frac{1}{N_{cls}}\sum_{i}{L_{cls}(p_i,p^*_i)}+\lambda\frac{1}{N_{reg}}\sum_{i}{p^{*}_{i}L_{reg}(t_i,t^*_i)} $$
在这里,$i$ 是一个 mini-batch 上一个 anchor 的索引,$p_i$ 是第 $i$ 个 anchor 为目标的预测可能性。如果 anchor 为正 ,ground-truth 标签 $p_i^*$ 为 1,否则为 0。$t_i$ 是一个代表预测的 bounding box 的 4 个参数化坐标向量, $t_i^*$ 是一个代表与正 anchor 对应的 ground-truth box 的4个参数化坐标向量。分类损失 $L_{cls}$ 是有两个分类(目标或非目标)的对数损失。至于回归损失,使用 $L_{reg}(t_i,t_i^*)=R(t_i-t^*_i)$ ,其中 $R$ 是鲁棒损失函数(robust loss function)。$p_i^*L_{reg}$ 这一项表示了回归损失只有在正 anchor ($p_i^*=1$)有作用。
对于回归损失,采用下列的4个坐标参数化:
$t_x=(x-x_a)/w_a,$ $t_y=(y-y_a)/h_a,$ $t_w=log(w/w_a),$ $t_h=log(h/h_a),$
$t_x^*=(x^*-x_a)/w_a,$ $t_y^*=(y^*-y_a)/h_a,$ $t_w^*=log(w^*/w_a),$ $t_h^*=log(h^*/h_a),$
$x,y,w$ 和 $h$ 分别代表 box 中心坐标,宽和高。$x,x_a$ 和 $x^*$ 分别代表预测的 box,anchor box 和 ground-truth box($y,w,h$ 也一样)
三、4步训练Faster R-CNN
- 像上述训练 RPN。这个网络使用一个 ImageNet 的预先训练模型初始化并为区域建议任务进行端到端的微调(fine-tune)。
- 通过 Fast R-CNN 使用第一步的 RPN 生成的建议框来训练一个单独的检测网络。这个检测网络也是由 ImageNet 的预先训练模型初始化的。在这一步,两个网络没有共享卷积层
- 使用检测网络来初始化 RPN 训练,但是固定共享卷积层,且只微调在 RPN 独有的层。现在,两个网络共享卷积层。
- 最后让共享卷积层保持固定,微调 Fast R-CNN 的全连接层。这样,两个网络共享相同的卷积层,形成了一个统一的网络。
参考:
R.Girshick,J.Donahue,T.Darrell,J.Malik. Rich feature hierarchies for accurate object detection and semantic segmentation Tech report
R.Shaoqing,H.Kaiming,R.Girshick,Jian Sun. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
[深度学习——Caffe之经典模型详解与实战,乐毅,王斌 编著]