一文读懂YOLOv5 与 YOLOv4

2023-05-16

作者:William

来源:自动驾驶全栈工程师知乎专栏

链接:https://www.zhihu.com/people/william.hyin/columns

YOLO之父Joseph Redmon在今年年初宣布退出计算机视觉的研究的时候,很多人都以为目标检测神器YOLO系列就此终结。

然而在4月23日,继任者YOLO V4却悄无声息地来了。Alexey Bochkovskiy发表了一篇名为YOLOV4: Optimal Speed and Accuracy of Object Detection的文章。

YOLO V4是YOLO系列一个重大的更新,其在COCO数据集上的平均精度(AP)和帧率精度(FPS)分别提高了10% 和12%,并得到了Joseph Redmon的官方认可,被认为是当前最强的实时对象检测模型之一。

正当计算机视觉的从业者们正在努力研究YOLO V4的时候,万万没想到,有牛人不服。

6月25日,Ultralytics发布了YOLOV5 的第一个正式版本,其性能与YOLO V4不相伯仲,同样也是现今最先进的对象检测技术,并在推理速度上是目前最强。

从上图的结果可以看出,YOLO V5确实在对象检测方面的表现非常出色,尤其是YOLO V5s 模型140FPS的推理速度非常惊艳。

YOLO V5和V4集中出现让很多人都感到疑惑,一是YOLO V5真的有资格能被称作新一代YOLO吗?二是YOLO V5的性能与V4相比究竟如何,两者有啥区别及相似之处?

在本文中我会详细介绍YOLO V5和YOLO V4的原理,技术区别及相似之处,最后会从多方面对比两者的性能。

我在我之前的文章中介绍了YOLO V3模型,YOLO是一种快速紧凑的开源对象检测模型,与其它网络相比,同等尺寸下性能更强,并且具有很不错的稳定性,是第一个可以预测对象的类别和边界框的端对端神经网络。

YOLO V3原始模型是基于Darknet网络。Ultralytics将YOLO V3架构迁移到了Pytorch平台上,并对其自行研究和改进。Ultralytics-yolov3 代码库是目前已开源YOLO V3 Pytorch的最佳实现。

YOLO网络主要由三个主要组件组成。

1)Backbone -在不同图像细粒度上聚合并形成图像特征的卷积神经网络。

2)Neck:一系列混合和组合图像特征的网络层,并将图像特征传递到预测层。

3)Head:对图像特征进行预测,生成边界框和并预测类别。

下图是对象检测网络的通用架构:

我们可以在上述每个主要组件上使用不同的技术或者组合不同的方案来实现属于自己的最佳对象检测框架。

实际上YOLO V5的模型架构是与V4非常相近的。

在下文中,我会从下面几个方面对比YOLO V5和V4,并简要阐述它们各自新技术的特点,对比两者的区别和相似之处,评判两者的性能,并做最后总结。

  • Data Augmentation

  • Auto Learning Bounding Box Anchors

  • Backbone

  • Neck

  • Head

  • Activation Function

  • Optimization Function

  • Benchmarks

Data Augmentation

图像增强是从现有的训练数据中创建新的训练样本。我们不可能为每一个现实世界场景捕捉一个图像,因此我们需要调整现有的训练数据以推广到其他情况,从而允许模型适应更广泛的情况。

无论是YOLO V5还是V4,多样化的先进数据增强技术是最大限度地利用数据集,使对象检测框架取得性能突破的关键。通过一系列图像增强技术步骤,可以在不增加推理时延的情况下提高模型的性能。

YOLO V4数据增强

YOLO V4使用了上图中多种数据增强技术的组合,对于单一图片,除了经典的几何畸变与光照畸变外,还创新地使用了图像遮挡(Random Erase,Cutout,Hide and Seek,Grid Mask ,MixUp)技术,对于多图组合,作者混合使用了CutMix与Mosaic 技术。

除此之外,作者还使用了Self-Adversarial Training (SAT)来进行数据增强。

在下文中我将简单介绍以上数据增强技术。

