极智AI | 目标检测实现分享四:详解YOLOv4算法实现

本文涉及的产品
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,视频资源包5000点
简介: 大家好,我是极智视界,本文详细介绍一下 YOLOv4 算法的设计与实践,实践部分包括 darknet 与 pytorch。

大家好,我是极智视界,本文详细介绍一下 YOLOv4 算法的设计与实践,实践部分包括 darknet 与 pytorch。

本文是目标检测类算法实现分享的第四篇,前面已经写过三篇,感兴趣的同学可以查阅:

(1) 《【模型训练】目标检测实现分享一:详解 YOLOv1 算法实现》;

(2) 《【模型训练】目标检测实现分享二:听说克莱今天复出了?详解 YOLOv2 算法与克莱检测》;

(3) 《【模型训练】目标检测实现分享三:详解 链接YOLOv3 算法实现》;

YOLOv4 是 YOLO 系列的第四个版本,在论文 《YOLOv4:Optimal Speed and Accuracy of Objecti Detection》中提出,集目标检测领域各种 state-of-the-art tricks 大荟萃 ,通过阅读 YOLOv4 论文及进行训练实践,可以对近年来目标检测领域涌现出的众多优秀 tricks 有个宏观把控。作者试验并集众多 tricks 于一身,就此催生出了性能出众的 YOLOv4 网络。

话不多说,让我们来看。

同样这里不止会讲原理也会讲实践。


1、YOLOv4 原理

老规矩,先上性能数据:

上图测试数据集为 MS COCO,推理硬件为 Nvidia V100,横轴为帧率 FPS,纵轴为精度 AP,所以从 兼顾效率和精度 角度来看,越往右上越好。可以看到 YOLOv4 相比 EfficientDet 要快两倍,相比 YOLOv3,AP 和 FPS 分别提升了 10% 和 12%。

来看一个分别跑在 Maxwell、Pascal、Volta 架构上的 AP&FPS 性能图:

可以看到作者对比了很多先进的目标检测网络,但不管是在 Maxwell、Pascal 还是 Volta 架构上,YOLOv4 总是右上角最闪亮的那颗星。

再来看一组更加详细的性能数据,这组数据是在 Volta 架构的 GPU 上测得:

上图性能数据是在 batch=1 且没有使用 TensorRT 进行加速的情况下测得,蓝色条表示帧率 FPS > 30,也即可以达到实时检测。可以看到 YOLOv4 的三个输入分辨率都能轻松达到实时,另外像 CenterMask-Lite、EFGRNet-VGG16-320、HSD-VGG16-320、DAFS-VGG16-512 也可以达到实时。另外在精度方面, AP、AP50、AP75、APs、APm 已经被 YOLOv4-CSPDarknet53-608 霸榜了,在 APl 上 CenterMask-Lite-VOVNet39-FPN-600x 要略优 0.2 个点。

从以上实验数据可以看出 YOLOv4 的性能是非常强悍的,它的提出主要有以下两个贡献:

(1) 提出了一个高效又强大的检测模型,任何人都可以只用一张 2080Ti GPU 卡就可训练出一个好用的检测器;

(2) 试验了众多 state-of-the-art 的检测 tricks,并融入到 YOLOv4 中,使其更加的高效和强大;

下面让我们来好好研究一下。

YOLOv4 的网络结构划可分为 Input、Backbone、Neck、Head 四个模块,可以用下图表达:

然后在模型结构和训练策略上分别加入了一些被称为 "Bag of freebies" 和 "Bag of specials" 的 tricks,解释一下这两个词:

  • Bag of freebies (BoF):只改变训练策略或只增加训练成本,而不增加推理成本从而提高性能的方法,如数据增强;
  • Bag of specials (BoS):稍微增加一点推理成本,但可以极大提升检测精度的方法,如插件模块和后处理方法;

YOLOv4 中融入了大量的 BoF 和 Bo

YOLOv4 的网络结构划分为 Input、Backbones、Neck、Heads 四个模块组成,差不多像下图:

下面来看各个模块中的 tricks。

1.1 Input

YOLOv4 在训练时对输入进行了很多创新性改进,包括 Mosaic 数据增强、cmBN、SAT 自对抗训练等,下面进行详细介绍。

1.1.1 Mosaic

Mosaic 是在 CutMix 数据增强的基础上进化而来的,CutMix 是使用两张图片拼接进行数据增强,而 Mosaic 拓展到了使用四张图片拼接,且这四张图片是随机缩放、随机裁剪和随机排版的,这样可以一下子极大的丰富数据集。Mosaic 数据增强的效果如下:

1.1.2 CmBN

