从 YOLOv1 到 YOLO-NAS 的所有 YOLO 模型:论文解析

在计算机视觉的浩瀚领域,有一支耀眼的明星,她的名字传颂着革新与突破的传奇——YOLO(You Only Look Once)。回溯时光,走进这个引人注目的名字背后,我们仿佛穿越进一幅画卷,一幅展现创新魅力与技术风华的画卷。

很久以前,CVPR 2016 是一个注定光芒万丈的时刻。在这个充满期待的舞台上,Joseph Redmon为世界呈现了一种单阶段目标检测的奇迹,她名为 YOLO。这并非仅是一个算法,更是一曲深沉的乐章,将实时性与准确性交织成和谐的旋律。

整个 YOLO 系列犹如一颗耀眼的明星,散发着创新的光芒。她不仅在计算界崭露头角,更是塑造了当今目标检测的典范。她是那位能够一眼洞悉世界的艺术家,她的每一次睁开眼睛都是一场震撼的演出。

这支明星也有着自己的旅程,从最初的 CVPR 舞台,踏上了征程。她在历经风雨后愈发璀璨,成为行业的标杆。从 CPU 到 GPU,她的光辉适应了不同的舞台;从小规模到大规模,她的力量在 ONNX、TensorRT、OpenVINO 的舞台上得以展现。

这是一支颠覆传统的队伍,她以浪漫而独特的姿态,书写着技术的诗篇。YOLO,她的历史如同一首华美的诗歌,充满了激情与革新,犹如一幅浪漫的画卷,描绘着计算机视觉的辉煌瞬间。

在这篇文章中,我们将深入研究YOLO的所有不同版本,从原始的YOLO到YOLOv8和YOLO-NAS,并试图理解它们的内部工作原理、架构、设计选择、改进和自定义训练。互联网上有限的资源涵盖了所有YOLO模型,从它们的内部工作原理到如何端到端地在所选数据上训练每个模型。

目标检测简介

目标检测是计算机视觉中一项重要任务。简而言之,目标检测定义为目标定位 + 目标分类。目标定位是使用边界框在图像中定位对象的方法,而目标分类是告诉我们该边界框中有什么的方法。

使用经典计算机视觉和深度学习进行目标检测

目标分类、定位和检测的区别

在这里插入图片描述
图1:目标分类、定位和检测之间的区别(来源)

目标检测有许多实际应用,比如在自动驾驶领域,它用于检测车辆、行人、道路分界预测、HD地图创建、交通灯和交通标志等;在监视和监测中,它用于检测闯入者、车辆牌照、口罩检测、武器检测等;在生物识别考勤系统中,在医学图像中,它用于检测某些细胞、癌症、肿瘤等等,此类应用层出不穷。

一阶段与二阶段检测器

早期的检测算法基于经典计算机视觉技术,如模板匹配、Haar级联、使用SIFT或SURF的特征检测和匹配、HOG检测器、可变形零件模型(DPM)等。然而,这些方法大多数对特定用例非常具体,缺乏泛化能力,这导致研究转向基于深度学习的方法。Overfeat论文是深度学习目标检测的先驱,它是一个单一网络模型,用于执行对象分类和定位。

Overfeat架构与AlexNet架构非常相似。它以滑动窗口的方式在不同尺度上进行图像分类,并在同一CNN层上执行边界框回归。后来,该领域出现了其他模型,如RCNN、FastRCNN、SPPNet、YOLO等。

目标检测的挑战

遮挡和小物体

小物体通常难以检测,因为模型对它们的信息较少,或者数据集可能没有很多实例。这个问题属于形状不变性问题的范畴。此外,遮挡和部分可见对象使模型难以检测小物体。

全局上下文和局部上下文

对于模型而言,全局上下文与局部上下文一样重要。全局上下文意味着对象的通常周围环境,例如交通灯通常出现在路边,或者可能有汽车或行人附近。局部上下文的意义在于对象的几何结构、纹理和颜色。例如,交通灯通常呈矩形,包含各种颜色的灯,红色、绿色或黄色。对于形状不变性属性,训练有素的模型不会将汽车尾部的红灯误认为是交通灯的红灯。然而,如果数据未经妥善策划,可能会发生这种情况。

YOLO简介

YOLO模型的年表:演进与里程碑

在2016年的CVPR上,Joseph Redmon与来自FAIR(Facebook AI Research)和Allen Institute for AI的研究人员共同发表了关于YOLO(You Only Look Once)的重要论文。当时,它是一种单阶段目标检测器的最先进技术。沿用单阶段检测的概念,人们发布了自己的模型,如SSD、RetinaNet等。

在2017年的CVPR上,Joseph Redmon和Ali Farhadi发布了YOLO模型的第二个版本,即YOLOv2,建立在YOLOv1的基础上,整合了当时的一些先进技术,使其更快、更准确。Redmon通过添加一个Neck和使用更大的主干改进了架构,并在2018年在ArXiv上发表了一篇非常随意的论文。

两年后,即2020年4月,其他作者使用YOLO的名字发布了该模型的第4版,并进行了许多重大改进。两个月后,Ultralytics开源了YOLOv5模型,但没有发表任何论文。同年,YOLOv4的作者发表了另一篇名为Scaled-YOLOv4的论文,其中包含了对YOLOv4的进一步改进。在接下来的一年,即2021年,YOLOR和YOLOX被发布。跳过第6版,在2022年,YOLOv4的作者发布了YOLOv7,当时在速度和准确性方面处于最先进水平。同年,美团视觉的研究人员发布了YOLOv6,比第7版更好。

在2023年1月,Ultralytics开源了具有语义分割能力的YOLOv8,同时具备检测能力。2023年5月,Deci AI推出了YOLO-NAS,这是一种由算法生成的架构,超越了YOLO的所有前身。

在这里插入图片描述

YOLO争议:伦理考虑与命名传奇

2020年2月,Redmon在推特上表示,由于担心他的研究涉及军事应用和隐私问题,他停止了对计算机视觉的研究。在成长过程中,他相信科学是独立于政治观点的,进行研究的行为本质上是道德和有益的,无论主题如何。他的目的是分享他对NeurIPS指南之一强调研究社会效益的看法。