图像遮挡

  • Random Erase:用随机值或训练集的平均像素值替换图像的区域。

  • Cutout:仅对 CNN 第一层的输入使用剪切方块Mask。

  • Hide and Seek:将图像分割成一个由 SxS 图像补丁组成的网格,根据概率设置随机隐藏一些补丁,从而让模型学习整个对象的样子,而不是单独一块,比如不单独依赖动物的脸做识别。

  • Grid Mask:将图像的区域隐藏在网格中,作用也是为了让模型学习对象的整个组成部分。

  • MixUp:图像对及其标签的凸面叠加。

多图组合

Cutmix:

  • 将另一个图像中的剪切部分粘贴到增强图像。图像的剪切迫使模型学会根据大量的特征进行预测。

Mosaic data augmentation:

  • 在Cutmix中我们组合了两张图像,而在 Mosaic 中我们使用四张训练图像按一定比例组合成一张图像,使模型学会在更小的范围内识别对象。其次还有助于显著减少对batch-size的需求,毕竟大多数人的GPU显存有限。

自对抗训练(SAT)

  • Self-Adversarial Training是在一定程度上抵抗对抗攻击的数据增强技术。CNN计算出Loss, 然后通过反向传播改变图片信息,形成图片上没有目标的假象,然后对修改后的图像进行正常的目标检测。需要注意的是在SAT的反向传播的过程中,是不需要改变网络权值的。

使用对抗生成可以改善学习的决策边界中的薄弱环节,提高模型的鲁棒性。因此这种数据增强方式被越来越多的对象检测框架运用。

类标签平滑

Class label smoothing是一种正则化方法。如果神经网络过度拟合和/或过度自信,我们都可以尝试平滑标签。

也就是说在训练时标签可能存在错误,而我们可能“过分”相信训练样本的标签,并且在某种程度上没有审视了其他预测的复杂性。

因此为了避免过度相信,更合理的做法是对类标签表示进行编码,以便在一定程度上对不确定性进行评估。YOLO V4使用了类平滑,选择模型的正确预测概率为0.9,例如[0,0,0,0.9,0...,0 ]。

从上图看出,标签平滑为最终的激活产生了更紧密的聚类和更大的类别间的分离,实现更好的泛化。

YOLO V5 似乎没有使用类标签平滑。

YOLO V5 数据增强

YOLO V5的作者现在并没有发表论文,因此只能从代码的角度理解它的数据增强管道。

YOLOV5都会通过数据加载器传递每一批训练数据,并同时增强训练数据。

数据加载器进行三种数据增强:缩放,色彩空间调整和马赛克增强。

有意思的是,有媒体报道,YOLO V5的作者Glen Jocher正是Mosaic Augmentation的创造者,他认为YOLO V4性能巨大提升很大程度是马赛克数据增强的功劳,

也许是不服,他在YOLO V4出来后的仅仅两个月便推出YOLO V5,当然未来是否继续使用YOLO V5的名字或者采用其他名字,首先得看YOLO V5的最终研究成果是否能够真正意义上领先YOLO V4。

但是不可否认的是马赛克数据增强确实能有效解决模型训练中最头疼的“小对象问题”,即小对象不如大对象那样准确地被检测到。

下图是我在训练BDD100K数据时的数据增强结果。我会在我的下篇文章:YOLO V5 Transfer learning 中展示YOLO V5对象检测框架的实测效果。

Auto Learning Bounding Box Anchors-自适应锚定框

在我之前YOLO V3的文章中,我介绍过如何采用 k 均值和遗传学习算法对自定义数据集进行分析,获得适合自定义数据集中对象边界框预测的预设锚定框。

在YOLO V5 中锚定框是基于训练数据自动学习的。

对于COCO数据集来说,YOLO V5 的配置文件*.yaml 中已经预设了640×640图像大小下锚定框的尺寸:

# anchors
anchors:
  - [116,90, 156,198, 373,326]  # P5/32
  - [30,61, 62,45, 59,119]  # P4/16
  - [10,13, 16,30, 33,23]  # P3/8

但是对于你的自定义数据集来说,由于目标识别框架往往需要缩放原始图片尺寸,并且数据集中目标对象的大小可能也与COCO数据集不同,因此YOLO V5会重新自动学习锚定框的尺寸。

