对DenseNet进行改进以达到实时目标检测的目的

An Energy and GPU-Computation Efficient Backbone Network for Real-Time Object Detection

构建高效的网络需要考虑的因素

为了构建高效的网络结构,需要考虑除了FLOPS和参数量之外的因素,例如每张图片消耗的能量、FPS等。

内存访问代价

对于一个CNN网络来说,内存访问所消耗的资源远远高于计算所消耗的资源。对于一个操作来说,从DRAM(Dynamic Random Access Memory)中读取数据所消耗的资源比其计算操作所消耗的能源高出好几个数量级。内存访问代价很可能成为一个网络资源消耗的瓶颈。因而,即使网络的参数和计算量相同,也可能有着不同的计算消耗。

在同样的参数量的情况下,如果网络的中间特征图很大,则会需要更多的内存访问次数。因而,在进行网络设计时,要特别考虑内存访问代价(Memory Access Cost,MAC)。每一层卷积的MAC的计算方式如下:

其中,$k,h,w,c_i,c_o$分别表示卷积核大小,输入和输出响应的高和宽,输入和输出响应的通道数。

GPU计算效率

在网络结构设计中,降低运算的FLOPS的依据是:在同一设备上,每一次浮点操作的速度是相同的。但实际上,这一观点是不正确的,不同的设备有着不同的浮点操作速度。

在GPU并行计算中,Tensor的大小越大则计算效率越高。将一次大的卷积操作划分为几个较小的操作会导致一次并行处理的计算量变小,从而使得GPU的运算效率降低。

因而,尽管类似于深度可分离卷积的技术降低了操作的FLOPS,但实际上会降低GPU的运算效率。一般来说,不同的网络结构具有不同的GPU计算效率。因而,为了同一度量网络的GPU运算效率,引入了每秒FLOPS(FLOP/s)度量准则。其计算方式为网络的总体FLOPS除以真实的GPU推理时间。

方法

Dense Connection的缺陷

随着网络层数的增加,每一层的输入通道数目是不断增加的。由于采用了大量的拼接操作,在FLOPS受限的情况下,dense block只能产生少量的特征图。也就是说,DenseNet通过稠密连接的方式,使用特征图的数量来换取特征图的质量。尽管这一做法有效,但从能源消耗和时间角度来看,有一些缺点。

首先,稠密连接需要更多的内存访问操作。一层卷积层的MAC的下界或者是内存访问操作的次数可以表示为:

其中,$B=k^2hwc_ic_o$表示运算次数。依据均值不等式可以得到:当计算次数固定或者模型参数相同时,如输入和输出通道数相同则MAC取得最小值。

Dense connections保持输出通道数目不变,增加输入通道的数目,输入通道数和输出通道数不平衡。这一做法会导致在同等数目的计算量和参数的情况下,需要更多的MAC,进而需要更多的能量和时间。

另一方面,由于dense bottleneck中使用了$1\times 1$卷积,因而会降低GPU并行运算的效率。在模型规模较大的情况下,线性增加的输入数目会造成较大的问题。对着深度的加深,模型的计算量快速增加。为了抑制这种增长,DenseNet使用了bottleneck结构,其中使用$1\times 1$卷积来保持$3\times 3$卷积的输出大小不变。尽管这一设计会降低FLOPS,但是会损害GPU并行计算的效率。Bottleneck结构将一个$3\times 3$结构拆分为两个小的层,因而导致了更多的序列计算,降低了推理速度。

总的来说,由于以下两方面的原因,DenseNet的效率不足

  • 稠密连接需要更多的内存访问次数;
  • 对卷积操作进行拆分会降低GPU的并行运算效率。

为了观察稠密连接之间是如何起作用的,对每一层的输入权重的归一化之后的L1范数进行了可视化,如下图所示:

如上图所示,在Dense Block3中,红色方块主要集中在中间位置,说明中间层的连接活跃性较高。而对于分类层,中间层中只有很小一部分有影响;而在Denso Block1中,Transition layer1聚合了其大多数的输入特征,而中间层的活跃性就较低。

因而,作者猜测在中间层的聚合长度和最后一层的聚合长度之间存在着负相关的关系。如果中间层的连接向层与层之间的特征引入了相关性,就意味着dense connection使得后面的中间层产生了比前面的中间层更好且相似的特征。在这种情况下,最后一层就没有必要对所有的输入特征进行聚合,因为这些特征之间存在着冗余的信息。因而,前面的中间层对最后的层的影响就会变得很小。

因为所有的中间层都被引入到最后一层的输入特征中,所以,中间层的特征之间最好是互补或者相关性较低的。因而,可以认为,中间层越靠前的部分的dense connection对于损失的影响越小。为此,作者设计了一个新的模块,在该模块中,只将中间层的特征聚合到最后一层的输入特征。

也就是说,作者发现在每一个block中,前面的中间层的稠密连接对最后一层的影响很小,为了减少内存访问消耗,提升计算效率,就只把所有的中间层的特征引入到最后一层,中间层之间不进行稠密连接。

One-Shot Aggregation

One-Shot aggregaiton(OSA)模块只在最后一层进行特征聚合。如下图所示:

每一层卷积层之后都紧接两路连接,一路接入到下一层具有更大感受野的卷积层,另一路直接接入最后一层。

通过使用OSA模块,可以降低网络的MAC。因而,如果MAC是能源和时间消耗的主要因素的话,使用OSA可以构建更快、资源利用效率更高的网络。而在目标检测任务中,由于输入的图片较大,因而中间层的内存访问消耗会较大,MAC会成为影响能源和时间消耗的主要因素。

同时,OSA会提升GPU计算的效率。OSA的中间层的输入大小是固定的,因而不需要使用$1\times 1$卷积来降低维度。

结果是OSA模块有着更少的层数且GPU计算效率更高。

VoVNet

基于OSA模块,作者设计了几种不同配置的VoVNet。

因为对于目标检测任务,高层的语义特征更重要,因而通过增加不同stages的输入通道的数目来提升高层特征相对于底层特征的占比。

实验结果

作者把自己的模型和其他实时性的模型进行了对比,结果如下:

可以看出,作者的模型在GPU利用率和能源利用率上都完胜。

同时,作者还测试了引入$1\times 1$卷积后的效率,发现虽然能够降低FLOPS,但是由于引入了更多的中间层,导致GPU并行计算的效率下降,推理速度反而没有提升。

同时,如上表所示,尽管与DenseNet-67相比,SSD-MobileNet和Pelee的FLOPs更低,但是在GPU上的推理速度相当。除此之外,即使VoVNet-27-Slim与DenseNet-67有着类似的FLOPS,但VoVNet-27-Slim的推理速度快了大概两倍。

上述结果表明,仅使用FLPOs无法有效度量模型的推理速度,因为不同的模型有着不同的GPU计算效率。因而,作者引入了FLOP/s这一度量指标来衡量网络的GPU计算资源利用率。实验中,作者发现VoVNet-27-Slim有着最高的400 GFLOP/s的得分。这一结果表明,深度可分离卷积和将卷积分为更小的操作的做法的GPU利用率不高。

而在能源利用方面,作者的模型同样取得了最高的分数,DenseNet-67由于有着过多的中间连接,因而需要更多的内存访问,能源利用效率较低。

同时作者还使用了更大的模型进行了对比,VoVNet同样有着最高的速度和能源利用率。

除此之外,作者发现DenseNet和VoVNet在小目标检测方面有着更高的性能。这是因为这两个网络将不同感受野的特征进行了拼接。同时,VoVNet在小目标检测上的性能要优于DenseNet。

结果对比表