YOLOv8源码修改(5)- YOLO知识蒸馏(下)设置蒸馏超参数:以yolov8-pose为例

目录

前言

1. 不同蒸馏算法资源占用

2. 不动态调整蒸馏损失

2.1  训练定量化结果

2.1 训练结果可视化结果

3. 动态调整蒸馏损失权重及实验分析

3.1 余弦衰减和指数衰减

3.2 CWD蒸馏损失

3.3 MGD蒸馏损失

3.4 AT蒸馏损失

3.5 SKD和PKD蒸馏损失

4. 调权重心得总结

5. 待验证


前言

       YOLOv8源码修改(5)- YOLO知识蒸馏(上)添加蒸馏代码,以yolov8-pose为例进行知识蒸馏

        接上文,我们已经加好了yolo蒸馏训练的必要代码,但并不意味着知识蒸馏就有用。我总结了以下一些可能有影响的因素:

(1)蒸馏算法的选择。最常用的CWD、MGD等知识蒸馏算法,论文中MGD的性能就要好过CWD。

(2)蒸馏算法的超参设置。以MGD为例,alpha_mgd的权重设置,lambda_mgd的权重设置等等,不同的参数设置会取得不同效果,MGD的论文里也写了,他的最佳经验值,是够能在我们自己的数据集上取得最好呢?

(3)蒸馏损失权重的设置。这点我认为是最重要的。因为所有蒸馏算法都绕不开,尤其对于yolo来说,yolo基于检测最基本的loss有box_loss、cls_loss和dfl_loss,如果是obb、seg、pose等任务,还会引入其他的loss。如果蒸馏损失过大,势必会导致其中一些较小的loss“失效”。

(4)数据集本身的质量。以COCO2017人体关键点为例,里面有些人需要预测出,有些人不需要预测出(我认为是标注错误、或者漏标)。但模型可能有别的“思考”,比如,只预测出属于“前景”的人,而“背景”的人不预测。大模型(m号以上)可以区分这种细粒度的区别,但小模型不行,因此就表现为中间层显著的特征差异,这时候知识蒸馏就明显了。而我数据清洗后,几乎没有漏标和错标,只要是人就预测出,这种特征可能相对简单,小模型(s号,n号可能还是不行)已经足够表示,所以再用知识蒸馏,这时效果就不明显了。

(5)教师模型和学生模型的差异。这里的差异不仅表现为中间层维度的差异,还可能是架构的差异,比如用yolov11m去蒸馏yolov8s,从一个维度映射到另一个维度,这种特征映射真的能形成等效表达吗?以及还有性能上的差异,教师模型比学生模型优秀多少,才能让学生模型有一个稳定提升。

(6)蒸馏代码实现的细节。我主要还是参考了paddleDetection中的yolo蒸馏实现,其中对特征用了均值归一化,如果换成一个可学习的BN层是否会更好,还有中间相同维度特征的映射,是否还要再加入一个相同维度的1D卷积?

 经过大量调试训练后,我得出的心得:

        对于实际落地的yolo训练而言(写论文不在其中),一个好的蒸馏算法应该只有一个参数,就是“损失权重”,最多再加一个影响不大的可调节参数。

        根据动态调整训练过程中的损失权重,我发现:不同蒸馏算法的影响可能没有那么大,只要损失权重调整的好,都可以取得一个不错的训练结果。

1. 不同蒸馏算法资源占用

        下面是我训练时候记录的资源占用情况,可以看到MGD训练时间比其他的多了1小时,这些算法大都要生成中间特征,以进行一系列操作,因此显存占用大。

        所以,经过我的调整测试,我一般选择AT来做蒸馏,实现简单,资源占用少,关键还有效。除非准确度有要求,才考虑其他的蒸馏算法。


2. 不动态调整蒸馏损失