如在上图中, YOLO V5在进行学习自动锚定框的尺寸。对于BDD100K数据集,模型中的图片缩放到512后,最佳锚定框为:

YOLO V4并没有自适应锚定框。

Backbone-跨阶段局部网络(CSP)

YOLO V5和V4都使用CSPDarknet作为Backbone,从输入图像中提取丰富的信息特征。CSPNet全称是Cross Stage Partial Networks,也就是跨阶段局部网络。

CSPNet解决了其他大型卷积神经网络框架Backbone中网络优化的梯度信息重复问题,将梯度的变化从头到尾地集成到特征图中,因此减少了模型的参数量和FLOPS数值,既保证了推理速度和准确率,又减小了模型尺寸。

CSPNet实际上是基于Densnet的思想,复制基础层的特征映射图,通过dense block 发送副本到下一个阶段,从而将基础层的特征映射图分离出来。

这样可以有效缓解梯度消失问题(通过非常深的网络很难去反推丢失信号) ,支持特征传播,鼓励网络重用特征,从而减少网络参数数量。

CSPNet思想可以和ResNet、ResNeXt和DenseNet结合,目前主要有CSPResNext50 and CSPDarknet53两种改造Backbone网络。


Neck-路径聚合网络(PANET)

Neck主要用于生成特征金字塔。特征金字塔会增强模型对于不同缩放尺度对象的检测,从而能够识别不同大小和尺度的同一个物体。

在PANET出来之前,FPN一直是对象检测框架特征聚合层的State of the art,直到PANET的出现。

在YOLO V4的研究中,PANET被认为是最适合YOLO的特征融合网络,因此YOLO V5和V4都使用PANET作为Neck来聚合特征。

PANET基于 Mask R-CNN 和 FPN 框架,同时加强了信息传播。该网络的特征提取器采用了一种新的增强自下向上路径的 FPN 结构,改善了低层特征的传播。

第三条通路的每个阶段都将前一阶段的特征映射作为输入,并用3x3卷积层处理它们。输出通过横向连接被添加到自上而下通路的同一阶段特征图中,这些特征图为下一阶段提供信息。

同时使用自适应特征池化(Adaptive feature pooling)恢复每个候选区域和所有特征层次之间被破坏的信息路径,聚合每个特征层次上的每个候选区域,避免被任意分配。

下图中pi 代表 CSP 主干网络中的一个特征层


Head-YOLO 通用检测层

模型Head主要用于最终检测部分。它在特征图上应用锚定框,并生成带有类概率、对象得分和包围框的最终输出向量。

在 YOLO V5模型中,模型Head与之前的 YOLO V3和 V4版本相同。

这些不同缩放尺度的Head被用来检测不同大小的物体,每个Head一共(80个类 + 1个概率 + 4坐标) * 3锚定框,一共255个channels。

Activation Function

激活函数的选择对于深度学习网络是至关重要的。YOLO V5的作者使用了 Leaky ReLU 和 Sigmoid 激活函数。

在 YOLO V5中,中间/隐藏层使用了 Leaky ReLU 激活函数,最后的检测层使用了 Sigmoid 形激活函数。而YOLO V4使用Mish激活函数。

Mish在39个基准测试中击败了Swish,在40个基准测试中击败了ReLU,一些结果显示基准精度提高了3–5%。

但是要注意的是,与ReLU和Swish相比,Mish激活在计算上更加昂贵。

Optimization Function

YOLO V5的作者为我们提供了两个优化函数Adam和SGD,并都预设了与之匹配的训练超参数。默认为SGD。

YOLO V4使用SGD。

YOLO V5的作者建议是,如果需要训练较小的自定义数据集,Adam是更合适的选择,尽管Adam的学习率通常比SGD低。

但是如果训练大型数据集,对于YOLOV5来说SGD效果比Adam好。

实际上学术界上对于SGD和Adam哪个更好,一直没有统一的定论,取决于实际项目情况。


Cost Function

YOLO 系列的损失计算是基于 objectness score, class probability score,和 bounding box regression score.

YOLO V5使用 GIOU Loss作为bounding box的损失。