在那之后,每个人都在质疑YOLO是否是一个系列的好名字。有人甚至称YOLOv4为“最后的YOLO”。

自YOLO发布最后一个模型以来已经过去了近两年。直到2020年4月,Bochkovskiy等人将他们的工作发布为YOLOV4。他还是DarkNet的维护者。根据Redmon的推文,似乎YOLOv4的作者在在使用YOLO这个名字发布他们的作品之前并未咨询Redmon或其他作者。尽管如此,Redmon理解了YOLOv4中所付出的努力,并毫不掩饰地承认了这一点。鉴于取得的令人满意的进展,计算机视觉社区也接受了该工作作为官方的YOLOV4。

2020年5月,Glenn Jocher在GitHub的Ultralytics组织下创建了一个名为YOLOV5的存储库。2020年6月,他在该存储库上提交了第一个提交,并附上“YOLOv5问世”的消息,该代码从Darknet框架移植到了Pytorch。YOLOv5包含了从YOLOV4模型中的许多改进,没有发表任何论文,这标志着YOLO模型的一个里程碑,即第一个不使用DarkNet框架进行开发的模型,并引发了关于Glenn是否有权在YOLO名称下发布模型的争论。当时,Roboflow还发表了一篇文章比较YOLOV5和YOLOV4,在HackerNews上引起轰动,助长了争论。人们开始在Reddit、Twitter甚至GitHub上讨论这个问题。2020年6月14日,在GitHub的一个问题线程中,Glenn Jocher表示他将在2020年底之前发布YOLOv5的摘要。2023年11月,他们发布了那份简短的摘要。

此后,许多人开始为他们的模型借用YOLO这个名字(在某种程度上,是对原始模型的改进)。一方面,允许研究人员使用这个名字有助于在全球范围内发展YOLO模型。然而,这也使得跟踪进展变得困难,因为人们不断改进他们的旧贡献。例如,如果阅读YOLOv5或YOLOv6,就无法理解YOLOv7,要理解这一点,需要关注作者并查看当前论文之前他们发表的内容,包括YOLOv4-Scaled、YOLO-v4和CSPNet。

YOLOv1

论文摘要

一般而言,深度学习目标检测模型分为两类:单阶段和两阶段模型。单阶段模型遵循特定的设计模式,即主干-颈部-头部。然而,在YOLOv1中,没有颈部的概念,只有主干和头部。YOLOv1的架构灵感来自GoogleNet的架构,它有24个卷积层和两个全连接层。在这24个卷积层中,前20个卷积层充当主干,而4个卷积层导致额外的两个全连接层,充当检测头。与inception模块不同,他们在主干中使用了一个1×1的卷积层和3×3的卷积层。这有助于在不减小空间维度的情况下减少通道数,使得参数数量相对较低。

在深度学习模型中,通常包含主干网络(Backbone)、颈部(Neck)和头部(Head)三个部分,它们各自承担着不同的任务和功能:

主干网络(Backbone): 主干网络是整个模型的核心部分,负责提取输入数据的特征。它通常由一系列卷积层、池化层等基本的神经网络层构成。主要目的是通过逐渐抽象的特征提取,捕捉输入数据的高级表示。在图像处理任务中,主干网络可以理解为图像中存在的边缘、纹理、形状等低级特征。

颈部(Neck): 颈部位于主干网络和头部之间,是连接两者的过渡区域。颈部的主要作用是进行特征融合或降维,将主干网络提取的底层特征与头部需要的高级语义特征相结合。颈部的设计有助于提高模型对全局信息的理解,并促使模型更好地适应不同尺度的输入数据。

头部(Head): 头部是模型的输出部分,负责生成最终的预测结果。在目标检测任务中,头部通常包括边界框坐标的回归、目标类别的分类以及其他可能的任务,如遮挡预测等。头部的设计与具体任务密切相关,不同的任务可能需要不同类型的头部结构。头部接受来自颈部的高级语义特征,并将其转化为最终的模型输出。

在这里插入图片描述
图2:YOLOv1模型架构(来源)

YOLOV4的作者在ImageNet上以224×224的分辨率预训练了YOLO的前20层,而剩下的四层在PASCAL VOC 2012上以448×448的分辨率进行微调。这增加了模型准确检测小物体的信息。他们在VOC 2007和2012的训练和验证集上对模型进行了135个epochs的训练。他们使用了批量大小为64,动量为0.9,学习率衰减为0.0005。学习率(LR)的调度是这样的,在最初的几个epochs中,LR从 1 0 − 3 10^{-3} 103上升到 1 0 − 2 10^{-2} 102。在前75个epochs中,他们以 1 0 − 2 10^{-2} 102训练模型,然后在接下来的30个epochs中使用 1 0 − 3 10^{-3} 103,最后在30个epochs中使用 1 0 − 4 10^{-4} 104

为了避免过拟合,作者使用了0.5的dropout率和大量的数据增强。使用了总数据集的随机缩放和平移的20%。他们在HSV色彩空间中将图像的曝光和饱和度随机调整了1.5倍。最终层设置为线性激活函数,其他层使用了leaky-ReLU激活。

没有锚点自由框的概念。作者将图像划分为一个SxS网格,在每个网格中,预测B个边界框坐标以及与边界框相关联的对象性得分和C个类别概率。预测被编码在 S × S × ( B × 5 + C ) S \times S \times (B \times 5+C) S×S×(B×5+C)张量中。这也意味着一个网格单元只能预测一个对象。对于边界框坐标,YOLO预测边界框的中心(x,y)以及边界框的宽度(w)和高度(h)。中心相对于网格单元,因此在0和1之间,宽度和高度相对于图像大小,也在0和1之间。对象性得分是指告诉我们边界框是否包含对象的分数,表示为 p ( \small p( p(Object ) ∗ I O U pred  truth  \small) * IOU_{\text {pred }}^{\text {truth }} )IOUpred truth ,其中 p ( O b j e c t ) \small p(Object) p(Object)是在该单元格中有对象的概率, I O U pred  truth  IOU_{\text {pred }}^{\text {truth }} IOUpred truth 是预测区域与真实区域的交并比。

