目标检测算法YOLOv6简介

news2024/11/17 11:33:19

      YOLOv6由Chuyi Li等人于2022年提出,论文名为:《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》,论文见:https://arxiv.org/pdf/2209.02976 ,项目网页:https://github.com/meituan/YOLOv6 ,最新发布版本为0.4.1,License为GPL-3.0。

      以下内容主要来自论文:

      1.Introduction:

      (1).我们凭经验(empirically)观察到激励我们重新设计YOLO框架的几个重要因素:

      1).RepVGG的重新参数化(reparameterization)是一种高级技术,但在检测中尚未得到充分利用。

      2).基于重参数化的检测器的量化也需要细致的处理,否则在训练和推理过程中由于其异构(heterogeneous)配置而导致性能下降将很难处理。

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

      4).考虑到架构差异,标签分配(label assignment)和损失函数设计等高级领域特定策略需要进一步验证。

      5).对于部署,我们可以容忍训练策略的调整,提高准确率性能但不增加推理成本。

      (2).总结YOLOv6主要方面:

      1).我们针对不同场景(diverse scenarios)的工业应用,重塑(refashion)了一系列不同规模的网络不同规模的架构会有所不同,以实现最佳的速度和准确性权衡(trade-off),其中小型模型具有普通的单路径主干网络(single-path backbone),而大型模型则构建在高效的多分支块(multi-branch blocks)上。

      2).我们为YOLOv6注入了自蒸馏(self-distillation)策略,在分类任务和回归任务上都执行。同时,我们动态调整来自教师和标签(teacher and labels)的知识,以帮助学生模型(student model)在所有训练阶段更有效地学习知识。

      3).我们广泛验证了标签分配、损失函数和数据增强技术的先进检测技术,并有选择地采用它们来进一步提高性能。

      4).我们在RepOptimizer和逐通道蒸馏(channel-wise distillation)的帮助下改革了检测的量化方案,从而实现了快速、准确的检测器。

      2.Method:YOLOv6的改进设计由以下组件组成:网络设计、标签分配、损失函数、数据增强、易于行业应用(industry-handy)的改进以及量化和部署

      (1).Network Design:Backbone:与其他主流架构相比,我们发现RepVGG主干网络在小型网络中以相似的推理速度配备了更多的特征表示能力,但由于参数和计算成本的爆炸性增长,它很难被缩放(scaled)以获得更大的模型。在这方面,我们将RepBlock作为我们小型网络的构建块(building block)。对于大型模型,我们修改了更高效的CSP块,名为CSPStackRep Block。Neck:YOLOv6的Neck采用了继YOLOv4和YOLOv5之后的PAN拓扑。我们使用RepBlocks或CSPStackRep Blocks增强颈部(Neck)以获得RepPAN。Head:我们简化了解耦头(decoupled head),使其更加高效,称为高效解耦头(Efficient Decoupled Head)。

      单阶段(one-stage)目标检测器一般由以下部分组成:a backbone, a neck and a head。Backbone主要决定特征表示能力,同时其设计也对推理效率有着至关重要的影响,因为它承载着很大一部分计算成本。Neck用于聚合低级物理特征与高级语义特征,然后构建各级金字塔特征图Head由多个卷积层组成,它根据Neck组装(assembled)的多级特征来预测最终的检测结果。从结构的角度来看,它可以分为基于锚的和无锚的(anchor-based and anchor-free),或者更确切地说,参数耦合头和参数解耦头(parameter-coupled head and parameter-decoupled head)。

      在YOLOv6中,基于硬件友好的网络设计原则,我们提出了两个可缩放的可重参数化的Backbone和Neck以适应不同尺寸的模型,以及具有混合通道(hybrid-channel)策略的高效解耦头。YOLOv6的整体架构如下图所示:

      1).Backbone: 主干网络的设计对检测模型的有效性和效率有很大影响。之前的研究表明,多分支网络(multibranch networks)通常可以比单路径(single-path)网络实现更好的分类性能,但通常会降低并行度(parallelism)并导致推理延迟增加。相反,像VGG这样的普通单路径网络具有高并行性和更少内存占用的优势,从而带来更高的推理效率。最近在RepVGG中,提出了一种结构重新参数化(re-parameterization)方法,将训练时多分支拓扑与推理时简单架构解耦(decouple),以实现更好的速度精度权衡。

      受上述工作的启发,我们设计了一个高效的可重参数化主干网络,表示为EfficientRep。对于小型模型,在训练阶段,主干网络的主要组成部分是RepBlock,如下图(a)所示。在推理阶段,每个RepBlock通过ReLU激活函数转换为3*3卷积层堆栈(表示为RepConv),如下图(b)所示。通常,3*3卷积在主流 GPU和CPU上进行了高度优化,并且具有更高的计算密度。因此,EfficientRep Backbone充分利用了硬件的计算能力,从而显着降低了推理延迟,同时增强了表示能力。

      然而,我们注意到,随着模型容量的进一步扩大,单路径普通网络(single-path plain network)中的计算成本和参数数量呈指数级增长。为了在计算负担和准确性之间实现更好的权衡(trade-off),我们修改了CSPStackRep块来构建中型和大型网络的主干网络。如下图(c)所示,CSPStackRep Block由三个1*1卷积层和一个由两个带有残差连接的RepVGG块或RepConv(分别在训练或推理时)组成的子块堆栈组成。此外,采用跨阶段部分(cross stage partial,CSP)连接来提高性能,而无需过多的计算成本。与CSPRepResStage相比,它具有更简洁的外观,并考虑了准确性和速度之间的平衡。

      2).Neck:在实践中,多尺度的特征集成(feature integration at multiple scales)已被证明是目标检测的关键且有效的部分。我们采用YOLOv4和 YOLOv5改进的PAN拓扑作为我们的检测颈(neck)的基础。此外,我们将YOLOv5中使用的CSPBlock替换为RepBlock(针对小模型)或CSPStackRep Block(针对大模型),并相应调整宽度和深度。YOLOv6的Neck表示为Rep-PAN

      3).Head:

      Efficient decoupled head:YOLOv5的检测头是一个耦合头(coupled head),在分类和定位分支之间共享参数,而FCOS和YOLOX中的对应检测头将两个分支解耦(decouple),并在每个分支中引入额外的两个3*3卷积层以提高性能。在YOLOv6中,我们采用混合通道(hybrid-channel)策略来构建更高效的解耦头(decoupled head)。具体来说,我们将中间3*3卷积层的数量减少到只有一个。head的宽度由backbone和neck的宽度乘数共同缩放(jointly scaled)。这些修改进一步降低了计算成本,以实现更低的推理延迟。

      Anchor-free:无锚检测器因其更好的泛化能力和解码预测结果的简单性而脱颖而出。其后处理(post-processing)的时间成本大大降低。无锚检测器有两种类型:基于锚点的检测器和基于关键点的检测器。在YOLOv6中,我们采用基于锚点的范式(paradigm),其框回归分支实际上预测从锚点到边界框四个边的距离。

      (2).Label Assignment:我们通过大量实验评估了YOLOv6上标签分配策略的最新进展,结果表明TAL更有效且更适合训练。标签分配负责在训练阶段将标签分配给预定义的锚点。之前的工作提出了各种标签分配策略,从简单的基于IoU的策略和内部ground-truth方法到其他更复杂的方案。

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

      2).Task alignment learning:任务对齐学习(Task Alignment Learning, TAL)首先在TOOD中提出,其中设计了分类分数和预测框质量的统一度量(unified metric)。IoU被替换为这个指标(metric)来分配目标标签。在一定程度上缓解了任务(分类和框回归)错位(misalignment)的问题。

      TOOD的另一个主要贡献是关于任务对齐头(task-aligned head, T-head)。T-head堆叠卷积层来构建交互特征,在其之上使用任务对齐预测器(Task-Aligned Predictor, TAP)。PP-YOLOE对T-head进行了改进,将T-head中的层注意力(layer attention)替换为轻量级的ESE注意力,形成ET-head。然而,我们发现ET-head会降低我们模型中的推理速度,并且不会带来任何精度增益。因此,我们保留了高效解耦头的设计。

      此外,我们观察到TAL可以比SimOTA带来更多的性能提升并稳定训练。 因此,我们采用TAL作为YOLOv6中默认的标签分配策略

      (3).Loss Function:主流的anchor-free目标检测器的损失函数包括分类损失、框回归损失和目标损失。对于每个损失,我们使用所有可用的技术进行系统地实验,最终选择VariFocal Loss作为我们的分类损失,选择SIoU/GIoU Loss作为我们的回归损失。目标检测包含两个子任务:分类和定位,对应两个损失函数:分类损失和框回归损失。对于每个子任务,近年来提出了各种损失函数。

      1).Classification Loss:提高分类器的性能是优化检测器的关键部分。Focal Loss对传统的交叉熵损失(cross-entropy loss)进行了修改,以解决正例与负例之间、难样本与易样本(hard and easy samples)之间的类别不平衡问题。为了解决训练和推理之间质量估计和分类使用不一致的问题,质量焦点损失(Quality Focal Loss, QFL)进一步扩展了焦点损失,将分类分数和定位质量(localization quality)联合表示,用于分类监督(supervision)。而VariFocal Loss(VFL)源于Focal Loss,但它对正样本和负样本的处理不对称。通过考虑不同重要程度的正样本和负样本,它平衡了来自两个样本的学习信号。Poly Loss将常用的分类损失分解为一系列加权多项式基。它在不同的任务和数据集上调整多项式系数,通过实验证明比交叉熵损失和焦点损失更好。我们在YOLOv6上评估所有这些高级分类损失,最终采用VFL。

      2).Box Regression Loss:框回归损失提供了精确定位边界框的重要学习信号。L1损失是早期作品中原始的框回归损失。逐渐地,各种精心设计的框回归损失涌现,例如IoU系列损失和概率损失。

      IoU-series Loss:IoU损失将预测框的四个边界作为一个整体进行回归。由于其与评价指标(evaluation metric)的一致性,已被证明是有效的。 IoU有多种变体,如GIoU、DIoU、CIoU、α-IoU和SIoU等相关的损失函数。SIoU应用于YOLOv6-N和YOLOv6-T,而其他则使用GIoU

      Probability Loss:分布焦点损失(Distribution Focal Loss, DFL)将框位置的底层连续分布(underlying continuous distribution of box locations)简化为离散概率分布。它考虑了数据中的模糊性和不确定性,而不引入任何其他强先验框,这有助于提高框定位精度,特别是当真实框的边界模糊(blurred)时。在DFL的基础上,DFLv2开发了一个轻量级子网络,利用分布统计数据和真实定位质量(real localization quality)之间的密切相关性,进一步提高检测性能。然而,DFL通常会比一般框回归输出多17倍的回归值,从而导致大量开销。额外的计算成本极大地阻碍了小模型的训练。而DFLv2由于额外的子网络进一步增加了计算负担。在我们的实验中,DFLv2在我们的模型上带来了与DFL类似的性能增益。因此,我们在YOLOv6-M/L中只采用DFL

      3).Object Loss:目标损失首先在FCOS中提出,用于降低低质量边界框的分数,以便在后处理中将其过滤掉。它也被用于YOLOX中以加速收敛并提高网络精度。作为像FCOS和YOLOX这样的无锚(anchor-free)框架,我们已经尝试将目标损失引入YOLOv6。不幸的是,它并没有带来太多积极的影响。

      (4).Industry-handy improvements:我们引入了额外的常见实践和技巧来提高性能,包括自蒸馏(self-distillation)和更多的训练周期(epochs)。对于自蒸馏,分类和框回归分别由教师模型(teacher model,是一个已经充分训练且表现良好的模型,它用于指导另一个待训练或较简单的模型(通常被称为student model或学生模型)的学习过程)监督。DFL使得框回归的蒸馏成为可能。此外,软标签和硬标签(soft and hard labels)的信息比例通过余弦衰减动态下降,这有助于学生在训练过程中的不同阶段选择性地获取知识(knowledge)。另外,我们在评估时遇到了没有添加额外灰色边框(gray borders)而导致性能受损的问题,为此我们提供了一些补救措施。以下技巧可以在实际实践中使用。它们并不是为了公平比较,而是稳定地产生性能增益,而不需要太多繁琐的工作。

      1).More training epochs:经验结果表明,随着训练时间的增加,检测器的性能不断提高。我们将训练持续时间从300 epoch延长到400 epoch以达到更好的收敛(convergence)。

      2)Self-distillation:为了进一步提高模型精度,同时不引入太多额外的计算成本,我们应用经典知识蒸馏技术来最小化教师和学生(teacher and the student)预测之间的KL散度(KL-divergence)。我们将教师限制为学生本身,但经过预先训练,因此我们称之为自蒸馏。注意,KL散度通常用于衡量数据分布之间的差异。然而,目标检测中有两个子任务,其中只有分类任务可以直接利用基于KL散度的知识蒸馏。 由于DFL损失,我们也可以在框回归上执行它。

      3).Gray border of images:我们注意到,在评估YOLOv5和YOLOv7实现中的模型性能时,每个图像周围都有半步灰色边框(half-stride gray border)。虽然没有添加有用的信息,但它有助于检测图像边缘附近的目标。这个技巧也适用于YOLOv6。然而,额外的灰色像素明显降低了推理速度。没有灰色边框,YOLOv6的性能会恶化(deteriorates)。我们假设该问题与Mosaic增强中的灰色边框填充有关。进行了在最后一个epoch关闭Mosaic增强的实验(也称为淡出策略)以进行验证。对此,我们改变灰色边框的区域,并将带有灰色边框的图像直接调整为目标图像大小。结合这两种策略,我们的模型可以保持甚至提高性能,而不会降低推理速度。

      (5).Quantization and deployment:为了解决基于量化重参数化(reparameterization)模型的性能下降问题,我们使用RepOptimizer训练YOLOv6以获得PTQ友好的权重。我们进一步采用带有通道蒸馏(channel-wise distillation)和图形优化的QAT来追求极限性能。

      对于工业部署,通常的做法是采用量化来进一步加快运行时间,而不会影响太多性能。训练后量化(Post-training quantization, PTQ)仅使用较小的校准集(calibration set)直接量化模型。而量化感知训练(quantization-aware training , QAT)通过访问训练集进一步提高性能,通常与蒸馏结合使用。然而,由于YOLOv6中大量使用重新参数化块(re-parameterization blocks),以前的PTQ技术无法产生高性能,而在训练和推理过程中匹配假量化器(fake quantizers)时很难结合QAT。我们在这里展示部署过程中的陷阱(pitfalls)和解决方法。

      1).Reparameterizing Optimizer:RepOptimizer在每个优化步骤中提出梯度重新参数化。该技术还很好地解决了基于重新参数化的模型的量化问题。因此,我们以这种方式重建YOLOv6的重新参数化块,并使用RepOptimizer对其进行训练以获得PTQ友好的权重。

      2).Sensitivity Analysis:我们通过将量化敏感(quantization-sensitive)操作部分转换为浮动计算(float computation)来进一步提高PTQ性能。为了获得灵敏度分布,常用的有几个指标:均方误差(MSE)、信噪比(SNR)和余弦相似度。通常为了进行比较,人们可以选择输出特征图(在激活某一层之后)来计算有或没有量化的这些指标。作为替代方案,也可以通过打开和关闭特定层的量化来计算验证AP。我们在使用RepOptimizer训练的YOLOv6-S模型上计算所有这些指标,并选择前6个敏感层以浮动方式运行。

      3).Quantization-aware Training with Channel-wise Distillation:如果PTQ不足,我们建议采用量化感知训练(QAT)来提高量化性能。为了解决训练和推理过程中假量化器不一致的问题,有必要在RepOptimizer的基础上构建QAT。此外,在YOLOv6框架内采用了逐通道蒸馏(channel-wise distillation,后来称为CW Distill),如下图所示。这也是一种自蒸馏方法,其中教师网络就是FP32精度的学生本身。

      GitHub:https://github.com/fengbingchun/NN_Test

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

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

