【YOLO系列】YOLOv6论文超详细解读(翻译 +学习笔记)

news2024/12/25 9:06:59

前言 

YOLOv6 是美团视觉智能部研发的一款目标检测框架,致力于工业应用。论文题目是《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》。

本框架同时专注于检测的精度和推理效率,在工业界常用的尺寸模型中:YOLOv6-nano 在 COCO 上精度可达 35.0% AP,在 T4 上推理速度可达 1242 FPS;YOLOv6-s 在 COCO 上精度可达 43.1% AP,在 T4 上推理速度可达 520 FPS。在部署方面,YOLOv6 支持 GPU(TensorRT)、CPU(OPENVINO)、ARM(MNN、TNN、NCNN)等不同平台的部署,极大地简化工程部署时的适配工作。


学习资料:

原文地址:YOLOv6: A Single-Stage Object Detection Framework for IndustrialApplications

开源代码:GitHub - meituan/YOLOv6: YOLOv6: a single-stage object detection framework dedicated to industrial applications.

前期回顾: 

【YOLO系列】YOLOv5超详细解读(网络详解)

【YOLO系列】YOLOv4论文超详细解读2(网络详解)

【YOLO系列】YOLOv4论文超详细解读1(翻译 +学习笔记)

【YOLO系列】YOLOv3论文超详细解读(翻译 +学习笔记)

【YOLO系列】YOLOv2论文超详细解读(翻译 +学习笔记)

【YOLO系列】YOLOv1论文超详细解读(翻译 +学习笔记)


目录

前言 

Abstract—摘要 

一、Introduction—介绍

二、Method—方法 

2.1 Network Design— 网络设计

2.1.1 Backbone—主干网络

2.1.2 Neck—颈部 

2.1.3 Head—头部

2.2 Label Assignment—标签分配

2.3 Loss Functions—损失函数

 2.3.1 Classification Loss—分类损失 

2.3.2 Box Regression Loss— 回归框损失 

2.3.3 Object Loss— 目标损失 

 2.4. Industry-handy improvements—工业界处理改进 

2.4.1 More training epochs—更多的训练epoch

2.4.2 Self-distillation— 自蒸馏

2.4.3 Gray border of images— 图像灰色边界

2.5. Quantization and Deployment—量化和部署

 2.5.1 Reparameterizing Optimizer—重新参数化 

2.5.2 Sensitivity Analysis—敏感度

2.5.3 Quantization-aware Training with Channel-wise Distillation—基于通道蒸馏的量化感知训练

三、Experiments—实验

3.1 Implementation Details—实施细节

3.2 Comparisons—对照实验

3.3 Ablation Study—消融实验

3.3.1 Network— 网络

3.3.2 Label Assignment—标签分配

3.3.3 Loss functions—损失函数

3.4 Industry-handy improvements—工业的便利改进

3.5. Quantization Results—量化结果

3.5.1 PTQ

3.5.2 QAT

四、 Conclusion—结论

Abstract—摘要 

翻译

多年来,YOLO系列一直是高效物体检测的事实上的工业级标准。YOLO社区以压倒性的优势丰富了它在众多硬件平台和丰富场景中的应用。在这份技术报告中,我们努力把它的极限推到一个新的水平,以坚定不移的心态向行业应用迈进。考虑到现实环境中对速度和准确性的不同要求,我们广泛地研究了来自工业界或学术界的最新的物体检测进展。具体来说,我们大量吸收了最近的网络设计、训练策略、测试技术、量化和优化方法的思想。在此基础上,我们整合了我们的想法和实践,建立了一套不同规模的可部署的网络,以适应多样化的用例。在YOLO作者的慷慨许可下,我们将其命名为YOLOv6。我们也表示热烈欢迎用户和贡献者的进一步改进。对于性能的表现,我们的YOLOv6-N在COCO数据集上达到了35.9%的AP,在NVIDIA Tesla T4 GPU上的吞吐量为1234 FPS。YOLOv6-S以495 FPS的速度达到了43.5%的AP,超过了其他相同规模的主流检测器(YOLOv5-S、YOLOX-S和PPYOLOE-S)。我们的量化版本YOLOv6-S甚至在869 FPS时带来了新的最先进的43.3%AP。此外,YOLOv6-M/L也比其他具有类似推理速度的检测器取得了更好的准确性表现(即49.5%/52.3%)。我们仔细进行了实验来验证每个组件的有效性。


精读

Abstract—摘要

背景

YOLO系列如今已广泛应用在工业方面

本文主要工作

YOLOv6大量地吸收了最近的网络设计训练策略测试技术量化优化方法的想法。(也就是说没有吸睛创新点,主要做的也是缝合和堆砌)

最终效果

  • 更高:   YOLOv6-NCOCO数据集上达到了35.9%AP,在NVIDIA Tesla T4 GPU上的吞吐量为1234 FPS
  • 速度更快:   YOLOv6-S495 FPS的速度达到了43.5%AP,超过了其他相同规模的主流检测器(YOLOv5-SYOLOX-SPPYOLOE-S)。
  • 量化版本也有提高:   量化版本YOLOv6-S甚至在869 FPS时带来了新的最先进的43.3%AP
  • 其余版   YOLOv6-M/L也比其他具有类似推理速度的检测器取得了更好的准确性表现(即49.5%/52.3%)。


一、Introduction—介绍

翻译

YOLO系列一直是工业应用中最受欢迎的检测框架,因为它在速度和精度之间有很好的平衡。YOLO系列的开创性工作是YOLOv1-3[32-34],它开辟了one-stage检测器的新道路,并在后来进行了大幅改进。YOLOv4[1]将检测框架重组为几个独立的部分(backbone, neck and head),并在当时验证了bag-of-freebies和bag-of-specials,设计了一个适合在单个GPU上训练的框架。目前,YOLOv5[10]、YOLOX[7]、PPY-OLOE[44]和YOLOv7[42]都是可以部署的高效检测器的竞争对象。不同尺寸的模型通常是通过缩放技术获得的。

在这份报告中,我们从经验上观察到几个重要的因素,促使我们重新装修YOLO框架:(1)来自RepVGG[3]的重新参数化是一种优越的技术,在检测中还没有得到很好的利用。我们还注意到,RepVGG块的简单模型扩展变得不切实际,为此我们认为小网络和大网络之间网络设计的优雅一致性是不必要的。对于小型网络来说,普通的单路径架构是一个较好的选择,但对于大型模型来说,参数的指数增长和单路径架构的计算成本使其不可行;(2)基于重参数化的检测器的量化也需要细致的处理,否则在训练和推理过程中,由于其异质配置导致的性能下降将是难以处理的。(3) 以前的工作[7, 10, 42, 44]往往不太注意部署,其延迟通常是在V100这样的高成本机器上进行比较。当涉及到真正的服务环境时,存在着硬件差距。通常情况下,像Tesla T4这样的低功耗GPU成本较低,并提供相当好的推理性能。(4) 考虑到架构上的差异,先进的特定领域策略,如标签分配和损失函数设计,需要进一步验证;(5) 对于部署,我们可以容忍训练策略的调整,以提高准确率性能,但不增加推理成本,如知识提炼。