在这里插入图片描述
图3:YOLO边界框自由预测(来源)

由于检测头需要预测边界框坐标、对象性得分和对象类别,因此它们的损失函数有三个部分:定位损失、置信度损失和分类损失。由于目标检测被描绘为回归问题,所有损失都是平方和误差。前两个损失属于定位损失,接下来的两个损失属于置信度损失,最后一个属于分类损失。通常存在一些不预测任何边界框的网格,这将使这些单元格的置信度得分趋近于零,压倒了包含对象的单元格。为解决这个问题,提出了两个参数 λ c o o r d = 5 \lambda_{coord} = 5 λcoord=5 λ n o o b j = 0.5 \lambda_{noobj} = 0.5 λnoobj=0.5

在这里插入图片描述

图4:YOLOv1损失函数(来源)

YOLOv2

论文摘要

YOLOv2于2017年在CVPR上发布,与YOLOv1的相同作者略微修改了YOLOv1的架构并改进了训练过程,使YOLOv2更快速、更准确。以下是增强YOLOv2的一些变化:

使用高分辨率图像:

他们在ImageNet上以448×448的分辨率对分类网络进行了10个epoch的训练。这有助于网络调整滤波器以更好地处理高分辨率图像。然后将得到的网络用于检测任务,通过这样做,他们推动了联合训练,有助于在目标检测和分类数据中同时训练对象检测器。他们的主要目标是在保持分类准确性的同时提高召回率和定位准确性。他们使用416×416而不是448×448,以使特征图的大小为奇数,对象中心应该位于一个点而不是多个位置。由于YOLO的卷积层通过因子32对图像进行下采样,因此使用416的输入图像将产生13×13的输出特征图。

锚框介绍:

通常,框的尺寸是手动挑选的,这并不总是一个好的先验。为解决这个问题,作者提出了使用数据集所有边界框的k均值聚类方法。这使他们获得了数据集中边界框的最显著尺寸。但是,在k均值中,使用欧几里得距离会对大框产生较大的错误(距离),对小框产生较小的错误(距离)。但是,由于IOU分数与框的大小无关,因此需要更改距离测量。他们提出,
在这里插入图片描述图5:YOLOv2使用的用于边界框先验的k均值聚类距离度量(来源)

方程的这一部分意味着距离与IOU成反比。从1中减去IOU实质上意味着随着IOU的增加(表示更大的重叠或相似性),距离减小,反之亦然。我们对各种k值运行k均值,并绘制与最接近质心的平均IOU,参见图6。我们选择k = 5作为模型复杂性和高召回之间的良好折衷。

在这里插入图片描述

图6:VOC和COCO上的框维度聚类(来源)

细粒度特征:

与YOLOV1一样,YOLOV2也相对于网格单元预测边界框坐标。修改后的YOLO预测一个13×13的特征图,虽然这有助于检测大对象,但具有细粒度的特征图可能有助于检测小对象。许多检测模型有不同的方法,但在YOLOv2中,作者提出了一个通过层传递特征的方法,该方法将来自较高分辨率层的特征连接到较低分辨率层。当将较高分辨率图像与较低分辨率图像连接时,它会内部重新构造较高分辨率图像,使其空间维度减少,但深度增加。这意味着,如果给定一个26x26x512的特征图,它会被调整为13x13x2048,其中通道维度2048来自于512 x 2 x 2 = 2048。

位置预测:

下面的图解释了这个方程,
在这里插入图片描述

图7:边界框(相对于网格单元)参数方程(来源)

在这里, c x c_x cx c y c_y cy是网格单元中心。 b x b_x bx b y b_y by是相对于网格单元的预测边界框中心的坐标。 b w b_w bw b h b_h bh是预测边界框的宽度和高度,它是与网格相关的先验锚框的偏移量。σ确保中心点( b x b_x bx b y b_y by)保持在网格单元内,限制其值在0到1之间。 e t w e^{t_w} etw e t h e^{t_h} eth表示预测宽度和高度偏移 t w t_w tw t h t_h th的指数变换,确保宽度和高度保持正值,尽管使用指数变换在数学上是不稳定的。

多尺度训练:

他们引入了多尺度训练,使模型更加稳健。每隔10批次,模型采用随机选择的图像尺寸并继续训练。由于他们的模型降采样因子为32,因此它们从32的倍数中提取:{320;352;…;608}。

分层分类:

在甚至进行检测训练之前,该模型首先接受了ImageNet上的分类训练。为此,他们按层次准备数据。分层分类通过利用类标签的分层结构,模型可以更好地理解不同类别之间的关系,从而提高模型的准确性。

YOLOv3

论文摘要

在YOLOv2中,模型为每个网格预测对象类别。但是,在YOLOv3中,模型为每个预测的边界框预测类别。该模型为每个网格预测3个边界框,目标性得分和类别预测。在输出端,张量的形状是 N × N × ( 3 × ( 4 + 1 + 80 ) ) \small N \times N \times (3 \times (4 + 1 + 80)) N×N×(3×(4+1+80))。该模型在3个不同的尺度上输出边界框。

YOLOv3使用多个独立的逻辑分类器,而不是为每个类别使用一个softmax层。在训练过程中,他们在一个对所有设置中使用二元交叉熵损失。

YOLOv3使用DarkNet-53作为特征提取的主干。该架构具有交替的1×1和3×3卷积层,以及受ResNet模型启发的跳跃/残差连接。他们还引入了FPN的概念,以利用所有先前的计算和网络早期的细粒度特征。尽管DarkNet53比ResNet101或ResNet-152小,但在相等或更好的性能下更快。

与YOLOv2类似,YOLOv3还使用k均值在锚点之前找到边界框。在这个模型中,他们为不同尺度使用了3个先验框,与YOLOv2不同。

