1,参考
2,CSPNet介绍
YOLOv4中的backbone使用的是CSPNET,还是得到了AlexAB大神的认可的。同时,轻量化以及神经网络表达能力一直是研究的热点。
神经网络使用最先进的方法,在对象检测之类的计算机视觉任务上实现令人难以置信的结果。 然而,这种成功极大地依赖于昂贵的计算资源,这不便于人们在廉价设备使用最先进的技术。 在本文中,我们提出了跨阶段局部网络(CSPNet:Cross Stage Partial Network),以缓解以前需要大量推理计算的问题。 我们将问题归因于网络优化中的重复梯度信息。 The proposed networks respect the variability of the gradients by integrating feature maps from the beginning and the end of a network stage,在我们的实验中,该过程将ImageNet数据集上的计算减少了20%,具有获得了更高的精度,并且性能明显优于状态 MS COCO对象检测数据集中的AP50方面的最先进方法。 CSPNet易于实施,并且通用性足以应付基于ResNet,ResNeXt和DenseNet等网络结构。
作者认为在神经网络推理过程中计算量过高的问题是由于网络优化中的梯度信息重复导致的。CSPNet通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。
CSPNet不仅仅是一个网络,更是一个处理思想,可以和ResNet、ResNext、DenseNet、EfficientNet等网络结合。
从下图可以看出,CSPNet与其他模型结合后的效果:
3,CSPNet的贡献
1,增强了CNN的学习能力,能够在轻量化的同时保持准确性。
2,降低计算瓶颈。
3,降低内存成本。
4,CSPNet的结构
Partial Dense Block.(这一部分我还没看懂)
设计partial dense blocks的目的是:
(1). 增加梯度通道。通过split-merge策略,梯度的通道数翻倍,由于cross-stage策略,显式使用特征图的copy来堆叠的不利影响得到了缓解。
(2). 平衡每一层的计算。通常base layer的通道数比growth rate大很多。而通道数减半用于dense layer能解决近一半的计算瓶颈。
(3). 减少内存流量。dense block和partial ~的CIO分别为 ( c × m ) + ( ( m 2 + m ) × d ) ) / 2 (c \times m)+((m^2+m)\times d))/2 (c×m)+((m2+m)×d))/2和 ( ( c × m ) + ( ( m 2 + m ) × d ) / 2 ((c \times m)+((m^2+m)\times d)/2 ((c×m)+((m2+m)×d)/2, 通常m和d比c小得多,因此后者最多能节省一半的内存流量。
作者给出了几种设计思路:
上图中的Transition Layer代表过渡层,主要包含瓶颈层((
1
×
1
1\times1
1×1卷积)和池化层(可选)
其中(a)图是原始的DenseNet的特征融合方式。(b)图是CSPDenseNet的特征融合方式。(c)图是Fusion First的特征融合方式。(d)图是Fusion Last的特征融合方式。
我在b站上找到一个视频,densenet:b站号:BV1Ly4y1z7Gh
Fusion First的方式是对两个分支的feature map先进行concatenation操作,这样梯度信息可以被重用。
Fusion Last的方式是对Dense Block所在分支先进行transtion操作,然后再进行concatenation,梯度信息将被截断,因此不会重复性使用梯度信息。
上图是对Fusion First、Fusion Last和CSP最终结构进行实验对比,我们可以得到如下结论:
1,使用Fusion First有助于降低计算代价,但是准确率有显著下降。
2,使用Fusion Last也是极大降低了计算代价,top-1 accuracy仅仅下降了0.1个百分点。
3,同时使用Fusion First和Fusion Last相结合的CSP所采用的融合方式可以在降低计算代价的同时,提升准确率。
下图是DenseNet的示意图和CSPDenseNet的改进示意图
DenseNet图二详细的展示了DenseNet的网络结构。DenseNet的每个阶段均包含一个dense block(密集连接层)和transition layer(过渡层),同时,每个dense block由K个密集层连接。第
i
t
h
i^{th}
ith个密集层的输出将会同第
i
t
h
i^{th}
ith个密集层的输入相连接,同时拼接后的输出结果作为
(
i
+
1
)
t
h
(i+1)^{th}
(i+1)th个密集层的输入。等式表示如下所示:
其中的
∗
*
∗ 表示卷积操作,同时
[
x
0
,
x
1
,
.
.
.
]
[x_0,x_1,...]
[x0,x1,...]表示对
x
0
,
x
1
,
.
.
.
x_0,x_1,...
x0,x1,...拼接。
w
i
w_i
wi和
x
i
x_i
xi代表
i
t
h
i^{th}
ith密集层的权重和输入。如果使用反向传播算法更新权重,则权重更新方程可写为:
我们可以看到,来自密集层的梯度是分别计算的。 另一方面,未穿过密集层的特征图
x
0
′
x^{'}_0
x0′也被计算。 关于用于更新权重的梯度信息,两条路径中都不包含属于另一方的重复的梯度信息。
总体而言,文中提出的CSPDenseNet保留了DenseNet的特征重用特性的优点,但同时通过截断梯度流,防止了过多的梯度信息重复。 通过设计分层特征融合策略来实现此思想,并将其用于部分过渡层。
改进点在于CSPNet将浅层特征映射为两个部分,一部分经过Dense模块(图中的Partial Dense Block),另一部分直接与Partial Dense Block输出进行concate。
5,CSP思想的应用
CSP思想也可以应用到ResNet或者ResNeXt中:
Fig. 5是将CSPNet应用于ResNet和ResNeXt的结构图,由于只有一半的特征通道经过Res(X)Blocks,因此没有必要引入bottleneck layer。当固定浮点运算(FLOP)时,这使理论上的内存访问成本(MAC)的下限更低成为可能。
跟CSPDenseNet一样,将上一层分为两部分,Part1不进行操作直接concate,Part2进行卷积操作。
下面是实现的cfg文件可视化图,可视化的内容是csresnet50中的一个基本模块:
6,FPN设计/Exact Fusion Model
a:特征金字塔网络(FPN):融合当前尺度和以前尺度的特征。
b:全全局融合模型(GFM):融合所有尺度的特征。
c:精确融合模型(EFM):融合anchor尺寸上的特征。
(1)Looking Exactly to predict perfectly
本文提出了一种EFM方法,它可以为每个anchor捕获一个合适的视场(Field of View),从而提高一阶段目标检测器的精度。对于分割任务,由于像素级标签通常不包含全局信息,因此通常更可取的做法是考虑较大的patches以获得更好的信息检索。然而,对于像图像分类和目标检测这样的任务,当从图像层和边界框层标签观察时,一些关键信息可能会变得模糊。Li等人发现CNN在学习图像级标签时经常会分心,这是两级目标检测器优于一级目标检测器的主要原因之一。
(2)Aggregate Feature Pyramid
提出的EFM能够更好地聚合初始特征金字塔。EFM基于YOLOv3,它在每个真实框之前恰好指定一个边界框。每个真实框对应一个超过阈值IoU的anchor box。如果anchor box的尺寸与网格单元的FoV相等,则对于该网格的 s t h s^{th} sth 比尺度,相应的边界框将以 ( s − 1 ) t h (s-1)^{th} (s−1)th 尺度下界,以 ( s + 1 ) t h (s+1)^{th} (s+1)th 尺度上界。因此,EFM从三个尺度集合特征。
(3)Balance Computation
由于特征金字塔中连接的特征映射非常庞大,因此会带来大量的内存和计算开销。为了解决这一问题,本文采用Maxout技术(类似于droupout)对特征映射进行压缩。
7,总结
CSPNet和PRN都是一个思想,将feature map拆成两个部分,一部分进行卷积操作,另一部分和上一部分卷积操作的结果进行concate。
从实验结果来看,分类问题中,使用CSPNet可以降低计算量,但是准确率提升很小;在目标检测问题中,使用CSPNet作为Backbone带来的提升比较大,可以有效增强CNN的学习能力,同时也降低了计算量。