从DenseNet到CSPNet及YOLO变种

发布时间 2023-06-01 00:20:26作者: 大师兄啊哈

1. 前言

CSPNet 是作者 Chien-Yao Wang 等于 2019 发表的论文 CSPNET: 《A NEW BACKBONE THAT CAN ENHANCE LEARNING CAPABILITY OF CNN》。也是对 DenseNet 网络推理效率低的改进版本。

CSPNet通过引入跨阶段部分连接来提高计算效率。在传统的深度神经网络中,特征图会经过连续的卷积层来提取高级特征。而在CSPNet中,特征图被分成两个部分,一个部分用于传统的卷积层处理,而另一个部分则通过跨阶段连接直接传递给后续的层。这种设计可以减少特征图的计算量,并且在不引入额外的参数的情况下增加了网络的表示能力。

2. DenseNet

DenseNet是由Gao Huang等人于2017年提出,论文名为:《Densely Connected Convolutional Networks》。

不同于ResNet的短接,DenseNet选择直接将两个层进行concat:

微信截图_20230531201838

对于DenseBlock,每个层从前面的所有层获得额外的输入,并将自己的特征映射传递到后续的所有层,使用级联(Concatenation)方式,每一层都在接受来自前几层的”集体知识(collective knowledge)”。

增长率(growth rate) k是每个层的额外通道数,这个表示的是输入通过每层的变换函数H_L后产生k个feature maps(其实就是每层的输出通道数),那么第L层的通道数就是 k_0 +k x (L-1),其中k0是DenseBlock第一层的输入。可以看到后面层的通道数是直线上升的,还好不同于其他网络,这里一般k取12就可以取得不错的效果。

densenet

一般DenseBlock之间还有接一个Transition层去减少feature map 尺寸和通道数, 使得后面的Dense Block的输入通道不至于太高,一般由1*1卷积和2*2的平均池化串联组成。

微信截图_20230531204202

DenseNet的这种结构,

  • 梯度流动:由于密集连接的存在,梯度可以更容易地在网络中传播。这有助于解决深层网络中的梯度消失问题,使得网络更容易训练。
  • 特征重用:每一层的输出都直接传递给后续所有层,使得低层的特征可以直接被高层使用。这种特征的重用可以提高网络的表达能力,并且有助于减少参数的数量。
  • 参数效率:DenseNet中的层之间共享参数,减少了网络中需要学习的参数数量。这使得DenseNet在参数效率方面表现出色,特别适用于具有有限计算资源的场景。

但是同时也带来了一些缺点:

  • 内存消耗:由于每一层的输出都与后续层直接连接,DenseNet需要存储大量的中间特征图。这可能导致内存消耗增加,特别是在处理大规模图像或使用深层网络时。
  • 计算复杂度:由于网络中存在大量的连接,DenseNet的计算复杂度较高。这可能导致在训练和推理时需要更多的计算资源和时间。

3. CSPNet

3.1. CSPNet要解决的问题

作者认为网络推理成本过高的问题是由于网络优化中的梯度信息重复导致的。CSPNet 通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。CSP(Cross Stage Partial Network,简称 CSPNet) 方法可以减少模型计算量和提高运行速度的同时,还不降低模型的精度,是一种更高效的网络设计方法,同时还能和Resnet、Densenet、Darknet 等 backbone 结合在一起。

CSPNet 提出主要是为了解决三个问题:

  • 增强 CNN 的学习能力,能够在轻量化的同时保持准确性。
  • 降低计算瓶颈和 DenseNet 的梯度信息重复。
  • 降低内存成本。

3.2. CSPNet的基本网络架构

如下图所示,这个架构在论文中叫“Cross Stage Partial DenseNet”,是一种单阶段的CSPDenseNet,分为Partial Dense BlockPartial Transition Layer两个部分。

微信截图_20230531220658

在Partial Dense Block 中,输入的feature maps x0按通道被分为x0’和x0”,然后x0’直接连接到这个阶段的末尾,x0”通过了若干dense layer,最后输出[x0”,x1,…,xk]。

然后Partial Transition Layer部分,[x0”,x1,…,xk]先通过一个一个transition layer,输出XT,与x0’进行拼接,然后再通过另外一个transition layer,输出xU。

总的来说,CSPDenseNet保留了DenseNet的特征重用特性的优点,但同时通过截断梯度流来防止过多的重复梯度信息。

3.3. Partial Dense Block

这个模块的设计目的有几个:

  • 增加梯度路径:通过分块合并策略,可以使梯度路径的数量增加一倍。由于采用了跨阶段策略,可以减轻使用显式特征图 copy 进行拼接所带来的弊端。
  • 平衡每一层的计算量:通常,DenseNet 的base layer(即输入层)的通道数远大于增长速率k。由于在Partial Dense Block中,参与Dense layer操作的base layer通道仅占原始数据的一半,可以有效解决近一半的计算瓶颈。
  • 减少内存流量:假设 dense block 在 DenseNet 中的基本特征映射大小为 w × h × c,增长率为 d,并且共 m 层。然后,该 dense block 的 CIO 为(c × m)+((m2 + m)× d)/ 2(这里可以通过DenseNet中的通道计算方式结合等比数列的和去推导),部分 dense block 的CIO 为((c × m)+(m2 + m)× d)/ 2。虽然 m 和 d 通常比 c 小得多,但部分 dense block 最多可以节省网络内存流量的一半。

3.4. Partial Transition Layer

设计Partial Transition Layer的目的是使梯度组合的差异最大,该层通过截断梯度信息流来阻止不同的层学习重复的梯度信息,也称作分层特征融合机制。在原来的基础上,还设计了两种变体,如下图中的(c)、(d)。

微信截图_20230531231834

 

(c) CSP(Fusion First)将两部分生成的feature maps进行拼接,然后进行transition操作,如果采用这种策略,大量的梯度信息会得到重用。

(d) CSP(Fusion Last)策略,Dense Block的输出将经过Transition layer,然后与来自第一部分的特征图进行拼接,由于梯度流被截断,梯度信息将不会被重用。

(b) 中的结构是论文所采用的,其结合了 (c)、(d) 的特点,提升了学习能力的同时也提高了一些计算复杂度。 

3.5. 将CSP思想应用到其他网络

CSP 应用到 ResNeXt 或者 ResNet 的残差单元后的结构图如下所示:

微信截图_20230531232935

4. YOLO系列中CSP Block的变种

YOLOv4在Darknet53中引入了CSP模块,但是却做了一点改变,base layer不是直接分成两半,而是分别通过一个1*1的卷积层,各自将通道减半,然后再进行ResBlock和Transition,框架依然是CSPDenseNet。

微信截图_20230531234712

V5则进一步改进CSP框架的细节,形成New CSP-Darknet53,里面的C3模块体现了CSP设计思想,如下所示:

微信截图_20230531235219

这里其实也是先通过两个1*1的卷积减半通道数,值得注意的是这里采用的是Fusion First的策略。

YOLOV8在backbone中引入了C2f模块,借鉴了CSP和ELAN,如下图所示:

微信截图_20230601000613

可以看到更多的跳层连接和额外的Split操作。

5. 参考

[1] 深入解析DenseNet(含大量可视化及计算)

[2] YOLOv8 深度详解!一文看懂,快速上手

(完)