目标检测——YOLOv6算法解读

论文:YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications (2022.9.7)
作者:Chuyi Li, Lulu Li, Hongliang Jiang, Kaiheng Weng, Yifei Geng, Liang Li, Zaidan Ke, Qingyuan Li, Meng Cheng, Weiqiang Nie, Yiduo Li, Bo Zhang, Yufei Liang, Linyuan Zhou, Xiaoming Xu, Xiangxiang Chu, Xiaoming Wei, Xiaolin Wei
链接:https://arxiv.org/abs/2209.02976
代码:https://github.com/meituan/YOLOv6


YOLO系列算法解读:
YOLOv1通俗易懂版解读、SSD算法解读、YOLOv2算法解读、YOLOv3算法解读、YOLOv4算法解读、YOLOv5算法解读、YOLOR算法解读、YOLOX算法解读、YOLOv6算法解读

PP-YOLO系列算法解读:
PP-YOLO算法解读、PP-YOLOv2算法解读、PP-PicoDet算法解读、PP-YOLOE算法解读、PP-YOLOE-R算法解读


文章目录

  • 1、算法概述
  • 2、YOLOv6细节
    • 2.1 网络设计
    • 2.2 标签分配
    • 2.3 损失函数
    • 2.4 适应工业界的改进
    • 2.5 量化和部署
  • 3、实验


1、算法概述

YOLOv6出自美团基础研发平台/视觉智能部研发团队,出于以下几个出发点,考虑对YOLO系列检测算法进行改进;1、RepVGG论文思想还未应用到检测网络,于是考虑对检测网络进行重参数化设计;2、基于重参数化的检测器的量化也需要细致的处理,否则难以处理由于其在训练和推理过程中的异构配置而导致的性能下降;3、更关注模型部署时的推理速度;4、对于更特定的优化策略比如标签分配和损失函数设计,需要进一步验证考虑到架构差异性;5、对于部署,我们可以容忍训练策略的调整,以提高准确性性能,但不会增加推理成本,例如知识蒸馏。基于以上5点因素,作者提出YOLOv6,为了在不降低性能的情况下提高推理速度,作者研究了最先进的量化方法,包括训练后量化(PTQ)和量化感知训练(QAT),并将它们应用于YOLOv6中,以实现可部署网络的目标。用TensorRT量化后的速度对比如下图所示:
在这里插入图片描述
总之,YOLOv6的贡献如下:
(1)、为不同场景应用定制不同规模的模型,小模型以普通的单路径主干为特征,而大模型建立在高效的多分支块上;
(2)、加入了自蒸馏策略,同时执行了分类任务和回归任务;
(3)、融合了各种先进tricks,如:标签分配检测技术、损失函数和数据增强技术;
(4)、在RepOptimizer和通道蒸馏的帮助下优化了检测器的量化方案。


2、YOLOv6细节

YOLOv6的重新设计包括以下部分:网络设计、标签分配、损失函数、数据增强、行业方便的改进以及量化和部署。整体YOLOv6网络结构如下:
在这里插入图片描述

2.1 网络设计

Backbone
与其他主流架构相比,作者发现RepVGG骨干网络具备和小型网络一样的推理速度,但是提取到的特征更丰富,性价比很高,但是由于参数和计算成本的爆炸性增长,它很难被缩放以获得更大的模型。所以作者把RepBlock作为小型网络的子模块;对于大型模型,作者基于现在的CSP模块进行改进得到了CSPStackRep模块。如下图所示为RepBlock和CSPStackRep的结构图:
在这里插入图片描述
基于以上改进,作者得到了高效的重参数主干网络EfficientRep,如下图所示:
在这里插入图片描述
相比于 YOLOv5 采用的 CSP-Backbone,该 Backbone 能够高效利用硬件(如 GPU)算力的同时,还具有较强的表征能力。作者将Backbone中stride=2的普通Conv层替换成了stride=2的RepConv层。同时,将原始的CSP-Block都重新设计为RepBlock,其中RepBlock的第一个RepConv会做channel维度的变换和对齐。另外,作者还将原始的SPPF优化设计为更加高效的 SimSPPF。

Neck
YOLOv6也和v4/v5一样采用了PAN结构,不同的是,作者用RepBlocks(N/S)或CSPStackRep(M/L)对CSPBlock进行了替换,同时对整体 Neck 中的算子进行了调整,目的是在硬件上达到高效推理的同时,保持较好的多尺度特征融合能力,命名为Rep-PAN,结构如下图所示:
在这里插入图片描述

