yolov6算法及其改进

yolov6算法及其改进

  • 1、YOLOV6简介
  • 2、RepVGG重参思想
  • 3、YOLOv6架构改进
    • 3.1、Backbone方面
    • 3.2、SPP改进
    • 3.3、Neck改进
    • 3.4、Head改进
  • 4、正负样本匹配与损失函数
    • 4.1、TaskAligned样本匹配
    • 4.2、VFL Loss分类损失函数
    • 4.3、SIOU损失函数
    • 4.4、DFL损失函数

1、YOLOV6简介

在这里插入图片描述
YOLOv6设计主要包含以下几个方面:

  • 网络架构设计:对于Backbone和Neck,延续了YOLOv4和YOLOv5的PAN架构思想并使用了重参思想进行了改进;关于Head部分,作者Decoupled Head进行了简化并将其命名为Efficient Decouple Head;
  • 标签匹配:对TaskAlign、SimOTA、ObjectBox以及ATSS等进行了评估,最终确认TaskAlign更为有效且训练友好;
  • 损失函数:损失函数一般包含cls loss、box-regression loss以及object loss。YOLOv6进行了系统性分析并最终选择VariFocal Loss作为分类损失,SIoU/GIoU作为回归损失;

2、RepVGG重参思想

ResNet,其残差结构也是多路结构。但是需要注意的是,多路结构需要保存中间结果,显存占有量会明显增高,只有到多路融合时,显存会会降低。这里如下图所示:
在这里插入图片描述
由ShuffleNet论文中提到的网络高效推理法则:模型分支越少,速度越快。所以,可想而知,多分支结果虽然会带来高性能收益,但是,显存占用明显增加,且模型推理速度会一定程度降低,这在工业场景上是不实用的。

VGG几乎都是由3×3卷积堆叠而成,而现在加速库,比如NVIDIA的cudNN,Intel的MKL和相关硬件对3×3的卷积核有非常好的性能优化,而在VGG中几乎都是3×3卷积。
VGG利用现有加速库会得到更好的性能优化,从下表就就可以看出,在相同channels、input_size和batchsize条件下,不同卷积核的FLOPs和TFLOPs和用时,可以看出3×3卷积非常快。
在GPU上,3×3卷积的计算密度(理论运算量(Theoretical FLOPs/Time usage)除以所用时间)可达1×1和5×5卷积的4倍。
在这里插入图片描述
VGG是一个直筒性单路结构,由上述分析可知,单路结构会占有更少的内存,因为不需要保存其中间结果,同时,单路架构非常快,因为并行度高。同样的计算量,大而整的运算效率远超小而碎的运算。

多分支结构会引入网络结构的约束,比如Resnet的残差结构要求输入和卷积出来的张量维度要一致(这样才能相加),这种约束导致网络不易延伸拓展,也一定程度限制了通道剪枝。对应的单路结构就比较友好,非常容易改变各层的宽度,这样剪枝后也能得到很好的加速比。
RepVGG主体部分只有一种算子:3×3卷积+ReLU。在设计专用芯片时,给定芯片尺寸或造价,可以集成海量的3×3卷积-ReLU来达到高效率。此外单路架构的省内存特性也可以帮降低存储单元。
综上所述,提出了RepVGG结构,如图所示:
在这里插入图片描述
在这里插入图片描述
从Step1到Step2的变换过程,涉及conv于BN层融合,1×1卷积与identity转化为等价的3×3卷积的形式;
结构重参化的最后一步也就是上图中Step2 => Step3, 这一步就是利用卷积可加性原理,将3个分支的卷积层和bias对应相加组成最终一个3×3卷积的形式即可。
这里,大家可能既然把BN、identity、1×1卷积和conv_3×3都融合在一起了,为什么不干脆把ReLU也融合进去呢?其实也是可以将ReLU层进行融合的,但是需要进行量化,conv输出tensor的值域直接使用relu输出的值阈,就可以完成conv和relu合并。无量化动作的优化是无法完成conv+relu的合并。

CONV+BN融合
在这里插入图片描述
这其实就是一个卷积层,只不过权重考虑了BN的参数,令:
在这里插入图片描述
最终的融合结果即为:
在这里插入图片描述
代码如下:
在这里插入图片描述
identity融合成33:
在这里插入图片描述
1
1融合成3*3
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、YOLOv6架构改进

在这里插入图片描述
网络架构设计:

  • 在Backbone方面,YOLOv6在小规模模型(n/t/s模型)采用RepBlock进行构建;对于大规模模型(m/l模型)采用CSPStackRepBlock进行构建;
  • 在Neck方面,YOLOv6延续了YOLOv4与YOLOv5的设计思想,依旧使用的是PAN-FPN架构,同时采用RepBlock(n/t/s模型)与CSPStackRepBlock(m/l模型)进行特征的增强;
  • 在Head方面,对Decoupled Head进行改进,最终使用Efficient Decouple Head;

