Faster RCNN

Faster RCNN是RCNN系列的第三篇,提出了Region Proposal Networks(RPN)替代传统的Selective Search算法,将检测的速度提升到了5fps.

Introduction

在fast rcnn中,通过共享卷积层,在不计算region proposal的情况下,整个网络的速度已经近乎达到了实时。因此整个检测的瓶颈目前就在region proposal上了。在fast rcnn中,region proposal使用的是selective search算法,其在cpu上运行处理单张图片需要2s。尽管我们可以用gpu重写这一操作让它快一些,但是这并不能从根本上解决这一问题。因此本文从根本出发,既然深度神经网络这么强大,我们是否可以直接用它来完成region proposal的过程呢?答案是肯定的,本文中,作者就提出了一种叫RPN的网络来完成这一目的。这样,整个检测过程的所有部件都可以运行在GPU上了,速度也因此可以达到近乎实时。

Architecture

整个网络的结构如上图所示,其与fast rcnn最大的区别在于RPN网络的引进。RPN网络有点类似于最近很火的注意力机制,告诉后面的分类网需要聚焦在feature map的哪块区域。

RPN

首先让我们看看RPN网络到底是个什么东西,想明白后其实它的思想非常的简单,实现也非常的简单粗暴。以下面这张图为例 图中的conv feature map是backbone的最后一个卷积层,用一个3x3的卷积核作为sliding window在这个特征图上滑动,它的输出channel是256,然后对这个输出的特征向量分出两条1x1卷积的支路,一条输出的channel为2k用来预测这个anchor box是否有目标,另一条支路为每个anchor box输出4个坐标信息,共4k个channel。因为faster rcnn训练和测试的时候都只使用单一尺度的图片,为了达到多尺度的目的,就在anchor box上进行了scale和aspect ratio的变化。文中取了三种不同的scale和三种不同的aspect ratio,因此这里的k=9。这里的anchor box可以这样理解,假设图中sliding window的中间点(anchor)坐标为(50,50),那么对于一个16x16的anchor box,这个anchor对应的box区域就应该是左上(42,42),右下(58,58)。其他尺寸的anchor box同理可以计算出它在原图上对应的区域。这样划分的anchor box在原图上是呈现为网格状的,可能不能很好地整好覆盖每个目标,因此我们的RPN网络就是希望能够学习一个偏移量,对大概覆盖某个目标的box进行修正,使其更好地覆盖这个目标。

如果用PyTorch,则可以这样实现,代码来自

self.rpn_conv = nn.Conv2d(in_channels, feat_channels, 3, padding=1)
self.relu = nn.ReLU(inplace=True)
self.num_anchors = len(self.anchor_ratios) * len(self.anchor_scales)
out_channels = (self.num_anchors
                if self.use_sigmoid_cls else self.num_anchors * 2)
self.rpn_cls = nn.Conv2d(feat_channels, out_channels, 1)
self.rpn_reg = nn.Conv2d(feat_channels, self.num_anchors * 4, 1)

Loss function

为了训练RPN,我们首先需要给每个anchor box赋予一个二值的标签(是目标或不是目标)。文中按照以下的几个策略进行标签分配:

  1. 跟某个gt box的IoU最大的那个anchor box赋予positive label
  2. 如果一个anchor box跟任意一个gt box IoU超过0.7赋予positive label
  3. 如果跟所有的gt boxes的IoU小于0.3赋予negative label

分配完标签后,可以定义如下的损失函数: 其中,$L_{cls}$是对anchor box中是否为目标分类的损失,$L_{reg}$是对anchor box坐标修正系数的预测损失,使用的是同fast rcnn一样的smooth L1 loss,注意到第二项损失函数中有一项$p_i^*$,也就是说当该anchor box为positive时才会计算对应的regression loss。关于坐标修正系数的gt,$t_i^*$,由以下的公式得到: 其中$x,y,w,h$分别为anchor box的中心坐标和宽,长。$x,x_a,x^*$分别为RPN网络的输出,anchor box和gt box。

Training

关于网络的训练,作者提出了几种不同的训练pipeline,其中比较好的方法是将RPN和Fast RCNN的训练合到一个网络中,在前向的时候,首先假设RPN网络的参数是固定的,这样就可以得到一系列的proposals,计算RPN网络的损失,然后利用这些proposals训练fast rcnn网络,将损失函数组合到一块后进行反向传播,同时更新RPN和fast rcnn部分的参数。

其他一些实现上的细节可以参考论文的Section 3.3

Experiments

实验结果也请看原文吧,反正就是相比前两个方法速度快了很多,精度也有了提升。


Reference

  1. https://arxiv.org/pdf/1506.01497.pdf

Related