CmBN 是 CBN 的改进版,而 CBN 又是 BN 的改进版。BN 是对当前 mini-batch 数据进行归一化,CBN 可以看做是 Cross Batch Normalization,是对当前以及往前数 3 个 mini-batch 数据进行归一化,而 CmBN 可以看做是 Cross mini-Batch Normalization,只统计一个大 batch 中 4 个 mini-batch 之间的数据,对外隔离。BN、CBN、CmBN 的流程示意如下:

1.1.3 SAT

SAT (Self-Adversarial Training) 自对抗训练也是一种数据增强的方法,它包括两个阶段:

(1) 1st stage:使用神经网络去改变图片数据,而不是更新权重数据,可以理解为图像数据生成;

(2) 2nd stage:神经网络以正常方式在扩充后的图像数据集上进行训练。

1.2 Backbone

1.2.1 CSPDarknet53

我们知道在 YOLOv2 中 backbone 为 Darknet19,YOLOv3 中 backbone 为 Darknet53,在 YOLOv4 中 backbone 又进行了一次升级,这次称为 CSPDarknet53,主要参考了论文《CSPNet:A New Backbone that can Enhance Learning Capability of CNN》,然后和 Darknet 相结合,来看主结构:

再来看一下 CSPDarknet53 对比其他一些优秀 backbone 的参数量及性能情况,如下:

可以看到在相同输入分辨率的情况下,CSPDarknet53 具有更高的 FPS,这说明效率更高;也具有更多的参数量,说明有更多的参数可以去学习特征,往往特征学习能力会更强。

1.2.2 Mish

YOLOv4 backbone 是由很多的 CBM block (Conv + BN + Mish) 和 残差结构组成,CBM block 差不多长这样:

Mish 激活函数在论文《Mish: A Self Regularized Non-Monotonic Activation Function》中提出,其数学表达为:

函数的图像表达如下,其中:

  • 蓝色曲线为:Mish;
  • 橙色曲线为:ln(1 + e^(x))

当然在实现的时候,也可以把 Mish 拆成由 tanh 和 softplus 组成,如在 TensorRT 的实现中往往需要这么做,即:

对比 Relu,Mish 不像 Relu 那样是两阶段的,Mish 没有明显的折点,所以经 Mish 出来的梯度更加平滑,对比效果如下:

1.3 Neck

1.3.1 SPP

SPP 指的是这个东西:

这个结构其实在 YOLOv3-SPP.cfg 中早就存在,不过在 YOLOv3 时期还没有真正上位,在 YOLOv4 的时候才算真正上位了。SPP 结构在论文《DC-SPP-YOLO: Dense Connection and Spatial Pyramid Pooling Based YOLO for Object Detection》中提出,其主要目的是增加感受野。

1.3.2 FPN + PAN

FPN 结构在 YOLOv3 中也存在,以输入分辨率 608 x 608 为例,在 YOLOv3 中通过 upsample 上采样和 Conv 下采样后,最后形成了 19 x 19、38 x 38、76 x 76 的三分支结构,示意如下:

而 YOLOv4 的不同之处在于,在 YOLOv3 FPN 的基础上再接一个 Botton-up 结构,Botton-up 中用 PAN 进行衔接,整个 YOLOv4 FPN + PAN 的结构示意如下:

YOLOv4 中的 PAN 修改了传统 PAN 中 addition 为 concatenation,这里有些不同,addition 不改变通道维度,concatenation 则会改变通道维度,示意如下:

1.4 Dense Prediction

1.4.1 Yolo

YOLOv4 中最后的 yolo 预测层沿用了 YOLOv3 的 yolo,不过需要注意的是 YOLOv4 在经过了如上的 FPN + PAN 的 Neck 后,又形成了一个很容易让人迷惑的点:

YOLOv3 的最后三个 yolo 层分别为

(1) 第一个 yolo 层:feature map 19 x 19 ==> mask = 6, 7, 8 ==> 对应最大的 anchor;

(2) 第二个 yolo 层:feature map 38 x 38 ==> mask = 3, 4, 5 ==> 对应中等的 anchor;

(3) 第三个 yolo 层:feature map 76 x 76 ==> mask = 0, 1, 2 ==> 对应最小的 anchor;

而在 YOLOv4 中情况是相反的

(1) 第一个 yolo 层:feature map 76 x 76 ==> mask = 0, 1, 2 ==> 对应最小的 anchor;

(2) 第二个 yolo 层:feature map 38 x 38 ==> mask = 3, 4, 5 ==> 对应中等的 anchor;

(3) 第三个 yolo 层:feature map 19 x 19 ==> mask = 6, 7, 8 ==> 对应最大的 anchor;

这个差异在开发过程中需要特别注意,很容易就把顺序搞错了

1.4.2 IOU Loss

