从YOLOv1到YOLOv8的YOLO系列最新综述【2023年4月】

作者:Juan R. Terven 、Diana M. Cordova-Esparaza

摘要:YOLO已经成为机器人无人驾驶汽车视频监控应用的核心实时物体检测系统。我们对YOLO的演变进行了全面的分析,研究了从最初的YOLO到YOLOv8每次迭代的创新和贡献。我们首先描述了标准指标和后处理;然后,我们讨论了每个模型的网络结构和训练技巧的主要变化。最后,我们总结了YOLO发展的基本经验,并提供了对其未来的看法,强调了提高实时物体检测系统的潜在研究方向。

1. 简介

实时物体检测已经成为众多应用中的一个重要组成部分,横跨自主车辆、机器人、视频监控和增强现实等各个领域。在各种物体检测算法中,YOLO(You Only Look Once)框架因其在速度和准确性方面的显著平衡而脱颖而出,能够快速、可靠地识别图像中的物体。自成立以来,YOLO系列已经经历了多次迭代,每次都是在以前的版本基础上解决局限性并提高性能(见图1)。本文旨在全面回顾YOLO框架的发展,从最初的YOLOv1到最新的YOLOv8,阐释每个版本的关键创新、差异和改进。

本文首先探讨了原始YOLO模型的基本概念和架构,这为YOLO系列的后续进展奠定了基础。随后,我们深入探讨了从YOLOv2到YOLOv8每个版本中引入的改进和提高。这些改进包括各个方面,如网络设计、损失函数的修改、锚框的调整和输入分辨率的扩展。通过研究这些发展,对YOLO框架的演变及其对物体检测的影响有一个整体的理解。

除了讨论每个YOLO版本的具体进展外,本文还强调了在整个框架的发展过程中出现的速度和准确性之间的权衡问题。这强调了在选择最合适的YOLO模型时,考虑具体应用的背景和要求的重要性。最后,我们设想了YOLO框架的未来方向,触及了进一步研究和发展的潜在途径,这将塑造实时物体检测系统的持续进展。

2. YOLO在不同领域的应用

YOLO的实时物体检测能力在自主车辆系统中是非常宝贵的,能够快速识别和跟踪各种物体,如车辆、行人[1, 2]、自行车和其他障碍物[3, 4, 5, 6]。这些能力已被应用于许多领域,包括用于监控的视频序列中的动作识别[7][8]、体育分析[9]和人机交互[10]。

YOLO模型已被用于农业,以检测和分类作物[11, 12]、害虫和疾病[13],协助精准农业技术和自动化耕作过程。它们还被用于生物识别、安全和面部识别系统中的面部检测任务[14, 15]。

在医学领域,YOLO已被用于癌症检测[16, 17]、皮肤分割[18]和药片识别[19],从而提高诊断的准确性和更有效的治疗过程。在遥感领域,它已被用于卫星和航空图像中的物体检测和分类,有助于土地利用绘图、城市规划和环境监测[20, 21, 22, 23]。

安防系统已经将YOLO模型整合到视频资料的实时监控和分析中,允许快速检测可疑活动[24]、社会距离和脸部面具检测[25]。这些模型还被应用于表面检测,以检测缺陷和异常,加强制造和生产过程的质量控制[26, 27, 28]。

在交通应用中,YOLO模型已被用于车牌检测[29]和交通标志识别[30]等任务,促进了智能交通系统和交通管理解决方案的发展。它们已被用于野生动物检测和监测,以识别濒危物种,用于生物多样性保护和生态系统管理[31]。最后,YOLO已被广泛用于机器人应用[32, 33]和无人机的物体检测[34, 35]。

3. 物体检测指标和非极大值抑制NMS

平均精度(AP),传统上称为平均精度(mAP),是评价物体检测模型性能的常用指标。它测量所有类别的平均精度,提供一个单一的数值来比较不同的模型。COCO数据集没有对AP和AP进行区分。在本文的其余部分,我们将把这个指标称为AP。

在YOLOv1和YOLOv2中,用于训练和基准测试的数据集是PASCAL VOC 2007和VOC 2012[36]。然而,从YOLOv3开始,使用的数据集是微软COCO(Common Objects in Context)[37]。对于这些数据集,AP的计算方法是不同的。以下各节将讨论AP背后的原理,并解释它是如何计算的。

3.1 AP

AP指标是基于精度-召回指标,处理多个对象类别,并使用Intersection over Union(IoU)定义一个积极的预测。

Precision和Recall:精确率衡量的是模型正面预测的准确性,而召回率衡量的是模型正确识别的实际正面案例的比例。精确率和召回率之间通常有一个权衡;例如,增加检测到的对象的数量(更高的召回率)会导致更多的假阳性(更低的精确率)。为了考虑到这种权衡,AP指标包含了精度-召回曲线,该曲线将精度与不同置信度阈值的召回率作了对比。这个指标通过考虑精度-召回曲线下的面积,对精度和召回进行了平衡的评估。

处理多个物体类别:物体检测模型必须识别和定位图像中的多个物体类别。AP指标通过单独计算每个类别的平均精度(AP),然后取所有类别中这些AP的平均值来解决这个问题(这就是为什么它也被称为平均平均精度)。这种方法确保了对每个类别的模型性能进行单独评估,从而对模型的整体性能提供了更全面的评估。

IoU:物体检测的目的是通过预测边界框来准确定位图像中的物体。AP指标包含了 "联合体上的交集"(IoU)措施,以评估预测的边界盒的质量。IoU是预测界线盒和地面真实界线盒的交集面积与联合面积之比(见图2)。它衡量的是地面实况和预测边界盒之间的重叠程度。COCO基准考虑了多个IoU阈值,以评估模型在不同定位精度水平上的表现。

3.2 计算AP

在VOC和COCO数据集中,AP的计算方法是不同的。在这一节中,我们将描述它是如何在每个数据集上计算的。

VOC数据集

这个数据集包括20个物体类别。为了计算VOC中的AP,我们遵循以下步骤:

  1. 对于每个类别,通过改变模型预测的置信度阈值,计算出精确-召回曲线
  2. 使用精度-召回曲线的内插11点抽样,计算每个类别的平均精度(AP)
  3. 通过取所有20个类别中的AP的平均值来计算最终的平均精度(AP)

COCO数据集