相关文章

67万英语单词学习词典ACCESS\EXCEL数据库

这似乎是最多记录的英语单词学习词典,包含复数、过去分词等形式的单词。是一个针对想考级的人员辅助背单词学英语必备的数据,具体请自行查阅以下的相关截图。 有了数据才能想方设法做好产品,结合权威的记忆理论,充分调动用户的眼…

GD32F103RCT6/GD32F303RCT6(9)高级定时器互补PWM波输出实验

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布: 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转: 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…

Linux网络编程(四) 同时处理一个端口的UDP与TCP连接

从bind系统调用的参数来看,一个socket只能与一个socket地址绑定,即一个socket只能用来监听一个端口。因此,服务器如果要同时监听多个端口,就必须创建多个socket,并将它们分别绑定到各个端口上。这样一来,服…

Github下载的项目使用

根据该视频整理GitHub上的项目要怎么运行?一个视频教会你!_哔哩哔哩_bilibili 方法一:从release中找。 方法二: 从官网中找(位于右上角) 方法三:看readme(从readme中搜索以下词汇&a…

Milvus Cloud 的RAG 的广泛应用及其独特优势

一个典型的 RAG 框架可以分为检索器(Retriever)和生成器(Generator)两块,检索过程包括为数据(如 Documents)做切分、嵌入向量(Embedding)、并构建索引(Chunks Vectors),再通过向量检索以召回相关结果,而生成过程则是利用基于检索结果(Context)增强的 Prompt 来激…

【Qt 开发基础体系】字符串类应用和常用的数据类型

文章目录 1. Qt 字符串类应用1.1 操作字符串1.2 QString::append()函数1.3 QString::sprintf()函数1.4 QString::arg()函数 2. 查询字符串2.1 函数 QString::startsWith()2.2 函数 QString::contains()2.3 函数 QString::toInt()2.4 函数 QString::compare()2.5 将 QString 转换…

Github 50k star!吴恩达联合OpenAi共同编写<面向开发者的LLM入门教程> PDF推荐!

今天给大家推荐一本由吴恩达和OpenAI团队共同编写的关于大型语言模型&#xff08;LLM&#xff09;的权威教程<面向开发者的LLM入门教程>&#xff01;&#xff0c;在Github上已经高达50k star了&#xff0c;这含金量不用多说&#xff0c;在这里给大家强烈推荐一波&#xf…

电脑文件怎么加密?电脑涉密文件加密方法

文件加密是保护电脑涉密文件的重要方法&#xff0c;可以有效避免文件泄露风险。那么&#xff0c;电脑涉密文件该怎么加密呢&#xff1f;下面我们就来了解一下吧。 超级加密3000 在加密电脑涉密文件时&#xff0c;首先需要考虑的就是文件加密的安全性。因此&#xff0c;我们可以…

2024挂耳式耳机怎么选?5款高性价比开放式耳机推荐榜

近年来&#xff0c;开放式耳机受到了越来越多人的关注&#xff0c;特别是对于运动爱好者来说&#xff0c;在运动的过程中&#xff0c;传统的有线耳机不适合户外运动&#xff0c;不仅佩戴不稳&#xff0c;线还容易缠绕&#xff0c;而普通的蓝牙耳机长时间佩戴会感觉耳朵不适。在…

基于短时傅里叶变换域的一维信号邻域降噪方法(MATLAB)

基于傅里叶变换的信号频域表示及能量频域分布揭示了信号在频域的特征&#xff0c;但傅里叶变换是一种整体变换&#xff0c;只能了解信号的全局特性&#xff0c;不能有效检测信号频率随时间的变化情况。只有把时域和频域结合起来才能更好地反映非平稳信号的特征。时频分析的基本…

机器学习 - 梯度下降算法推导

要逐步推导多变量线性回归的梯度计算过程&#xff0c;我们首先需要明确模型和损失函数的形式&#xff0c;然后逐步求解每个参数的偏导数。这是梯度下降算法核心部分&#xff0c;因为这些偏导数将指导我们如何更新每个参数以最小化损失函数。 模型和损失函数 考虑一个多变量线…

Linux:进程通信(三)信号的捕捉

目录 一、信号捕捉函数 1、signal函数 2、sigaction函数 二、用户态与内核态 1、用户态 2、内核态 用户态与内核态转换 三、volatile关键字 四、SIGCHLD信号 一、信号捕捉函数 1、signal函数 signal函数是C语言标准库中的一个函数&#xff0c;用于处理Unix/Linux系…

web自动化系列-selenium执行js脚本|截图|识别验证码(十五)

1.执行脚本 如果你定位的元素通过各种方法都无法完成页面操作&#xff0c;最后的方法就是通过操作js脚本来完成 。 在selenium中提供了一个方法 &#xff0c;这个可以方法可以自行JS的脚本 。具体为&#xff1a; execute_script(js脚本) &#xff1a; js脚本代表要执行的脚本…

OC类与对象(下)

OC类与对象&#xff08;下&#xff09; 文章目录 OC类与对象&#xff08;下&#xff09;不是包装类的NSValue 和NSNumber处理对象打印对象和description方法 和 isEqual方法 类别类别语法部分利用类别进行模块化设计使用类别来调用私有方法 类的扩展协议与委托规范&#xff0c;…

BLIP和BLIP2 论文讲解

文章目录 BLIPIntroductionMethod模型架构预训练目标字幕和过滤&#xff08;Capfilt&#xff09; BLIP2IntroductionMethod模型结构Q-Former预训练第一阶段Q-Former预训练第二阶段 BLIP 论文&#xff1a; 《BLIP: Bootstrapping Language-Image Pre-training for Unified Visio…

Unity打开安卓设备不同的设置面板

1&#xff0c;打开安卓设备不同的设置面板&#xff0c;我还贴心的把Android官网的链接放下面了 2&#xff0c;使用也很方便&#xff1a;unity按钮事件上拖这个脚本&#xff0c;注册MyOpenAndroidSettings方法&#xff0c;参数 填 和枚举值相应的数字 // 功能&#xff1a;打开…

【c++】线程池的原理及实现

&#x1f4bb;文章目录 &#x1f4c4;前言线程池的原理概念工作原理 线程池的实现线程池的基础结构任务队列的实现工作线程的实现 线程池的应用与拓展线程池的拓展 &#x1f4d3;总结 &#x1f4c4;前言 不知道各位是否有试过点进限时抽奖网站、抢票网站呢&#xff1f;你是否好…

静态分析-RIPS-源码解析记录-02

这部分主要分析scanner.php的逻辑&#xff0c;在token流重构完成后&#xff0c;此时ini_get是否包含auto_prepend_file或者auto_append_file 取出的文件路径将和tokens数组结合&#xff0c;每一个文件都为一个包含require文件名的token数组 接着回到main.php中&#xff0c;此时…

一款功能强大的网络安全综合工具-PotatoTool

一、 简介 这款工具是一款功能强大的网络安全综合工具&#xff0c;旨在为安全从业者、红蓝对抗人员和网络安全爱好者提供全面的网络安全解决方案。它集成了多种实用功能&#xff0c;包括解密、分析、扫描、溯源等&#xff0c;为用户提供了便捷的操作界面和丰富的功能选择。 二…

《Fundamentals of Power Electronics》——状态空间平均法

文献中出现了许多交流变换器建模技术&#xff0c;包括电流注入法、电路平均法和状态空间平均法。尽管给定方法的支持者可能更喜欢用特定形式表示最终结果&#xff0c;但几乎所有方法的最终结果都是等效的。所有人都会赞同&#xff0c;平均和小信号线性化是PWM变换器建模的关键步…