先看看效果对比
YOLOv4 的运行速度是 EfficientDet 的两倍。使 YOLOv3 的 AP 和 FPS 分别提高 10 % 10\% 10% 和 12 % 12\% 12%,达到 43.5 % 43.5% 43.5% AP 和 65 65 65 FPS。
论文地址:https://arxiv.org/abs/2004.10934
源码地址:https://github.com/AlexeyAB/darknet
论文框架:
研究目的: 提高目标检测器的速度与精度,并使其可以很容易地训练和使用。
解决方法: 堆料,综合各先进算法。
研究贡献:
实验数据集: ImageNet、MS COCO
这里作者对目标检测作了一个小综述,对初学者有很大帮助。
作者将模型框架拆分为 Head、Neck、Backbone 和 Head 四部分,并对常见网络进行了归类。如下图:
上图只是部分归类,文中全部归类总结如下:(附下载链接)
Input:Image,Patches,Image Pyramid
Backbones:
Neck:
Heads:
作者提出了实时神经网络的两种选择:
对于GPU,在卷积层中使用:CSPResNeXt50 / CSPDarknet53
对于VPU,使用分组卷积,但避免使用 SE 块,具体包括以下模型:
EfficientNet-lite / MixNet / GhostNet / MobileNetV3
首先看看选择结果:
确定 Backbone
作者的目标是找到输入网络分辨率、卷积层数、参数个数( filter_size 2 ^2 2 * filters * channel / groups )和层输出( filters )数之间的最佳平衡。
大量研究表明,就 ILSVRC2012(ImageNet) 数据集上的对象分类而言,CSPResNext50 比 CSPDarknet53 要好得多。但在 MS COCO 数据集上,CSPDarknet53 比 CSPResNext50 更好。
由于作者使用 MS COCO 数据集,所以这里选择 CSPDarknet53。
选择其他块以增加接受野
对于分类而言最优的参考模型对于检测器而言并不总是最优的。与分类器相比,检测器需要满足以下各项:
所以选择感受野较大(卷积层数为3×3)、参数较多的模型作为 Backbone,下表大量实验所示,选 CSPDarknet53 最佳。
选择针对不同探测器级别的不同 Backbone 层参数聚合的最佳方法
不同大小感受野的影响总结如下:
作者在 CSPDarknet53 上添加 SPP 块,因为它显著增加了感受野,分离出最重要的上下文特征,并且几乎不会降低网络运行速度。使用 PANet 代替 YOLOv3 中使用的 FPN,作为不同Backbone 级别对不同检测器级别的参数聚合的方法。
最后,作者选择了 CSPDarknet53 backbone、SPP 附加模块、PANet 路径聚合 neck 和YOLOv3(基于锚点的) head 作为 YOLOv4 的体系结构。
为了改进目标检测训练,CNN通常使用以下方法:
对于训练激活函数,由于 PReLU 和 SELU 训练难度较大,而 ReLU6 是专门为量化网络设计的,因此作者没有选择上述激活函数。
在正则化方法上,作者以 DropBlock 正则化方法的论文结果很优秀为理由,选择了DropBlock。
在归一化方法的选择上,由于关注的是只使用一个GPU的训练策略,所以没有考虑 syncBN。
为了使所设计的检测器更适合在单 GPU 上进行训练,作者对其进行了额外的设计和改进,具体如下:
Mosaic 是一种新的数据增强方法(混合4幅训练图像)。而 CutMix 仅混合了2个输入图像。这允许检测其正常上下文之外的对象。此外,批量归一化从每层上的4个不同图像计算激活统计数据,这极大地减少了对大量 mini-batch 的需求。
自对抗训练(SAT)也代表了一种新的数据增强技术,它分为两个阶段。在第一阶段,神经网络改变原始图像而不是网络权值。以这种方式,神经网络对其自身执行对抗性攻击,改变原始图像,以制造图像上没有所需对象的假象。在第二阶段,训练神经网络,以正常的方式在修改后的图像上检测目标。
CmBN 是 CBN 的修改版本,如下图所示,定义为交叉小批量归一化(Cross mini-Batch Normalization,CmBN)。仅在单个批次内的小批次之间收集统计信息。
作者将 SAM 从空间关注修改为点关注,并将 PAN 的 shortcut 连接替换为串联,如下图所示。
来一个 YOLOv4 框架及技巧的全家福:
框架结构:
即 YOLOv4 = CSPDarknet53 + SPP + PAN + YOLOv3
技巧:
作者在 ImageNet(ILSVRC 2012 Val) 数据集上测试了不同训练改进技术对分类器精度的影响,然后在 MS COCO(test-dev 2017) 数据集上测试了不同训练改进技术对检测器精度的影响。
关于训练参数设置等,通读论文阶段可以略过。
在 ImageNet 图像分类实验中,默认的超参数为:训练步数为 800 万步;批次大小和小批次大小分别为 128 和 32;采用多项式衰减学习率调度策略,初始学习率为 0.1;预热步数为 1000;动量衰减和权重衰减分别设置为 0.9 和 0.005。我们所有的 BoS 实验都使用与默认设置相同的超参数,并且在 BoF 实验中,我们增加了 50% 的训练步骤。在 BoF 实验中,我们验证了 MIXUP、CutMix、Mosaic、Bluring 数据增强和标签平滑正则化方法。在BoS 实验中,我们比较了 LReLU、SWISH 和 MISH 激活函数的影响。所有实验都使用1080Ti 或 2080Ti GPU 进行训练。
在 MS COCO 目标检测实验中,默认的超参数为:训练步数为 500500 步;采用步长衰减学习率调度策略,初始学习率为 0.01,在 40 万步 和 45 万步分别乘以因子 0.1;动量和权重衰减分别设置为 0.9 和 0.0005。所有架构都使用单个GPU来执行批大小为 64 的多尺度训练,小批量大小为 8 或 4,具体取决于架构和GPU内存限制。除采用遗传算法进行超参数搜索实验外,其余实验均采用默认设置。遗传算法使用 YOLOv3-SPP 算法进行带GIoU损失的训练,搜索 300 个 epochs 的 min-val 5k 集。遗传算法实验采用搜索学习率为 0.00261,动量为 0.949,IOU阈值为 0.213,损失归一化为 0.07.。我们验证了大量的BoF 算法,包括网格敏感度消除、Mosaic 数据增强、IOU 阈值、遗传算法、类标签平滑、交叉小批量归一化、自对抗训练、余弦退火、动态小批量大小、DropBlock、优化锚点、不同类型的 IOU 损失。我们还在各种 BoS 上进行了实验,包括MISH、SPP、SAM、RFB、BiFPN 和 GaussYOLO。对于所有的实验,我们只使用一个 GPU 进行训练,因此不使用诸如优化多个 GPU 的 syncBN 之类的技术。
作者通过实验研究了不同特征对分类器训练的影响。
包括:
作者通过实验研究了不同特征对 BoF-detector 训练精度的影响。
包括: Eliminate grid sensitivity(S)、Mosaic 数据增强(M)、IoU threshold(IT)、遗传算法(GA)、类别标签平滑(LS)、CmBN(CBN)、余弦退火(CA)、Dynamic mini-batch size(DM)、优化锚点(OA)、使用不同的损失算法进行有界盒回归(GIoU, CIoU, DIoU, MSE)。结果如下表:
作者通过实验研究了不同特征对 BoS-detector 训练精度的影响。
包括:PAN、RFB、SAM、GaussYOLO(G) 和 ASFF。
结果如下表:
作者通过实验研究了不同 backbone 和预训权重对检测器训练的影响。
首先,虽然不同特征训练的 CSPResNeXt50 模型比 CSPDarknet53 模型具有更高的分类精度,但 CSPDarknet53 模型在目标检测方面表现出更高的准确率。
其次,使用 BoF 和 Mish 对 CSPResNeXt50 分类器进行训练可以提高其分类精度,但是进一步将这些预先训练好的权重用于检测器训练会降低检测器的精度。而使用 BoF 和 Mish 进行 CSPDarknet53 分类器训练,可以同时提高分类器和使用该分类器预训练权重的检测器的准确性。最终结果是 CSPDarknet53 比 CSPResNeXt50 更适合检测器。
最后,作者分析了用不同小批量训练模型得到的结果,如下表所示:
可以看出,加入 BoF 和 BoS 训练策略后,小批量对检测器的性能几乎没有影响。这一结果表明,BOF 和 BOS 推出后,不再需要使用昂贵的GPU进行训练。换句话说,任何人都能只使用传统的 GPU 来训练一个优秀的检测器。
感觉作者就是作了大量实验(除了文中,文章最后足足有3页的实验结果表格,这里未列出),比较了各模型与 trick,选择了最好的,然后把它们拼起来,就成了 YOLOv4。不过正因为这样,文章覆盖了当前大部分主流的 模型与 trick,对系统了解当前研究有很大帮助(哈哈,当一个综述读也是不错的)。
自己的理解,有不对的地方欢迎留言。