这个数据集包括80个对象类别,并使用更复杂的方法来计算AP。它没有使用11点插值,而是使用101点插值,也就是说,它计算了从0到1的101个召回阈值的精度,增量为0.01。另外,AP是通过对多个IoU值进行平均而不是只对一个IoU值进行平均得到的,除了一个常见的AP指标,即AP50    ,它是单个IoU阈值为0.5的AP。COCO中计算AP的步骤如下:

  1. 对于每个类别,通过改变模型预测的置信度阈值,计算出精确-召回曲线
  2. 使用101-recall阈值计算每个类别的平均精度(AP)
  3. 在不同的交叉联合(IoU)阈值下计算AP,通常从0.5到0.95,步长为0.05。更高的IoU阈值需要更准确的预测才能被认为是真阳性
  4. 对于每个IoU阈值,取所有80个类别的AP的平均值
  5. 最后,通过平均每个IoU阈值计算的AP值来计算总体AP

AP计算的差异使得我们很难直接比较两个数据集的物体检测模型的性能。目前的标准使用COCO AP,因为它对一个模型在不同的IoU阈值下的表现有更精细的评估。

3.3 非极大值抑制 (NMS)

非极大值抑制(NMS)是物体检测算法中使用的一种后处理技术,用于减少重叠边界盒的数量,提高整体检测质量。物体检测算法通常会在同一物体周围产生多个具有不同置信度分数的边界框。NMS过滤掉多余的和不相关的边界盒,只保留最准确的边界盒。算法1描述了该程序。图3显示了一个包含多个重叠边界框的物体检测模型的典型输出和NMS之后的输出。

4. YOLO: You Only Look Once

Joseph Redmon等人的YOLO发表在CVPR 2016[38]。它首次提出了一种实时的端到端物体检测方法。YOLO这个名字代表了 "你只看一次",指的是它是与之前的方法相比,YOLO只需通过一次网络就能完成检测任务,而之前的方法要么使用滑动窗口,要么使用分类器,每个图像需要运行数百次或数千次,更先进的方法则将任务分为两步,第一步检测有物体或候选框的可能区域,第二步对候选框进行分类。另外,YOLO使用了一个更直接的输出,只基于回归来预测检测输出,而Fast R-CNN[39]则使用了两个单独的输出,一个是概率的分类,一个是方框坐标的回归。

4.1 YOLOv1如何工作?

YOLOv1通过同时检测所有的边界框,统一了物体检测步骤。为了实现这一目标,YOLO将输入图像划每个边界框的预测由五个值组成:Pc、bx、by、bh、bw ,其中Pc是bounding box的置信度分数,反映了模型对bbox包含物体的置信度以及bbox的精确程度。bxby坐标是方框相对于网格单元的中心,bhbw是方框相对于整个图像的高度和宽度。YOLO的输出是一个S×S×(B×5+C)的张量,可以选择用非最大抑制(NMS) 来去除重复的检测结果。

在最初的YOLO论文中,作者使用了PASCAL  VOC数据集[36],该数据集包含20个(C  = 20);一个7×7(= 7)网格最多预测两个类(B = 2),输出7×7×30预测结果。

 YOLOv1在PASCAL VOC2007数据集上取得了63.4的平均精度(AP)。

4.2 YOLOv1网络架构

YOLOv1架构包括24个卷积层,然后是两个全连接层,用于预测bbox坐标和概率。除了最后一个层使用线性激活函数外,所有层都使用了漏整流线性单元激活[40]。受GoogLeNet[41]和Network in Network[42] 的启发,YOLO使用1×1卷积层来减少特征图的数量并保持相对较低的参数数量。作为激活层,表1描述了YOLOv1的架构。作者还介绍了一个更轻的模型,称为快速YOLO,由九个卷积层组成。

4.3 YOLOv1训练

作者使用ImageNet数据集[43]在224x224的分辨率下对YOLO的前20层进行了预训练。然后,他们用随机初始化的权重增加了最后四层,并在448x448的分辨率下用PASCAL VOC 2007和VOC 2012数据集[36]对模型进行了微调,以增加细节,实现更准确的物体检测。对于增强,作者使用了最多为输入图像大小20%的随机缩放和平移,以及HSV色彩空间中上端系数为1.5的随机曝光和饱和度。

YOLOv1使用了一个由多个和平方误差组成的损失函数,如图5所示。在该损失函数中、 λcoord = 5是一个比例因子,赋予边界框预测更多的重要性,而λnoobj = 0.5是一个比例因子,降低不包含物体的框的重要性。λnoobj = 0.5是一个比例因子,它降低了不包含物体的bbox的重要性。

4.4 YOLOv1优缺点

YOLO的简单结构,加上其新颖的全图像单次回归,使其比现有的物体检测器快得多,允许实时性能。然而,虽然YOLO的表现比任何物体检测器都快,但与最先进的方法如快速R-CNN[39]相比,定位误差更大。造成这种限制的主要原因有三个:

  1. 它在网格单元中最多只能检测到两个相同类别的物体,限制了它预测附近物体的能力
  2. 它在预测训练数据中未见的长宽比物体时很吃力
  3. 由于下采样层,它只能从粗略的物体特征中学习

5. YOLOv2:更好、更快、更强

YOLOv2由Joseph Redmon和Ali Farhadi发表在CVPR 2017[44]。它包括了对原始YOLO的一些改进,使其更好,保持相同的速度,也更强大,能够检测9000个类别!这些改进有以下几点:

  1. 在所有卷积层上的批量归一化改善了收敛性,并作为一个正则器来减少过拟合;
  2. 高分辨率分类器,和YOLOv1一样,他们在ImageNet 以224x224的分辨率对模型进行了预训练。然而,这一次,他们在分辨率为448 x 448的ImageNet上对模型进行了10次微调,提高了网络在高分辨率输入下的性能;
  3. 完全卷积。他们去掉了密集层,采用了全卷积架构;
  4. 使用Anchor来预测边界盒。他们使用一组先验框Anchor,这些Anchor具有预定义的形状,用于匹配物体的原型形状,如图6所示。每个网格单元都定义了多个Anchor,系统预测每个Anchor的坐标和类别。网络输出的大小与每个网格单元的Anchor数量成正比;
  5. 维度聚类。挑选好的Anchor有助于网络学习预测更准确的边界盒。作者对训练中的边界盒进行了k-means聚类,以找到好的先验。他们选择了五个Anchor,在召回率和模型复杂性之间进行了良好的权衡;
  6. 直接预测位置。与其他预测偏移量的方法不同[45],YOLOv2遵循同样的理念,预测了相对于网格单元的位置坐标。网络为每个单元预测了五个bounding box,每个bounding box有五个值tx , ty , tw , th , to ,其中to 相当于YOLOv1的Pc,最终得到的bounding box坐标如图7所示;
  7. 细粒度的特征。与YOLOv1相比,YOLOv2去掉了一个池化层,对于416×416的输入图像,得到13×13的特征图,结构细节见图表2;
  8. 多尺度训练。由于YOLOv2不使用全连接层,输入可以是不同的尺寸。为了使YOLOv2对不同的输入尺寸具有鲁棒性,作者随机训练模型,每十批改变输入尺寸(从320 × 320到608 × 608)。