YOLOv3的训练

Ultralytics有一个在PyTorch中实现的YOLOv3存储库。他们提供了一个命令行界面,可以快速训练模型。 yolov3的官方存储库在darknet框架中。 YOLOv3自定义训练是了解从头开始训练的好资源。我们还展示了在coco数据集上使用OpenCV Python和C++进行YOLOv3的训练。

YOLOv4

论文摘要

Alexey Bochkovskiy与CSPNet的作者Chien-Yao Wang和Hong-Yuan Mark Liao合作开发了YOLOv4(2019年11月)。与其前身的唯一相似之处是它使用了Darknet框架进行构建。他们尝试了许多新的想法,并随后在一篇名为"Scaled-YOLOv4"的独立论文中发表了这些想法。

在这里插入图片描述图8: 一阶段与二阶段检测器架构比较 (来源)

通常,目标检测器包括一个ImageNet预训练的主干进行特征提取和一个Head进行边界框回归和分类。但是,从YOLOv3和YOLOv4开始,作者引入了结构的另一部分,称为Neck,位于主干和Head之间。这个块的作用是从主干中收集不同阶段的特征并将它们传递给Head。在YOLOv4中,我们有CSPDarkNet53作为主干,Spatial Pyramid Pooling(SPP)和Modified PANet作为Neck,以及YOLOV3 head。在论文中,他们介绍了两个概念,即免费增值和专业增值。他们将只改变训练策略或增加训练成本而不增加推理成本的方法称为免费增值。这方面的一个常见例子是数据增强。另一方面,那些稍微增加推理成本但显着提高准确性的方法称为专业增值。属于这一类别的方法包括扩大感受野、合并特征、后处理等。SPP和PANet在YOLOv5部分中有详细讨论。

跨阶段部分网络设计用于更快的推理,同时保持原始模型的准确性。它作为一个附加组件,可以集成到现有设置中。CSPNet的背后概念是,ResNet和DensNet等架构具有许多跳跃连接。在不同层次的梯度更新过程中,大量的梯度信息被重复使用,导致不同层次反复学习复制的梯度信息。为了阻止这种重复的梯度,CSPNet将输入分为两部分,一部分通过通常的中间层,第二部分在该块之后进行连接以进行进一步的操作。

在这里插入图片描述

图9: CSPNet中不同类型的特征融合策略 (来源)

作者尝试了许多架构,如ResNet50、ResNext50、VGG16、DarkNet53等,但后来,使用带有CSPNet的DarkNet53的变体作为主干。他们发现许多研究表明,对于对象分类,CSPResNext50比CSPDarkNet53更好。但是,通过实验,他们发现CSPDarkNet53更适合对象检测任务。

他们引入了Spatial Pyramid Pooling(SPP),就像YOLOV3-SPP一样,用于多尺度特征池化。他们在特征金字塔中使用PANet,而不是YOLOV3模型的FPN。文献中提到了两种在目标检测器中使用的注意模块,即通道注意和点注意。SAM和Squeeze-and-Extraction分别是这方面的例子。由于SAM可以提高准确性并减少推理延迟,因此在YOLOv4中使用了SAM。最后,对于检测头,他们使用了像YOLOv3中一样的锚点。上述整合是专业增值的一部分,其中CSPNet削减了计算成本同时保持准确性,SPP块有助于增加感受野,而PANet有助于更好地进行特征聚合。

作为免费增值的方法,作者引入了马赛克数据增强,将4张图像合并成一张图像。通过这样做,他们增加了额外的上下文信息,并减小了批次归一化的小批量大小。除了马赛克,他们还使用了MixUp和CutMix以及其他几何增强。为了更好地进行检测,他们使用cIOU损失和跨小批量归一化,将普通的Dropout替换为DropBlock。
在这里插入图片描述

图10:YOLOv4 中使用的不同增强技术(来源)

YOLOv4的训练

我们讨论了使用YOLOv4和darknet框架进行坑洼检测的YOLOv4的自定义训练。数据集包含1265个训练图像、401个验证图像和118个验证图像。

YOLOv5

论文摘要

在这里插入图片描述

图 11: YOLOv5 模型架构(来源)

模型架构:

YOLOv5 模型分为三个部分,主干 (Backbone)、颈部 (Neck) 和头部 (Head)。每个卷积后面都跟随批量归一化 (BN) 和 SiLU 激活。以下是 YOLOv5 模型架构的概述:

  • 主干: CSP-DarkNet53
  • 颈部: SPPF 和 CSP-PANet
  • 头部: YOLOv3 头部

空间金字塔池化快速 (SPPF):

SPPF 是他们在模型中引入的改进之一。它其实就是 SPP,只是不同于将输入传递给三个不同的最大池层,而是将一个最大池块的输出馈送到后续的最大池层,这使得该过程更加快速。以下是 SPP 和 SPPF 的 Pytorch 实现:

在这里插入图片描述

图12: SPP 和 SPPF Pytorch 实现(来源)

PANet (Path Aggregation Network):

PANet 在 YOLOv4 中被使用。使用 PANet 的目的是为了创建一个丰富的多阶段特征层次结构,用于强大的目标检测。唯一的修改是 PANet 将特征图串联而不是相加,如原论文中所述。CSP-PANet 与 PANet 相同。不同之处在于,他们在 PANet 之间添加了一些 CSP 层。这个改变导致了处理速度超过两倍以上。

AutoAnchors:

YOLOv5 还引入了另一个称为 AutoAnchor 的改进。在 AutoAnchor 中,他们在训练过程中改变了锚点的形状。首先,模型使用在地面实况边界框上运行 k-means 生成的初始锚点框。后来,这些边界框使用遗传进化 (GE) 算法进行更新。GE 算法在 1,000 代中发展这些锚点,采用 CIoU 损失和最佳可能召回来进行适应性评估。

免费增值方法:

在这里插入图片描述