Head
像FCOS和YOLOX一样,也是解耦了分类和回归任务,但它们都在每个分支中引入额外的两个3x3卷积层用于提取任务特征;在YOLOv6中,作者采用混合通道策略,将3x3卷积层简化到只使用一个,检测头的宽度由骨干和颈部的宽度乘数共同缩放。这些修改进一步降低了计算成本,以实现更低的推理延迟。使其更加高效,命名为Efficient Decoupled Head。
在这里插入图片描述

Anchor-free
基于anchor-free的检测算法由于其泛化性能好和解码预测简单而减少了后处理成本。目前有两类anchor-free方式,基于锚点和基于关键点的方式,YOLOv6采用基于锚点的方式,其回归分支实际上预测了从锚点到box四边的距离。

2.2 标签分配

标签分配负责在训练阶段将标签分配给预定义的锚。早期都是采用比较简单的方式,根据gt框与预定义锚框的iou大小来判断,现在有了比较复杂的动态匹配策略,如SimOTA和TAL。YOLOv6早期版本采用SimOTA分配策略,但是,在实践中,作者发现引入SimOTA将减缓训练过程,而且经常陷入不稳定训练的情况。因此,YOLOv6后期采用TAL的方式,因为高效又训练友好。

SimOTA
OTA将目标检测中的标签分配问题视为最佳传输问题,它从全局角度考虑预测框与真实标签的匹配的最优问题,从而对每个真实标签对象定义正负样本预测框。而SimOTA是OTA的简化版本,减少了额外的超参数但依然保持了其性能。SimOTA的分配标签步骤为:
(1)、计算成对预测框与真值框代价,由分类及回归loss构成
(2)、计算真值框与前k个预测框IoU,其和为Dynamic k;因此对于不同真值框,其Dynamic k存在差异
(3)、最后选择代价最小的前Dynamic k个预测框作为正样本

TAL(Task alignment learning,任务对齐学习)
任务对齐学习的匹配标签方式最早由TOOD检测算法提出,该算法设计了一个统一的分类分数和预测框质量的指标用来替换传统的IoU度量方式。这在一定程度上,使得分类任务和回归任务的不一致性得到了缓解。其匹配标签的步骤为:
(1)、在各个特征层计算gt与预测框IoU及与分类得分乘积作为score,进行分类检测任务对齐
(2)、对于每个gt选择top-k个最大的score对应bbox
(3)、选取bbox所使用anchor的中心落在gt内的为正样本
(4)、若一个anchor box对应多个gt,则选择gt与预测框IoU最大那个预测框对应anchor负责该gt

2.3 损失函数

主流的anchor-free检测算法的损失函数包括分类损失、回归损失和object损失;作者通过系统的实验,最终确定分类损失采用VAriFocal Loss,回归损失采用SIou/GIoU。

Classification Loss
Focal Loss对传统的交叉熵损失进行了改进,解决了正样本与负样本、难样本与易样本之间的类不平衡问题。为了解决训练和推理在质量估计和分类使用上不一致的问题,quality Focal Loss (QFL)进一步扩展了Focal Loss,将分类分数和定位质量联合表示,用于分类中的监督。VariFocal Loss(VFL)也对Focal Loss进行改进,它对正负样本的处理是不对称的,通过考虑正负样本的不同重要程度,平衡了正负样本的学习信号。Poly Loss将常用的分类损失分解为一系列的加权多项式基数。它在不同的任务和数据集上调整多项式系数,通过实验证明它比交叉熵损失和Focal Loss更好。
通过一系列实验,YOLOv6的分类损失最终采用VAriFocal Loss。

Box Regression Loss
边框回归损失在边界框定位学习中充当着重要角色,早期是采用L1损失,后来就涌现出IoU系列损失和probability loss。
IoU损失将预测框的四个边界作为一个整体单位进行回归。它被证明是有效的,因为它与评价指标一致。IoU有很多变体,比如:GIoU、DIoU、CIoU、α-IoU、SIoU通过实验,作者在YOLOv6-N和YOLOv6-T中采用SIoU,剩余网络结构则采用GIoU。

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

Object Loss
FCOS检测算法首次提出了对象损失,以降低低质量边界框的分数,以便在后处理中过滤掉它们。YOLOX也利用它加速收敛并提升网络性能。在YOLOv6中,作者也尝试加入对象损失,但是没起到正面效果。

2.4 适应工业界的改进

作者尝试了其他常见的做法和技巧来提高性能,包括自蒸馏和更多的迭代epoch。对于自蒸馏,分类和回归都分别由教师模型进行监督。回归的蒸馏是由于DFL而实现的。此外,软标签和硬标签的信息比例通过余弦衰减动态下降,这有助于学生在训练过程中的不同阶段选择性地获取知识。

