【计算机视觉】《Light-Head R-CNN: In Defense of Two-Stage Object Detector》



转载请注明 AIQ - 最专业的机器学习大数据社区  http://www.6aiq.com

AIQ 机器学习大数据 知乎专栏 点击关注

我们知道 Object detection 分为两大门派:

  • 一类是two-stage detector (Faster RCNN, Mask RCNN 等): 第 1 步是生成 proposals,第 2 步是对这些 proposals 进行分类、回归.
  • 另一类是singel-stage detector (YOLO, SSD 等): 这些算法一步到位,可以理解为把 object detection task 简化成了 regression problem.

通常来说,前者检测精度高,后者检测速度快。随着 YOLO、YOLOv2、SSD 等速度极快且精度不错的 one stage detector 的出现,大家似乎对 RCNN family 的青睐少了很多。毕竟,真正应用落地的时候,speed 显然是非常重要的一点。讲实话,如果你不是为了刷榜,这些 one stage detector 算法的精度也确实够用了,更何况速度真的是快了好多。

但就个人而言,我认为 single-stage 的上限是低于 two-stage 的,一直很想看到优化 two-stage detector 速度的工作,所以非常喜欢这篇文章:idea 虽然不大,但是实验做的非常好,手动点赞!


Abstract

在这篇文章里,作者主要分析了:

  1. 为什么 two-stage detector 会慢,主要慢在哪?
  2. 如何在解决速度慢同时保证精度?

文中,作者把 two-stage 拆解成 body 跟 head:

  • body: 生成 proposal(RoI) 的过程, 即: ROI warping.
  • head: 基于 proposal 的 recognition 过程, 即: RCNN subnet.

作者认为,目前的算法,为了追求 best accurcy,一般都会把 head 设计的非常 heavy,所以即使我们把前面的 base model 变小,还是无法明显提升检测速度。

这篇文章的重点,就是如何对 head 进行瘦身。通过 light head 以及其他 trick: 
- 作者用 Resnet-101 作为 base model,拿到了COCO-2017冠军。 
- 更重要的是,作者用了轻量级的 Xception 作为 base model,达到了30.7 mmAP,并且速度达到102FPS,从 speed 到 accuracy 都全面击败现有的 single-stage 的算法。

上个图,大家自行感受一下这篇文章在 speed 与 accuracy 之间的 trade-off 做的有多好:


Light-Head R-CNN

上文提到,作者把 two-stage 分成了 body(RoI warping) + head(RCNN subnet),并且指出,head 太 heavy 是造成 two-stage 效率低的主要原因。我们来看一下典型的 two-stage detector 结构:

RCNN subnet of Faster RCNN


上图为 base mode 是 Resnet-101 的 Faster RCNN 的网络结构:

  1. 首先是用 Resnet-101 提取特征,得到 channel 数为 2048 的 feature map.
  2. 然后,由 RPN 产生的每个 RoI 经过 RoI pooling 得到固定大小的 feature map。
  3. 每个 RoI 对应的固定大小的 feature map,都要通过 RCNN-subnet,得到最终的分类、回归结果。

每个 RoI 都要通过 RCNN-subnet 计算一次,而且为了保证精度,Faster R-CNN 用的 RCNN-subnet 通常是两个很大的 FC(或者 resnet 的第 5 个 stage),这样的做法是非常耗时的。

为了提速,通常 RoI feature map 后面会采用global average pool. 这样做的目的是为了减少第一个 FC 层的计算量,但是会丢失一些 spatial localization 的信息,不利于目标 bbox 回归

RCNN subnet of R-FCN

针对 Faster-RCNN 中每个 RoI 都要重复计算的情况,R-FCN 做了一些优化。

在 R-FCN 中:

  1. 同样地,经过 Resnet-101 得到 channel 数为 2048 的 feature map.
  2. 然后,采用 1x1 的卷积核,得到 Position-sensitive feature map(channel: P^2(C+1)).
  3. 每个 RoI 经过一个 PSRoI Pooling 层得到 feature map(size: P*P,channel: C+1). 再经过一个 global average pool 层得到每个 RoI 的 prediction.

可以看到,R-FCN 的 RCNN-subnet 很小,只包含了 global average pool,所以它会比 Faster-RCNN 快。但是,为了让得到的 feature map 具有 Position-sensitive 的特点,需要满足它的 channel 数是 P^2(C+1)。在 COCO 数据集上,相应的 channel 数是 3969,这就必然还是会造成很大的时间和存储的开销。

RCNN subnet of Light-head RCNN

上图为本文中提出的改进结构,可以看出基本是在 R-FCN 的基础上进行修改的。不同的地方在于: 
1. 作者采用 large separable convolution 生成 channel 数更少的 feature map (从 3969 减少到 490)。 
2. 用 FC 层代替了 R-FCN 中的 global average pool,避免空间信息的丢失。