通过所有这些改进,YOLOv2在PASCAL VOC2007数据集上取得了78.6%的平均精度(AP),而YOLOv1则取得了63.4%。

5.1 YOLOv2架构

YOLOv2使用的骨干架构被称为Darknet-19,包含19个卷积层和5个maxpooling层。与YOLOv1的架构类似,它受到Network in Network[42]的启发,在3×3之间使用1×1 3×3之间的卷积,以减少参数的数量。此外,如上所述,他们使用批量归一化来规范化并帮助收敛。

5.2 YOLO9000是一个更强大的YOLOv2

作者在同一篇论文中介绍了一种训练联合分类和检测的方法。它使用来自COCO[37]的检测标记数据来学习bounding box坐标,并使用来自ImageNet的分类数据来增加它能检测的类别数量。在训练过程中,他们将这两个数据集结合起来,这样当使用检测训练图像时,它反向传播检测网络,而当使用分类训练图像时,它反向传播架构的分类部分。结果是一个能够检测超过9000个类别的YOLO模型,因此被称为YOLO9000。 

6. YOLOv3

YOLOv3[46]于2018年由Joseph Redmon和Ali Farhadi发表在ArXiv。它包括重大的变化和更大的架构,以便在保持实时性能的同时与最先进的技术接轨。在下文中,我们描述了相对于YOLOv2的变化。

  1. bounding box预测。与YOLOv2一样,该网络为每个bounding box预测四个坐标tx、ty、tw和th;然而,这次YOLOv3使用逻辑回归为每个bounding box预测一个目标分数。这个分数与ground truth重合度最高的Anchor来说是1,对于其他Anchor来说是0。与Faster R-CNN[45]相比,YOLOv3只为每个ground truth分配一个Anchor。另外,如果没有为一个对象分配Anchor,它只会产生分类损失,而不会产生定位损失或置信度损失;
  2. 类预测。他们没有使用softmax进行分类,而是使用二元交叉熵来训练独立的logistic分类器,并将问题作为多标签分类来提出。这种变化允许给同一个bounding box分配多个标签,这可能发生在一些标签重叠的复杂数据集上[47]。例如,同一个物体可以是一个人和一个男人;
  3. 新的骨干网络。YOLOv3的特点是一个更大的特征提取器,由53个卷积层组成,带有Res残余连接。第6.1节更详细地描述了该架构;
  4. 空间金字塔池(SPP)。 虽然在论文中没有提到,但作者还在骨干中加入了一个改进的SPP块[48],它连接了多个最大集合输出,而没有子采样(stride = 1),每个内核大小不同的k×k,其中k=1、5、9、13,允许更大的感受野。这个版本被称为称为YOLOv3-spp,是表现最好的版本,将AP50提高了2.7%;
  5. 多尺度预测。与特征金字塔网络[49]类似,YOLOv3在三个不同尺度上预测三个bounding box。第6.2节描述了多尺度预测机制的更多细节;
  6. Bounding box先验。与YOLOv2一样, 作者也使用k-means来确定Anchor的bounding box预设。不同的是, 在YOLOv2中,他们每个单元共使用了五个先验盒,而在YOLOv3中,他们使用了三个不同尺度的先验盒。

6.1 YOLOv3架构

YOLOv3中提出的架构主干被称为Darknet-53。它用全连接层取代了所有的max-pooling层,并增加了Res残差连接。总的来说,它包含53个卷积层。图8显示了该架构的细节。

Darknet-53骨干网获得了与ResNet-152相当的Top-1和Top-5的准确率,但速度几乎为2倍。

6.2  YOLOv3多尺度预测

除了更大的结构,YOLOv3的一个基本特征是多尺度预测,即在多个网格尺寸下的预测。这有助于获得更精细的方框,并大大改善了对小物体的预测,而这正是YOLO以前版本的主要弱点之一。

图9所示的多尺度检测架构的工作原理如下:第一个标记为y1的输出相当于YOLOv2的输出,其中一个13×13的网格定义了输出。第二个输出y2是由串联后的输出与(Res × 8)后的输出相连接。这些特征图有不同的尺寸,即13×13和26×26,所以在连接之前有一个上采样操作。最后,使用一个上采样操作,第三个输出y3将26×26的特征图与52×52的特征图连接起来。对于有80个类别的COCO数据集,每个尺度提供了一个形状为N×N×[3×(4+1+80)]的输出张量。其中N×N是特征图(或网格单元)的大小,3表示每个单元的方框,4+1包括四个坐标和置信度得分。4+1包括四个坐标和置信度得分。

6.3  YOLOv3结果

当YOLOv3发布时,物体检测的基准已经从PASCAL VOC变成了Microsoft COCO[37]。因此,从这里开始, 所有的YOLO都在MS COCO数据集中进行评估。YOLOv3-spp在20FPS的情况下,平均精度AP为36.2%, AP50 为60.6%,达到了当时的最先进水平,速度快了2倍。

7. Backbone, Neck和Head

这时,物体检测器的结构开始被描述为三个部分:Backbone, Neck和Head。图10显示了一个高层次的Backbone, Neck 和 Head图

 Backbone负责从输入图像中提取有用的特征。它通常是一个卷积神经网络(CNN),在大规模的图像分类任务中训练,如ImageNet。骨干网在不同的尺度上捕捉层次化的特征,在较早的层中提取低层次的特征(如边缘和纹理),在较深的层中提取高层次的特征(如物体部分和语义信息)。

Neck是连接Backbone和Head的一个中间部件。它聚集并细化骨干网提取的特征,通常侧重于加强不同尺度的空间和语义信息。颈部可能包括额外的卷积层、特征金字塔网络(FPN)[49],或其他机制,以提高特征的代表性。

Head是物体检测器的最后组成部分;它负责根据Backbone和Neck提供的特征进行预测。它通常由一个或多个特定任务的子网络组成,执行分类、定位,以及最近的实例分割和姿势估计。头部处理颈部提供的特征,为每个候选物体产生预测。最后,一个后处理步骤,如非极大值抑制(NMS),过滤掉重叠的预测,只保留置信度最高的检测。

在其余的YOLO模型中,我们将使用Backbone, Neck和Head来描述架构。

