R-CNN目标检测第三弹(Faster R-CNN)
今天,重看了 R-CNN 的终极改进版本 Faster R-CNN(NIPS 版)-本文提到的paper,若为特别指明,说的就是此版本。
先说一个学术趣事吧,R-CNN 的 一作是RGB大神,大神的导师也是DPM检测方法的作者;受到微软亚研院 Kaiming HeRGB博士SPP-Net工作的启发,RGB大神博士毕业后在微软 redmond 研究院做出了 Fast R-CNN;而本篇paper,则是Kaiming 和 RGB的合作产生;今年CVPR17 的mask R-CNN也是两位大神的大作。大神们的合作,我等只能膜拜...
闲话以后再扯,我们就来看这一次改进是怎么让 R-CNN faster的。
1. 缘起
1.1 Fast R-CNN的不足
尽管 Fast R-CNN通过 ROI Pooling Layer实现了对proposal深度特征的快速提取,又通过multi-loss的联合训练进一步提升了mAP。但是它依旧不完全是一个end-2-end的工作,下面详细列出:
- 和R-CNN一样,Fast R-CNN的region proposal生成依旧严重依赖于 Selective Search算法(简写为SS算法)。不仅在于SS算法比较耗时,还在于SS算法得到的proposal不一定适合于detection network。
1.2 Faster R-CNN的主要解决手段
针对 Fast R-CNN 存在的上述问题,Faster R-CNN主要采用以下方式来解决:
- 设计专门用于region proposal generating的网络:region proposal networks。该网络和fast r-cnn中的检测网络共享 conv layer的参数,通过anchor box来生成多个 region proposal,并给出每个proposal的object-ness score
- 设计multi-loss来对该 region proposal network进行优化。此外,依次对参数共享的region proposal network和detection network进行交替训练。
本文在Fast R-CNN 的基础上,采用其原有的detection network来对每张图片中的region proposal进行分类和重定位。另一方面,设计了Region Proposal Network 来生成proposal。
下面,我们主要探讨 region proposal network的构造与优化
2. Region Proposal Network
paper作者希望设计基于CNN model的region生成机制。
A Region Proposal Network(RPN)(也是CNN model)的以任意size的图像作为输入,输出一系列矩形目标proposals,每个proposal都自带一个object-ness score
为了节省计算量,作者将RPN前半部分的卷积层设计为和detection network的卷积层为共享(shared),在最后一层共享的conv layer后,作者设计了如下的类似sliding window的机制来生成proposal,并得到每个proposal的object-ness score。详细如下:
2.1 后续的proposal如何生成?
-
基本的生成流程
为了生成 region proposals,在最后一个共享 conv layer输出的conv feature map上,上下左右滑动一个小型的network。这个network全连接到conv feature map上的 (n,n)大小的子窗口上,对应每个子窗口,network的输出就是一个低维向量(256-d for ZF,512-d for VGG16)。而这个低维向量后面跟了两个分开的全连接层,其中一个是分类层:负责判定子窗口得到的proposal为object的概率,即计算object-ness score;而另一个则是回归层:负责对子窗口的位置信息进行更新(类似于detection network中的),即计算更精确的proposal的位置。
这里的n取3,事实上,这个滑动的network就是(3,3,input_dim,output_dim)的conv 层。
-
Anchors的引入
事实上,上述生成流程中,对每一个(n,n)子窗口,就可以得到关于这个子窗口的 object-ness score和位置信息的更新。但是proposal的size和aspect ratio 可能存在多种情况,例如目标人的height一般就是width的两倍以上,车辆则反过来。如果考虑多种长宽比的子窗口,那么就会出现组合爆炸,变成了真正的dense sample proposal,计算量太高。因此,对每个(n,n)子窗口,paper在提出采用旋转不变的 Anchors:
在每一个 sliding-window location,同时预测 k 个 region proposals,这样一来,分类层会输出k个object-ness score,回归层会输出k个对应的新的位置信息。
这k个proposal是相对 k个 anchor来说的。这里的k个anchor是一些以sliding-window的中心为中心,不同scale和aspect ratio的proposal。这里取3种scale和3种aspect-ratio,那么k=9。
假设conv feature map的大小为 (W,H),那么anchors的个数为 WHK,这是因为在有边界padding的情况下,每个点都是sliding-window location。
一个重要的性质是:每个点的k个anchors,除了中心不同外,高度和宽度均一致。且对每种anchor,从子窗口到256-d的conv连接是共享的,是不随中心变化而变化的。
所以,现在再看k个anchors,实际上就是在conv feature map运行k个不同kernel size的conv 层。每个conv层后面接的就是分类全连接层和回归全连接层。
2.2 如何学习RPN?
RPN的loss其实和 Fast R-CNN中 detection的multi-loss十分类似。区别在于,detection network中的分类错误是对多类别的分类错误,回归错误只针对不是背景的proposal来做;而RPN 中的分类错误是针对 是否为物体的分类错误,回归错误则只针对是物体的anchor来做。这个loss的公式表达为:
$L({p_i},{t_i})=\frac{1}{N_{cls}}\sum_iL_{cls}(p_i, p_i^)+\lambda \frac{1}{N_{reg}}\sum_i p^i L{reg}(t_i, t^*_i)$
上式中的 $p_i$ 和 $p_i^$ 分别代表proposal经过分类层得到的object-ness预测概率和 proposal对应的gt bbox的label(1 or 0),而 $t_i$ 和 $t_i^$ 则是proposal经过回归层预测出的位置信息以及 proposal对应的gt bbox的位置信息。当然这里的位置信息和R-CNN中的bbox regression一样,经过了参数化的。详见paper的第4页。
值得注意的是,这里的regression是针对k种anchors来进行训练的,即覆盖了多种scale和aspect-ratio下的bbox regression,这样做出的预测是更有针对性的。
RPN 训练时的正负样本定义:正样本包含两类:和每个gt bbox的IOU最大的anchor,以及和任意 gt bbox的IOU大于0.7的anchor。负样本为:和所有的 gt bbox的IOU均小于0.3的anchor。对于正样本某anchor,其回归层的回归目标就是那个和它IOU最大的gt bbox的位置信息。
接下来,就是通过类似 hierarchical sampling的方式采集正负样本,进行SGD训练来学习RPN。
2.2.1 一些训练细节
anchor boxes在训练和测试中的使用
由于anchor box是对子窗口进行不同scale和不同aspect-ratio变化得到的,因此存在大量的anchor boxes超出了图像的边界。在训练中,将超出了图像边界的anchor boxes全部忽略。在测试时,也不保留这些超出边界的anchor boxes(这里存疑,文中并未叙述清晰,需要看具体的代码),待得到最终的 proposal后,对于超出图像边界的proposal,截取其在图像内的部分作为proposal。
Non-maximum Suppression用于减少proposal
在RPN得到proposal之后,根据每个proposal的object-ness score来执行NMS(使用的IOU阈值为0.7),并留下前2000个proposal,作为detection network的输入
2.3 如何对RPN和detection network进行联合训练
由于节省计算量的关系,作者将RPN和detection network的前半部分设计为共享的。顺理成章,最好是进行联合训练。正如paper中第4页末尾所言,
需要开发一种技术来学习共享层的参数,而不是学习两个隔离开来的网络。但这并非简单地将RPN和detection network组合在一起进行联合训练,主要是因为:detection network的训练需要固定的object proposal作为输入。很难说,在对RPN进行优化(即逐步改变proposal的生成机制)时同时去优化detection network,因为不一定会收敛。
不过未来可以尝试开发联合学习,paper中给出的是:采用交替优化的四步训练算法:
- 从 imagenet pretrained的网络出发fine-tuning RPN
- 采用第一步得到的RPN来负责proposal generation,从 imagenet pretrained 的网络出发fine-tuning detection network
- 采用第二步得到的detection network的权重来初始化RPN的共享部分,并保持共享部分的权重不变,在第一步得到的RPN的ROI Pooling Layer及其后的层的权重的基础上fine-tuning RPN
- 采用第三步得到的RPN来负责proposal generation,保持共享部分的权重不变,在第二步detection network的FC层权重的基础上fine-tuning detection network。
3. 实验分析
3.1 RPN 对训练的提升
paper第5页的Table 1清晰展示了实验结果,以下结果说明了训练RPN时multi-loss的重要性
- 训练好RPN后,采用SS算法生成的proposal来训练detection network,然后在测试时采用RPN来生成proposal,mAP相对上面的方法略有下降
- 训练好不带分类输出的RPN后,采用SS算法生成的proposal来训练detection network,然后在测试时采用不刚刚训练的不带分类输出的RPN来生成proposal,mAP有大幅下降,下降的绝对值接近10%以上
- 训练好不带回归输出的RPN后,采用SS算法生成的proposal来训练detection network,然后在测试时采用不刚刚训练的不带回归输出的RPN来生成proposal,mAP有小幅下降,下降的绝对值接近5%以上
3.2 其它
- 采用的detection network的capacity越强,mAP也更高(from ZF-Net to VGG)
- 在整个的检测流程中,因为实现了RPN和detection network的共享,实际上proposal的生成几乎不耗费时间
我个人感觉,今后肯定能出现一个将RPN和detection network结合起来的工作...