考虑到上述意见,我们带来了YOLOv6的诞生,它在准确性和速度方面完成了迄今为止的最佳权衡。我们在图1中展示了YOLOv6与其他同行在类似规模下的比较。为了在不降低性能的情况下提高推理速度,我们研究了最先进的量化方法,包括训练后量化(PTQ)和量化感知训练(QAT),并将其纳入YOLOv6,以实现部署就绪的目标。网络的目标。


精读

背景

   (1)来自RepVGG的重参数化是一种优越的技术,在检测(已有的yolo版本)中尚未得到很好的利用。同时,作者认为小型网络和大型网络的设计不一样,对大型网络来说,对RepVGG块进行简单地模型缩放不切实际

   (2)基于重参数化的检测器的量化需要细致的处理

   (3)以前的工作往往不太关注部署,其延迟通常在 V100 等高成本机器上进行比较。在实际服务环境方面存在硬件差距

   (4)标签分配和损失函数设计,需要进一步验证考虑架构的差异

   (5)对于部署,训练过程可以使用知识蒸馏等策略,但不增加推理成本

贡献

  (1)为不同场景应用定制不同规模的模型,小模型以普通的单路径主干为特征,而大模型建立在高效多分支块上    

  (2)加入了自蒸馏策略,同时执行了分类任务和回归任务

  (3)融合了各先进tricks,如:标签分配检测技术、损失函数和数据增强技术

  (4)在重新优化器和通道蒸馏的帮助下改革了定量检测方案,得到了一个更好的探测器


二、Method—方法 

翻译

YOLOv6的重新设计由以下部分组成,网络设计、标签分配、损失函数、数据增强、适合工业界的改进,以及量化和部署:

  • 网络设计:Backbone:与其他主流架构相比,我们发现RepVGG[3]骨干网络在推理速度相近的情况下,在小型网络中具备更多的特征表示能力,而由于参数和计算成本的爆炸性增长,它很难被扩展以获得更大的模型。在这方面,我们把RepBlock[3]作为我们小型网络的构建模块。对于大型模型,我们修改了一个更有效的CSP[43]块,名为CSPStackRep块。Neck:YOLOv6的颈部采用了YOLOv4和YOLOv5之后的PAN拓扑结构[24]。我们用RepBlocks或CSPStackRep Blocks来增强颈部,以实现Rep-PAN。Head:我们简化了解耦头,使其更加有效,称为高效解耦头。
  • 标签的分配:我们通过大量的实验评估了最近在YOLOv6上的标签分配策略[5, 7, 18, 48, 51]的进展,结果表明TAL[5]更加有效和 训练友好。
  • 损失函数:主流anchor-free目标检测器的损失函数包含分类损失、box回归损失和object损失。对于每个损失,我们用所有可用的技术进行了系统的实验,最后选择VariFocal损失[50]作为我们的分类损失,SIoU[8]/GIoU[35]损失作为我们的回归损失。
  • 适合工业界的改进:我们引入了更多常见的做法和技巧来提高性能,包括自我蒸馏和更多的训练epoch。对于自蒸馏,分类和回归都分别由教师模型进行监督。回归的蒸馏是由于DFL[20]而实现的。此外,软标签和硬标签的信息比例通过余弦衰减动态下降,这有助于学生在训练过程中的不同阶段选择性地获取知识。此外,我们还遇到了在评估时不添加额外的灰边而导致性能受损的问题,对此我们提供了一些补救措施。我们提供了一些补救措施。
  • 量化和部署:为了解决基于重新参数化的模型量化时的性能下降问题,我们用RepOptimizer[2]训练YOLOv6,以获得PTQ友好的权重。我们进一步采用QAT与信道精馏[36]和图优化来追求极致的性能。我们的量化YOLOv6-S以42.3%的AP和869 FPS的吞吐量(批次大小=32)达到了一个新的技术水平。

2.1 Network Design— 网络设计

翻译

一个单阶段目标检测器一般由以下部分组成:backbone、neck和head。主干部分主要决定了特征表示能力,同时,由于它承载了很大一部分计算成本,所以它的设计对推理效率有关键影响。neck用于将低层次的物理特征与高层次的语义特征聚合在一起,然后在各个层次建立金字塔特征图。头部由几个卷积层组成,它根据neck集合的多层次特征预测最终的检测结果。从结构上看,它可以分为 anchor-based 和 anchor-free的,或者说是参数耦合头和参数解耦头。

在YOLOv6中,基于硬件友好型网络设计的原则[3],我们提出了两个可扩展的可重新参数化的骨干和颈部,以适应不同规模的模型,以及一个高效的混合通道策略的解耦头。

精读

阶段物体探测器的组成:

  • 主干网络:主要决定了特征表示能力  
  • 颈部:用于将低级的物理特征与高级的语义特征进行聚合,然后在所有层次上建立金字塔形特征映射
  • 头部:由多个卷积层组成,并根据颈部组装的多级特征预测最终检测结果


2.1.1 Backbone—主干网络

翻译

如上所述,骨干网络的设计对检测模型的有效性和效率有很大影响。以前的研究表明,多分支网络[13, 14, 38, 39]往往能比单路径网络[15, 37]取得更好的分类性能,但往往伴随着并行性的降低,导致推理延迟的增加。相反,像VGG[37]这样的普通单路径网络具有高并行性和较少内存占用的优势,导致更高的推理效率。最近在RepVGG[3]中,提出了一种结构上的重新参数化方法,将训练时的多分支拓扑结构与推理时的普通结构解耦,以实现更好的速度-准确度权衡。
受上述工作的启发, 我们设计了一个高效的可重参数化骨干网, 命名为EfficientRep. 对于小型模型, 骨干网的主要组成部分是训练阶段的Rep-Block, 如图3(a)所示. 在推理阶段,每个RepBlock被转换为具有ReLU激活函数的3×3卷积层(表示为RepConv),如图3(b)所示。通常情况下,3×3卷积在主流的GPU和CPU上被高度优化,它享有更高的计算密度。因此,EfficientRep Backbone充分地利用了硬件的计算能力,使推理的延迟大大降低,同时提高了表示能力。

