当前位置: 首页 > news >正文

YOLOv6-目标检测论文解读

文章目录

  • 摘要
  • 问题
  • 算法
    • 网络设计
      • Backbone
      • Neck
      • Head
    • 标签分配
      • SimOTA(YOLOX提出):
      • TAL(Task alignment learning,TOOD提出)
    • 损失函数
      • 分类损失
      • 框回归损失
      • 目标损失
    • 行业有用改进
      • 自蒸馏
      • 图像灰度边界填充
    • 量化及部署
  • 实验
    • 消融实验
    • 损失函数
    • 量化实验
  • 结论

论文: 《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》
github: https://github.com/meituan/YOLOv6

摘要

YOLOv6-N在T4平台COCO数据集达到35.9 AP,推理速度1234FPS;YOLOv6-S达到43.5 AP,推理速度495FPS,超越YOLOv5-S、YOLOX-S、PPYOLOE-S;YOLOv6-M/L达到49.5%/52.3%;如图1所示
在这里插入图片描述

问题

作者发现以下几点可用于优化YOLO
1、RepVGG重参数化可应用于检测器;
2、基于重参数化的探测器的量化也需要精心处理,由于其异构配置而导致的性能下降将难以处理;
3、之前工作较少关注部署;
4、标签分配策略及损失函数设计需要进一步验证 ;
5、对于部署,训练过程可以使用知识蒸馏等策略,但不增加推理成本;
为了推理加速,作者使用了PTQ、QAT量化方法;
YOLOv6总结如下:
1、设计不同结构,达到速度与性能均衡;
2、在分类及回归任务使用自蒸馏策略;
3、充分验证标签分配、损失函数、数据增强策略;
4、使用RepOptimizer及channel级蒸馏改进量化机制;

算法

YOLOv6整体框架如图2所示
在这里插入图片描述

网络设计

Backbone

RepVGG将训练时多分支重参数化为推理时单分支结构,达到速度与精度平衡;
受此影响,对于小模型作者设计EfficientRep,如图3a为训练时RepBlock,图3b为推理时将RepBlock转换为33卷积+ReLU形式;
随着模型增大,平铺直连网络结构计算量、参数量指数级增长;对此作者提出CSPStackRep Block如图3c所示,由3个1
1卷积及多个子网络组成,其中子网络包括两个RepConv+ReLU构成,除此之外,使用CSP连接;与PP-YOLOE中CSPRepResStage相比,CSPStackRep更加简洁,达到速度与精度平衡。
在这里插入图片描述

Neck

作者使用YOLOv4、YOLOv5中魔改的PAN(将shortcut改为concat),同时对于小模型使用RepBlock替换CSPBlock,对于大模型使用CSPStackRep Block替换CSPBlock,YOLOv6中neck命名为Rep-PAN。

Head

作者使用分类回归解耦头,并引入混合通道策略(hybrid-channel,HC),每个仅使用一个1个3*3卷积层,称为Efficient Decoupled Head,进一步降低计算量;
Anchor-free方案不需要预设参数,同时后处理耗时短;Anchor-free方案有两种:point-base(FCOS)、keypoint-based(CornerNet),YOLOv6使用point-based方案;

标签分配

SimOTA(YOLOX提出):

SimOTA过程如下:
1、计算成对预测框与真值框代价,由分类及回归loss构成;
2、计算真值框与前k个预测框iou,其和为Dynamic k;因此对于不同真值框,其Dynamic k存在差异。
3、最后选择代价最小的前Dynamic k个预测框作为正样本;
但是SimOTA导致训练过程变慢,因此作者未使用SimOTA.

TAL(Task alignment learning,TOOD提出)

1、在各个特征层计算gt与预测框iou及与分类得分乘积作为score,进行分类检测任务对齐;
2、对于每个gt选择top-k个最大的score对应bbox;
3、选取bbox所使用anchor的中心落在gt内的为正样本;
4、若一个anchor box对应多个gt,则选择gt与预测框iou最大那个预测框对应anchor负责该gt;
TAL使用代价函数(包含分类及回归信息)代替iou进行划分样本标签,从一定程度上解决分类回归不统一问题,比如分类效果不好但定位效果好。
经过实验,作者发现TAL相对于SimOTA性能更好且训练稳定,因此YOLOv6使用TAL;
作者发现PP-YOLOE中改进的ET-head为带来性能增益,但降低推理耗时,因此作者仍使用Efficient decoupled head.

损失函数

分类损失

Focal Loss通过更改cross-entropy损失权重解决正负样本类别不均衡及难易样本不均衡问题;
QFL为解决训练推理时框质量及分类得分用法不一致问题,比如训练过程各个分支分别训练,但是推理时分类得分与质量得分相乘作为nms score进行排序;QFL将FL中硬标签转为软标签,由类别与iou乘积作为软标签;
VFL考虑到正负样本不同重要程度,正样本少而负样本多,VFL降低负样本损失权重;
Poly Loss将分类损失拆分为一系列加权多项式,实验表明效果优于交叉熵损失和FL。
经过实验作者选择VariFocal Loss作为分类损失