2.1  训练定量化结果

        首先,还是问问神奇的GPT,蒸馏损失大小怎么调整,他是这样告诉我的:

        可调节的占比范围大概在0.1-0.8之间,然后如下图绿色框中所示,观察一下yolov8s-pose的几类损失,发现box_loss和dfl_loss很小加起来才等于其他3个损失。所以,我就想蒸馏损失应该控制在20%~30%之间(绝对数值在1.0~2.0之间),这样占比刚好取个平均值。

        基于上面这样设置参数,本文直接进行了实验,得到了以下结果:

        如上图,仅CWD取得比较明显的效果,MGD仅次于CWD。于是,我们就有疑问:这和论文中的结果不对啊。MGD是后发的论文,里面明明还写了自己效果比CWD好的。

        此外,我们还容易发难:这个AT是什么鬼,不仅没正面作用,还产生负面效果了,难道是这个蒸馏算法实现不对,或者就是个rubbish算法,打着“attention”的旗号水论文,根本没有普适性?

        而经过我对训练过程分析,发现恰恰相反,AT是所有算法中收敛最快的,尤其在前50轮的训练,基本要比正常训练高1~2%的点。那就又有疑问了:假设我们从50轮起训练,不加任何蒸馏损失,我AT训练得到的模型,应该有一个更好的起点(各项指标都高),那么最终获取的模型,至少不应该比其他蒸馏算法训练得到的差吧?

        因此,我也做了一些可视化分析。

2.1 训练结果可视化结果

        每10轮,记录一下验证的结果(B表示检测框,P表示关键点):

        根据上面的图表,我很很如看到AT在开始是瑶瑶领先的,收敛速度很快。但是在50轮之后就不行了。那只有一个原因,训练后期,AT的蒸馏损失对模型优化是负面影响。

        因此,我用余弦衰减来对AT蒸馏损失进行加权,最终得到以下变化:

        根据上图,很容易发现,进行衰减加权后,整个训练过程中,取得的性能都要优于直接使用的性能。最终,pose的mAP50:95取得66.8(超正常训练的66.5),也说明知识蒸馏产生了一些效果。


3. 动态调整蒸馏损失权重及实验分析

        使用余弦衰减、指数衰减后损失权重的可视化分析。这里没有使用“温度”这个参数来调整损失大小,是因为相比分类,检测、关键点等损失调整要困难很多,直接用权重加权会简单很多。

3.1 余弦衰减和指数衰减

        也可以引入warmup,因为前期损失过大,不过用了以后,似乎没啥用。

        这两种衰减方式的选择,主要是看损失需不需要快速衰减,比如AT后期没用,可能需要衰减快一点,就用指数衰减,其他可以用余弦衰减。具体还是要根据自己的训练过程中,蒸馏损失下降的特性以及产生的影响去调整。

指数衰减:

余弦衰减:

        衰减的预设参数的代码写在了distillation.py中YOLOv8DistillationLoss类的get_kd_weight方法中:

3.2 CWD蒸馏损失

        如下图,最初用BN来归一化的版本的,下井很快,20轮后比例就稳定在0.11,总统而言,该算法损失下降速度和yolov8-pose的一致,可能不需要加权重,只需要调整比例。

        加权后下降,如下图,精度反而掉了0.3%,参数还需要调整一下。

3.3 MGD蒸馏损失

        MGD的蒸馏损失在后期占比还提升了,说明下降过慢,对应后期性能增加也变慢了。

        我设置最终权重衰减到0.1,不过训练结果好像也没有提升,也没有下降。经过多次实验,我发现只要权重不是设置太高或者太低,该方法都能产生效果,是鲁棒性比较好的一个方法

3.4 AT蒸馏损失

        AT的下降趋势看起和CWD类似,但是比例却不同,损失占比一致在20%左右,可能太高了,但是前期收敛快也是真的快,是唯一一个能在20轮的时候就让原始损失到6.5的,比其他算法快了10轮。

        加权后,衰减到0,衰减好像过快了,导致后期就是没进行知识蒸馏的训练。所以这部分参数还得再调试。

3.5 SKD和PKD蒸馏损失

        这两种算法不会实际用,仅做实验参考。

SKD:2.1中训练效果变差,有原因,就是这个损失在后期占比越来越高,影响原始损失的下降了。

PKD:中规中矩,没啥特点,类似CWD,要用估计也优先用CWD。