YOLO V5使用二进制交叉熵和 Logits 损失函数计算类概率和目标得分的损失。同时我们也可以使用fl _ gamma参数来激活Focal loss计算损失函数。

YOLO V4使用 CIOU Loss作为bounding box的损失,与其他提到的方法相比,CIOU带来了更快的收敛和更好的性能。

上图结果基于Faster R-CNN,可以看出,实际上CIoU 的表现比 GIoU 好。

Benchmarks- YOLO V5 VS YOLO V4

由于Ultralytics公司目前重心都放在尽快推广YOLO V5对象检测框架,YOLO V5也在不停的更新和完善之中,因此作者打算年底在YOLO V5的研究完成之后发表正式论文。

在没有论文的详细论述之前,我们只能通过查看作者放出的COCO指标并结合大佬们后续的实例评估来比较两者的性能。

  • 官方性能评估

在上面的两个图中,FPS与ms/img的关系是反转的,经过单位转换后我们可以发现,在V100GPU上YOLO V5可以达到250FPS,同时具有较高的mAP。

由于YOLO V4的原始训练是在1080TI上的,远低于V100的性能,并且AP_50与AP_val的对标不同,因此仅凭上述的表格是无法得出两者的Benchmarks。

好在YOLO V4的第二作者WongKinYiu使用V100的GPU提供了可以对比的Benchmarks。

从图表中可以看出,两者性能其实很接近,但是从数据上看YOLO V4仍然是最佳对象检测框架。YOLO V4的可定制化程度很高,如果不惧怕更多自定义配置,那么基于Darknet的YOLO V4仍然是最准确的。

值得注意的是YOLO V4其实使用了大量Ultralytics YOLOv3代码库中的数据增强技术,这些技术在YOLO V5中也被运行,数据增强技术对于结果的影响到底有多大,还得等作者的论文分析。

  • 训练时间

根据Roboflow的研究表明,YOLO V5的训练非常迅速,在训练速度上远超YOLO V4。对于Roboflow的自定义数据集,YOLO V4达到最大验证评估花了14个小时,而YOLO V5仅仅花了3.5个小时。

而在我自己的数据训练过程中,YOLO V5s训练速度远超YOLO V4 。我会在我的下篇文章:YOLO V5 Transfer learning 中展示YOLO V5s的实测训练速度。

  • 模型大小

上图中不同模型的大小分别为:V5x: 367MB,V5l: 192MB,V5m: 84MB,V5s: 27MB,YOLOV4: 245 MB

YOLO V5s 模型尺寸非常小,降低部署成本,有利于模型的快速部署。

  • 推理时间

在单个图像(批大小为1)上,YOLOV4推断在22毫秒内,YOLOV5s推断在20毫秒内。

而YOLOV5实现默认为批处理推理(批大小36),并将批处理时间除以批处理中的图像数量,单一图片的推理时间能够达到7ms,也就是140FPS,这是目前对象检测领域的State-of-the-art。

我使用我训练的模型对10000张测试图片进行实时推理,YOLOV5s 的推理速度非常惊艳,每张图只需要7ms的推理时间,再加上20多兆的模型大小,在灵活性上堪称无敌。

但是其实这对于YOLO V4并不公平,由于YOLO V4没有实现默认批处理推理,因此在对比上呈现劣势,接下来应该会有很多关于这两个对象检测框架在同一基准下的测试。

其次YOLO V4最新推出了tiny版本,YOLO V5s 与V4 tiny 的性能速度对比还需要更多实例分析。

Summary

总的来说,YOLO V4 在性能上优于YOLO V5,但是在灵活性与速度上弱于YOLO V5。

由于YOLO V5仍然在快速更新,因此YOLO V5的最终研究成果如何,还有待分析。

我个人觉得对于这些对象检测框架,特征融合层的性能非常重要,目前两者都是使用PANET,但是根据谷歌大脑的研究,BiFPN才是特征融合层的最佳选择。谁能整合这项技术,很有可能取得性能大幅超越。