框回归损失

框回归损失由最初L1损失,到iou系列损失,iou损失已经证明有效,因为其与评价指标一致;作者在YOLOv6-N及YOLOv6-T使用SIoU损失,其余使用GIoU损失;
DFL将框位置连续分布简化为离散概率分布;YOLOv6-M/L使用DFL,其余未使用。

def distribution_focal_loss(pred, label):r"""Distribution Focal Loss (DFL) is from `Generalized Focal Loss: LearningQualified and Distributed Bounding Boxes for Dense Object Detection<https://arxiv.org/abs/2006.04388>`_.Args:pred (torch.Tensor): Predicted general distribution of bounding boxes(before softmax) with shape (N, n+1), n is the max value of theintegral set `{0, ..., n}` in paper.label (torch.Tensor): Target distance label for bounding boxes withshape (N,).Returns:torch.Tensor: Loss tensor with shape (N,)."""dis_left = label.long()dis_right = dis_left + 1weight_left = dis_right.float() - labelweight_right = label - dis_left.float()loss = (F.cross_entropy(pred, dis_left, reduction="none") * weight_left+ F.cross_entropy(pred, dis_right, reduction="none") * weight_right)return loss

目标损失

FCOS引入centerness用于降低低质量框得分,YOLOX通过IoU分支进行,作者尝试目标损失,但未带来增益。

行业有用改进

作者训练时长由300epoch提升到400epoch,性能提升

自蒸馏

作者限制教师模型与学生模型网络结构相同,但经过预训练,因此称为自蒸馏。
归因于DFL损失,回归分支也可使用知识蒸馏,损失函数如式1所示,
在这里插入图片描述

图像灰度边界填充

与YOLOv5、YOLOv7一致,作者对图片边界进行half-stride灰度填充,这一策略有助于提升图像边界目标检出能力,但会增加推理耗时
对此作者认为与马赛克增强有关,最后一轮训练时关闭马赛克操作,同时原图增加灰度边界后,resize到原始图片尺寸,可在不增加耗时情况下,保持或提升模型性能。

量化及部署

作者使用RepOptimizer训练模型获取PTQ(训练后量化)友好权重,如图4所示,特征分布大幅收缩;
为进一步提升PTQ表现,作者选择部分量化敏感层仍使用浮点计算;作者使用MSE、SNR、余弦相似度、AP进行评估,选择top-6量化敏感层仍使用浮点计算。
为防止PTQ不足,作者引入
QAT(训练中量化)
,保证训练推理一致,作者同样使用RepOptimizer,此外使用channel-wise蒸馏,如图5所示;
YOLOv6-S达到42.3 AP,在batch32时达到869FPS。
在这里插入图片描述

实验

表1汇总YOLO系列在COCO数据集性能,
与YOLOv5-N/YOLOv7-Tiny相比,YOLOv6-N分别提升7.9%/2.6%,并且诉苦更快;
与YOLOX-S/PPYOLOE-S相比,YOLOv6-S性能分别提升3.0%/0.4%,且速度更快;
YOLOv6-M相比于YOLOv5-M,性能提升4.2%,耗时接近,相比于YOLOX-M/PPYOLOE-M,性能提升2.7%/0.6%,耗时更短;
YOLOv6-L相比于YOLOX-L/PPYOLOE-L,耗时接近,性能分别提升2.8%/1.1%;
YOLOv6-L-ReLU中将YOLOv6-L中SiLU替换为ReLU,速度更快,性能略下降;
在这里插入图片描述

消融实验

表2作者比较backbone及neck中不同block及CSPStackRep Block中channel系数(CC)影响,作者发现不同网络结构适用不同策略;
在这里插入图片描述
表3表示YOLOv6-L neck中参数影响,窄深网络相对于宽浅网络,性能提升0.2%,耗时接近;
YOLO系列中常用激活函数有ReLU、LReLU、Swish、SiLU、Mish等,虽然SiLU最常用,带来性能提升,但是部署时无法与卷积层融合,ReLU更具有速度优势;
在这里插入图片描述
表4作者验证卷积层与激活函数不同组合性能,Conv+SiLU性能最佳,但RepConv+ReLU达到性能与速度均衡;作者在YOLOv6-N/T/S/M中使用RepConv/ReLU,为了达到更高推理速度,YOLOv6-L中使用Conv/SiLU,为了追求性能;
在这里插入图片描述
表5作者以YOLOv5-N为基线,验证YOLOv6-N中不同部件影响,解耦头(DH)性能提升1.4%
,耗时增加5%;anchor-free(AF)方案耗时降低51%;
EfficientRep Backbone+Rep-PAN neck(EB+RN)使得性能提升3.6%,耗时降低21%;
Head中混合通道策略(hybrid-channel,HC)使得性能太好0.2%,耗时降低6.8%;
在这里插入图片描述
表6展示不同label assign策略影响;
在这里插入图片描述

