madobet / webooru

Web Danbooru
32 stars 6 forks source link

增强CNN学习能力的Backbone:CSPNet - pprp - 博客园 #224

Open madobet opened 4 years ago

madobet commented 4 years ago

CSPNet 全称是 Cross Stage Partial Network,主要从一个比较特殊的角度切入,能够在降低 20% 计算量的情况下保持甚至提高 CNN 的能力。CSPNet 开源了一部分 cfg 文件,其中一部分 cfg 可以直接使用 AlexeyAB 版 Darknet 还有 ultralytics 的 yolov3 运行。

1. 简介

Cross Stage Partial Network(CSPNet) 就是从网络结构设计的角度来解决以往工作在推理过程中需要很大计算量的问题。

作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。CSPNet 通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。CSPNet 是一种处理的思想,可以和 ResNet、ResNeXt 和 DenseNet 结合。

下图是 cspnet 对不同 backbone 结合后的效果,可以看出计算量大幅下降,准确率保持不变或者略有提升(ps: 分类的提升确实不多)

下图是 CSPNet 用于目标检测的结果:

AlexeyAB 版本的 darknet 的首页就是这张图,使用 CSPNet 做 backbone 可以极大提升模型的准确率,在同等 FPS 的情况下,CSPNet 准确率更有竞争力。

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

2. 实现

CSPNet 作者也设计了几种特征融合的策略,如下图所示:

图中的 Transition Layer 代表过渡层,主要包含瓶颈层(1x1 卷积)和池化层(可选)。(a)图是原始的 DenseNet 的特征融合方式。(b)图是 CSPDenseNet 的特征融合方式(trainsition->concatenation->transition)。(c)图是 Fusion First 的特征融合方式(concatenation->transition)(d)图是 Fusion Last 的特征融合方式(transition->concatenation)

Fustion First 的方式是对两个分支的 feature map 先进行 concatenation 操作,这样梯度信息可以被重用。

Fusion Last 的方式是对 Dense Block 所在分支先进性 transition 操作,然后再进行 concatenation, 梯度信息将被截断,因此不会重复使用梯度信息 。

上图是对 Fusion First、Fusion Last 和 CSP 最终采用的融合方式 (对应上图 CSPPeleeNet) 在 ILSVRC2012 分类数据集上的对比,可以得到以下结论:

上图是 DenseNet 的示意图以及 CSPDenseNet 的改进,改进点在于 CSPNet 将浅层特征映射为两个部分,一部分经过 Dense 模块(图中的 Partial Dense Block), 另一部分直接与 Partial Dense Block 输出进行 concate。

下图是将 CSP 模型应用到 ResNeXt 或者 ResNet 中:

跟 CSPDenseNet 一样,将上一层分为两部分,Part1 不进行操作直接 concate,Part2 进行卷积操作。

下面是实现的 cfg 文件可视化图,可视化的内容是 csresnet50 中的一个基本模块:

3. FPN 设计

论文中列举了三种 FPN:

第一个如(a)图所示,是最常见的 FPN,在 YOLOv3 中使用。(ps: YOLOv3 中的 FPN 跟原始 FPN 不同,其融合的方式是 concate)

第二个如(b)图所示,是 ThunderNet 中提出的 GFM, 之前的文章中有详解,直接将多个不同分辨率的特征进行融合,具体融合方式是相加。

第三个如(c)图所示,是 EFM,也就是本文提出的融合方式,没两层之间特征进行融合,并且在原有 FPN 基础上再进行一次 bottom-up 的融合方式。

4. 实验

首先来看一下 EFM 的消融实验:

实验是基于 MS COCO 数据集的,PRN其实也是同一个团队在提出的和 CSP 相似的思想,被 ICCV 接受。

上图来自《Enriching Variety of Layer-wise Learning Information by Gradient Combination》,也就是 RPN 网络,也是将输入特征划分为两部分,一部分经过卷积,另一部分经过直接通过 concate 进行融合。

下表是 CSPNet 对特征融合方式所进行的消融实验:

作者还做了非常多的实验来验证 CSPNet 的有效性,下图是在 ImageNet 中的一些 SOTA 模型:

作者还做了非常多的实验来验证 CSPNet 的有效性,下图是在分类网络中的对比试验:

下图是在 MS COCO 数据集上的 SOTA 模型:

应用于移动端的分类模型也进行了实验:

值得一提的是,以上模型大部分都是基于 AlexeyAB 的 Darknet 进行的实验,也有一小部分是在 ultralytics 的 yolov3 上进行的实验,不过后者支持的并不是很完全。

总结

CSPNet 和 PRN 都是一个思想,将 feature map 拆成两个部分,一部分进行卷积操作,另一部分和上一部分卷积操作的结果进行 concate。

从实验结果来看,分类问题中,使用 CSPNet 可以降低计算量,但是准确率提升很小;在目标检测问题中,使用 CSPNet 作为 Backbone 带来的提升比较大,可以有效增强 CNN 的学习能力,同时也降低了计算量。

总体来说,CSPNet 还是非常强的,也得到了 AlexeyAB 大神的认可,darknet 中也提供了具体的实现:

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[route]
layers = -1
group_id=0
groups=2

[route]
layers = -2
group_id=1
groups=2

或者


[convolutional]
batch_normalize=1
filters=64
size=1
stride=1
pad=1
activation=leaky

[route]
layers = -2

[convolutional]
batch_normalize=1
filters=64
size=1
stride=1
pad=1
activation=leaky

作者也在 Github 中公开了部分的 cfg 文件实现,可以配合 AlexeyAB 版的 Darknet 进行使用,Github 链接如下:

https://github.com/WongKinYiu/CrossStagePartialNetworks

Reference

https://github.com/WongKinYiu/CrossStagePartialNetworks

https://arxiv.org/pdf/1911.11929.pdf

https://github.com/ultralytics/yolov3

PRN: Enriching Variety of Layer-wise Learning Information by Gradient Combination

https://www.cnblogs.com/pprp/p/12566116.html