然而,我们注意到,随着模型容量的进一步扩大,单路径简单网络的计算成本和参数数量呈指数级增长。为了在计算负担和准确性之间实现更好的权衡,我们修改了一个CSPStackRep块来构建大中型网络的主干。如图3(c)所示,CSPStackRep Block由三个1×1的卷积层和一个由两个RepVGG块[3]或RepConv(分别在训练或推理时)组成的堆栈子块与一个剩余连接组成。此外,还采用了跨阶段部分(CSP)连接来提高性能,而没有过多的计算成本。与CSPRepResStage[45]相比,它有一个更简洁的前景,并考虑了准确性和速度之间的平衡。

精读

背景

RepVGG 主干在小型网络中具有更强的特征表示能力但是随着参数和计算成本的爆炸式增长, RepVGG 在大模型中难以获得较高的性能

改进工作

  • 设计了一个高效的可重新参数化的骨干,称为EffificientRep
  • 小模型(n/t/s) 中,使用RepBlock
  • 大模型(m/l) ,使用CSPStackRep Blocks   

方法

(1)将 Backbone stride=2 的普通 Conv 层替换成了 stride=2 的 RepConv层

(2)将原始的 CSP-Block 都重新设计为 RepBlock,其中 RepBlock 的第一个 RepConv 会做 channel 维度的变换和对齐    

(3)将原始的 SPPF 优化设计为更加高效的 SimSPPF

下图为 EfficientRep Backbone 具体设计结构图

下图是网络在不同情况下的结构

图(a):表示训练的时候,RepVGG block接一个ReLU

图(b):表示推理的时候,RepVGG被替换成了RepConv

图(c):表示CSPStackRep块的结构   ( 3 1x1 conv + 2 RepVGG(训练) / RepConv(推理) + 1 Relu。)


 2.1.2 Neck—颈部 

翻译

在实践中,多尺度的特征整合已被证明是目标检测的一个关键和有效的部分[9, 21, 24, 40]。我们采用YOLOv4[1]和YOLOv5[10]中修改的PAN拓扑结构[24]作为我们检测颈部的基础。此外,我们用RepBlock(用于小模型)或CSPStackRep Block(用于大模型)取代YOLOv5中使用的CSPBlock,并相应调整宽度和深度。YOLOv6的颈部被表示为Rep-PAN。

精读

参考YOLOv4v5用的PAN,结合Backbone里的RepBlock或者CSPStackRep,提出了一个Rep-PAN

方法

 Rep-PAN 基于 PAN拓扑方式,用 RepBlock 替换了 YOLOv5 使用的 CSP-Block对整体 Neck 中的算子进行了调整

目的

在硬件上达到高效推理的同时,保持较好的多尺度特征融合能力

方法Rep-PAN 基于 PAN拓扑方式,用 RepBlock 替换了 YOLOv5 中使用的 CSP-Block,同时对整体 Neck 中的算子进行了调 整,目的是在硬件上达到高效推理的同时,保持较好的多尺度特征融合能力


2.1.3 Head—头部

Efficient decoupled head—高效的解耦头

翻译

高效的解耦头 YOLOv5的检测头是一个耦合头,其参数在分类和定位分支之间共享,而其在FCOS[41]和YOLOX[7]中的同类产品则将这两个分支解耦,并且在每个分支中引入额外的两个3×3卷积层以提高性能。在YOLOv6中,我们采用混合通道策略来建立一个更有效的解耦头。具体来说,我们将中间的3×3卷积层的数量减少到只有一个。头部的宽度由骨干和颈部的宽度乘数共同缩放。这些修改进一步降低了计算成本,以实现更低的推理延迟。

精读

方法

   (1)将中间的3x3卷积层的数量减少为 1

   (2)Head 的尺度和 backbone neck 同大同小

目的

   进一步降低了计算成本,以实现更低的推断延迟。


Anchor-free

翻译

Anchor-free Anchor-free检测器因其更好的泛化能力和解码预测结果的简单性而脱颖而出。其后期处理的时间成本大大降低。有两种类型的Anchor-free检测器:基于锚点[7, 41]和基于关键点[16, 46, 53]。在YOLOv6中,我们采用了基于锚点的范式,其回归分支实际上预测了从锚点到box四边的距离。

精读

 不用Anchor-based的原因 

 由于 Anchor-based检测器需要在训练之前进行聚类分析以确定最佳 Anchor 集合,这会一定程度提高检测器的复杂度    在一些边缘端的应用中,需要在硬件之间搬运大量检测结果的步骤,也会带来额外的延时

Anchor-free优点

Anchor-free方案不需要预设参数,同时后处理耗时短