3.1、Backbone方面

在这里插入图片描述
,YOLOv6作者设计了一种高效重参模块EfficientRep(图左),在推理阶段EfficientRep则可以折叠为图右所示的结构,进而使得Backbone能更好利用硬件计算资源达成更低的推理延迟。
在这里插入图片描述
中间是小模型,右边是大模型

YOLOv6作者实验发现,单方面的使用RepVGG Block的堆叠(EfficientRep Backbone),对于小规模模型是比较友好的,对于大模型表现并不是很理想。因此,针对大模型YOLOv6借鉴CSP思想构建了下图所示的CSPStackRepBlock模块。

3.2、SPP改进

在这里插入图片描述
1、对于小规模模型(n/t/s模型),RepBlock即为RepVGG Block;
2、对于大规模模型(m/l模型),RepBlock即为CSPStackRepBlock;
对于SimSPPF,其运行效率高于SPP。
下图依次为SPP、SPPF以及SimSPPF的结构图。

3.3、Neck改进

YOLOv6对YOLOv4和YOLOv5所采用的PAN-FPN架构进行了改进:
对于小模型,采用RepBlock替换CSPBlock;对于大模型,采用CSPStackRepBlock替换CSPBlock。作者将YOLOv6的Neck命名为Rep-PAN。
还研究了Neck宽度和深度对YOLOv6-L的影响。结果表明,在几乎相同的推理速度下,细长Neck的表现比宽浅Neck好0.2%。
这里的粗细指的是3个Stage对应的Channel的数量;
这里的深浅指的是模块堆叠的数量;
在这里插入图片描述
在这里插入图片描述

3.4、Head改进

在这里插入图片描述
YOLOv6采用了一种Hybrid-channel策略构建了一种更高效Decoupled Head。具体来说,将中间3×3卷积数量减少为1个,同时channel数量也随Neck进行调整。

4、正负样本匹配与损失函数

4.1、TaskAligned样本匹配

在YOLOv6的早期版本中使用了SimOTA作为标签分配方法。SimOTA 减少了额外的超参数并保持了性能,但是在实践中发现引入SimOTA会减慢训练过程。同时可能会使训练陷入不稳定。
之后,YOLOv6最新版本找到一个替代SimOTA的匹配方法,TaskAlign。

任务对齐学习(TAL)首次在TOOD中提出,其中设计了分类得分和bbox质量的统一度量。IoU被此度量替换以分配对象标签。在一定程度上,任务不一致的问题(分类和bbox)得到了缓解。
TOOD的另一个主要贡献是关于任务对齐头(T-head)。T-head堆叠卷积层以构建交互特征,在T-head上使用任务对齐预测器(TAP)。PP-YOLOE通过用ESE Attention取代T-head中的Layer Attention,从而改进了T-head,形成ET-head。
然而,ET-head会降低模型推理速度,并且不会带来精度增益。因此,保留了高效Decoupled Head设计。

为与NMS搭配,训练样例的Anchor分配需要满足以下两个规则:
1、正常对齐的Anchor应当可以预测高分类得分,同时具有精确定位;
2、不对齐的Anchor应当具有低分类得分,并在NMS阶段被抑制。
基于上述两个目标,TOOD设计了一个新的Anchor alignment metric 来在Anchor level 衡量Task-Alignment的水平。并且,Alignment metric 被集成在了 sample 分配和 loss function里来动态的优化每个 Anchor 的预测。

Anchor alignment metric:
分类得分和 IoU表示了这两个任务的预测效果,所以,TOOD使用分类得分和IoU的高阶组合来衡量Task-Alignment的程度。使用下列的方式来对每个实例计算Anchor-level 的对齐程度:

在这里插入图片描述
s 和 u 分别为分类得分和 IoU 值,α 和 β 为权重超参。
从上边的公式可以看出来,t 可以同时控制分类得分和IoU 的优化来实现 Task-Alignment,可以引导网络动态的关注于高质量的Anchor。

Training sample Assignment:
为提升两个任务的对齐性,TOOD聚焦于Task-Alignment Anchor,采用一种简单的分配规则选择训练样本:对每个实例,选择m个具有最大t值的Anchor作为正样本,选择其余的Anchor作为负样本。然后,通过损失函数(针对分类与定位的对齐而设计的损失函数)进行训练。

4.2、VFL Loss分类损失函数