YOLOv4 在 Bounding box Regeression Loss 上也做了一些创新,采用 CIOU_Loss 进行回归预测,使得预测框的速度和精度更加高。

说到 CIOU_Loss,它经历了从最开始直接计算预测框的坐标点 Loss 到 IOU_Loss ,然后再进行了一系列优化的过程。这个过程差不多是这样:Smooth L1_Loss -> IOU_Loss -> GIOU_Loss -> DIOU_Loss -> CIOU_Loss。

  • Smooth L1_Loss: 使用 Smooth L1_Loss 计算预测框的中心点或顶点相对于真实框的损失,无约束,反向传播时很容易导致梯度消失;
  • IOU_Loss:IOU_Loss 主要考虑检测框和真实框的交集 / 并集,存在问题:当 IOU=0时(边界框不重合) 或 IOU值一定时,情况是多样的 ;
  • GIOU_Loss:GIOU_Loss 在 IOU_Loss 的基础上,增加了相交尺度的衡量方式,解决了边界框不重合时的问题,不过还存在问题:IOU 值一定时,情况是多样的;
  • DIOU_Loss:DIOU_Loss 进一步在 GIOU 的基础上,考虑了 重叠面积 和 中心点距离,覆盖的情况更多了,但还不够全面:当多个预测框的中心点刚好在以真实框中心为圆心的圆上时,情况是多样的;
  • CIOU_Loss:CIOU_Loss 在 DIOU_Loss 的基础上再增加了一个影响因子,加入了预测框和真实框的长宽比,可以说覆盖的情况十分全面了。

好了,以上主要介绍了 YOLOv4 的原理和改进点,下面进入实践环节。


2、YOLOv4 实现

这里实践了两种框架的 YOLOv4。

2.1 训练

2.1.1 darknet 训练

darknet 下训练数据集为 COCO,关于 COCO 数据集的制作过程就不多说了,上一篇 YOLOv3 中已经详细说过,不会的同学可以移步到上一篇。下面直接开始。

在 cfg 目录下创建 yolov4 文件夹,加入 yolov4.cfg、coco.data、coco.names,并在 yolov4 文件夹下创建 backup 文件夹用于存放中间权重,形成目录树如下:

执行训练指令:

./darknet detector train cfg/yolov4/coco.data cfg/yolov4/yolov4.cfg

当然也可以加预训练权重:

./darknet detector train cfg/yolov4/coco.data cfg/yolov4/yolov4.cfg cfg/yolov4/yolov4.conv.137

附上 yolov4.conv.137 的传送:https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137

然后可以看到已经开始训练:

经过很长的训练时间应该可以看到网络在慢慢收敛:

2.1.2 pytorch 训练

pytorch 是现在使用十分广泛的训练框架,以动态图和灵活性著称,当然这里少不了 YOLOv4 的 pytorch 实现了。

相关 YOLOv4-pytorch 工程代码我已为你们整理好,关注我的公众号 [极智视界] 回复 yolov4 即可领取

我这里提供的工程内还放了 VOC 数据集格式,只需要根据提供的格式制作一下训练数据集就可以轻松跑起来。

让我们来跑一跑,直接执行工程下 train.sh 即可开始训练:

./train.sh

这样的执行方式应该非常的友好,另外你可能还想着要修改一些参数,在 train.py 脚本内做相应修改即可,比如修改是否进行 Mosaic 数据增强等:

来看看训练过程:

2.2 验证

好了,接下来我们进行验证一下,训练出来的模型是否有效。

这里拿 darknet 的模型进行验证,验证场景为春运现场,执行如下命令进行检测:

./darknet detector demo cfg/yolov4/coco.data cfg/yolov4/yolov4.cfg cfg/yolov4/backup/yolov4.weights data/chunyun.mp4

检测效果如下:

可以看到检测效果还是不错的。


以上分享了 YOLOv4 算法设计与实践,希望我的分享能对你的学习有一点帮助。


logo_show.gif