4. 调权重心得总结

        我会优先选择AT,因为实现简单,资源消耗少,训练时间也不会变长。实际训练的想法就是但求无错,最好有功。

        求鲁棒性选择MGD,算法对参数设置(用论文中的就行)没那么敏感,多多少少会有些效果。

        求结果选择CWD,只要参数调的好,效果比MGD还好。

        初始权重调整:将蒸馏损失与原始损失的初始比例调整到15%~25%,最终比例调整到5%~15%,可能是一个比较好的设置。

        如果教师模型性能远超学生模型(比如yolov8m-pose蒸馏yolov8n-pose),那么参数设置可以没那么严格,因为我在做m蒸n时,参数直接用的m蒸s的,根本没调,结果也能提升2.5%~2.8%。


5. 待验证

        优于时间有限,目前验证的结论如上。大家可以多尝试,分享下调参经验。

        还可以采用多种/多阶段的知识蒸馏方式,比如AT+MGD,开始设置9:1权重,最后设置1:9权重,因为AT开始效果好,MGD后期效果好一些,可以多尝试。

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

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

相关文章

历年华东师范大学保研上机真题

2025华东师范大学保研上机真题 2024华东师范大学保研上机真题 2023华东师范大学保研上机真题 在线测评链接:https://pgcode.cn/school?classification1 简单一位数代数式计算 题目描述 给一个小学生都会算的1位数与1位数运算的代数式,请你求出这个表…

Oracle 中 SHRINK 与 MOVE 操作的比较