更多迭代次数,300增加到400epoch
在这里插入图片描述
自蒸馏
为了进一步提高模型的准确性,同时不引入太多的额外计算成本,作者应用经典的知识蒸馏技术,使教师和学生的预测之间的KL散度最小。教师模型限定为学生模型本身,但是经过了预先训练的,所以可以称之为自蒸馏的学习方式。KL散度通常被用来衡量数据分布之间的差异。然而,在目标检测中有两个子任务,其中只有分类任务可以直接利用基于KL散度的知识提炼。由于DFL损失的存在,我们也可以在box回归上执行它。知识蒸馏损失可以用公式表述为:
在这里插入图片描述
总的损失可以表述为:
在这里插入图片描述
Ldet代表检测网络自身损失,LKD代表蒸馏损失,α用于平衡两者损失。

图像灰度边界
在YOLOv5和YOLOv7的实现中,在评估模型性能时,每个图像周围都放置了半截灰色边界。虽然没有添加有用的信息,但它有助于检测图像边缘附近的物体。这个技巧也适用于YOLOv6。但是,额外的灰度边界会降低推理速度,但是不要又会降低精度,作者猜测是mosaic增加中引入灰度填充的原因造成的,所以,在训练过程中,在最后一轮,关闭了马赛克增强。最终使得减少了灰色边界面积的情况下,不掉点。
在这里插入图片描述

2.5 量化和部署

为了解决基于重新参数化的模型量化时的性能下降问题,我们用RepOptimizer训练YOLOv6,以获得PTQ友好的权重,使得其特征的分布是非常狭窄的,能够有利于量化,如下图所示:
在这里插入图片描述
PTQ的实验结果如下:
在这里插入图片描述
通过将量化敏感操作部分转换为浮点计算,进一步提高了PTQ的性能。
为防止PTQ不足,作者引入QAT(训练中量化),保证训练推理一致,作者同样使用RepOptimizer,此外使用channel-wise蒸馏,如图所示:
在这里插入图片描述
QAT的实验结果如下:
在这里插入图片描述


3、实验

实验设置:作者使用与YOLOv5相同的优化器与学习率下降策略,并且也使用warmup、EMA、以及mosaic/mixup数据增强手段。在COCO2017训练集上训练模型,在COCO2017验证集上评估模型准确性。作者的模型均在8卡A100gpu上训练完成,在Tesla T4 GPU以TensorRT形式就行测试。

与现今其他检测算法进行比较
在这里插入图片描述
其余消融实验:略

参考文章:https://tech.meituan.com/2022/06/23/yolov6-a-fast-and-accurate-target-detection-framework-is-opening-source.html

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业商业活动如何获得央级媒体的采访报道?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 企业想要获得央级媒体的采访报道,确实需要精心策划和准备: 一、如何巧妙给媒体报选题 精准定位:首先要明确企业的核心价值、创新点或行业影响力&…

【C++】手撕list(list的模拟实现)

目录 01.节点 02.迭代器 迭代器运算符重载 03.list类 (1)构造与析构 (2)迭代器相关 (3)容量相关 (4)访问操作 (5)插入删除 我们在学习数据结构的时候…

StartAI智能绘图软件出现“缺少Python运行库”怎么办?

StartAI做为一款国产AI界的新秀,是一款贴合AIGC新手的智能绘图软件。新手安装遇见“缺少Python运行库”怎么办”?小编一招搞定~ 解决方法:手动下载【resource文件】,将文件添加到安装目录下。 点击链接进行手动下载噢~ 确保 Star…

图像处理之模板匹配(C++)

图像处理之模板匹配(C) 文章目录 图像处理之模板匹配(C)前言一、基于灰度的模板匹配1.原理2.代码实现3.结果展示 总结 前言 模板匹配的算法包括基于灰度的匹配、基于特征的匹配、基于组件的匹配、基于相关性的匹配以及局部变形匹…

Spring-IOC之组件扫描

版本 Spring Framework 6.0.9​ 1. 前言 通过自动扫描,Spring 会自动从扫描指定的包及其子包下的所有类,并根据类上的特定注解将该类装配到容器中,而无需在 XML 配置文件或 Java 配置类中逐一声明每一个 Bean。 支持的注解 Spring 支持一系…

Mysql索引详解(索引分类)