Anchor-free方案有两种

  • point-base  ( FCOS)  ——YOLOv6使用的
  • keypoint-based  ( CornerNet)

  • 2.2 Label Assignment—标签分配

    SimOTA

    翻译

    SimOTA OTA[6]认为物体检测中的标签分配是一个最优传输问题。它从全局的角度为每个ground-truth目标定义了正/负的训练样本。SimOTA[7]是OTA[6]的简化版本,它减少了额外的超参数并保持了性能。在YOLOv6的早期版本中,SimOTA被用作标签分配方法。然而,在实践中,我们发现引入SimOTA会减慢训练过程。而且,陷入不稳定的训练也并不罕见。因此,我们渴望有一个替代SimOTA的方法。

    精读

    介绍

    OTA 将目标检测中的标签分配视为最佳传输问题。它从全局角度为每个真实对象定义了正/负训练样本。

    SimOTA OTA 简化版本,它减少了额外的超参数并保持了性能。

    步骤

       ①计算成对预测框与真值框代价,由分类及回归loss构成

       ②计算真值框与前k个预测IoU,其和为Dynamic k;因此对于不同真值框,其Dynamic k存在差异

       ③最后选择代价最小的前Dynamic k个预测框作为正样本

    不足

    SimOTA 会拉慢训练速度,容易导致训练不稳定


  • Task alignment learning—任务对齐学习

  • 翻译

    任务对齐学习 任务对齐学习(TAL)最早是在TOOD[5]中提出的,其中设计了一个统一的分类分数和预测框质量的指标。IoU被这个度量所取代,用于分配对象标签。在一定程度上,任务(分类和箱体回归)不一致的问题得到了缓解。

    TOOD的另一个主要贡献是关于任务对齐的头(T-head)。T-head堆叠卷积层以建立交互式特征,在此基础上使用任务对齐预测器(TAP)。PP-YOLOE[45]改进了T-head,用轻量级的ESE注意力取代了T-head中的层注意力,形成ET-head。然而,我们发现ET-head在我们的模型中会降低推理速度,而且没有准确性的提高。

    因此,我们保留了Efficient解耦头的设计。此外,我们观察到TAL比SimOTA能带来更多的性能提升,并且能稳定训练。因此,我们在YOLOv6中采用TAL作为默认的标签分配策略。

  • 精读

    介绍

    TAL 是在 TOOD 中被提出的,其中设计了一个【分类得分和定位框质量的统一度量标准】,使用该度量结果代替 IoU 来帮助

    分配标签,有助于解决任务不对齐的问题,且更稳定,效果更好

    步骤

      ①在各个特征层计算gt与预测框IoU及与分类得分乘积作为score,进行分类检测任务对齐

      ②对于每个gt选择top-k个最大的score对应bbox

      ③选取bbox所使用anchor中心落在gt内的为正样本

      ④若一个anchor box对应多个gt,则选择gt与预测框IoU最大那个预测框对应anchor负责该gt

    效果

       TALSimOTA带来更多的性能改善,稳定训练


  • 2.3 Loss Functions—损失函数

     2.3.1 Classification Loss—分类损失 

  • 翻译

  • 提高分类器的性能是优化检测器的一个关键部分。Focal Loss[22]修改了传统的交叉熵损失,以解决正负样本之间或难易样本之间类别不平衡的问题。为了解决训练和推理之间质量估计和分类的不一致使用问题,质量Focal Loss(QFL)[20]进一步扩展了Focal Loss,对分类分数和分类监督的定位质量进行联合表示。而VariFocal Loss(VFL)[50]则源于Focal Loss[22],但它对正负样本的处理是不对称的。通过考虑正负样本的不同重要程度,它平衡了来自两个样本的学习信号。Poly Loss[17]将常用的分类损失分解为一系列的加权多项式基数。它在不同的任务和数据集上调整多项式系数,通过实验证明它比交叉熵损失和Focal Loss更好。

    我们在YOLOv6上评估了所有这些高级分类损失,最终采用了VFL[50]。

  • 精读

  • VariFocal Loss (VFL) :提出了非对称的加权操作。针对正负样本有不平衡的问题和正样本中不等权的问题,来发现更多有价值的正样本。因此选择 VariFocal Loss 作为分类损失。


    2.3.2 Box Regression Loss— 回归框损失

    翻译

    回归损失提供了精确定位box边界的重要学习信号。L1损失是早期工作中最初的回归损失。逐渐地,各种精心设计的回归损失涌现出来,如IoU系列损失[8, 11, 35, 47, 52, 52] 和概率损失[20]。

    IoU-系列损失 IoU损失[47]将预测框的四个边界作为一个整体单位进行回归。它被证明是有效的,因为它与评价指标一致。IoU有很多变体,如GIoU[35]、DIoU[52]、CIoU[52]、α-IoU[11]和SIoU[8]等,形成相关损失函数。在这项工作中,我们用GIoU、CIoU和SIoU进行实验。而SIoU被应用于YOLOv6-N和YOLOv6-T,而其他的则使用GIoU。

    概率损失 Distribution Focal Loss(DFL)[20]将连续分布的box位置简化为离散的概率分布。它考虑了数据的模糊性和不确定性,而没有引入任何其他强的先验因素,这有助于提高box的定位精度,特别是当ground-truth boxes模糊时。在DFL的基础上,DFLv2[19]开发了一个轻量级的子网络,以利用分布统计和实际定位质量之间的密切关联,这进一步提高了检测性能。然而,DFL通常比一般的目标框回归多输出17倍的回归值,导致了大量的开销。额外的计算成本大大阻碍了小模型的训练。而DFLv2由于有了额外的子网络,进一步增加了计算负担。在我们的实验中,DFLv2在我们的模型上带来了与DFL相似的 在我们的模型上,DFLv2带来的性能增益与DFL相似。因此,我们 只在YOLOv6-M/L中采用DFL。实验细节可以在可在第3.3.3节中找到。

    精读

    IoU-series Loss— IoU系列损失

    SIoU Loss小模型上提升明显, GIoU Loss在大模型上提升明显,因此选择SIoU  (for n/t/s)  /GIoU (for m/l) 损失作为回归损失。

    Probability Loss—概率损失

    Distribution Focal Loss (DFL) Distribution Focal Loss (DFL) v2可以带来一定的性能提升,但是对效率影响较大,因此弃


    2.3.3 Object Loss— 目标损失 

    翻译

    物体损失最早是在FCOS[41]中提出的,用于降低低质量bounding boxes的得分,以便在后期处理中过滤掉它们。它也被用于YOLOX[7],以加速收敛并提高网络精度。作为一个像FCOS和YOLOX一样的anchor-free框架,我们已经在YOLOv6中尝试了object loss。不太幸运的是,它并没有带来很多好的效果。详细情况在第3节中给出。

    精读

    Object loss 首次提出是在 FCOS 中,用于降低 low-quality bbox 的得分,利于在 NMS 中过滤掉, YOLOX 中使用了该 loss 来加 速收敛并提升准确性,但 YOLOv6 中使用同样的方法后并无收益。


     2.4. Industry-handy improvements—工业界处理改进 

    2.4.1 More training epochs—更多的训练epoch

    翻译

    经验结果表明,随着训练时间的增加,检测器的性能也在不断进步。我们将训练时间从300 epochs延长到400 epochs,以达到一个 更好的收敛性。

    精读

    将训练从300epochs延长到400epochs,以达到更好的收敛性。

    效果

    YOLOv6-NTS在较长时期的训练中,使AP分别提高了0.4%0.6%0.5%


    2.4.2 Self-distillation— 自蒸馏

    翻译

    为了进一步提高模型的准确性,同时不引入太多的额外计算成本,我们应用经典的知识蒸馏技术,使教师和学生的预测之间的KL-散度最小。我们把老师限定为学生本身,但进行了预训练,因此我们称之为自我蒸馏。请注意,KL-散度通常被用来衡量数据分布之间的差异。然而,在目标检测中有两个子任务,其中只有分类任务可以直接利用基于KL-散度的知识提炼。由于DFL损失[20]的存在,我们也可以在box回归上执行它。知识提炼损失 可以被表述为:

    L KD = KL(p cls t ||p s ) + KL(p t ||p s ),

    其中p cls t和p s分别是教师模型和学生模型的班级预测,相应地p reg t和p reg是盒式回归预测。现在,总体损失s函数被表述为:

    L total = L det + αL KD ,

    其中L det是用预测和标签计算的检测损失。引入超参数α是为了平衡两种损失。在训练的早期阶段,教师的软标签更容易学习。随着训练的继续,学生的表现将与教师相匹配,因此硬标签将更多地帮助学生。在此基础上,我们对α应用余弦权重衰减来动态调整来自硬标签和来自教师的软标签的信息。我们进行了详细的实验来验证YOLOv6的自我蒸馏的效果,这将在第3节讨论。

    精读

    背景

    为了进一步提高模型的准确性,同时不引入太多的额外计算成本,我们应用经典的知识蒸馏技术,使教师和学生的预测之间的KL-散度最小。

    方法

    作者限制教师模型与学生模型网络结构相同,但经过预训练,因此称为自蒸馏。

    归因于DFL损失,回归分支也可使用知识蒸馏,损失函数如式1所示:

    效果

  • 仅在分类分支上应用自蒸馏可以提高0.4%AP
  • 在预测框回归任务上执行自蒸馏可以提高0.3%AP
  • 权重衰减的引入自蒸馏使模型可以提高0.6%AP