8. YOLOv4

两年过去了,YOLO没有新版本。直到2020年4月,Alexey Bochkovskiy、Chien-Yao Wang和Hong-Yuan Mark Liao在ArXiv发布了YOLOv4[50]的论文。起初,不同的作者提出一个新的YOLO "官方 "版本让人感觉很奇怪;然而,YOLOv4保持了相同的YOLO理念——实时、开源、端到端和DarkNet框架——而且改进非常令人满意,社区迅速接受了这个版本作为官方的YOLOv4。

YOLOv4试图通过试验许多被归类为bag-of-freebiesbag-of-specials的变化来找到最佳平衡。bag-of-freebies是指只改变训练策略和增加训练成本但不增加推理时间的方法,最常见的是数据增强。另一方面,bag-of-specials是指稍微增加推理成本但显著提高准确率的方法。这些方法的例子有扩大感受野[48, 51, 52],结合特征[53, 49, 54, 55],以及后处理[56, 40, 57, 58]等等。

我们将YOLOv4的主要变化总结为以下几点:

  • 一个带有bag-of-specials集成的增强型架构。作者尝试了多种骨干架构, 如ResNeXt50[59] 、EfficientNet-B3[60]和Darknet-53。表现最好的架构是对Darknet-53的修改,采用跨阶段部分连接(CSPNet)[61],以Mish激活函数[57]作为骨干(见图11)。对于颈部,他们使用了YOLOv3-spp中的修改版空间金字塔集合(SPP)[48]和YOLOv3中的多尺度预测,但用修改版的路径聚合网络(PANet)[62]代替FPN,以及修改的空间注意模块(SAM)[63]。最后,对于检测头,他们使用YOLOv3中的锚。因此,该模型被称为CSPDarknet53-PANet-SPP。添加到Darknet-53中的跨阶段部分连接(CSP)有助于减少模型的计算量,同时保持相同的精度。与YOLOv3-spp中一样,SPP块在不影响推理速度的情况下增加了感受野。修改后的PANet版本将特征串联起来,而不是像原PANet论文中那样将其添加;
  • bag-of-freebies的高级训练方法。除了常规的增强,如随机亮度、对比度、缩放、裁剪、翻转和旋转,作者还实现了马赛克增强,将四张图像合并为一张,允许检测其通常背景之外的物体,同时也减少了对大批量正常化的小批量的需求。对于正则化, 他们使用了DropBlock[64] , 作为Dropout[65]的替代品,但用于卷积神经网络以及类标签平滑[66, 67]。对于检测器,他们增加了CIoU 损失[68]和Cross mini-bath normalization (CmBN),用于收集整个批次的统计数据,而不是像常规批次归一化中的单个小批次[69];
  • 自我对抗性训练(SAT。为了使模型对扰动更加稳健,对输入的图像进行对抗性攻击,以创造一个欺骗性,即gound truth不在图像中,但保持原始标签以检测正确的对象;
  • 用遗传算法进行超参数优化。为了找到用于训练的最佳超参数,他们在前10%的时期使用遗传算法,并使用余弦退火调度器[70]来改变训练期间的学习率。它开始缓慢地降低学习率,然后在训练过程的一半时快速降低,最后略微降低。

 表3列出了骨干网和检测器的最终选择的BoF和BoS。

8.1 YOLOv4结果

在MS COCO数据集test-dev 2017上进行评估,YOLOv4在NVIDIA V100上实现了43.5%的AP和65.7%的AP50,速度超过了50 FPS。

9. YOLOv5

YOLOv5[72]是在YOLOv4之后几个月于2020年由Glenn Jocher发布。在写这篇文章时,还没有关于YOLOv5的科学论文,但从代码中,我们知道它使用了YOLOv4部分描述的许多改进,主要区别是它是用Pytorch而不是Darknet开发的。YOLOv5是开源的,由Ultralytics积极维护,有250多个贡献者,并经常有新的改进。YOLOv5很容易使用、培训和部署。Ultralytics提供了一个iOS和Android的移动版本,以及许多用于标签、培训和部署的集成。

YOLOv5 提供了五个版本: YOLOv5n( 纳米级)、YOLOv5s( 小型)、YOLOv5m( 中型)、YOLOv5l(大型)和YOLOv5x(特大型)。

在撰写本文时,YOLOv5发布的版本是7.0版,包括能够进行分类和实例分割的YOLOv5版本。

9.1 YOLOv5结果

在MS COCO数据集test-dev 2017上进行评估,YOLOv5x在图像大小为640像素的情况下实现了50.7%的AP。使用32 个批次的大小,它在NVIDIA V100 上可以达到200 FPS 的速度。使用更大的输入尺寸1536 像素, YOLOv5实现了55.8%的AP。

10. Scaled-YOLOv4

在YOLOv4 的一年后, 同一作者在CVPR 2021 上展示了Scaled-YOLOv4 [73] 。与YOLOv4 不同, Scaled YOLOv4是在Pytorch而不是Darknet中开发的。主要的创新之处在于引入了扩大和缩小的技术。扩大规模意味着以降低速度为代价来制作一个增加精度的模型;另一方面,缩小规模需要制作一个增加速度而牺牲精度的模型。此外,按比例缩小的模型需要更少的计算能力,可以在嵌入式系统上运行。

缩小的架构被称为YOLOv4-tiny;它是为低端GPU设计的,在Jetson TX2上能以46 FPS运行,在RTX2080Ti上能以440 FPS运行,在MS COCO上达到22%的AP。

扩大的模型架构被称为YOLOv4-large,其中包括三种不同尺寸的P5、P6和P7。这个架构是为云计算GPU设计的,取得了最先进的性能,超过了所有以前的模型[74, 75, 76],在MS COCO上的AP为56%。

11. YOLOR

YOLOR[77]由YOLOv4的同一研究小组于2021年5月发表在ArXiv。它代表着你只学习一个表征。在这篇论文中,作者采用了一种不同的方法;他们开发了一种多任务学习方法,旨在通过学习一般的表征和使用子网络来创建特定任务的表征,为各种任务(如分类、检测、姿势估计)创建一个单一的模型。洞察到传统的联合学习方法经常导致次优特征的产生,YOLOR旨在通过编码神经网络的隐性知识来克服这一问题,以应用于多个任务,类似于人类使用过去的经验来处理新问题。结果显示,将隐性知识引入神经网络有利于所有的任务。

在MS COCO数据集test-dev 2017上进行评估,YOLOR在NVIDIA V100上以30 FPS的速度取得了55.4%的AP和73.3%的AP50。

12. YOLOX

YOLOX[78]于2021年7月发表在ArXiv上,由Megvii Technology的研究团队开发。它以Pytorch为基础,以Ultralytics的YOLOV3为起点,有五个主要变化:无锚结构、多阳性、解耦头、高级标签分配和强增强。它取得了最先进的结果。

2021年,在Tesla V100上以50.1%的AP和68.9%的FPS实现了速度和准确性的最佳平衡。在下文中,我们描述了YOLOX相对于YOLOv3的五个主要变化:

  1. 无锚(Anchor-free)。自YOLOv2以来,所有后续的YOLO版本都是基于锚点的检测器。YOLOX受到CornerNet[79]、CenterNet[80]和FCOS[81]等最先进的无锚物体检测器的启发,回到了一个无锚结构,简化了训练和解码过程。与YOLOv3基线相比,无锚的AP增加了0.9;
  2. 多重正样本(Multi positives)。为了弥补因缺乏锚点而产生的巨大不平衡,作者使用了中心采样[81],他们将中心3×3的区域作为正例区域。这种方法使AP增加了2.1点;
  3. 解耦头(Decoupled head)。在[82, 83]中显示,分类置信度和定位精度之间可能存在错位。由于这个原因,YOLOX将这两者分离成两个头(如图12所示),一个用于分类任务,另一个用于回归任务,将AP提高了1.1 分,并加快了模型收敛。
  4. 高级标签分配。在[84]中,有研究表明,当多个对象的bounding box重叠时,ground truth标签分配可能存在模糊性,并将分配程序表述为最佳传输(OT)问题。YOLOX在这项工作的启发下,提出了一个简化的版本,称为simOTA。这一变化使AP增加了2.3分;
  5. 强化增强。YOLOX使用MixUP[85]和Mosaic增强。作者发现,在使用这些增强后,ImageNet预训练不再有好处。强势增强使AP增加了2.4分;

13. YOLOv6

YOLOv6[86]于2022年9月由美团视觉人工智能部发布在ArXiv。与YOLOv4和YOLOv5类似,它为工业应用提供了各种不同尺寸的模型。跟随基于锚点的方法[78, 81]的趋势,YOLOv6采用了无锚点的检测器。该模型的主要创新之处总结如下:

  1. 一个基于RepVGG[87]的新骨架,称为EfficientRep,比以前的YOLO骨架使用更高的并行性。对于颈部, 他们使用PAN[62] 增强了RepBlocks[87] 或CSPStackRep[61]Blocks , 用于大型模型。而受YOLOX的启发,他们开发了一个高效的解耦头;
  2. 使用TOOD[88]中介绍的任务排列学习方法进行标签分配;
  3. 新的分类和回归损失。他们使用了一个分类VariFocal损失[89]和一个SIoU[90]/GIoU回归损失;
  4. 一个用于回归和分类任务的自我蒸馏策略;
  5. 使用RepOptimizer[92]和信道明智蒸馏[93]的检测量化方案,有助于实现更快的检测器。

13.1 YOLOv6结果

在MS COCO数据集test-dev 2017上进行评估,YOLOv6-L在NVIDIA Tesla T4上实现了52.5%的AP和70%的AP50 ,速度约为50 FPS。

14. YOLOv7

YOLOv7[94]由YOLOv4和YOLOR的同一作者于2022年7月发表在ArXiv。当时,在5 FPS到160 FPS的范围内,它的速度和准确度超过了所有已知的物体检测器。与YOLOv4一样,它只使用MS COCO数据集进行训练,没有预训练的骨干。YOLOv7提出了一些架构上的变化和一系列的免费包,在不影响推理速度的情况下提高了准确率,只影响了训练时间。

YOLOv7的架构变化是:

  • 扩展高效层聚合网络(E-ELAN。ELAN[95]是一种策略,通过控制最短的最长梯度路径,让深度模型更有效地学习和收敛。YOLOv7提出的E-ELAN适用于具有无限叠加计算块的模型。E-ELAN通过洗牌和合并cardinality结合不同组的特征,在不破坏原始梯度路径的情况下增强网络的学习;
  • 基于串联的模型的模型缩放。缩放通过调整一些模型属性来生成不同大小的模型。YOLOv7的架构是一个基于串联的架构,其中标准的缩放技术,如深度缩放,导致过渡层的输入通道和输出通道之间的比例变化,这反过来又导致了模型的硬件使用量的减少。YOLOv7提出了一种新的基于串联模型的缩放策略,其中块的深度和宽度以相同的因素进行缩放,以保持模型的最佳结构。

YOLOv7中使用的bag-of-freebies包括:

  • 计划中的重新参数化卷积。和YOLOv6一样,YOLOv7的架构也是受到重新参数化卷积(RepConv) 的启发[87]。然而,他们发现RepConv中的身份连接破坏了ResNet[53]中的残差和DenseNet[96]中的串联。出于这个原因,他们删除了身份连接,并称之为RepConvN;
  • 对辅助头进行粗略的标签分配,对主导头进行精细的标签分配。主导头负责最终输出,而辅助头则协助训练;
  • conv-bn-activation中的批量归一化。这将批量归一化的平均值和方差整合到推理阶段的卷积层的偏置和权重中;
  • YOLOR[77]中启发的隐性知识;
  • 指数移动平均线作为最终推断模型。

14.1 YOLOv4YOLOR的比较

在这一节中,我们强调了YOLOv7与同一作者以前开发的YOLO模型相比的改进之处。

与YOLOv4相比,YOLOv7实现了参数减少75%,计算量减少36%,同时平均精度(AP)提高了1.5%。与YOLOv4-tiny相比,YOLOv7-tiny设法将参数和计算量分别减少39%和49%,同时保持相同的AP。最后,与YOLOR相比,YOLOv7的参数数量和计算量分别减少了43%和15%,同时AP也略微增加了0.4%。

14.2 YOLOv7结果

在MS COCO数据集test-dev 2017上评估,YOLOv7-E6在输入尺寸为1280像素的情况下,在NVIDIA V100上取得了55.9%的AP和73.5%的AP50 ,速度为50 FPS。

15. DAMO-YOLO

DAMO-YOLO[97]由阿里巴巴集团于2022年11月发表在ArXiv。受到当前技术的启发,DAMO-YOLO包括以下内容:

  1. 一个神经架构搜索NAS。他们使用了阿里巴巴开发的一种叫做MAE-NAS[98]的方法来自动寻找一个有效的架构;
  2. 一个大的颈部。受GiraffeDet[99]、CSPNet[61]和ELAN[95]的启发,作者设计了一个可以实时工作的脖子,称为Efficient-RepGFPN;
  3. 一个小头。作者发现,大头和小头能产生更好的性能,他们只留下一个线性层用于分类,一个用于回归。他们把这种方法称为ZeroHead;
  4. AlignedOTA标签分配。动态标签分配方法,如OTA[84]和TOOD[88],由于比静态方法有明显的改进,已经得到普及。然而,分类和回归之间的错位仍然是一个问题,部分原因是分类和回归损失之间的不平衡。为了解决这个问题,他们的AlignOTA方法在分类成本中引入了焦点损失[75],并使用预测和ground truth的IoU作为软标签,使每个目标都能选择对齐的样本,并从全局角度解决这个问题;
  5. 知识的提炼。他们提出的策略包括两个阶段:教师在第一阶段指导学生,学生在第二阶段独立进行微调。此外,他们在蒸馏方法中加入了两项增强功能:对齐模块,它将学生的特征调整为与教师的特征相同的分辨率,以及通道动态温度,它将教师和学生的特征归一化,以减少实际价值差异的影响;

作者生成了名为DAMO-YOLO-Tiny/Small/Medium的比例模型,在NVIDIA V100上,最佳模型在233 FPS下的AP达到了50.0%。

16. YOLOv8

YOLOv8[100]由开发YOLOv5的公司Ultralytics于2023年1月发布。由于在撰写本文时,还没有关于YOLOv8的论文,我们需要深入了解与其他YOLO版本相比的架构决策。按照目前的趋势,YOLOv8是无锚的,减少了箱体预测的数量,加快了非极大值抑制(NMS)的速度。此外,YOLOv8在训练过程中使用了马赛克增强功能;但是,由于已经发现如果在整个训练过程中使用这种增强功能可能是有害的,所以在最后10个epoch中禁用了这种功能。

YOLOv8可以从命令行界面(CLI)运行,也可以作为一个PIP包安装。此外,它还配备了多个用于贴标、培训和部署的集成。

YOLOv8 提供了五个版本: YOLOv8n( 纳米级)、YOLOv8s( 小型)、YOLOv8m( 中型)、YOLOv8l(大型)和YOLOv8x(特大型)。

16.1 YOLOv8结果

在MS COCO数据集test-dev 2017上进行评估,YOLOv8x在图像大小为640像素的情况下实现了53.9%的AP( 相比之下,YOLOv5在相同的输入大小上为50.7%),在NVIDIA A100和TensorRT上的速度为280 FPS。

17. PP-YOLOPP-YOLOv2PP-YOLOE

PP-YOLO模型一直在与我们描述的YOLO模型平行发展。然而,我们决定将它们归为一个部分,因为它们从YOLOv3开始,一直在逐步改进以前的PP-YOLO版本。尽管如此,这些模型在YOLO的发展过程中还是很有影响力的。与YOLOv4和YOLOv5相似的PP-YOLO[76]是基于YOLOv3的。它于2020年7月由百度公司的研究人员发表在ArXiv上。该作者使用了PaddlePaddle[101]深度学习平台,因此它的PP名称。遵循我们从YOLOv4开始看到的趋势,PP-YOLO增加了十个现有的技巧来提高检测器的准确性,保持速度不变。根据作者的说法,本文的目的不是要介绍一个新的物体检测器,而是要展示如何一步一步地建立一个更好的检测器。PP-YOLO使用的大部分技巧都与YOLOv4中使用的技巧不同,重合的技巧使用了不同的实现。PP-YOLO关于YOLOv3的变化是:

  1. ResNet50-vd骨干网取代了DarkNet-53骨干网,其架构在最后阶段增加了可去形成的卷积[102],并提炼出预训练模型,在ImageNet上具有更高的分类精度。这个架构被称为ResNet5-vd-dcn;
  2. 更大的批次规模以提高训练的稳定性,他们从64个到192个,同时更新了训练计划和学习率;
  3. 对训练过的参数保持移动平均数,并使用它们来代替最终的训练值;
  4. DropBlock只适用于FPN;
  5. 在另一个分支中增加了一个IoU损失,以及用于边界盒回归的L1损失;
  6. 增加了一个IoU预测分支,以衡量定位精度和IoU感知损失。在推理过程中,YOLOv3乘以分类概率和客观性分数来计算最终的检测结果,PP-YOLO也乘以预测的IoU来考虑定位精度;
  7. 类似于YOLOv4的网格敏感方法被用来改善网格边界的包围盒中心预测;
  8. 矩阵NMS[103]被使用,它可以并行运行,使得它比传统的NMS更快;
  9. CoordConv[104]用于FPN的1×1卷积,并用于检测头的第一个卷积层。CoordConv允许网络学;
  10. 空间金字塔集合法只用于顶部特征图,以增加骨干的感受野。

17.1 PP-YOLO的增量和预处理

PP-YOLO使用了以下增强和预处理:

  1. 混合训练[85],权重从Beta(α, β)分布中取样,其中α = 1.5,β = 1.5;
  2. 随机色彩失真;
  3. 随机展开;
  4. 随机裁剪和随机翻转,概率为0.5;
  5. RGB通道的z-score规范化,其平均值为[0.485, 0.456, 0.406],标准偏差为
    [0 . 229 , 0 . 224 , 0 . 225];
  6. 从[320, 352, 384, 416, 448, 480, 512, 544, 576, 608]中均匀地抽取多种图像尺寸。

17.2 PP-YOLO结果

在MS COCO数据集test-dev 2017上进行评估,PP-YOLO在NVIDIA V100上取得了45.9%的AP和65.2%的AP50,73 FPS。

17.3 PP-YOLOv2

PP-YOLOv2[105]于2021年4月发表在ArXiv上,对PP-YOLO增加了四项改进,在NVIDIA V100上69FPS时,性能从45.9%AP提高到49.5%AP。PP-YOLOv2关于PP-YOLO的变化如下:

  1. 骨干网从ResNet50改为ResNet101;
  2. 路径聚合网络(PAN而不是类似于YOLOv4的FPN;
  3. Mish激活函数。与YOLOv4和YOLOv5不同,他们只在检测颈部应用mish激活函数,以保持骨干的ReLU不变;
  4. 较大的输入尺寸有助于提高小物体的性能。他们将最大的输入尺寸从608扩大到768,并将每个GPU 的批量大小从24张图像减少到12张。输入尺寸从[320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768]中均匀抽取;
  5. 一个修改过的IoU意识到的分支。他们修改了使用软标签格式而不是软权重格式的IoU意识到的损失计算方法。

17.4 PP-YOLOE

PP-YOLOE[106]于2022年3月在ArXiv发表。它在PP-YOLOv2的基础上增加了改进,在NVIDIA V100上实现了51.4%的AP,78.1 FPS的性能。PP-YOLOE关于PP-YOLOv2的主要变化是:

  1. 无锚。在[81, 80, 79, 78]的工作推动下,PP-YOLOE使用了一个无锚的架构;
  2. 高效任务排列头(ET-head。与YOLOX的分类头和位置头解耦不同,PP-YOLOE反而使用了基于TOOD的单一头,以提高速度和准确性;
  3. 任务对准学习(TAL。YOLOX是第一个提出任务错位问题的人,在这种情况下,分类置信度和定位准确度并不一致。为了减少这个问题,PP-YOLOE实施了TOOD[88]中提出的TAL,其中包括动态标签分配与任务对齐损失相结合;
  4. 新的骨干和颈部。受TreeNet[107]的启发,作者用RepResBlocks修改了骨干和颈部的结构,结合了剩余和密集连接;
  5. VarifocalVFL)和Distribution focal lossDFL。VFL[89]使用目标分数对阳性样本的损失进行加权,对那些具有高IoU的样本给予更高的权重。这在训练过程中优先考虑了高质量的样本。同样,两者都使用IoU意识到的分类分数(IACS)作为目标,允许分类和定位质量的联合学习,导致训练和推理之间的一致性。另一方面,DFL[108]将Focal Loss从离散标签扩展到连续标签,使结合质量估计和类别预测的改进表征成功优化。这使得真实数据中的灵活分布得到了准确的描述,消除了不一致的风险。

和以前的YOLO版本一样,作者通过改变背脊和颈部的宽度和深度,生成了多个比例的模型。这些模型被称为PP-YOLOE-s(小型)、PP-YOLOE-m(中型)、PP-YOLOE-l(大型)和PP-YOLOE-x(特大型)。

18. 讨论

本文研究了15个YOLO版本,从最初的YOLO模型到最新的YOLOv8。表4提供了所讨论的YOLO版本的概况从这个表中,我们可以确定几个关键的模式:

  • 锚Anchor:最初的YOLO模型相对简单,没有采用锚点,而最先进的模型则依赖于带有锚点的两阶段检测器。YOLOv2采用了锚点,从而提高了边界盒的预测精度。这种趋势持续了五年,直到YOLOX引入了一个无锚的方法,取得了最先进的结果。从那时起,随后的YOLO版本已经放弃了锚的使用;
  • 框架:最初,YOLO是使用Darknet框架开发的,后续版本也是如此。然而,当Ultralytics将YOLOv3 移植到PyTorch时,其余的YOLO版本都是使用PyTorch开发的,导致了增强功能的激增。另一个利用的深度学习语言是PaddlePaddle,一个最初由百度开发的开源框架;
  • 骨干Backbone:YOLO模型的骨干架构随着时间的推移发生了重大变化。从由简单的卷积层和最大集合层组成的Darknet架构开始,后来的模型在YOLOv4中加入了跨阶段部分连接(CSP),在YOLOv6和YOLOv7中加入了重新参数化,并在DAMO-YOLO中加入了神经架构搜索;
  • 性能:虽然YOLO模型的性能随着时间的推移有所提高,但值得注意的是,它们往往优先考虑平衡速度和准确性,而不是只关注准确性。这种权衡是YOLO框架的一个重要方面,允许在各种应用中进行实时物体检测。

18.1 在速度和准确性之间进行权衡

YOLO系列的物体检测模型一直专注于平衡速度和精度,旨在提供实时性能而不牺牲检测结果的质量。随着YOLO框架在各种迭代中的发展,这种权衡一直是一个反复出现的主题,每个版本都试图以不同的方式优化这些相互竞争的目标。在最初的YOLO模型中,主要重点是实现高速物体检测。该模型利用单一的卷积神经网络(CNN)直接预测输入图像中的物体位置和类别,实现实时处理。然而,这种对速度的强调导致了准确性的妥协,主要是在处理小物体或具有重叠边界盒的物体时。

随后的YOLO版本在保持框架的实时性的同时,引入了完善和增强功能来解决这些限制。例如,YOLOv2( YOLO9000)引入了锚定框和穿透层,以改善物体的定位,从而提高精确度。此外,YOLOv3通过采用多尺度特征提取架构增强了模型的性能,允许在不同尺度上进行更好的物体检测。

随着YOLO框架的发展,速度和准确性之间的权衡变得更加微妙。YOLOv4和YOLOv5等模型引入了创新,如新的网络主干、改进的数据增强技术和优化的训练策略。这些发展导致了准确度的显著提高,但并没有大幅影响模型的实时性能。

从Scaled YOLOv4开始,所有官方的YOLO模型都对速度和精度之间的权衡进行了微调,提供不同的模型比例以适应特定的应用和硬件要求。例如,这些版本通常提供为边缘设备优化的轻量级模型,用精度换取降低的计算复杂性和更快的处理时间。

19 YOLO的未来

随着YOLO框架的不断发展,我们预计以下趋势和可能性将决定未来的发展:

纳入最新技术。研究人员和开发人员将继续利用深度学习、数据增强和训练技术的最先进方法来完善YOLO架构。这种持续的创新过程可能会提高模型的性能、稳健性和效率。

基准的演变。目前用于评估物体探测模型的基准,即COCO 2017,最终可能会被一个更先进、更具挑战性的基准所取代。这反映了前两个YOLO版本中使用的VOC 2007基准的转变,反映了随着模型越来越复杂和准确,需要更多的基准。

YOLO模型和应用的激增。随着YOLO框架的发展,我们预计每年发布的YOLO模型的数量会增加,同时应用也会相应地扩大。随着该框架变得更加通用和强大,它可能会被应用于更多不同的领域,从家用电器设备到自动驾驶汽车。

扩展到新的领域。YOLO模型有可能将其能力扩展到物体检测和分割之外,分支到视频中的物体跟踪和三维关键点估计等领域。随着这些模型的发展,它们可能成为解决更广泛的计算机视觉任务的新解决方案的基础。

对不同硬件的适应性。YOLO模型将进一步跨越硬件平台,从物联网设备到高性能计算集群。这种适应性将使YOLO模型能够在各种情况下部署,这取决于应用程序的要求和限制。此外,通过定制模型以适应不同的硬件规格,YOLO可以被更多的用户和行业所接受和使用。

Reference:

A COMPREHENSIVE REVIEW OF YOLO: FROM YOLOV1 TO YOLOV8 AND BEYOND

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

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

相关文章

研发管理-代码管理篇

前言: 工作了这些年,工作了三家公司,也用过主流的代码管理平台,比如SVN,git系列(gitlib,gitee),各有优点,我个人比较喜欢SVN,多人协作的代码管理难免会有代码冲突&#…

flutter学习-day16-自定义组件

📚 目录 介绍组合多个组件自绘组件 Custompaint绘制边界RepaintBoundaryCustomPainter与Canvas画笔Paint绘制组件例子 本文学习和引用自《Flutter实战第二版》:作者:杜文 1. 介绍 当Flutter提供的现有组件无法满足我们的需求,或…

LeetCode 每日一题 Day 18 || 简单模拟

2828. 判别首字母缩略词 给你一个字符串数组 words 和一个字符串 s ,请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每个字符串的第一个字符形成字符串 s ,则认为 s 是 words 的首字母缩略词。例如,“ab” 可以由…

2024年【北京市安全员-B证】考试试卷及北京市安全员-B证复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 北京市安全员-B证考试试卷根据新北京市安全员-B证考试大纲要求,安全生产模拟考试一点通将北京市安全员-B证模拟考试试题进行汇编,组成一套北京市安全员-B证全真模拟考试试题,学员可…

飞天使-k8s知识点3-卸载yum 安装的k8s

要彻底卸载使用yum安装的 Kubernetes 集群,您可以按照以下步骤进行操作: 停止 Kubernetes 服务: sudo systemctl stop kubelet sudo systemctl stop docker 卸载 Kubernetes 组件: sudo yum remove -y kubelet kubeadm kubectl…

深入了解 npm 命令

目录 前言1 初始化项目2 安装依赖3 更新依赖4 发布包5 卸载包6 查看依赖7 运行脚本8 包搜索9 查看包信息结语 前言 在现代 Web 开发中,JavaScript 是一种至关重要的语言,而 npm(Node Package Manager)作为 Node.js 平台的默认软件…

ChatGPT如何计算token数?

GPT 不是适用于某一门语言的大型语言模型,它适用于几乎所有流行的自然语言。所以 GPT 的 token 需要 兼容 几乎人类的所有自然语言,那意味着 GPT 有一个非常全的 token 词汇表,它能表达出所有人类的自然语言。如何实现这个目的呢?…

Nginx生成自签名证书从而添加域名的HTTPS访问

数字证书 ## 原理参考 https://mysticaldream.github.io/2023/05/certificate/## https://blog.csdn.net/m0_52440465/article/details/130713591 简介 数字证书是由证书颁发机构(CA)签名并颁发的电子文件,用于建立网络连接的身份认证和加密通信。SSL 证书是数字证书的一种。…

SparkSQL读写数据

1.3 SparkSQL读写数据 1.3.1 数据的加载 Sparksql中加载外部的数据,使用统一的API入口, spark.read.format(数据文件格式).load(path) 这个方式有更加清晰的简写方式,比如要加载json格式的文件 spark.read.json(path) 默认加载的文件格式为…

BSWM 模式管理(一) 基本规则

BSWM 模式管理 基本规则 1 BSWM 模式管理2 AUTOSAR BSWM 的两种 operation 模式2.1 deferred opration2.2 immediate opration1 BSWM 模式管理 BSW 模式管理由 4 部分组成: Mode source: 模式仲裁的的触发器,可以由 APP/BSW 模块请求触发Mode Arbitration:当模式源出发的时候…

全球知名的五款JavaScript混淆加密工具详解

​ 现在市场上有很多好用的混淆加密工具,其中一些比较流行且受欢迎的工具包括: 1、UglifyJS(罗马尼亚):UglifyJS是一个非常流行的 JavaScript工具库,它可以压缩、混淆、美化和格式化 JavaScript 代码。使用…

线程学习(2)

💕"i need your breath"💕 作者:Mylvzi 文章主要内容:线程学习(2) 前情回顾: 在上一篇博客中介绍到了进程与线程的区别,以及初步了解如何在Java实现多线程编程,通过内置的Thread类来…

Spring接口返回的类型是json格式,里面字段对应base64格式的excel文件

使用场景:需要对前端导入的excel文件中的内容进行验证,如期中有验证失败的信息需要转成excel反馈给前端,用户下载查看信息,并且前端需要获取json返回的状态,给用户提示失败或者成功,所以需要导出json的同时…

创建局域网git裸仓库

创建局域网git裸仓库 不说废话,直接上脚本 #!/bin/bash# 获取脚本所在的目录 script_path"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"if [ $# -eq 0 ]; thenecho "请提供仓库的名称作为参数。"exit 1 …

Python发送邮件

Python发送邮件 一、概念二、邮件服务器设置三、发送邮件流程3.1 登录邮箱3.2 准备数据3.3 发送邮件 四、实现4.1 发送文本4.2 发送html4.3 发送图片4.4 发送文件 一、概念 SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,它是一组用于由源地址到目的地址…

自定义 spring-boot组件自动注入starter

1&#xff1a;创建maven项目 2&#xff1a;pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocati…

Jenkins + gitlab 持续集成和持续部署的学习笔记

1. Jenkins 介绍 软件开发生命周期(SLDC, Software Development Life Cycle)&#xff1a;它集合了计划、开发、测试、部署的集合。 软件开发瀑布模型 软件的敏捷开发 1.1 持续集成 持续集成 (Continuous integration 简称 CI): 指的是频繁的将代码集成到主干。 持续集成的流…

全光谱护眼灯哪个牌子好?全光谱备考护眼台灯推荐

什么是全光谱&#xff1f;全光谱指的是光谱中包含紫外光、可见光、红外光的光谱曲线&#xff0c;并且在可见光部分中红绿蓝的比例与阳光近似&#xff0c;显色指数接近于100的光谱。太阳光的光谱可以称作全光谱&#xff0c;太阳光的色温是随着四季和早晚时间变化而变化&#xff…

SD 一次性客户地址如何打开

一次性客户 写入后在哪里看具体数据呢 在转到->抬头->合作伙伴 双击Y0

Ubuntu系统的基础操作和使用

一、Ubuntu系统介绍 1. Ubuntu系统介绍 Ubuntu是一种流行的开源Linux操作系统&#xff0c;它以稳定性和易用性而闻名。由Canonical公司维护&#xff0c;Ubuntu提供了广泛的软件支持和社区参与。 2. Ubuntu与其他Linux发行版区别 2.1 当前的Linux发行版本 当前主要的Linux发…