在这里插入图片描述
其中y为0~1的质量标签,来自预测的bbox和gt bbox的iou值,注意如果是负样本,则y直接等于0,σ是分类分支经过sigmoid后的预测值。可以发现广义focal loss将focal loss只能支持离散label的限制推广到了连续label,并且强制将分类分支对应类别处的预测值变成了包括bbox预测准确度。
VFL主要改进是提出了非对称的加权操作,FL和QFL都是对称的。而非对称加权的思想来源于论文PISA,该论文指出首先正负样本有不平衡问题,即使在正样本中也存在不等权问题,因为mAP的计算是主正样本。

在这里插入图片描述
q是label,正样本时候q为bbox和gt的IoU,负样本时候q=0,当为正样本时候其实没有采用FL,而是普通的BCE,只不过多了一个自适应IoU加权,用于突出主样本。而为负样本时候就是标准的FL了。可以明显发现VFL比QFL更加简单,主要特点是正负样本非对称加权、突出正样本为主样本。

4.3、SIOU损失函数

IoU、GIoU、CIoU、DIoU loss等等,这些损失函数通过考虑预测框与目标框之前的重叠程度、中心点距离、纵横比等因素来衡量两者之间的差距,从而指导网络最小化损失以提升回归精度,但是这些方法都没有考虑到预测框与目标框之间方向的匹配性。

SIoU 损失函数通过引入了所需回归之间的向量角度,重新定义了距离损失,有效降低了回归的自由度,加快了网络模型的收敛,并且在小规模模型(n/t/s模型)上可以一定程度上提升精度。

YOLOv6对小模型采用SIoU损失,大模型采用GIoU损失。

Zhora Gevorgyan 证明了中心对齐的边界框会具有更快的收敛速度,以Angle cost、Distance cost、Shape cost 构造了SIoU。其中Angle cost 描述了边界框中心连线与 x-y 轴的最小夹角:
在这里插入图片描述
Distance cost 描述了两边界框的中心点在x轴和y轴上的归一化距离,其惩罚力度与 Angle cost 正相关。Distance cost 被定义为:
在这里插入图片描述
Shape cost 描述了两边界框的形状差异,当两边界框的尺寸不一致时不为 0。Shape cost 被定义为:

在这里插入图片描述
SIOU的惩罚项由Distance cost 和Shape cost 组成:
在这里插入图片描述

4.4、DFL损失函数

这里的DFL(Distribution Focal Loss),其主要是将框的位置建模成一个 general distribution,让网络快速的聚焦于和目标位置距离近的位置的分布。
在这里插入图片描述
在这里插入图片描述

yi和 yi+1是浮点值 y 的左右整数值,S是输出分布,长度为17;
DFL 能够让网络更快地聚焦于目标 y 附近的值,增大它们的概率;
DFL的含义是以交叉熵的形式去优化与标签y最接近的一左一右2个位置的概率,从而让网络更快的聚焦到目标位置的邻近区域的分布;
也就是说学出来的分布理论上是在真实浮点坐标的附近,并且以线性插值的模式得到距离左右整数坐标的权重。

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

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

相关文章

面试241228

面试可参考 1、cas的概念 2、AQS的概念 3、redis的数据结构 使用场景 不熟 4、redis list 扩容流程 5、dubbo 怎么进行服务注册和调用,6、dubbo 预热 7如何解决cos上传的安全问题kafka的高并发高吞吐的原因ES倒排索引的原理 spring的 bean的 二级缓存和三级缓存 spr…

小程序配置文件 —— 13 全局配置 - window配置

全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段,window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色; 状态栏:顶部位置,有网络信号、时间信息、电池信息等;导航条:有一个当…

STM32 与 AS608 指纹模块的调试与应用

前言 在嵌入式系统中,指纹识别作为一种生物识别技术,广泛应用于门禁系统、考勤机、智能锁等场景。本文将分享如何在 STM32F103C8T6 开发板上使用 AS608 指纹模块,实现指纹的录入和识别功能。 硬件准备 STM32F103C8T6 开发板AS608 指纹模块…

3GPP R18 MT-SDT

Rel-17 指定MO-SDT允许针对UL方向的数据包进行小数据包传输。对于DL,MT-SDT(即DL触发的小数据)可带来类似的好处,即 通过不转换到 RRC_CONNECTED来减少信令开销和UE功耗,并通过允许快速传输(小而少见的)数据包(例如用于定位)来减少延迟。 在R17中,NR_SmallData_INACTIVE的工…

小程序基础 —— 02 微信小程序账号注册

微信小程序账号注册 小程序开发与网页开发不一样,在开始微信小程序开发之前,需要访问微信公众平台,注册一个微信小程序账号。 有了小程序的账号以后,才可以开发和管理小程序,后续需要通过该账号进行开发信息的设置、…

两个链表的第一个公共结点