2.4.3 Gray border of images— 图像灰色边界

翻译

我们注意到,在评价YOLOv5[10]和YOLOv7[42]的实现中的模型性能时,每个图像周围都有一个半截灰色的边框。虽然没有增加有用的信息,但它有助于检测图像边缘附近的物体。这个技巧也适用于YOLOv6。然而,额外的灰色像素显然会降低推理速度。没有灰色边界,YOLOv6的性能就会下降,这也是[10, 42]的情况。我们推测,这个问题与Mosaic增强中的灰边填充有关[1, 10]。为了验证,我们进行了在最后一个epoch中关闭马赛克增强的实验[7](又称淡化策略)。在这方面,我们改变了灰色边框的面积,并将带有灰色边框的图像直接调整为目标图像的大小。结合这两种策略,我们的模型可以在不降低推理速度的情况下保持甚至提高性能。推理速度。

精读

背景

半截灰色的边框它有助于检测图像边缘附近的物体

方法

   (1)在最后一个epoch中关闭mosaic增强的实验(又称淡化策略)

   (2)改变了灰色边框的面积,并将带有灰色边框的图像直接调整为目标图像的大小

效果

 YOLOv6-N/S/M的最终性能更准确,最终图像尺寸从672减少到640


2.5. Quantization and Deployment—量化和部署

 2.5.1 Reparameterizing Optimizer—重新参数化 

翻译

RepOptimizer[2]在每个优化步骤中提出梯度重新参数化。该技术也能很好地解决了基于再参数化的模型的量化问题。因此,我们以这种方式重建了YOLOv6的重新参数化块,并使用重新优化器对其进行训练,以获得对PTQ友好的权值。特征图的分布很窄(如图4,B.1),这大大有利于量化过程,结果见第3.5.1节。 

精读

(1)RepOptimizer 提出了在每次训练的时候进行梯度重参数化,该方法能够较好的解决基于重参数化的模型。               

(2)YOLOv6 中就使用了 RepOptimizer 用于获得 PTQ-friendly 的权重,其特征的分布是非常狭窄的,能够有利于量化。


2.5.2 Sensitivity Analysis—敏感度

翻译

我们通过将量化敏感操作部分转换为浮点计算,进一步提高了PTQ的性能。为了获得灵敏度分布,我们常用了几个指标,即均方误差(MSE)、信噪比(SNR)和余弦相似度。通常,为了进行比较,可以选择输出特征映射(在激活某一层之后)来计算有量化和没有量化的这些度量。作为一种替代方法,它也可以通过开关特定层[29]的量化来计算验证AP。

 我们在使用重新优化器训练的YOLOv6-S模型上计算所有这些指标,并选择前6个敏感层,以浮动形式运行。敏感性分析的完整图表见B.2。

精读

通过将量化敏感操作部分转换为浮点计算,进一步提高了 PTQ 性能为了得到敏感性分布,作者使用了 mean-square error (MSE), signal-noise ratio (SNR) cosine similarity

2.5.3 Quantization-aware Training with Channel-wise Distillation—基于通道蒸馏的量化感知训练

翻译

 在PTQ不足的情况下,我们建议涉及量化感知训练(QAT)来提高量化性能。为了解决在训练和推理过程中假量化器的不一致性问题,有必要在重新优化器上建立QAT。此外,在YOLOv6框架内采用了通道蒸馏[36](后来称为CW蒸馏),如图5所示。这也是一种自蒸馏的方法,其中教师网络是在fp32精度上的学生模型。参见第3.5.1节中的实验。

精读

为防止PTQ不足,作者引入QAT  (训练中量化),保证训练推理一致,作者同样使用RepOptimizer,此外使用channel-wise如图所示;


三、Experiments—实验

3.1 Implementation Details—实施细节

翻译

我们使用与YOLOv5 [10]相同的优化器和学习时间表,i.即具有动量和学习率余弦衰减的随机梯度下降(SGD)。还利用了预热、分组权重衰减策略和指数移动平均(EMA)。我们采用了两个强数据增强(Mosaic [1,10]和Mixup [49])[1,7,10]。超参数设置的完整列表可以在我们发布的代码中找到。我们在COCO 2017 [23]训练集上训练我们的模型,并在COCO 2017验证集上评估准确性。我们所有的模型都在8个NVIDIA A100 GPU上进行训练,速度性能在配备TensorRT版本7的NVIDIA Tesla T4 GPU上进行测量。2除非另有说明。还有速度使用其他TensorRT版本或其他设备测量的性能在附录A中演示。

精读

(1)采用了和YOLOv5相同的优化算法和学习机制设置(包括SGD、学习率、预热、分组权重衰减策略和EMA、还有两个数据增强)

(2)在COCO 2017训练集上训练模型,并在COCO 2017验证集上评估准确性

(3)所有的模型都在8NVIDIA A100 GPU上进行训练,速度性能在配备TensorRT版本7NVIDIA Tesla T4 GPU上进行测量


3.2 Comparisons—对照实验

翻译

考虑到这项工作的目标是为工业应用构建网络,我们主要关注部署后所有模型的速度性能,包括吞吐量(批量大小为1或32的FPS)和GPU延迟,而不是FLOPs或参数数量。我们将YOLOv 6与YOLO系列的其他最先进的探测器进行了比较,包括YOLOv 5 [10],YOLOX [7],PPYOLOE [45]和YOLOv 7 [42]。请注意,我们使用TensorRT在相同的Tesla T4 GPU上测试了所有官方型号的FP 16精度的速度性能[28]。YOLOv 7-Tiny的性能根据其开源代码和输入大小为416和640的权重进行重新评估。结果示于表1和图2中。1.与YOLOv 5-N/YOLOv 7-Tiny(输入大小=416)相比,我们的YOLOv 6-N显著提高了7。9%/2.6%。在吞吐量和延迟方面,它还具有最佳的速度性能。与YOLOX-S/PPYOLOE-S相比,YOLOv 6-S可使AP提高3.0%/0.4%,速度更快。我们将YOLOv 5-S和YOLOv 7-Tiny(输入大小=640)与YOLOv 6-T进行比较,我们的方法是2。精度提高9%,批处理大小为1时,速度提高73/25 FPS。YOLOv 6-M的性能比YOLOv 5-M高4倍。2%的AP,在相同的速度下,实现了2.在更高的速度下,AP比YOLOX-M/PPYOLOE-M高7%/0.6%。此外,它比YOLOv 5-L更准确,更快。YOLOv 6-L为2。在相同的延迟限制下,比YOLOX-L/PPYLOE-L准确8%/1.1%。我们还通过用ReLU替换SiLU(表示为YOLOv 6-L-ReLU)来提供YOLOv 6-L的更快版本。达到51。7%AP,延迟为8.8 ms,在精度和速度上均优于YOLOX-L/PPYOLOE-L/YOLOv 7。