除了专业增值方法之外,他们还使用了一些免费增值方法和数据增强,如 Mosaic、复制-粘贴、随机仿射、MixUp、HSV 增强等。我记得 TensorFlow – Help Protect the Great Barrier Reef Kaggle 竞赛中,人们突然开始在高分辨率图像上训练 YOLOv5,这导致了更高的 Leader Board 分数。然而,后来经过测试,使用 1536 像素的更大输入尺寸和测试时增强 (TTA),YOLOv5 可以达到 55.8% 的 AP。

YOLOv5 训练

YOLOv5 是最有效的 YOLO 版本之一,了解如何在自定义数据集上进行训练是很重要的。这里我们展示了如何在 OpenImage 数据集上训练 YOLOv5。由于 Glenn Jocher 将模型从 darknet 框架移植到 Pytorch,训练变得更加容易。YOLOv5 – 自定义目标检测训练 将帮助你深入了解自定义训练。由于模型大多数情况下会部署在边缘设备上,因此了解如何使用 OpenCV 在 Python 和 C++ 中运行 YOLOv5 是很重要的。作为一个新的功能,Ultralytics 启用了使用 YOLOv5 仓库进行训练实例分割模型的功能。查看: YOLOv5 实例分割,以深入了解。

YOLO-R

论文摘要

YOLOv4 于 2020 年 4 月发布,之后一些研究人员开始使用 YOLO 这个名字并发布他们的模型。2020 年 11 月,YOLOv4 的同一作者们发布了他们之前工作的延续,即 Scaled-YOLOv4。在 2021 年中,YOLOv4 团队的一些作者发布了 YOLO-R。通过这篇论文,作者们开始探索多任务学习的方向。

作者们发现为特定任务提取的特征不够通用,无法应用于其他任务。这意味着不能直接将检测模型的特征用于分割模型。为解决这个问题,一切都归结为产生一个通用的表示。而这就是多任务学习(MTL)的用武之地。在 MTL 中,模型被训练以同时执行多个不同的任务,而不是训练特定于任务的模型。通过并行训练模型执行多个任务,可以提高模型的泛化能力。这是因为模型利用了跨任务的共性和差异。MTL 还有助于减少模型参数的数量,从而减少 FLOPs 和减小模型的延迟。

YOLOR 的概念与通常的 MTL 模型不同,通常在 MTL 模型中,你会看到共享的表示组件和任务特定的组件,而 YOLOR 的概念来自隐式知识和显式知识。知识分为两种类型:显式知识和隐式知识。人类通过视觉、听觉、触觉等学习,这是一种显式知识,而他们还通过过去的经验学习,这被归类为隐式知识。隐式知识是指在潜意识状态下学到的知识。

在神经网络中,会有一个用于学习显式知识的网络,还会有另一个与显式模型一起联合训练的模型,用于学习隐式知识。在这个流程图中,作者呈现了相同的概念,
在这里插入图片描述

图13: YOLOR 工作流程图 (来源)

对于显式知识网络,作者使用了带有轻微修改的 YOLOv4-Scaled,添加了一个 ReOrg 层,后跟两个卷积层。在隐式网络中,他们使用了一个卷积层,带有两个可学习的先验,用于核空间对齐和预测细化。他们包括目标检测、多标签图像分类和特征嵌入以进行多任务学习。

要进一步了解 YOLO-R,全面的论文评论是一个非常好的资源,深入探讨了显式和隐式知识,人类如何理解和学习,如何建模隐式知识,如何将其与显式知识结合以提高模型能力等等。

YOLOX

论文摘要

在2021年7月,中国的旷视科技发布了YOLOX。这个模型是CVPR 2021 WAD研讨会上Streaming Perception Challenge的第一名。YOLOX与YOLOR同时发布。当YOLOR的作者试图探索多任务学习时,YOLOX的作者专注于将最新的进展整合到YOLO模型中。在YOLOX之前的所有YOLO模型都使用Anchor boxes。但是,在那个时期,大多数最先进的模型使用Anchor-free检测器。因此,作者将这种方法与先进的标签分配策略simOTA、解耦头(Decoupled Head)和强增强(Strong Augmentations)一起纳入了他们的模型。

YOLOX模型采用了YOLOv3的DarkNet53作为骨干网络,空间金字塔池(Spatial Pyramid Pooling,SPP)作为颈部(Neck),以及自定义的解耦头。YOLOX模型是从头开始训练的,作者排除了ImageNet预训练,因为使用强增强时这已经不再有用。那时,YOLOv3仍然是最好的检测器之一,因为受限于计算资源,许多行业都会转向它。另一方面,YOLOv5在优化时考虑了基于Anchor的方法。尽管YOLO检测器的骨干和颈部随着时间的推移而改进,但头部部分保持不变,解耦头还解决了分类和回归任务之间的长期冲突。这有助于更快地收敛。

YOLOX模型的解耦头从一个1×1卷积层开始,然后再次是两个3×3卷积层和一个1×1卷积层(对于每个分支)。他们有一个很好的训练方案,使用SGD进行300个epoch的训练,余弦学习率调度器,多尺度训练,EMA权重更新,分类分支使用BCE loss,回归分支使用IoU loss。

作者使用了大量的增强来提高模型性能,他们在增强流水线中明确加入了著名的Mosaic和MixUp。他们发现,对于大型模型,强增强是有用的。在进行了MixUp和Copypaster的消除之后,他们在流水线中使用了带有尺度抖动的MixUp。

受到端到端(无NMS)检测器的启发,作者添加了两个额外的卷积层,一对一标签分配和停止梯度。不幸的是,这稍微降低了性能和推理速度,所以他们放弃了它。

训练YOLO-X

YOLOX是一个精心设计的专门用于目标检测的模型。我们展示了在Drone Detection数据集上使用官方YOLOX存储库进行训练的YOLOX定制训练,该数据集包含4014个标记图像。我们在不同的配置下训练了模型,并分享了结果。

YOLOv7

论文摘要

YOLOv7是Scaled-YOLOv4之后的继续。YOLOv4和YOLOv7由同一作者发布。YOLOv7模型引入了一些新颖的修改,如E-ELAN、模型缩放、计划的重新参数化卷积、辅助粗略和引导丢失的惩罚。