输入两个链表,找出它们的第一个公共结点。 当不存在公共节点时,返回空节点。 数据范围 链表长度 [1,2000] 保证两个链表不完全相同,即两链表的头结点不相同。 算法思想描述 如上图所示,两种链表的出现的情况只有图中2中&…

OpenAI 12天发布会:AI革命的里程碑@附35页PDF文件下载

在人工智能的浪潮中,OpenAI的12天发布会无疑是2024年科技界的一场盛宴。从12月5日开始,OpenAI连续12天每天发布一个新应用或功能,标志着AI技术的又一次飞跃。本文将梳理这些激动人心的发布,带你一探究竟。 OpenAI发布会概览 Ope…

理解数列和函数的极限

什么是数列 数列就是按照1定顺序排列的数字, 也可以理解为包含数字元素的队列 格式: a 1 , a 2 , a 3 , . . . , a n a_1, a_2, a_3, ..., a_n a1​,a2​,a3​,...,an​, n ∈ N n \in N n∈N 或者 { a n } \{ a_n \} {an​}, n ∈ N n \in N n∈N 其中 a n…

TOP K问题:利用堆排序找出数组中最小的k个数

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 找小的数需要建大堆来解决,首先将数组中前K个数建成一个大堆,将从k1个数直到数组结束的所有数与堆顶的数进行比较,如果比堆顶的数小,则替换堆顶的数…

6-Gin 路由详解 --[Gin 框架入门精讲与实战案例]

Gin 是一个用 Go 语言编写的 HTTP Web 框架,以其高性能和简洁的 API 而闻名。它提供了一套强大的路由功能,使得开发者可以轻松地定义 URL 路由规则,并将这些规则映射到具体的处理函数(handler)。以下是关于 Gin 路由的…

【数据库初阶】Linux中库的基础操作

🎉博主首页: 有趣的中国人 🎉专栏首页: 数据库初阶 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 Linux…

【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)11

文章目录 一、算法概念11二、算法原理(一)感知机(二)多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点(一)优点(二)缺点 四、MLP分类任务实…

【LLM】OpenAI 的DAY12汇总和o3介绍

note o3 体现出的编程和数学能力,不仅达到了 AGI 的门槛,甚至摸到了 ASI(超级人工智能)的边。 Day 1:o1完全版,开场即巅峰 12天发布会的开场即是“炸场级”更新——o1完全版。相比此前的预览版本&#x…

MaixBit k210学习记录

开发背景:Window系统主机,在主机上安装了虚拟机(VirtualBoxUbuntu23.04) 目标实现:在虚拟机(Ubuntu)中,实现对Maix bit(k210)开发板的开发 虚拟机的安装参考…

ExpDemo-JavaFX打造属于你自己的图形化漏洞利用工具

声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! 目录标题 前言编写属于你的图像化漏洞利用工具项目结构编写EXP部署 部…

串口通信标准RS232、RS422、RS485有什么区别和不同

目录 第一个区别:硬件管脚接口定义不同: 第二个区别、工作方式不同 第三个区别、通信方式不同 第四个区别,逻辑特性不同 第五个区别、抗干扰性、传输距离和传输速率也不同 RS-232与RS-485对比 RS-422与RS-485对比 今天给大家分享的是&…

银河麒麟操作系统安装达梦数据库(超详细)

目录 引言1. 前期准备1.1 安装麒麟系统1.2 下载达梦数据库安装包(DM8)1.3 上传安装包到麒麟系统1.4 挂载安装包(iso)文件1.5 配置安装用户和组1.6 创建安装路径及修改权限1.7 设置临时安装目录 2. 安装达梦数据库(DM8&…

Linux-frp_0.61.1内网穿透的配置和使用

下载frp frp官网 https://gofrp.org/zh-cn/docs/setup/ frp安装包下载地址 https://github.com/fatedier/frp/releases?page1 下载之后在服务器上 解压 tar -zxvf frp_0.61.1_linux_amd64.tar.gztar:一个用于压缩和解压缩的工具。-z:表示使用 gzi…

04.HTTPS的实现原理-HTTPS的混合加密流程

04.HTTPS的实现原理-HTTPS的混合加密流程 简介1. 非对称加密与对称加密2. 非对称加密的工作流程3. 对称加密的工作流程4. HTTPS的加密流程总结 简介 主要讲述了HTTPS的加密流程,包括非对称加密和对称加密两个阶段。首先,客户端向服务器发送请求&#xf…

【从零开始入门unity游戏开发之——C#篇34】C#匿名函数(delegate )和Lambda表达式

文章目录 一、匿名函数(delegate )1、什么是匿名函数?2、匿名函数的基本语法2.1 语法2.2 **没有参数的匿名函数:**2.3 **有参数的匿名函数:**2.4 **有返回值的匿名函数:** 3、匿名函数的使用示例3.1 作为参…