尽管YOLO V5目前仍然计逊一筹,但是YOLO V5仍然具有以下显著的优点:

  • 使用Pytorch框架,对用户非常友好,能够方便地训练自己的数据集,相对于YOLO V4采用的Darknet框架,Pytorch框架更容易投入生产

  • 代码易读,整合了大量的计算机视觉技术,非常有利于学习和借鉴

  • 不仅易于配置环境,模型训练也非常快速,并且批处理推理产生实时结果

  • 能够直接对单个图像,批处理图像,视频甚至网络摄像头端口输入进行有效推理

  • 能够轻松的将Pytorch权重文件转化为安卓使用的ONXX格式,然后可以转换为OPENCV的使用格式,或者通过CoreML转化为IOS格式,直接部署到手机应用端

  • 最后YOLO V5s高达140FPS的对象识别速度令人印象非常深刻,使用体验非常棒

写在结尾

其实很多人都觉得YOLO V4和YOLO V5实际上没有什么耳目一新创新,而是大量整合了计算机视觉领域的State-of-the-art,从而显著改善YOLO对象检测的性能。

其实我觉得有的时候工程应用的能力同样也很重要,能有两个这么优秀的技术整合实例供我们免费使用和学习研究,已经不能奢求更多了,毕竟活雷锋还是少啊。先别管别人谁更强,自己能学到更多才是最重要的,毕竟讨论别人谁强,还不如自己强。

最后想说的是,技术发展如此之快,究竟谁能最后拿下最佳对象检测框架的头衔尤未可知,而我们处在最好的时代,让我们且行且学且珍惜。

备注:目标检测

目标检测交流群

2D、3D目标检测等最新资讯,若已为CV君其他账号好友请直接私信。

我爱计算机视觉

微信号:aicvml

QQ群:805388940

微博知乎:@我爱计算机视觉

投稿:amos@52cv.net

网站:www.52cv.net