文章目录 概述索引对查询速度的影响索引的优缺点索引类型一级索引和二级索引的区别MySQL 回表联合索引(最左前缀原则主键索引和唯一索引的区别BTree索引和Hash索引的区别 覆盖索引索引下推加索引能够提升查询效率原因MySQL 索引结构采用 B树原因索引失效的场景MySQL…

JAVASE基础语法(异常、常用类)

一、异常 1.1 什么是异常 异常就是指不正常。是指代码在运行过程中可能发生错误,导致程序无法正常运行。 package com.atguigu.exception;public class TestException {public static void main(String[] args) {int[] arr {1,2,3,4,5};System.out.println(&quo…

前端css中filter(滤镜)的使用

前端css中filter的使用 一、前言二、补充内容说明三、模糊(一)、模糊效果,源码1(二)、源码1运行效果1.视频演示2.截图演示 四、阴影(一)、阴影效果,源码2(二)…

Linux文件系统与日志

一、inode和block 文件数据包括元信息与实际数据,文件存储在硬盘上,硬盘最小存储单位是扇区,每个扇区存储512字节 1.block(块):文件系统中用于存储文件实际数据的最小单位,由文件系统进行分配和管理,并通…

JavaSE内部类

内部类概述 1.内部类的基础 内部类的分类:实例化内部类,静态内部类,局部内部类和匿名内部类 public class OutClass {// 成员位置定义:未被static修饰 --->实例内部类public class InnerClass1{}// 成员位置定义:被…

01、创建型-单例模式--只有一个实例

文章目录 前言一、基本介绍1.1 什么是单例模式1.2 为什么要用单例模式1.3 应用场景1.4 单例优缺点 二、单例模式的实现方式2.1 饿汉式单例2.1.1 静态变量方式2.1.2 静态代码块 2.2 懒汉式单例2.2.1 懒汉式单例2.2.2 懒汉式优化①-线程安全2.2.2 懒汉式优化②-双重检查锁2.2.3 懒…

ROS1快速入门学习笔记 - 04创建工作环境与功能包

一、定义 工作空间(workspace)是一个存放工程开发相关文件的文件夹。 src:代码空间(Source Space)build: 编辑空间(Build Space)devel:开发空间(Development Space)install:安装空间(Install …

深入理解Linux文件系统于日志分析

目录 一.Inode 和 block 概述 ​编辑 1.inode 的内容 (1)Inode 包含文件的元信息 (2)用 stat 命令可以查看某个文件的 inode 信息 (3) Linux系统文件三个主要的时间属性 (4)目…

CentOS 系统的优缺点

CentOS (社区企业操作系统的缩写)是一个基于红帽企业 Linux (RHEL)的免费开源发行版, 旨在为服务器和工作站提供稳定、可靠和安全的平台。 不应将其与CentOS Stream 混淆,后者是即将发布的 RHEL 版本的上游开发平台。 CentOS Li…

第67天:APP攻防-Frida反证书抓包移动安全系统资产提取评估扫描

思维导图 案例一:内在-资产提取-AppinfoScanne AppinfoScanner 一款适用于以 HW 行动/红队/渗透测试团队为场景的移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具,可以帮助渗透测试工程师、攻击队成员、红队成员快速收集到移动端或者静态 WEB …

机器学习之sklearn基础教程

ChatGPT Scikit-learn (简称sklearn) 是一个非常受欢迎的Python机器学习库。它包含了从数据预处理到训练模型的各种工具。下面是一个关于如何使用sklearn进行机器学习的基础教程。 1. 安装和导入sklearn库 首先,你需要安装sklearn库(如果你还没有安装的…

使用写入这类接口后,文件指针fp是否会偏移?

以fprintf为例: 在使用 fprintf 函数写入数据时,文件指针 fp 会自动进行偏移,以确保数据被写入到文件的正确位置。 每次调用 fprintf 函数都会将数据写入文件,并且文件指针会在写入完成后自动移动到写入的末尾,以便下…

56-FMC连接器电路设计

视频链接 FMC连接器电路设计01_哔哩哔哩_bilibili FMC连接器电路设计 1、FMC简介 1.1、FMC介绍 FMC(FPGA Mezzanine Card)是一个应用范围、适应环境范围和市场领域范围都很广的通用模块。FMC连接器连接了由FPGA提供的引脚和FMC子板的I/O接口。最新的…

NLP方面知识

NLP方面知识 一 基础1.Tokenizer1.1 分词粒度:1.2 大模型的分词粒度1.3 各路语言模型中的tokenizer 2.Embedding layer2.1 理解Embedding矩阵 一 基础 1.Tokenizer tokenizer总体上做三件事情: 分词。tokenizer将字符串分为一些sub-word token string&…

ISSCC论文详解:“闪电”数模混合存内计算,适应transformer和CNNs架构

本文聚焦存内计算前沿论文ISSCC 2024 34.3,总结归纳其创新点,并对与之相似的创新点方案进行归纳拓展。 一、文章基本信息 ISSCC 2024 34.4:《A 22nm 64kb Lightning-Like Hybrid Computing-in-Memory Macro with a Compressed Adder Tree a…
最新文章