Extended-ELAN(E-ELAN):

E-ELAN是扩展的高效层聚合网络,是ELAN的一种变体。ELAN受VoVNet和CSPNet的启发。我们已经了解了CSPNet,而VoVNet只是由级联的OSA模块组成的目标检测网络。OSA代表One-shot Aggregation。它比DenseNet中的Denses Block更高效,并且非常优化用于GPU计算。下面的图像清楚地说明了OSA的概念,

在这里插入图片描述

图 14: E-ELAN Aggregation Methods(来源)

它与DensesNet非常相似,但我们在这里的几个卷积块后进行了特征的级联。

复合模型缩放:

作者使用模型缩放来调整模型参数,以生成不同规模的模型。不同规模意味着模型参数的变化。它有助于满足不同推理速度的需求。在EfficientDet中,缩放是通过宽度、深度和分辨率来完成的,而Scaled-YOLOv4在阶段(特征金字塔数量)中缩放模型。在这个模型中,他们使用了NAS(Network Architecture Search),这是一种常用的模型缩放方法,作者还展示了通过复合模型缩放方法可以进一步改进这种方法。

模型重新参数化:

模型重新参数化意味着对模型权重进行平均。有两种进行模型平均的方法,

  1. 对在不同数据折叠上训练的同一模型的权重进行平均。
  2. 对不同时期的模型权重进行平均。

这是一种非常流行的集成技术。PyTorch有一个名为SWA(Stochastic Weight Averaging)的相同实现。

粗略用于辅助和细化用于引导丢失:

正如您所看到的,模型架构具有多个头来预测相同的内容。负责最终输出的头部是引导头,而其他头则协助模型训练。通过助手损失(assistant loss)的帮助,更新辅助头的权重。

要深入了解YOLOv7论文及其推理结果,请考虑探索YOLOv7 Paper Explanation。这个资源提供了对这个主题的详细分析和见解。

训练YOLOv7

我们展示了在坑洼数据集上进行的YOLOv7微调,使用官方YOLOv7存储库。进行了固定分辨率训练以及多分辨率训练,同时进行了对模型推理的全面研究。我们还对YOLOv7和mediapipe人体姿势估计进行了全面研究,比较了GPU和CPU推理性能。

YOLOv6

论文摘要

在YOLOv7发布的两个月后,中国美团点评的研究人员发布了YOLOv6。是的,你没听错,YOLOv7是在YOLOv6之前发布的。显然,作者得到了原始YOLO作者的许可。在发表YOLOv6时,它是最先进的模型。

在这篇论文中,作者尝试了许多技术,而成功的方法被整合到模型中,并作为YOLOv6发布。YOLOv6是一种无Anchor、解耦头架构,具有名为EfficientRep的独特骨干。

在这里插入图片描述

图 15: YOLOv6模型架构(来源)

EfficientRep由RepVGGBlock stem组成,后跟4个ERBlock。ERBlock由RepVGGBlock和RepBlock组成。ERBlock的最后一层具有RepVGGBlock和RepBlock,除了SimSPPF之外,它仅是带有ReLU激活的SPPF层。对于颈部,他们使用Rep-PAN,这只是YOLOv4和YOLOv5中的PANet,只是我们将CSPBlock替换为RepBlock(对于小模型)或CSPStackRep Block(对于大模型)。对于头部,他们使用了YOLOX的定制版本的解耦头,称为混合通道策略。在这种方法中,他们减少了一个3×3卷积层,并同时按照骨干和颈部的宽度乘数缩放头的宽度。

在这里插入图片描述

图16: RepBlock and RepVGG 模型架构(来源)

除了这些结构上的变化,他们使用了先进的标签分配技术,如simOTA和TAL(Task alignment learning),引入了许多新的损失函数,并使用了许多后训练量化方法,如自我蒸馏、重参数化优化器等,以使模型更快速、更准确。

YOLOv6是YOLO系列模型的一个非常重要的补充,了解是如何改进模型以使其更加高效的是非常重要的。YOLOv6 - Paper Explanation是一个了解YOLOv6的好资源;它仔细地澄清了RepConv、RepVGGBlock、CSPStackRep、VFL、DFL和Self-Distillation等复杂概念。

训练YOLOv6

尽管它被命名为YOLOv6,但在发布时它是性能最佳的模型。了解如何在自定义数据集上训练YOLOv6非常关键,对此,YOLOv6 custom dataset training for Underwater Trash Detection为这类自定义训练应用提供了一个很好的指南。

YOLOv8

论文摘要

在2023年1月,Ultralytics推出了YOLOv8,这在当时是最先进的技术。该模型是开源的,但维护者并没有发表任何论文。从YOLOv8模型的架构来看,先前的模型似乎过于工程化。

在这里插入图片描述

图17: YOLOv8 架构(来源)

YOLOv8架构遵循与YOLOv5相同的架构,有一些轻微的调整,比如,他们使用c2f模块而不是CSPNet模块,这只是CSPNet的变体(CSPNet后跟两个卷积网络)。他们使用了YOLOv5作为基础模型,设计了YOLOv8 Anchor-free,而YOLOX的作者尝试过,但最终选择使用YOLOv3,因为他们发现YOLOv5对基于Anchor的训练进行了过度优化。他们还引入了解耦头(Decoupled heads)以独立处理目标性、分类和边界框预测任务。他们在最后一层使用Sigmoid层进行目标性分数预测,而使用Softmax进行分类。

YOLOv8使用CIoU和DFL损失函数进行边界框损失,并使用二元交叉熵进行分类损失。这些损失改善了目标检测性能,特别是在处理较小的对象时。他们还通过对原始模型进行最小更改引入了YOLOv8-Seg模型,用于通过语义分割。

由于YOLOv8没有附带论文,因此通过查看代码或GitHub讨论来理解模型的工作方式变得非常困难。YOLOv8: Comprehensive Guide是了解YOLOV8的最佳起点之一。

训练YOLOv8