在看,让更多人看到  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文读懂YOLOv5 与 YOLOv4 的相关文章

  • YOLOv4从配置环境到跑通代码的小白教程

    一直以来都只是看论文和网上的一些纯文字的讲解 xff0c 但从来没有实操过 xff0c 非常想自己跑一下代码 xff0c 看一下算法的整个实现过程 xff0c 于是就有了这次尝试 系统环境介绍 windows 10 NVIDIA GeFor
  • 无人机目标检测:使用YOLOv4在VisDrone数据集上进行目标检测任务

    在本篇博客中 我们将探讨如何使用YOLOv4在VisDrone数据集上进行无人机目标检测任务 目标检测是计算机视觉中的一个重要任务 可以用于自动驾驶汽车 无人机监测和视频分析等多种应用 YOLOv4是一种实时目标检测算法 以其速度和准确性而
  • YOLOv5训练参数简介

    YOLOv5参数解析 xff0c 这次主要解析源码中train py文件中包含的参数 1 1 39 weights 39 1 2 39 cfg 39 1 3 39 data 39 1 4 39 hyp 39 1 5 39 epochs 39
  • yolov5源码解析--输出

    本文章基于yolov5 6 2版本 主要讲解的是yolov5是怎么在最终的特征图上得出物体边框 置信度 物体分类的 一 总体框架 首先贴出总体框架 xff0c 直接就拿官方文档的图了 xff0c 本文就是接着右侧的那三层输出开始讨论 Bac
  • 一文读懂BLOB算法

    算法执行效果 相关参考资料 看着玩的 BLOB算法简述 https blog csdn net icyrat article details 6594574 话说这老哥写的也太 简 了吧 完全口水话 把blob算法说的很神秘 说什么把blo
  • 55、记录标注的关键点和目标检测数据集,进行目标检测标注文件和关键点文件分离以及yolov5.txt标注格式转xml数据集

    基本思想 xff1a 手中存在一份关键点检测模型 xff0c 因为客户把检测框和目标关键点框都标注在一起了 xff0c 所以进行一下剥离 代码一 xff1a 从关标注数据集剥离目标检测 coding utf 8 import cv2 imp
  • Yolov5 更改识别窗口大小

    启动yolov5时 xff0c 会因为像素太大导致占据整个桌面 xff0c 这样非常影响使用和操作 xff0c 我们可以通过opencv中的resize函数来修改识别窗口的像素大小 xff0c 这样操作就方便多了 原代码中 通过修改cv2
  • yolov5/v7/v8自动检测多个文件夹及截取锚框

    目前yolo仅支持检测图片或单个文件夹 xff0c 但在很多时候需要对成百上千个文件夹中图片进行检测 xff0c 再根据得到的位置信息txt文件来截取图片 xff0c 如何一步完成呢 xff0c 详情见下文 在detect py中将save
  • math模块

    math 模块是Python中的标准模块 并且始终可用 要在此模块下使用数学函数 您必须使用导入模块import math 它提供对基础C库函数的访问 导入数学函数库 import math 查看 math 查看包中的内容 print di
  • 干货-YOLOv5检测烟火

    火灾是一种常见的自然灾害和事故 经常给人们的生命财产安全带来威胁 在人力无法及时发现火灾的情况下 火势可能迅速扩散 造成不可挽回的损失 因此 及时发现火灾并采取有效的救援措施至关重要 利用计算机视觉技术检测火灾具有以下意义 提高火灾检测效率
  • yolov5小目标检测-提高检测小目标的检测精度

    目前基于目标检测方面 近些年基于深度学习的人神经网络产生了很多经典且高效的网络结构 其中不乏有凯明大神的Fast RCNN Faster RCNN家族系列检测网络结构 还有号称you only look once的YOLO系列 本次分享的就
  • yolov5如何开启和关闭mosaic(马赛克)增强

    总结 将 hyp scratch yaml中的mosaic设置为0 表示关闭马赛克增强
  • yolo毕业设计(车辆识别、行人识别、车牌识别)

    车牌识别视频 车辆识别视频 yolov5车辆识别视频 yolov5 yoloR对比行人车辆识别视频
  • 睿智的目标检测56——Pytorch搭建YoloV5目标检测平台

    睿智的目标检测56 Pytorch搭建YoloV5目标检测平台 学习前言 源码下载 YoloV5改进的部分 不完全 YoloV5实现思路 一 整体结构解析 二 网络结构解析 1 主干网络Backbone介绍 2 构建FPN特征金字塔进行加强
  • 基于Yolov5目标检测的物体分类识别及定位(一) -- 数据集原图获取与标注

    从本篇博客正式开始深度学习项目的记录 实例代码只会放通用的代码 数据集和训练数据也是不会全部放出 系列文章 基于Yolov5目标检测的物体分类识别及定位 一 数据集原图获取与标注 基于Yolov5目标检测的物体分类识别及定位 二 yolov
  • 纯代码干货-Python基于YOLOv5的车辆检测并计数

    首先 你需要安装YOLOv5 可以通过官方文档了解安装步骤和相关依赖 接着 你需要准备训练好的车辆检测模型和测试图片或视频 1 导入库 import cv2 import torch from models experimental imp
  • 如何制作和训练自己的数据集(YoloV5)

    标注方法 1 自己获取的数据集 人工进行标注 全人工 2 自己获取的数据集 首先使用训练好的网络标注一遍 然后手动进行微调 半人工 3 仿真数据集 GAN网络来生成自己的数据集 synthetic data 标注工具 1 CVAT 需要安装
  • 关于yolov5训练大量数据存在的问题记录

    相关配置环境 拉取官方最新的镜像 docker pull ultralytics yolov5 以及代码 git clone https github com ultralytics yolov5 torch 1 10 1 cu102 CU
  • yolov5量化部署(基于openvino和tensorrt)

    yolov5 openvino量化部署 首先 下载YOLOv5源码 安装YOLOv5和OpenVINO的python依赖 git clone https github com ultralytics yolov5 git pip insta
  • “分页文件太小,无法完成此操作”尝试训练 YOLOv5 对象检测模型时出错

    我有大约 50000 个图像和注释文件用于训练 YOLOv5 对象检测模型 我在另一台计算机上仅使用 CPU 训练模型没有问题 但需要太长时间 因此我需要 GPU 训练 我的问题是 当我尝试使用 GPU 进行训练时 我不断收到此错误 OSE

随机推荐