精读

和SOTA对比

(1)相比 YOLOv5-N/YOLOv7-Tiny (input size=416) YOLOv6-N 分别提升了 7.9% 2.6% ,也达到了最高的速度

(2)YOLOX-S/PPYOLOE-S, YOLOv6-S 分别提升了 3.0% 0.4%

(3)相比 YOLOv5-S YOLOv7-Tiny (input size=640) YOLOv6-M 在同等速度的情况下高了 4.2% AP

(4)相YOLOX-M/PPYOLOE-M YOLOv6-M 更快,且分别高了 2.7% 0.6% AP

(5)相比 YOLOX-L/PPYOLOE-L/YOLOv7 YOLOv6-L-Relu 达到了 51.7% AP,超越了前面几个方法


3.3 Ablation Study—消融实验

3.3.1 Network— 网络

Backbone and neck—骨干网络和颈部

翻译

主干和颈部我们探讨了单路径结构和多分支结构对主干和颈部的影响,以及CSPStackRep Block的信道系数(表示为CC)。本部分描述的所有模型均采用TAL作为标签分配策略,VFL作为分类损失,GIoU和DFL作为回归损失。结果示于表2中。我们发现,在不同规模的模型的最佳网络结构应该拿出不同的解决方案。对于YOLOv 6-N,单路径结构在精度和速度方面优于多分支结构。

由于相对较低的存储器占用和较高的并行度,因此运行得更快。对于YOLOv 6-S,两种块样式带来相似的性能。当涉及到较大的模型,多分支结构实现更好的性能,在准确性和速度。并且我们最终选择多分支,其中对于YOLOv 6-M具有2/3的信道系数,并且对于YOLOv 6-L具有1/2的信道系数。此外,我们研究了颈部的宽度和深度对YOLOv 6-L的影响。表3中的结果显示细长颈部执行0.2%,比宽浅颈在相同的速度。

精读

作者比较backboneneck中不同blockCSPStackRep Blockchannel系数影响

结论  

不同网络结构适用不同策略


Combinations of convolutional layers and activation functions—卷积层和激活函数组合

翻译

YOLO系列采用了广泛的激活函数,ReLU [27],LReLU [25],Swish [31],SiLU [4],Mish [26]等。在这些激活函数中,SiLU是使用最多的。一般来说,SiLU具有更好的准确性,并且不会导致太多额外的计算成本。然而,当涉及到工业应用时,特别是部署具有TensorRT [28]加速的模型时,ReLU由于融合到卷积中而具有更大的速度优势。此外,我们进一步验证了RepConv/普通卷积(表示为Conv)和ReLU/SiLU/LReLU在不同规模的网络中的组合的有效性,以实现更好的权衡。如表4所示,具有SiLU的Conv在准确性方面表现最好,而RepConv和ReLU的组合实现了更好的折衷。我们建议用户在延迟敏感的应用程序中采用ReLU的RepConv。我们选择使用RepConv/ReLU组合

精读

YOLO系列中常用激活函数有ReLULReLUSwishSiLUMish等,  SiLU精度最高且最常用,但是部署与TensorRT 加速 模型时无法与卷积层融合,  ReLU更具有速度优势

进一验证了RepConv/普通卷积(记为Conv)和ReLU/SiLU/LReLU组合在不同大小的网络中的有效性

结论

(1)Conv+SiLU性能最佳,但RepConv+ReLU达到性能与速度均衡

(2)在YOLOv6-N/T/S/M中使用RepConv/ReLU组合来获得更高的推理速度

(3)在大型模型YOLOv6-L中使用Conv/SiLU组合来加速训练和提高性能。


Miscellaneous design—其余设计

翻译

我们还对第2节中提到的其他网络部分进行了一系列消融。1基于YOLOv 6-N。我们选择YOLOv 5-N作为基线,并逐步添加其他组件。结果示于表5中。首先,对于解耦头(表示为DH),我们的模型是1。精确度提高4%,时间成本增加5%。其次,我们验证了无锚范式比基于锚的范式快51%,因为它的3倍少的预定义锚,这导致输出的维数更少。此外,表示为EB+RN的骨架(EfficientRep骨架)和颈部(Rep-PAN颈部)的统一修饰带来3。6%的AP改进,运行速度提高21%。最后,优化的解耦头(混合通道,HC)带来0。2%AP和6.FPS的准确性和速度分别提高了8%。

精读

作及结论

DH: YOLOv5-N为基线,验证YOLOv6-N中不同部件影响,使用解耦头(DH)性能提升1.4%,耗时增加5%

AF: Anchor-free方案耗时降低51%

EB+RN: 主干网络EfficientRep +颈部Rep-PAN 使得性能提升3.6%,耗时降低21%

HC: Head中混合通道策略,使得性能提升0.2%,耗时降低6.8%


 3.3.2 Label Assignment—标签分配

翻译

在表6中,我们分析了主流标签分配策略的有效性。在YOLOv6N上进行实验。如预期的,我们观察到SimOTA和TAL是最好的两个策略与ATSS相比,SimOTA可以提高AP 2.0%,TAL带来0。AP比SimOTA高5%。考虑到TAL的稳定训练和更好的准确性能,我们采用TAL作为我们的标签分配策略。此外,TOOD [5]的实现采用ATSS [51]作为早期训练时期的预热标签分配策略。我们还保留了热身策略,并对其进行了进一步的探索。详细信息如表7所示,我们可以发现,在没有预热或通过其他策略预热的情况下(即:例如,SimOTA)也可以实现类似的性能。

精读

可知,  SimOTATAL是最好的两种策略。

结论

考虑到TAL的稳定训练和更好的准确性性能,作者采用TAL作为我们的标签分配策略。

进一步探索warm-up策略。

结论  

如果没有warm-up或通过其他策略(即SimOTA)进行热身,也可以达到类似的性能。


3.3.3 Loss functions—损失函数

Classification Loss—分类损失

翻译