我们展示了使用Ultralytics存储库进行YOLOv8模型的定制训练,我们使用了从Roboflow、Research-Gate、手动注释的YouTube视频和RDD2022数据集中收集的坑洼数据集。还有一份使用 KerasCV 训练 YOLOv8 的指南。总共有6962张图像用于训练,271张图像用于验证。文章还包括对YOLOv8不同变体和推理结果进行比较。我们还有一篇深入的文章,比较了全球小麦数据2020数据集上不同尺度的YOLOv8模型。YOLOv8具有在最小更改原始YOLOv8检测架构的情况下训练语义分割模型的能力,这在这里进行了讨论:YOLOv8 Instance Segmentation Training on Custom Data。姿势估计是计算机视觉中一个非常关键的问题陈述;您可以通过YOLOv8 Animal Pose Estimation来了解如何为姿势估计微调YOLOv8。

YOLO-NAS

论文摘要

在2023年5月,以色列公司Deci发布了他们的最新YOLO变体,名为YOLO-NAS,是当前最先进的目标检测模型。YOLO-NAS专为高效检测小物体而设计,具有增强的定位精度。它还改善了性能与计算比的关系,使其成为实时边缘设备应用的理想选择。

他们引入了一些量化感知模块,如QSP和QCI。架构是通过AutoNAC生成的,这是Deci专有的NAS技术。NAS代表神经架构搜索。YOLO-NAS模型在推断期间通过引入注意机制和重新参数化来增强其检测对象的能力。

  • YOLO-NAS模型最初在Object365基准数据集上进行了预训练,该数据集包含365个类别的200万张图像。
  • 他们还使用一种名为伪标签的方法,在COCO数据集的123,000张未标记图像上进行了进一步的预训练。
  • 此外,他们采用了知识蒸馏(KD)和分布焦点损失(DFL)等技术来完善和增强YOLO-NAS模型的训练过程。
  • 他们通过改变QSP和QCI块的深度和位置生成了YOLO-NAS的不同变体。
  • YOLO-NAS和AutoNAC是非常高度复杂的算法,YOLO-NAS目标检测模型是一个全面了解该模型复杂性的信息资源。

训练YOLO-NAS

YOLO-NAS目前是YOLO系列模型的最新成员,人们应该知道如何在自定义数据集上训练它。在这里,我们展示了如何在Thermal Dataset上训练YOLO-NAS。YOLO-NAS Pose也是一个在姿势估计方面表现非常出色的模型,YOLO-NAS Pose简介是了解模型工作原理的好资源。

总结和结论

整个YOLO系列充满了工程创新和突破。它提供了许多应用于特定场景的应用机器学习想法。由于卷积块是整个YOLO系列模型的基础,而且YOLO主要设计用于边缘设备,通过阅读所有YOLO模型,您可以学到不同的CNN优化技术。

  • 当首次引入YOLOv1时,它是革命性的,因为它开创了单阶段检测模型的概念。它突出的地方在于没有整合任何区域建议机制,使其能够一次性分析整个图像,有效捕获全局和局部上下文。
  • 随后,YOLOv2和YOLOv3模型集成了当时出现的先进技术,如特征金字塔网络(FPN)的概念、多尺度训练和Anchor boxes。
  • 但是,YOLOv4不同,作者们超越了常规,为YOLO带来了一些突破性的变化。他们在架构、Darknet53、技术(如特征集和免费赠品)、遗传演化算法、注意模块等方面进行了改进。
  • YOLOv5带来的变化非常微小,包括了YOLOv4的大部分技术,使YOLOv5之所以成为YOLOv5,是因为它采用了Pytorch实现,以及使用Ultralytics轻松训练模型的便利性。
  • 在YOLO-R中,作者尝试了一种新颖的方法,并致力于使模型支持多任务学习。
  • 但是在YOLO-X中,再次回到了将新技术整合到旧的YOLOv3模型中,比如无Anchor、解耦头、标签分配和强大的数据增强等。
  • 在YOLOv7和YOLOv6中,作者们尝试了模型架构,YOLOv7首次引入了在YOLO中的重新参数化和模型缩放的概念,而YOLOv6通过添加蒸馏和量化技术做出了贡献。
  • 看看YOLOv8及其性能,先前的模型可能会显得过于工程化,因为它是在YOLOv5的基础上进行了最小更改,比如用C2f模块替换了CSPLayer,并添加了更好的损失函数,帮助模型处理小对象。
  • YOLO-NAS是通过引入量化块使模型更快、更准确的算法生成的模型。

参考文献

[1] You Only Look Once: Unified, Real-Time Object Detection

[2] YOLO9000: Better, Faster, Stronger

[3] YOLOv3: An Incremental Improvement

[4] YOLOv4: Optimal Speed and Accuracy of Object Detection

[5] YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications

[6] YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors

[7] YOLO-NAS by Deci Achieves SOTA Performance on Object Detection Using Neural Architecture Search

[8] A Comprehensive Review of YOLO: From YOLOv1 and Beyond

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/233540.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计-----ssm+mysql实现的JavaWeb酒店管理系统

项目介绍 本项目为基于ssmmysql实现的JavaWeb酒店管理系统; 主要功能包括: 管理员登录,收入统计,客房管理,商品管理,客房预订,住宿登记,财务统计,旅客管理,接待对象管理等功能。 环境需要 1.运行环境:最好是java jdk 1.8,我们在这个平台上…

【工具】推荐一个好用的代码画图工具

PlantUML 官网地址:https://plantuml.com/zh/ 跳转 支持各种结构化数据画图支持代码调用jar包生成图片 提供在线画图能力 https://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 有兴趣可以尝试下 over~~

Unity之摄像机

一、摄像机类型 1.1 透视摄像机 透视摄像机有近大远小的效果,与我们在现实中看到的效果相同。所以当两个同样大小的物体到摄像机的距离不同时我们看到的大小也会不同。Unity的3D项目中默认使用的就是透视摄像机。 1.2 正交摄像机 正交摄像机没有近大远小的效果&am…

百度自由DIY小程序源码:PHP+MySQL组合开发 带完整的搭建教程