Oracle 中 SHRINK 与 MOVE 操作的比较 在 Oracle 数据库中,SHRINK 和 MOVE 都是用于重组表和索引以减少空间碎片的重要操作,但它们在实现方式和适用场景上有显著区别。 SHRINK 操作 基本语法 ALTER TABLE table_name SHRINK SPACE [COMPACT] [CASCAD…

展锐 Android 15 锁定某个App版本的实现

Android 15 系统锁定Antutu版本的实现方法 在Android系统开发中,有时需要锁定特定应用的版本以确保系统稳定性或测试一致性。本文将介绍如何通过修改Android源码来锁定Antutu跑分软件的版本。 修改概述 这次修改主要涉及以下几个方面: 禁用产品复制文件的检查添加指定版本…

视频剪辑SDK定制开发技术方案与报价书优雅草卓伊凡

视频剪辑SDK定制开发技术方案与报价书-优雅草卓伊凡 一、项目概述 客户需求:开发一套跨平台(Android/iOS/Uni-App)视频剪辑SDK,包含AI字幕提取、转场特效、文字叠加、背景音乐、滤镜、背景替换、动态贴纸等功能。 报价范围&#…

BGP为什么要配置对等IP?

本文由deepseek生成,特此声明 一、为什么要配置对等体IP? 1. 明确标识邻居身份 路由协议需求:动态路由协议(如BGP、OSPF、RIP)需要路由器之间建立邻居关系以交换路由信息。配置对等体IP是为了唯一标识邻居路由器&…

Qt中配置文件读写

1. 保存分组数据到配置文件 #include <QSettings>void saveNetworkConfig() {QSettings settings("network.ini", QSettings::IniFormat);// 网络配置分组settings.beginGroup("Network");// 源地址配置settings.beginGroup("Source");se…

Linux 的编辑器--vim

1.Linux编辑器-vim使⽤ vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;⽽且还有⼀些新的特性在⾥⾯。例如语法加亮&#xff0c;可视化操作不仅可以在终端运⾏&#xff0c;也可以…

SAP Commerce(Hybris)开发实战(二):登陆生成token问题

问题简述 最近处理Hybris框架标准的登陆功能&#xff0c;遇到一个问题&#xff1a;用两个不同的浏览器&#xff0c;同时登陆一个账号&#xff0c;会同时生成两个不同的token和refreshToken。 问题原因 解决了其实非常简单&#xff0c;就是Hybris的Employee表中&#xff0c;有一…

c/c++的opencv椒盐噪声

在 C/C 中实现椒盐噪声 椒盐噪声&#xff08;Salt-and-Pepper Noise&#xff09;&#xff0c;也称为脉冲噪声&#xff08;Impulse Noise&#xff09;&#xff0c;是数字图像中常见的一种噪声类型。它的特点是在图像中随机出现纯白色&#xff08;盐&#xff09;或纯黑色&#x…

LIEDNet: A Lightweight Network for Low-light Enhancement and Deblurring论文阅读

摘要 夜间拍摄的图像常常面临诸如低光和模糊等挑战&#xff0c;这些问题主要是由于昏暗环境和长时间曝光的频繁使用所导致。现有方法要么独立处理这两种退化问题&#xff0c;要么依赖于通过复杂机制生成的精心设计的先验知识&#xff0c;这导致了较差的泛化能力和较高的模型复…

谈谈worldquant中设置的几个意思

Decay 是一个设置&#xff0c;用于确定要反映多少过去的位置。正如我们之前详细介绍的那样&#xff0c;Decay 值越高&#xff0c;Alpha 周转率越低。但是&#xff0c;请注意&#xff0c;Alpha 的夏普比率可能会随着信息延迟而降低。 创建 Alpha 时&#xff0c;头寸可能会集中在…

大模型和AI工具汇总(一)

一、国内可免费使用的大模型&#xff08;持续更新&#xff09; DeepSeek 模型介绍&#xff1a;DeepSeek 系列包括 DeepSeek V3&#xff08;通用场景&#xff09;、DeepSeek R1&#xff08;推理模型&#xff09;&#xff0c;支持高达 64K 上下文长度&#xff0c;中文场景表现优…

HarmonyOS NEXT 技术特性:分布式软总线技术架构

HarmonyOS NEXT 技术特性&#xff1a;分布式软总线技术架构 随着物联网发展&#xff0c;2030 预计全球联网设备达 2000 亿&#xff0c;异构设备互联难题凸显&#xff0c;分布式软总线作为 HarmonyOS 生态核心&#xff0c;以软件虚拟总线打破物理局限&#xff0c;让跨品牌设备即…

什么是VR展馆?VR展馆的实用价值有哪些?

VR展馆&#xff0c;重塑展览体验。在数字化时代浪潮的推动下&#xff0c;传统的实体展馆经历前所未有的变革。作为变革的先锋&#xff0c;VR展馆以无限的潜力&#xff0c;成为展览行业的新宠。 VR展馆&#xff0c;即虚拟现实展馆&#xff0c;是基于VR&#xff08;Virtual Real…

VLA模型:自动驾驶与机器人行业的革命性跃迁,端到端智能如何重塑未来?

当AI开始操控方向盘和机械臂&#xff0c;人类正在见证一场静默的产业革命。 2023年7月&#xff0c;谷歌DeepMind抛出一枚技术核弹——全球首个视觉语言动作模型&#xff08;VLA&#xff09;RT-2横空出世。这个能将“把咖啡递给穿红衣服的阿姨”这类自然语言指令直接转化为机器人…

华为OD机试真题——出租车计费/靠谱的车 (2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

40 岁 Windows 开启 AI 转型:从系统到生态的智能重构

在科技快速发展的当下&#xff0c;人工智能成为驱动各领域变革的核心力量&#xff0c;拥有 40 年历史的 Windows 也开启了向 AI 的全面转型。2025 年 5 月 19-22 日西雅图 Build 2025 开发者大会上&#xff0c;微软展示了 Windows 11 向 AI 智能体核心平台转型的战略&#xff0…

Python实例题:Python3实现可控制肉鸡的反向Shell

目录 Python实例题 题目 代码实现 reverse_shell_client.py reverse_shell_server.py 实现原理 反向连接机制&#xff1a; 命令执行与传输&#xff1a; 功能特点&#xff1a; 关键代码解析 服务端命令处理 客户端命令执行 客户端持久化连接 使用说明 启动服务端…

AWS EC2 使用Splunk DB connect 连接 RDS mysql

1: 先创建 RDS mysql: 我们选择free: 选择free 过后,自动生成single instance, 没有垮AZ 的db 设置。 选择密码登入: 注意:上面设置密码的时候,特别提示:不能有特殊字符,我就设置了: mypassword 下面可以选择通过EC2 连接,当然也可以不选:

SAP重塑云ERP应用套件

在2025年Sapphire大会上&#xff0c;SAP正式发布了其云ERP产品的重塑计划&#xff0c;推出全新“Business Suite”应用套件&#xff0c;并对供应链相关应用进行AI增强升级。这一变革旨在简化新客户进入SAP生态系统的流程&#xff0c;同时为现有客户提供更加统一、智能和高效的业…