分类损失:我们在YOLOv 6-N/S/M上实验了Focal Loss [22]、Poly loss [17]、QFL [20]和VFL [50]。从表8中可以看出,VFL带来0。与局灶性丢失相比,YOLOv 6-N/S/M的AP改善分别为2%/0.3%/0.1%。我们选择VFL作为分类损失函数。

精读

作者对不同分类损失函数进行验证

结论

 选择VFL作为分类损失函数


Regression Loss— 回归损失

翻译

在YOLOv 6-N/S/M上对回归损失IoU序列和概率损失函数进行了实验。YOLOv 6 N/S/M采用了最新的IoU系列损耗。表9中的实验结果显示,对于YOLOv 6-N和YOLOv 6-T,SIoU损失优于其他损失,而CIoU损失在YOLOv 6-M上表现更好。对于概率损失,如表10所列,引入DFL可以获得0。YOLOv 6-N/S/M的性能增益分别为2%/0.1%/0.2%。然而,对于小模型,推理速度受到很大影响。因此,仅在YOLOv 6-M/L中引入DFL。

精读

作者在YOLOv6-N/S/M上实验了IoU系列损失和概率损失函数。

结论

(1)关IoU系列损失:   YOLOv6-NYOLOv6-T使用SIoU损失,其余使用GIoU损失;

(2)关于概率损失:   YOLOv6-M/L使用DFL,其余未使用;


Object Loss— 目标损失

翻译

如表11所示,还用YOLOv 6实验物体损失。从表11中,我们可以看到对象丢失对YOLOv 6-N/S/M网络有负面影响,其中最大减少为1。YOLOv 6-N上的1% AP。负增益可能来自目标分支与TAL中的其他两个分支之间的冲突。具体来说,在训练阶段,预测框和地面实况框之间的IoU以及分类得分用于联合构建度量作为分配标签的标准。但是,引入的对象分支将要对齐的任务数量从两个扩展到三个,这显然增加了难度。基于实验结果和该分析,然后在YOLOv6中丢弃对象丢失。

精读

使用YOLOv6也进行了Object Loss 实验

结论

YOLOv6-N/S/M中目标损失都降低了效果;作者选择丢弃

原因:负增益可能来自于TAL中对象分支和其他两个分支之间的冲突,  TAL中将IoU与分类联合作为,额外引入一分支导

两分支对齐变为三分支,增加对齐难度


3.4 Industry-handy improvements—工业的便利改进

(这一部分内容请看第2部分,就不再重复讲咯~)


3.5. Quantization Results—量化结果

3.5.1 PTQ

翻译

当使用RepOptimizer训练模型时,平均性能得到了显著提高,请参见表15。RepOptimizer通常更快,几乎相同

精读

使用RepOptimizer训练模型

结论:  表明RepOptimizer带来性能大幅改进


3.5.2 QAT

翻译

对于v1.0,我们将伪量化器应用于从第2节获得的非敏感层。5.2执行量化感知训练并将其称为部分QAT。我们将结果与表16中的完整QAT。部分QAT导致更好的准确性,但吞吐量略有降低。由于v2中的量化敏感层的去除。0版本,我们直接在使用RepOptimizer训练的YOLOv 6-S上使用完整的QAT。我们通过图优化消除插入量化器,以获得更高的精度和更快的速度。我们在表17中比较来自PaddleSlim [30]的基于蒸馏的量化结果。请注意,我们的YOLOv 6-S的量化版本是最快和最准确的,也请参见图1.

精读

对于v1.0,作者将假量化器应用于非敏感层,进行量化感知训练,并称之为部分QAT

结论 

Partial QAT  (只对敏感层进行量化)比full QAT性能更佳,但耗时略增加

v2.0版本中删除了量化敏感层,作者直接在使用RepOptimizer训练的YOLOv6-S上使用全QAT

结论

表明作者量化的YOLOv6-S速度快性能佳,其余检测器使用PaddleSlim中基于蒸馏量化方法。


四、 Conclusion—结论

翻译

简而言之,考虑到持续的工业需求,我们提出了YOLOv6的当前形式,仔细研究了迄今为止物体探测器组件的所有进步,同时灌输了我们的思想和实践。其结果在精度和速度上都超过了其他可用的实时检测器。为了方便工业部署,我们还为YOLOv6提供了定制的量化方法,使其成为开箱即用的快速检测器。我们衷心感谢学术界和工业界的杰出想法和努力。未来,我们将继续扩大该项目,以满足更高的标准和更苛刻的场景。

精读

YOLOv6在精度和速度上都超过了其他可用的目标检测器。为了方便工业部署,作者还为YOLOv6提供了定制的量化方法,使其成为开箱 即用的快速检测器。

解决的问题

   (1)RepVGG提出的结构重参数化方法表现良好,但在此之前没有检测模型使用。作者认为RepVGGblock缩放不合理,小模型和大模型

   (2)没必要保持相似网络结构;小模型使用单路径架构,大模型就不适合在单路径上堆参数量。

   (3)使用重参数化的方法后,检测器的量化也需要重新考虑,否则因为训练和推理时的结构不同,性能可能会退化。

   (4)前期工作很少关注部署。前期工作中,推理是在V100等高配机器完成的,但实际使用时往往用T4等低功耗推理gpu,作者更关注后者

性能。

  (5)针对网络结构的变化,重新考虑标签分配和损失函数。

   (6)对于部署,可以调整训练策略,在不增加推理成本的情况下提升性能,如使用知识蒸馏。

主要贡献

 (1)在不同的工业落地场景下,设计了不同的模型,兼顾精度与速度。其中,小模型为单分支,大模型为多分支。    

 (2)在分类和回归任务上都使用自蒸馏策略,动态调整教师模型和标签,便于学生模型的训练。

 (3)分析了各种标签分配、损失函数和数据增强技术,选择合适的策略进一步提升性能。

 (4) 基于RepOptimizer优化器和通道蒸馏,对量化方式做了改进。

未来完善

   1.  完善 YOLOv6 全系列模型,持续提升检测性能。

   2.  在多种硬件平台上,设计硬件友好的模型。

   3.  支持 ARM 平台部署以及量化蒸馏等全链条适配。

   4.  横向拓展和引入关联技术,如半监督、自监督学习等等。

   5.  探索 YOLOv6 在更多的未知业务场景上的泛化性能。


本文参考:

YOLOv6:又快又准的目标检测框架开源啦 - 美团技术团队 (meituan.com)

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

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

相关文章

如何让 Edge 浏览器更干净!

如果你也喜欢 Edge 或想要尝试迁移,本文介绍一些能够让 Edge 浏览器体验更加干净、纯粹的设置技巧。 洗白新标签页 Edge 的新标签页提供了多种页面设置方案,在没有安装第三方新标签页扩展的前提下,我们可以在默认新标签页右上角的齿轮设置中…

【MCS-51】时钟电路和复位

