文章目录
论文信息
原文地址:Light-Head R-CNN: In Defense of Two-Stage Object Detector
代码实现:地址
作者:Zeming Li,Chao Peng,Gang Yu,Xiangyu Zhang,Yangdong Deng,Jian Sun
two-stage 检测器的速度瓶颈
目标检测(detection)主要分为两个流派,one-stage(SSD,YOLO系列等)和 two-stage(R-CNN系列等),前者速度快,后者精度高。
two-stage的检测框架一般将任务分为两步:
-
第一步:产生足够多的候选框(proposal),作者称之为Body(检测器体)
-
第二步:对候选框进行识别,作者称为Head(检测器头)
通常,想要取得最好的准确率,Head的设计一般比较 Heavy,就是计算量参数较多,计算量比较大。作者发现,像 Faster RCNN 和 R-FCN 都有共同点,就是有一个非常 Heavy 的 Head 接到主体框架上:
-
Faster RCNN 在对 ResNet 的 conv5 进行 ROI Pooling 后,接了两个全连接层。由于 ROI Pooling 后的特征非常大,所以第一个 fc 层非常耗内存,并且影响速度。每个 Region Proposal 都要经过两个 fc 层也导致计算量非常大。
-
在 R-FCN中,虽然少了两个全连接层,但是需要构建一个 大小的Score Map( 为后接的池化层的大小),也是需要非常大的内存和计算量。
由于Faster R-CNN 和 R-FCN 的重头设计,即使换用小的主干网络,速度也很难有较大的提升,于是作者结合两者优点,提出如下两点改进:
-
使用 Large Separable Convolution 来生成一个 “Thin” 的Score Map,Score Map只有 通道。在论文中,作者用了 。
-
在 ROI Pooling 后接上一个全连接层。为什么要接上这个全连接层呢?因为原来的 R-FCN 的 Score Map 是 通道,正好对应 Classes 的预测,现在没有这么多个通道了,没办法用原来的投票方法了,所以接上一个全连接层也是为了后面能够接上 Faster R-CNN 的回归和分类。
Light-Head R-CNN 与其他网络的速度对比如下图,主干网络分别使用 (a small Xception like network,Resnet-50,Resnet-101):
![](https://img-blog.csdnimg.cn/20181210112531538.png)
网络架构对比
作者将Light-Head R-CNN 与 Faster R-CNN 和 R-FCN 的架构进行了对比:
- Faster R-CNN
![](https://img-blog.csdnimg.cn/20181210113054994.png)
Faster R-CNN 在 ROI Pooling 以后要对每个 ROI 进行计算,也就是 R-CNN subnet,这部分包括两个 fc 层,且第一个 fc 层要全连接上一层的全部channel,使用 ResNet101 作为主干网络时,在上一层有 2048 个channel,这个计算量就很大了,所以说 ROI-wise 部分的计算太重了。
- R-FCN
![](https://img-blog.csdnimg.cn/20181210113155329.png)
R-FCN 为了对 ROI-wise subnet 进行加速,就采用了一种全卷积的策略。R-FCN 首先为每个 region 预测一个score maps,通道数是 (p是接下来的pooling形状),接着是沿着每个 ROI 做pool,然后 average vote 最后的预测。
采用这种方式,R-CNN subnet 其实是没有计算量的(但是效果上不如有 ROI-wise 的 Faster R-CNN),但是要为ROI pooling生成一个大的score map, 还是挺耗时的。
(图中 表示物体检测的类别数, 表示背景类。)
- Light-Head R-CNN
![](https://img-blog.csdnimg.cn/20181210113250258.png)
Light-Head R-CNN结合了Faster R-CNN和R-FCN的优点:
-
对 ResNet 卷积层中 conv5 的 2048 通道输出,使用large separable convolution 降低特征图(feature maps)厚度并简化计算量,生成 “薄”的 thin feature map( , ),避免了 R-FCN feature map 太大,且随类别数 增加而增大的问题。
-
在 thin feature map 后面接 ROI Pooling,此时得到的 ROI-wise feature map 也薄,这样后面再接 fc 层,此时的计算量就小了,避免了Faster R-CNN 在 R-CNN subnet 的第一个 fc 层计算量过大的问题。
Light-Head R-CNN 将原来 R-FCN 的 score map 的职责两步化了:thin score map 主攻位置信息,R-CNN子网络中的 fc 主攻分类信息。另外,global average pool 的操作被去掉,用于保持精度。
主干网络 Backbone
在Head小了以后,Light-Head R-CNN就可以在速度和精度之间做权衡,可以选择性地使用大的或者小的backbone网络了。文章中给出了两种设置:
-
“ L” 表示使用大的 backbone network,更注重精度。这里用的 L 网络是resnet101。
-
“S” 表示使用小的 backbone network,更注重速度。这里用的 S 网络是Xception-like model。
Thin feature maps for RoI warping
使用 large separable convolution,应该是借鉴了 Inception 3 的思想,用 和 的两层卷积来代替 的卷积核,其结构如下:
![](https://img-blog.csdnimg.cn/2018121014360420.png)
其中 kernel 大小: ,很大,所以叫 large conv,这主要是为了保证不丢失太多精度。因为这一层之前的 feature map 有2048 channel,这一层只有 490 channel,这么多channel数的减少要通过 large conv 进行一定的补偿。
另外,separate conv 能够减少计算量, , ,远小于 R-FCN 的 。
RPN
RPN 网络用于生成候选区域(region proposals)。通过 softmax 判断 anchors 属于前景(foreground)或者背景(background),同时利用bounding box regression 修正 anchors 的偏移和缩放,获得精确的proposals。
Light-head R-CNN中使用RPN网络生成候选区域,具体过程如下:
-
卷积以及生成候选框(RoI):
在Light-head R-CNN中,使用 Resnet 的 conv4 的输出作为 RPN 的输入特征图,其维度是 。对特征图进行 卷积,并对feature map 进行滑窗操作。
当前滑窗的中心在原像素空间的映射点称为 anchor,以此 anchor 为中心,可以得到 15 个候选框(proposals):
-
使用 5 种面积尺寸(scales),即{ }
-
在每个面积尺寸下,取 3 种不同的纵横比(Aspect Ratios): { }。
-
-
以3×3卷积核的中心点,作为 anchor 的中心点,通过滑动窗口和 anchor 机制得到图像的多尺度候选框。
-
使用1×1卷积核,基于 anchor 种类数量进行卷积,得到所有 anchors 的foreground softmax scores 和 bounding box regression 偏移量。
-
根据 bounding box regression 偏移量,获取位置修正后的 anchors。
-
按照 foreground softmax scores 由大到小排序 anchors,提取前 6000 个 foreground anchors。
-
限定超出图像边界的 foreground anchors 为图像边界,防止后续 RoI Pooling 时 proposal 超出图像边界
-
剔除非常小(width < threshold or height < threshold)的 foreground anchors。
-
进行非最大抑制(non maximum suppression,NMS),其中
-
再次按照 NMS 后的 foreground softmax scores 由大到小排序foreground anchors,提取前 1000 个结果作为 proposal 输出。
Light-Head R-CNN 精度提升技巧
为了提升算法精度,作者又加入了其他 trick,分别是:
-
在 PSRoI pooling 中加入RoIAlign ( Mask-RCNN ) 中的插值技术,提升了1.7%.
-
将NMS threshold从 0.3 改成 0.5 之后,提升了0.6%.
-
使用 multi-scale 进行training,提升1%.
![](https://img-blog.csdnimg.cn/20181210151625343.png)
Light-Head R-CNN 速度提升技巧
为了平衡精度与速度,作者做了如下一些改变:
-
用 tiny Xception 代替 Resnet-101.
-
弃用 atrous algorithm.
-
将 RPN channel 减少一半到256.
-
Large separable convolution: .
-
采用 PSPooling + RoI-align. 用 alignment 技术做了 RoI warping,它能减少被 pool 的 feature map通道[ 倍,k是 pooling size],RoI-align能提升结果。
采用上述trick之后,能够在COCO上达到102FPS,同时达到30.7% mmAP的精度:
![](https://img-blog.csdnimg.cn/20181210152421254.png)
作者的测试环境:The code is tested on a server with 8 Pascal Titian XP gpu, 188.00 GB memory, and 40 core cpu.