Fast RCNN

Fast RCNN是RCNN系列的第二篇,一定程度解决了RCNN第一篇论文训练和检测速度慢的问题。

Introduction

文章的一开始首先提出了之前的的RCNN和SPPnet存在的问题:

  1. 整个训练是有多个阶段构成,整个流程非常的麻烦
  2. 训练过程非常的耗费时间和空间。因为训练有多个阶段,进入下一个阶段前需要缓存一些上一个阶段的结果
  3. 测试时的速度也非常慢。RCNN使用GPU检测一张图也需要花费47s

既然有这么多的问题,本文就提出了一系列措施来进行改进,相比于之前的方法,Fast RCNN主要有以下几个优点:

  1. 相比于RCNN和SPPnet,具有更高的mAP
  2. 使用multi-task loss将整个训练过程合为一个阶段
  3. 目前整个网络的参数都可以被更新了(之前的SPPnet在训练的过程中前几个卷积层的参数是被冻结的)
  4. 不需要额外的磁盘空间对中间的特征进行缓存

Architecture

Fast RCNN的整体流程如上图所示,其与传统检测网络最大的不同在于roi pooling层的引入。

RoI pooling layer

RoI pooling layer其实可以看作是level为1的spp layer。它的作用是对于任意大小的输入,其结果都是一个固定长度的feature vector,这样就可以跟后面的fc layer衔接,而不需要提前对特征图进行缩放到固定的大小。它的具体实现是这样的,假设我们希望不管输入的feature map多大,输出的feature map size都为7x7,那么我们就将原图分为7x7个小窗口,然后对每个小窗口实施max pooling的操作。假设输入的feature map size为hxw,那么每个小窗口的尺寸就应该是h/7 x w/7.

Fine-tuning for detection

之前提到,sppnet在训练的时候无法更新卷积层的参数。首先,并不是说原理上无法进行更新,而是由于其roi的采样策略造成了如果想要对卷积层参数进行更新,所带来的计算和显存的压力过于巨大。

在sppnet中,假设我们需要采集一个batch(128)的roi,会随机地从所有的roi中进行均匀采样,这样最差的情况下这128个roi可能采自128张不同的图片,这对当时的GPU而言是无法处理的(卷积层反传时需要处理128张图片)。而fast rcnn则每次先采两张图,然后从每张图中均匀的采64个proposals。这样卷积层反传时只需要处理两张图。

Multi-task loss

相比于sppnet和rcnn,fast rcnn训练的时候使用了multi-task loss,同时优化classifier和bounding box regressors。其中classifier使用log loss,而bounding box regressors使用的是smooth L1 loss,相比于L2 loss,它对异常值更不敏感。

Inference

Inference阶段基本和训练阶段一致,输入一张图片和R个proposals(R=2000,typically),然后网络输出每个regions的类别概率分布$p$和每个box的四个坐标修正量。

Truncated SVD for faster detection

相比于分类任务主要的计算量在卷积层,识别任务因为有大量的region proposals需要通过fc层计算,因此整个fc层的计算量接近整个前向计算时间的一半,因此为了加快计算速度,作者提出可以通过Truncated SVD的方法减少计算量。对于一个$u$ x $v$维的全连接权重矩阵$W$,使用truncated SVD可以分解为: $$W\approx U \Sigma_t V^T$$ 其中$U$为$u$x$t$的矩阵,$\Sigma_t$为$t$x$t$的矩阵,$V_T$为$v$x$t$的矩阵。这样参数量就从uv减少到了t(u+v),通常t远远小于u和v。这个简单的压缩将detection的时间减少了30%同时只有极少的性能损失,大约0.3%,这也说明了平时使用的那些网络其内部参数其实存在大量的冗余。

RCNN vs SPPnet vs FAST RCNN

以下三张图简单的总结了下这三种方法的异同,图片来自Ross Girshick在ICCV2015上的slide,在文章的最后也给出了链接:


References

  1. https://arxiv.org/pdf/1504.08083.pdf
  2. http://www.robots.ox.ac.uk/~tvg/publications/talks/fast-rcnn-slides.pdf

Related