损失函数

损失函数包括分类损失、回归损失、可选择的目标损失,如式3,
在这里插入图片描述

表8作者对不同分类损失函数进行验证,作者选用VFL;
在这里插入图片描述
表示9作者对不同回归损失,进行比较;YOLOv6-N及YOLOv6-T使用SIoU损失,其余使用GIoU损失;
在这里插入图片描述
表10表示概率损失函数影响,YOLOv6-M/L使用DFL,其余未使用;
在这里插入图片描述
表11表示目标损失影响,可见YOLOv6-N/S/M中目标损失均为带来增益;作者分析由于TAL中两分支与目标分支存在冲突,TAL中将IoU与分类联合作为,额外引入一分支导致两分支对齐变为三分支,增加对齐难度;
在这里插入图片描述
表12表明延长训练epoch,性能提升;
在这里插入图片描述
表13表明自蒸馏应用于分类分支性能提升0.4%,回归分支性能提升0.3%,weight decay带来性能提升0.6%;
在这里插入图片描述
表14表明当不进行灰度补边时,移除马赛克带来性能下降;使用马赛克,同时输入图片634*634,进行3个像素灰度补边,性能进一步提升;
在这里插入图片描述

量化实验

表15表明RepOptimizer带来性能大幅改进;
在这里插入图片描述
表16表明**Partial QAT(只对敏感层进行量化)**比full QAT性能更佳,但耗时略增加;
在这里插入图片描述
表17表明作者量化的YOLOv6-S速度快性能佳,其余检测器使用PaddleSlim中基于蒸馏量化方法;在这里插入图片描述

结论

YOLOv6实验了目前先进目标检测策略,同时引入作者想法,在速度及性能上超越当前实时目标检测器。

相关文章:

YOLOv6-目标检测论文解读

文章目录摘要问题算法网络设计BackboneNeckHead标签分配SimOTA&#xff08;YOLOX提出&#xff09;&#xff1a;TAL&#xff08;Task alignment learning&#xff0c;TOOD提出&#xff09;损失函数分类损失框回归损失目标损失行业有用改进自蒸馏图像灰度边界填充量化及部署实验消…...

【factoryio】使用SCL编写 <机械手控制> 程序

使用虚拟工厂软件和博图联合仿真来编写【scl】机械手控制程序 文章目录 目录 文章目录 前言 二、程序编写 1.机械手运行部分 2.启动停止部分 3.急停复位部分 三、完整代码 总结 前言 在前面我们一起写过了许多案例控制的编写&#xff0c;在这一章我们一起来编写一下一个…...

QT学习记录散件

fromLocal8Bit() qt中fromLocal8Bit()函数可以设置编码。 因为QT默认的编码是unicode&#xff0c;不能显示中文的 而windows默认使用&#xff08;GBK/GB2312/GB18030&#xff09; 所以使用fromLocal8Bit()函数&#xff0c;可以实现从本地字符集GB到Unicode的转换&#xff0c;从…...

[SSD科普之1] PCIE接口详解及应用模式

PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准&#xff0c;它原来的名称为“3GIO”&#xff0c;是由英特尔在2001年提出的&#xff0c;旨在替代旧的PCI&#xff0c;PCI-X和AGP总线标准。一、PCI-E x1/x4/x8/x16插槽模式PCI-E有 x1/…...

Linux设备驱动模型与 sysfs实现分析

RTOS和Linux系统上开发驱动的方式非常的不同,在RTOS系统下,驱动和驱动之间并没有实质性的联系,不同的驱动和BSP之间仅仅通过一层很薄很薄的设备管理框架聚合在一起构成RTOS的设备管理子系统。图形化表示如下: 设备驱动&BSP之间互相独立,互不影响,互不依赖,独立实现,…...

软考高级之制定备考计划

制定备考计划 高项准备时间最好是三个月以上&#xff0c;分为三个阶段来复习。 第一个阶段——熟悉知识点 第二个阶段——刷题 第三个阶段——冲刺复习 具体操作 第一个阶段 这个阶段的复习以教材和视频为主&#xff0c;掌握重要知识点。基础知识要打牢。例如&#xff1…...

[Pytorch] Linear层输出nan

参考链接&#xff1a; https://discuss.pytorch.org/t/well-formed-input-into-a-simple-linear-layer-output-nan/74720/11 总结原因&#xff1a; numpy需要更新 PS. 查看numpy版本号 打开Anaconda Prompt 进入环境 输入命令conda activate envname 然后输入pip show numpy…...

