参考:https://blog.csdn.net/u014380165/article/details/79502113

论文:Lightweight Deep Neural Networks for Real-time Object Detection
Github:PVANet
C++ Demo :PVANet_CPP

1 摘要

RCNN系列的object detection算法总体上分为特征提取、RPN网络和分类回归三大部分,Faster RCNN的效果虽好,但是速度较慢,这篇文章的出发点是改进Faster CNN的特征提取网络,也就是用PVANET来提取特征作为Faster RCNN网络中RPN部分和RoI Pooling部分的输入,改进以后的Faster RCNN可以在基本不影响准确率的前提下减少运行时间。
我们知道加宽和加深网络向来是提升网络效果的两个主要方式,因为要提速,所以肯定做不到同时加宽和加深网络,因此PVANET网络的总体设计原则是:less channels with more layers,深层网络的训练问题可以通过residual(残差网络)结构来解决。
PVAnet是RCNN系列目标方向,基于Faster-RCNN进行改进,Faster-RCNN基础网络可以使用ZF、VGG、Resnet等,但精度与速度难以同时提高。PVAnet的含义应该为:Performance Vs Accuracy,意为加速模型性能,同时不丢失精度的含义。主要的工作再使用了高效的自己设计的基础网络。该网络使用了C.ReLU、Inception、HyperNet以及residual模块等技巧。整体网络结构如图1所示。

PVAnet目标检测原理

2 C.ReLU

C.ReLU(concatenated ReLU)主要是用来减少计算量。C.ReLU的提出来自于对CNN网络的前面一些卷积层输出的观察:In the early stage, output nodes tend to be “paired” such that one node’s activation is the opposite。也就是说输出基本上是负相关的(可以参看C.ReLU原论文),这样相当于卷积核存在冗余,有一半的计算是可以省掉的。因此C.ReLU的定义也非常简单:C.ReLU(x)=[ReLU(x), ReLU(-x)],这个中括号就是concatenation操作,x就是卷积层的输出,Figure1中的Negation操作就是对x取负数的操作。原文如下:C.ReLU reduces the number of output channels by half, and doubles it by simply concatenating the same outputs with negation, which leads to 2x speed-up of the early stage without losing accuracy. 另外在本文中,和原始的C.ReLU相比,作者还额外添加了scale/shift层用来做尺度变换和平移操作,相当于一个线性变换,改变原来完全对称的数据分布,如下图Figure1所示。原文如下:Compared to the original C.ReLU, we append scaling and shifting after concatenation to allow that each channel’s slope and activation threshold can be different from those of its opposite channel. 

PVAnet目标检测原理

3 Inception模块

作者发现googlenet中Inception模块由于具有多种感受野的卷积核组合,因此能够适应多尺度目标的检测,作者使用基于Inception模块组合并且组合跳级路特征进行基础网络后部分特征的提取。对于size较大的object检测,需要用卷积核size较大(也就是receptive field较大)的卷积层去提取特征,反之亦然。这样看来,卷积核尺度多样的Inception结构就成为了作者的不二之选。

2012年AlexNet做出历史突破以来,直到GoogLeNet出来之前,主流的网络结构突破大致是网络更深(层数),网络更宽(神经元数)。所以大家调侃深度学习为“深度调参”,但是纯粹的增大网络的缺点:1.参数太多,容易过拟合,若训练数据集有限;2.网络越大计算复杂度越大,难以应用;3.网络越深,梯度越往后穿越容易消失(梯度弥散),难以优化模型。那么解决上述问题的方法当然就是增加网络深度和宽度的同时减少参数,Inception就是在这样的情况下应运而生。

Inception模块的起点是类似下图的结构:通道从M变换到N,把多个不同尺寸的卷积结果串接(concat)起来。 

PVAnet目标检测原理 

由于M,N往往很大,这种结构的模型大小和运算量都不小。Inception将后续三路中插入一个1*1卷积,让每一路构成能够节省参数的“瓶颈结构”。

PVAnet目标检测原理

在每一路瓶颈结构中,首先从M通道压缩到K通道,再由K通道扩展到N通道。K比M,N都小。1*1卷积相当于在每个像素施加同一个fully connected层,所以又称为network in network。

Figure2展示了Inception结构的receptive filed多样性。图中一共包含3个Inception结构,每个Inception结构中包含7种不同size的receptive field size,黄色矩形框的长度表示某一个receptive field size的feature map的channel数量。可以看出第一个Inception结构中feature map的receptive field size主要是1、3、5,第三个Inceptive结构中则较为均匀地分布在从1到13的receptive field size中,这样就保证了高层部分receptive field的多样性。 

PVAnet目标检测原理

Figure3是作者使用的Inception结构,其中右边和左边相比多了stride=2,所以输出的feature map的size减半。

PVAnet目标检测原理

4 HyperNet

将conv3中原图1/8特征图、conv4中原图1/16特征图、conv5中原图1/32特征图连接来增加最终特征图中多尺度信息。其中,conv3中特征图被下采样,conv5中特征图被线性插值上采样。如图1所示。

多层特征融合可以尽可能利用细节和抽象特征,这种做法在object detection领域也常常用到,比如SSD,但是在融合的时候需要注意融合的特征要尽量不冗余,否则就白白增加计算量了。 

Table1是PVANET的网路结构图。前半部分采用常规的卷积,后半部分采用Inception结构,另外residual(残差网络)结构的思想也贯穿了这两部分结构。残差网络结构简单,解决了极深度条件下深度卷积神经网络性能退化的问题,分类性能表现出色。之所以引入residual结构,主要还是回到作者一开始提到的网络结构设计原则:less channels with more layers。受限于深层网络的训练瓶颈,所以引入residual结构。C.ReLU那一列包含1*1、K*K和1*1卷积,其中K*K部分就是前面Figure1的C.ReLU结构,而前后的两个1*1卷积是做通道的缩减和还原,主要还是为了减少计算量。强调下关于特征层融合的操作:将conv3_4进downscale、将conv5_4进行upscale,这样这两层feature map的size就和conv4_4的输出size一样,然后将二者和conv4_4进行concate得到融合以后的特征。 

PVAnet目标检测原理

5 实验结果 

Table2是在VOC2007数据集上的不同配置的PVANET网络实验结果。 

PVAnet目标检测原理

Table3是在VOC2012数据集上的PVANET网络和Faster RCNN、RFCN网络的对比。 
PVAnet目标检测原理

6 其它

除了以上基础网络的区别:

(1) PVAnet使用的anchor与faster-rcnn不同,PVA在每个特征点上使用了25个anchor(5种尺度,5种形状)。

(2) 并且RPN网络不使用全部特征图就能达到很好的定位精度,RPN网络只用生成200个proposals;

(3) 使用VOC2007、VOC2012、COCO一起训练模型;

(4) 可以使用类似于Fast-RCNN的truncated SVD来加速全连接层的速度

(5) 使用投票机制增加训练精度,投票机制应该参考于R-FCN