单片机的处理器内部具有众多模块,但是要想协调这些模块统一工作并不是一件易事。为了确保各部分能够统一有序工作,因为单片机已经是一个同步时序电路,所以要想让它内部能够有序工作,我们需要从外部输入一个时钟信号。 目录 &am…

MyBatis凭什么征服SpringBoot ?

1、MyBatis的优势 众所周知,MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。通过xml映射到接口,使开发者使用接口的方式就能够轻松的映射、解析、执行xml中的SQL。MyBatis 消除了几乎所有的JDBC代码和参数的手工设…

No.052<软考>《(高项)备考大全》【冲刺6】《软考之 119个工具 (4)》

《软考之 119个工具 (4)》 61.人际交往:62.组织理论:63.预分派:64.谈判:65.招募:66.虚拟团队:67.多标准决策分析:68.人际关系技能:69.培训:70.团队建设活动:71.基本规则:72.集中办公:73.认可与奖励:74.人事评测工具:75.观察和交谈:76.项目绩效评估:77.冲…

Linux学习[8]查找文件指令:which whereis locate find

文章目录 前言1. which2. whereis3. locate4. find总结: 前言 之前在弄交叉编译的时候需要找到gcc,gdb什么的在哪里;涉及到了查找文件指令。 这里对linux中的查找指令进行总结 1. which which指令一般用来寻找可执行文件的路径,…

OpenCV实战(20)——图像投影关系

OpenCV实战(20)——图像投影关系 0. 前言1. 相机成像原理2. 图像对的基本矩阵3. 完整代码小结系列链接 0. 前言 数码相机通过将光线通过镜头投射到图像传感器上来捕捉场景产生图像。由于通过将 3D 场景投影到 2D 平面上形成图像,因此场景与其…

时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测

时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于贝叶斯(bayes)优化卷积神经网络-门控循环单元(CNN-GR…

2023年人工智能GPT-4时代,最新13个ChatGPT商业市场AIGC应用正在掀起革命性变革!

目录 前言ChatGPT商业应用——LLM是星辰大海1. 研究背景1.1 研究背景1.2 研究方法 2. 商业应用和案例分析2.1 工具层ChatGPT搜索ChatGPT办公ChatGPT教育 2.2 行业层ChatGPT游戏ChatGPT音乐ChatGPT零售电商ChatGPT广告营销ChatGPT媒体新闻ChatGPT金融ChatGPT医疗ChatGPT设计Chat…

AI绘画能力的起源:通俗理解VAE、扩散模型DDPM、ViT/Swin transformer

前言 2018年我写过一篇博客,叫:《一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD》,该文相当于梳理了2019年之前CV领域的典型视觉模型,比如 2014 R-CNN2015 Fast R-CNN、Faster R-CNN2016 YOLO、SSD2…

Linux命令集(Linux网络连接管理命令--ifconfig指令篇)

Linux命令集(Linux网络连接管理命令--ifconfig指令篇) Linux网络连接管理命令集(ifconfig指令篇)1. ifconfig(interface configuration)1. 信息显示2. 接口配置 Linux网络连接管理命令集(ifconfig指令篇) 如…

C++Primer第五版【阅读笔记】

CPrimer第五版 阅读笔记 第1章开始1.1 编写一个简单的C程序1.1.1 编译、运行程序 1.2 初识输入输出1.3 注释简介1.4 控制流1.4.1 while语句1.4.2 for语句1.4.3 读取数量不定的输入数据1.4.4 if语句 1.5 类简介1.5.1 Sales_item 类1.5.2 初识成员函数 1.6 书店程序第一章小结 第…

【Linux入门】linux指令(1)

【Linux入门】linux指令(1) 目录 【Linux入门】linux指令(1)操作系统登录服务器Linux下的基本指令ls指令pwd指令Linux路径分割符 /cd指令touch指令mkdir指令(重要)rmdir指令&&rm指令(重…

4.30下周美联储携非农来袭黄金多空该如何布局?

近期有哪些消息面影响黄金走势?下周黄金多空该如何研判? ​黄金消息面解析:周五(4月28日)当周金价维持震荡交投,金价基本持稳于2000美元下方。支撑和打压金价的因素参半。经济衰退的担忧,以及避险情绪支持金价&#x…

Fabric.js 讲解官方demo:Stickman

theme: smartblue 本文简介 戴尬猴,我是德育处主任 Fabric.js 官网有很多有趣的Demo,不仅可以帮助我们了解其功能,还可以为我们提供创意灵感。其中,Stickman是一个非常有趣的例子。 先看看效果图 从上图可以看出,在拖拽…

【SpringBoot2】二:基础入门---自动配置原理(SpringBoot特点+容器功能)

文章目录 1.SpringBoot特点1.1 依赖管理1.2 自动配置 2.容器功能2.1 组件添加2.1.1Configuration2.1.2 Bean、Component、Controller、Service、Repository2.1.3 ComponentScan、Import2.1.4 Conditional 2.2 原生配置引入ImportResource2.3 配置绑定2.3.1 Component Configur…

如何保障网络安全

网络安全是一个涵盖范围广、深入浅出的话题。随着互联网在现代社会中扮演的重要角色日益突出,网络安全问题成为各个领域所关注的焦点。在此,我们将从以下几个方面来阐述网络安全的重要性,并讨论几种保障网络安全的方式。 一、网络安全的重要性…

K8s(1.20.15版本)部署(3master+2node)

1.准备工作 准备五台centos 7的虚拟机(每台虚拟机分配2核2G,存储使用20G硬盘,必须2核不然报错):如下图机器的分配情况: IP节点名称节点类型10.10.10.11k8s-master11master10.10.10.12k8s-master12master1…

解决centos8下域名raw.githubusercontent.com解析错误

在win10环境下执行命令 D:\test>ping raw.githubusercontent.com Ping 请求找不到主机 raw.githubusercontent.com。请检查该名称,然后重试。 解决很简单,把ipv6的DNS服务器设为240c::6666就行了,改完后执行命令 D:\test>ping raw.g…

C语言函数大全-- s 开头的函数(2)

C语言函数大全 本篇介绍C语言函数大全-- s 开头的函数(2) 1. setlinestyle 1.1 函数说明 函数声明函数功能void setlinestyle( int linestyle, unsigned upattern, int thickness );设置当前绘图窗口的线条样式、线型模式和线条宽度 参数&#xff1a…

SQL中去除重复数据的几种方法,我一次性都告你​

使用SQL对数据进行提取和分析时,我们经常会遇到数据重复的场景,需要我们对数据进行去重后分析。 以某电商公司的销售报表为例,常见的去重方法我们用到distinct 或者group by 语句, 今天介绍一种新的方法,利用窗口函数…