相关文章
|
29天前
|
传感器 人工智能 监控
智慧工地 AI 算法方案
智慧工地AI算法方案通过集成多种AI算法,实现对工地现场的全方位安全监控、精准质量检测和智能进度管理。该方案涵盖平台层、展现层与应用层、基础层,利用AI技术提升工地管理的效率和安全性,减少人工巡检成本,提高施工质量和进度管理的准确性。方案具备算法精准高效、系统集成度高、可扩展性强和成本效益显著等优势,适用于人员安全管理、施工质量监控和施工进度管理等多个场景。
|
1月前
|
传感器 人工智能 监控
智慧电厂AI算法方案
智慧电厂AI算法方案通过深度学习和机器学习技术,实现设备故障预测、发电运行优化、安全监控和环保管理。方案涵盖平台层、展现层、应用层和基础层,具备精准诊断、智能优化、全方位监控等优势,助力电厂提升效率、降低成本、保障安全和环保合规。
智慧电厂AI算法方案
|
2天前
|
机器学习/深度学习 人工智能 算法
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
X-AnyLabeling是一款集成了多种深度学习算法的图像标注工具,支持图像和视频的多样化标注样式,适用于多种AI训练场景。本文将详细介绍X-AnyLabeling的功能、技术原理以及如何运行该工具。
22 2
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
|
14天前
|
机器学习/深度学习 缓存 人工智能
【AI系统】QNNPack 算法
QNNPACK是Marat Dukhan开发的量化神经网络计算加速库,专为移动端优化,性能卓越。本文介绍QNNPACK的实现,包括间接卷积算法、内存重排和间接缓冲区等关键技术,有效解决了传统Im2Col+GEMM方法存在的空间消耗大、缓存效率低等问题,显著提升了量化神经网络的计算效率。
32 6
【AI系统】QNNPack 算法
|
14天前
|
存储 人工智能 缓存
【AI系统】Im2Col 算法
Caffe 作为早期的 AI 框架,采用 Im2Col 方法优化卷积计算。Im2Col 将卷积操作转换为矩阵乘法,通过将输入数据重排为连续内存中的矩阵,减少内存访问次数,提高计算效率。该方法首先将输入图像转换为矩阵,然后利用 GEMM 库加速计算,最后将结果转换回原格式。这种方式显著提升了卷积计算的速度,尤其适用于通道数较多的卷积层。
36 5
【AI系统】Im2Col 算法
|
14天前
|
存储 机器学习/深度学习 人工智能
【AI系统】Winograd 算法
本文详细介绍Winograd优化算法,该算法通过增加加法操作来减少乘法操作,从而加速卷积计算。文章首先回顾Im2Col技术和空间组合优化,然后深入讲解Winograd算法原理及其在一维和二维卷积中的应用,最后讨论算法的局限性和实现步骤。Winograd算法在特定卷积参数下表现优异,但其应用范围受限。
29 2
【AI系统】Winograd 算法
|
2天前
|
人工智能 算法
AI+脱口秀,笑点能靠算法创造吗
脱口秀是一种通过幽默诙谐的语言、夸张的表情与动作引发观众笑声的表演艺术。每位演员独具风格,内容涵盖个人情感、家庭琐事及社会热点。尽管我尝试用AI生成脱口秀段子,但AI缺乏真实的情感共鸣和即兴创作能力,生成的内容显得不够自然生动,难以触及人心深处的笑点。例如,AI生成的段子虽然流畅,却少了那份不期而遇的惊喜和激情,无法真正打动观众。 简介:脱口秀是通过幽默语言和夸张表演引发笑声的艺术形式,AI生成的段子虽流畅但缺乏情感共鸣和即兴创作力,难以达到真人表演的效果。
|
1月前
|
机器学习/深度学习 传感器 人工智能
智慧无人机AI算法方案
智慧无人机AI算法方案通过集成先进的AI技术和多传感器融合,实现了无人机的自主飞行、智能避障、高效数据处理及多机协同作业,显著提升了无人机在复杂环境下的作业能力和安全性。该方案广泛应用于航拍测绘、巡检监测、应急救援和物流配送等领域,能够有效降低人工成本,提高任务执行效率和数据处理速度。
智慧无人机AI算法方案
|
18天前
|
存储 人工智能 缓存
【AI系统】布局转换原理与算法
数据布局转换技术通过优化内存中数据的排布,提升程序执行效率,特别是对于缓存性能的影响显著。本文介绍了数据在内存中的排布方式,包括内存对齐、大小端存储等概念,并详细探讨了张量数据在内存中的排布,如行优先与列优先排布,以及在深度学习中常见的NCHW与NHWC两种数据布局方式。这些布局方式的选择直接影响到程序的性能,尤其是在GPU和CPU上的表现。此外,还讨论了连续与非连续张量的概念及其对性能的影响。
42 3
|
18天前
|
机器学习/深度学习 人工智能 算法
【AI系统】内存分配算法
本文探讨了AI编译器前端优化中的内存分配问题,涵盖模型与硬件内存的发展、内存划分及其优化算法。文章首先分析了神经网络模型对NPU内存需求的增长趋势,随后详细介绍了静态与动态内存的概念及其实现方式,最后重点讨论了几种节省内存的算法,如空间换内存、计算换内存、模型压缩和内存复用等,旨在提高内存使用效率,减少碎片化,提升模型训练和推理的性能。
36 1

热门文章

最新文章

下一篇
DataWorks