2023-2-19-What is ‘ template<typename E, E V> ‘?

目录C里面template怎么用inline函数模板类模板函数模板特化C里面template怎么用 template是什么? template其实是C的一种语法糖&#xff0c;本意是去简化程序员的工作. void swap(int *a,int *b){int temp *a;*a *b;*b temp; }比如在写一个交换函数的的时候,参数为两个in…...

华为OD机试题 - 字符串加密(JavaScript)

最近更新的博客 华为OD机试题 - 任务总执行时长(JavaScript) 华为OD机试题 - 开放日活动(JavaScript) 华为OD机试 - 最近的点 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试题 - 最小步骤数(JavaScript) 华为OD机试题 - 任务混部(JavaScript) 华为OD机试题 - N 进…...

美团前端一面手写面试题

实现斐波那契数列 // 递归 function fn (n){if(n0) return 0if(n1) return 1return fn(n-2)fn(n-1) } // 优化 function fibonacci2(n) {const arr [1, 1, 2];const arrLen arr.length;if (n < arrLen) {return arr[n];}for (let i arrLen; i < n; i) {arr.push(arr[…...

2D图像处理:缺陷检测--仿照Halcon的Variation Model

文章目录 基于 C++&Opencv 的检测结果(Robust模式-MAD)一、Variation Model1.1 准备和训练模型方法1.2 比较模板方法1.3 过滤(保留符合缺陷特征的区域)二、参考基于 C++&Opencv 的检测结果(Robust模式-MAD) 一、Variation Model Halcon中的Variation Model主要是将待…...

JavaScript 注释

JavaScript 注释可用于提高代码的可读性。JavaScript 注释JavaScript 不会执行注释。我们可以添加注释来对 JavaScript 进行解释&#xff0c;或者提高代码的可读性。单行注释以 // 开头。本例用单行注释来解释代码&#xff1a;实例// 输出标题&#xff1a;document.getElementB…...

浅谈使用CDN加速的OSS

目录引出OSS对象存储服务CDNCDN加速OSS资源总结引出 之前&#xff0c;我在写项目的时候&#xff0c;因为项目中存在音视频的存储&#xff0c;然后我看圈子里面的人都是使用OSS对象存储来处理&#xff0c;然后我也跟风去使用了&#xff0c;然后在之后&#xff0c;我一个朋友问我…...

华为OD机试题 - 服务依赖(JavaScript)

最近更新的博客 华为OD机试题 - 任务总执行时长(JavaScript) 华为OD机试题 - 开放日活动(JavaScript) 华为OD机试 - 最近的点 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试题 - 最小步骤数(JavaScript) 华为OD机试题 - 任务混部(JavaScript) 华为OD机试题 - N 进…...

整合K8s+SpringCloudK8s+SpringBoot+gRpc

本文使用K8s当做服务注册与发现、配置管理&#xff0c;使用gRpc用做服务间的远程通讯一、先准备K8s我在本地有个K8s单机二、准备service-providerpom<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.…...

Django框架之模型视图--HttpResponse对象

HttpResponse对象 视图在接收请求并处理后&#xff0c;必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建&#xff0c;HttpResponse对象由开发人员创建。 1 HttpResponse 可以使用django.http.HttpResponse来构造响应对象。 HttpResponse(content响应体, con…...

Linux下的Jenkins安装教程

当前环境 CentOS 7.8Java 11&#xff08;注意当前jenkins支持的Java版本最低为Java11&#xff09;FinalShell 3.9&#xff08;操作环境&#xff09; 安装Jenkins PS&#xff1a;不建议使用Docker安装Jenkins&#xff0c;因为使用Jenkins的时候一般会调用外部程序&#xff0c;…...

[软件工程导论(第六版)]第5章 总体设计(课后习题详解)

文章目录1. 为每种类型的模块耦合举一个具体例子。2. 为每种类型的模块内聚举一个具体例子。3. 用面向数据流的方法设计下列系统的软件结构。4. 美国某大学共有200名教师&#xff0c;校方与教师工会刚刚签订一项协议。按照协议&#xff0c;所有年工资超过$26000&#xff08;含$…...

力扣62.不同路径

文章目录力扣62.不同路径题目描述方法1&#xff1a;暴力深搜(超时未通过)方法2&#xff1a;动态规划力扣62.不同路径 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器…...

【验证码的识别】—— 图形验证码的识别

前言 &#xff08;结尾有彩蛋欧&#xff09; 目前&#xff0c;许多网站采取各种各样的措施来反爬虫&#xff0c;其中一个措施便是使用验证码。随着技术的发展&#xff0c;验证码的花样越来越多。验证码最初是几个数字组合的简单的图形验证码&#xff0c;后来加入了英文字母和混…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...