文中所说的 large separable convolution 应该是借鉴了 Inception 3 的思想: 
 
Inception 3 中将大小为 kk 的卷积核,用 1k 和 k*1 的两层卷积来代替。 
使用这种卷积替换之后,可以在计算结果一致的前提下,减少计算量。减少的计算量,大致为原来的 k/2,文中作者将 k 取 15,因此这里大大减少了计算了。当然,计算复杂度还跟 C_mid 和 C_out 有关。


Experiments

作者在 8 块 Pascal TITAN XP GPUs 上跑的 COCO 的实验。

Implementation Details

  • synchronized SGD with weight decay: 0.0001, momentum: 0.9.
  • Each mini-batch has 2 images per GPU.
  • Each image has 2000/1000 RoIs for training/testing.
  • Pad images within mini-batch to the same size by filling zeros into the right-bottom of the image.
  • Learning rate: 0.01 for first 1.5M iterations and 0.001 for later 0.5M iterations.
  • Adopt atrous algorithm in stage 5 of Resnet.
  • Adopt OHEM.
  • Backbone network is initialized based on the pre-trained ImageNet.
  • Pooling size: 7.
  • Batch normalization is also fixed for faster experiment.
  • Data augmentation: Horizontal image flipping.

Ablation Experiments

这部分是整篇文章我最喜欢的部分,实验做的很好。不过,具体的对比实验还是应该看看原文。这里我简单总结一下实验结论。

Baselines

作者通过R-FCN的开源代码,在 COCO mini-validation set 上得到了 mmAP 32.1% 的 baseline,记为 B1. 又通过一些改进,得到一个更好的 R-FCN baseline,记为 B2. 主要的改进是:

  • 对图像进行 resize,将 shorter edge 设为 800,同时限制 max size 为 1200.
  • 由于图像变大了,所以采用新的 anchor: {322, 642, 1282, 2562, 5122}.
  • 发现在 R-CNN 中,regression loss 会比 classification loss 小很多,因此将 regression loss*2.
  • Each image has 2000/1000 RoIs for training/testing.

效果非常显著,这些简单的改进之后,R-FCN 就提升了 3%,如下图: 

Thin feature maps for RoI warping

为了研究数量更少的 feature map 对结果的影响,作者又做了一组实验。除了以下两点,跟 R-FCN 基本一致:

  1. 减少 feature map channel,从 3696(8177) 减少到 490(1077).
  2. 由于改变了 feature map channel 数,导致无法直接通过 global average pool 进行 prediction,因此加了一个 FC 层。

实验结果如下:

这是符合预期的,channel 数少了必然会导致精度的下降。

Large separable convolution

上述的实验减少了 channel 数,但用的还是 R-FCN 中 11 的卷积核。为了验证 Large separable convolution 带来的影响,作者在上一组的实验基础之上,将 11 卷积核,换成了 Large separable convolution. 同时令:k = 15, Cmid = 256, Cout = 490.

 
用了 large separable convolution,虽然 channel 数减少了,效果却提升了 0.7%.

R-CNN subnet

分别介绍了 thin feature map 和 large separable convolution 的效果,下面是将这二者结合后的效果:

精度得到了大幅提升,mmAP 达到了 37.7%. 更重要的是,由于 thin feature map 以及 light RCNN-subnet,使得即使有数千个 RoI,算法仍然很快。

Light-Head RCNN 可以有多精准?

为了提升算法精度,作者又加入了其他 trick,分别是:

  • 在 PSRoI pooling 中加入 RoIAlign (Mask-RCNN) 中的插值技术,提升了 1.7%.
  • 将 NMS threshold 从 0.3 改成 0.5 之后,提升了 0.6%.
  • 使用 multi-scale 进行 training,提升 1%.

最终,在 COCO test-dev 数据集上,达到了如下的 performance:

Light-Head RCNN 可以有多快?

为了平衡精度与速度,作者做了如下一些改变:

  1. 用 Xception 代替 Resnet-101.
  2. 弃用 atrous algorithm.
  3. 将 RPN channel 减少一半到 256.
  4. Large separable convolution: kernel size = 15, Cmid = 64, Cout = 490 (10 × 7 × 7).
  5. 采用 PSPooling + RoI-align.

采用上述 trick 之后,能够在 COCO 上达到 102FPS,同时达到 30.7% mmAP 的精度。可以说是非常厉害了!

Conclusion

总结一下这篇文章,作者主要有以下几个改进点:

  1. Large separable convolution + Thin feature map 提升算法速度。
  2. 用 FC 来代替 global average pooliing 来减少空间信息的丢失,提高精度。
  3. 加入其它 trick,例如: PSRoI pooling with RoIAlign、multi-scale training、OHEM 等来进一步提升精度。

更多高质资源 尽在AIQ 机器学习大数据 知乎专栏 点击关注

转载请注明 AIQ - 最专业的机器学习大数据社区  http://www.6aiq.com