随着移动互联网的快速发展,小程序已成为企业与用户互动的重要平台。然而,对于许多中小企业和开发者来说,从零开始开发一款小程序需要投入大量的时间和资源。 以下是部分代码示例: 系统特色功能一览: 1.高度自定义&…

Android 串口协议

前言 本协议是 Android 应用端与主控板之间的通信协议,是串行通信协议。 协议要求同一时间只能有两个通讯端点在相互通讯,采用小端传输数据。 硬件层基于RS485协议,采取半双工,一主多从的通讯模式。Android定义为主机&#xff0c…

【认知计算】《智能追踪》

故事背景科技相关: 认知计算 意在使计算机系统能够像人的大脑一样学习、思考,并做出正确的决策。 模仿大脑从经验中学习,发现不同事物之间的联系,进而实现逻辑推理和记忆等功能。 认知计算是一种类脑计算模式,源自模…

可狱可囚的爬虫系列课程 10:在网站中寻找 API 接口

上一篇文章我们讲述了爬虫中一个比较重要的知识点,如何从 API 接口中获取数据,本篇文章我们继续讲述,如何在网站中寻找 API 接口,我们以“今日头条”网站 https://www.toutiao.com/ 为例。 如上图所示,如果要获取页面…

论文阅读记录SuMa SuMa++

首先是关于SuMa的阅读,SuMa是一个完整的激光SLAM框架,核心在于“基于面元(surfel)”的过程,利用3d点云转换出来的深度图和法向量图来作为输入进行SLAM的过程,此外还改进了后端回环检测的过程,利用提出的面元的概念和使…

python股票分析挖掘预测技术指标知识之蜡烛图指标(6)

本人股市多年的老韭菜,各种股票分析书籍,技术指标书籍阅历无数,萌发想法,何不自己开发个股票预测分析软件,选择python因为够强大,它提供了很多高效便捷的数据分析工具包。 我们已经初步的接触与学习其中数…

【MySQL】字符集与排序规则

在MySQL数据库中,字符集(Character Set)和排序规则(Collation,也称字符集校验规则)是重要的概念,它们对于正确存储和比较数据至关重要。 字符集与排序规则 字符集是一组字符的集合,与数字编码…

【数据库】视图索引执行计划多表查询面试题

文章目录 一、视图1.1 概念1.2 视图与数据表的区别1.3 优点1.4 语法1.5 实例 二、索引2.1 什么是索引2.2.为什么要使用索引2.3 优缺点2.4 何时不使用索引2.5 索引何时失效2.6 索引分类2.6.1.普通索引2.6.2.唯一索引2.6.3.主键索引2.6.4.组合索引2.6.5.全文索引 三、执行计划3.1…

详解Keras3.0 Callbacks API : TensorBoard(可视化工具)

TensorBoard TensorBoard是TensorFlow提供的可视化工具。需要安装TensorFlow才能使用此回调。此回调记录TensorBoard的事件,包括:度量汇总图、训练图可视化、重量直方图、采样剖面。 keras.callbacks.TensorBoard(log_dir"logs",histogram_…

C++完成Query执行sql语句的接口封装和测试

1、在LXMysql.h 创建Query执行函数 //封装 执行sql语句 if sqllen 0 strlen获取字符长度bool Query(const char*sql,unsigned long sqllen0); 2、在LXMysql.cpp编写函数 bool LXMysql::Query(const char* sql, unsigned long sqllen){if (!mysql)//如果mysql没有初始化好{c…

计算机毕业设计----SSM场地预订管理系统

项目介绍 本项目分为前后台,前台为普通用户登录,后台为管理员登录; 用户角色包含以下功能: 按分类查看场地,用户登录,查看网站公告,按分类查看器材,查看商品详情,加入购物车,提交订单,查看订单,修改个人信息等功能。 管理员角…

【计算机网络】网络层

文章目录 网络层提供的服务虚电路数据报服务虚电路与数据报服务比较 虚拟互连网络IP地址IP层次结构IP地址分类特殊地址子网掩码 子网划分变长子网划分超网合并网络规律 IP地址与MAC地址ARP协议ARP欺骗的应用 数据包数据包首部 路由ICMP协议RIP动态路由协议OSPF协议BGP协议 VPNN…

Dockerfile基本结构及编写详解

文章目录 1 Dockerfile1.1 Dockerfile的基本结构1.2 Dockerfile文件说明1.3 Dockerfile常见命令1.4 build命令1.5 部署微服务1.6 docker-compose部署 1 Dockerfile ​ Dockerfile其实就是我们用来构建Docker镜像的源码,当然这不是所谓的编程源码,而是一…

Linux下QT生成的(.o)、(.a)、(.so)、(.so.1)、(.so.1.0)、(.so.1.0.0)之间的区别

记录一下遇到的问题:Linux系统下Qt编译第三方动态库会生成多个.so文件,不了解的小伙伴可能很疑惑: (1)Linux 下 QT 生成的(.o)、(.a)和(.so)三个文…

图像分割-Grabcut法

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 本文的C#版本请访问:图像分割-Grabcut法(C#)-CSDN博客 GrabCut是一种基于图像分割的技术,它可以用于将图像…

客服系统接入FastGPT

接入FastGPT 点击【应用】【外部使用】【API访问】【新建】新建一个KEY,同时也可以看到我们的API根地址 这个根地址和Key可以填入任何支持OpenAI接口的应用里,这个接口是兼容OpenAI格式。 在客服系统【知识库AI配置】里填上接口地址和接口密钥。这样我…

MATLAB指令

01--根据数学公式进行绘制 1.绘制连续函数 ①一元函数 t0:0.1:10; y3*t2; plot(t,y) ②一元二次函数 t0:0.1:10; yt.*t; plot(t,y) 注意此处应为点乘 ③一元3次 t0:0.1:10; yt.*t.*t; plot(t,y) ④y1/t t0:0.1:10; y1./t; plot(t,y) ⑤yexp(t) t0:0.1:10; yexp(2*t); p…