2026/6/28 23:35:30
网站建设
项目流程
用thinkcmf做的网站,企业网站的管理系统,务分销系统,企业设计网站推荐前言
本文介绍了新型视觉适配器微调方法Mona#xff0c;并将其集成到YOLO26中。传统全参数微调成本高、存储负担重且有过拟合风险#xff0c;现有PEFT方法性能落后。Mona仅调整5%以内的骨干网络参数#xff0c;在多个视觉任务中超越全参数微调。其核心亮点包括参数效率高、…前言本文介绍了新型视觉适配器微调方法Mona并将其集成到YOLO26中。传统全参数微调成本高、存储负担重且有过拟合风险现有PEFT方法性能落后。Mona仅调整5%以内的骨干网络参数在多个视觉任务中超越全参数微调。其核心亮点包括参数效率高、性能突破和即插即用。适配器模块包含降维、多认知视觉滤波器等单元通过深度可分离卷积和多尺度卷积核处理视觉信号还加入分布适配层优化输入分布。我们将Mona集成到YOLO26经注册和配置yaml文件后进行实验展现出良好效果。文章目录 YOLO26改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLO26改进专栏文章目录前言介绍摘要文章链接基本原理一、提出背景二、核心亮点三、方法架构与核心设计1. 整体模块结构2. 两大核心创新设计核心代码YOLO26引入代码注册步骤1:步骤2配置yolo26-Mona.yaml实验脚本结果介绍摘要MonaMulti-cognitive Visual Adapter是一种新型视觉适配器微调方法旨在打破传统全参数微调full fine-tuning在视觉识别任务中的性能瓶颈。Mona 方法通过引入多认知视觉滤波器和优化输入分布仅调整 5% 的骨干网络参数就能在实例分割、目标检测、旋转目标检测等多个经典视觉任务中超越全参数微调的效果显著降低了适配和存储成本为视觉模型的高效微调提供了新的思路。文章链接论文地址论文地址代码地址代码地址基本原理Mona是由清华大学、国科大、上海交大、阿里巴巴联合提出的新型视觉适配器微调方法相关论文《5%100%: Breaking Performance Shackles of Full Fine-Tuning on Visual Recognition Tasks》已被CVPR2025收录其核心目标是打破传统全参数微调的性能与成本枷锁为视觉大模型高效微调提供新方案。一、提出背景传统全参数微调的痛点成本极高需更新模型全部参数以早期BERT为例单卡训练100万数据需5-7小时万亿级参数模型的微调对硬件和时间要求更苛刻存储负担重多任务场景下需为每个任务保存完整模型副本存在过拟合风险大模型直接微调易因数据分布差异出现性能下降。现有PEFT方法的局限参数高效微调PEFT虽能仅调整少量参数实现模型适配但视觉领域的多数PEFT方法性能仍落后于全参数微调无法兼顾效率与效果。二、核心亮点参数效率极高仅调整5%以内的骨干网络参数远低于传统PEFT方法的参数改动占比大幅降低适配和存储成本性能突破枷锁在实例分割、目标检测、图像分类等多类视觉任务中首次实现小于5%参数成本下超越全参数微调的性能即插即用特性可便捷嵌入现有视觉模型架构如Swin-Transformer无需大规模重构模型。三、方法架构与核心设计1. 整体模块结构Mona的适配器模块包含降维、多认知视觉滤波器、激活函数、升维等单元并内置跳跃连接Skip-Connections可无缝集成至Swin-Transformer等主流视觉骨干网络整体流程为输入特征经LayerNorm处理后先降维至内部维度再通过多认知滤波器增强特征表达经GELU激活和dropout后升维还原最终与原始特征残差连接输出。2. 两大核心创新设计多认知视觉滤波器这是Mona的核心模块通过深度可分离卷积和**多尺度卷积核3×3、5×5、7×7**实现对二维视觉信号的精准处理与传统线性适配器不同其专门针对视觉任务设计可完成多尺度特征融合提升模型对视觉信息的理解能力具体是将3种尺度卷积的输出均值后与原始特征残差连接再经1×1卷积投影优化。输入分布优化在适配器前端加入分布适配层Scaled LayerNorm通过可学习参数gamma和gammax调整输入特征分布使预训练特征更适配适配器的处理逻辑提升微调效率。核心代码classMona(BaseModule):def__init__(self,in_dim,factor4):super().__init__()self.project1nn.Linear(in_dim,64)self.nonlinearF.gelu self.project2nn.Linear(64,in_dim)self.dropoutnn.Dropout(p0.1)self.adapter_convMonaOp(64)self.normnn.LayerNorm(in_dim)self.gammann.Parameter(torch.ones(in_dim)*1e-6)self.gammaxnn.Parameter(torch.ones(in_dim))defforward(self,x,hw_shapesNone):identityx xself.norm(x)*self.gammax*self.gammax project1self.project1(x)b,n,cproject1.shape h,whw_shapes project1project1.reshape(b,h,w,c).permute(0,3,1,2)project1self.adapter_conv(project1)project1project1.permute(0,2,3,1).reshape(b,n,c)nonlinearself.nonlinear(project1)nonlinearself.dropout(nonlinear)project2self.project2(nonlinear)returnidentityproject2YOLO26引入代码在根目录下的ultralytics/nn/目录新建一个otherModules目录然后新建一个以Mona为文件名的py文件 把代码拷贝进去。importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassMonaOp(nn.Module):def__init__(self,in_features):super().__init__()self.conv1nn.Conv2d(in_features,in_features,kernel_size3,padding3//2,groupsin_features)self.conv2nn.Conv2d(in_features,in_features,kernel_size5,padding5//2,groupsin_features)self.conv3nn.Conv2d(in_features,in_features,kernel_size7,padding7//2,groupsin_features)self.projectornn.Conv2d(in_features,in_features,kernel_size1,)defforward(self,x):identityx conv1_xself.conv1(x)conv2_xself.conv2(x)conv3_xself.conv3(x)x(conv1_xconv2_xconv3_x)/3.0identity identityx xself.projector(x)returnidentityxclassMona(nn.Module):def__init__(self,in_dim):super().__init__()self.project1nn.Conv2d(in_dim,64,1)self.nonlinearF.gelu self.project2nn.Conv2d(64,in_dim,1)self.adapter_convMonaOp(64)self.normnn.LayerNorm(in_dim)self.dropoutnn.Dropout(p0.1)self.gammann.Parameter(torch.ones(in_dim,1,1)*1e-6)self.gammaxnn.Parameter(torch.ones(in_dim,1,1))defforward(self,x):identityx x_normx.permute(0,2,3,1).contiguous()x_normself.norm(x_norm)xx_norm.permute(0,3,1,2).contiguous()*self.gammax*self.gammax project1self.project1(x)project1self.adapter_conv(project1)nonlinearself.nonlinear(project1)nonlinearself.dropout(nonlinear)project2self.project2(nonlinear)returnidentityproject2注册在ultralytics/nn/tasks.py中进行如下操作步骤1:fromultralytics.nn.otherModules.MonaimportMona步骤2修改def parse_model(d, ch, verboseTrue):elifmisMona:args[ch[f]]c2ch[f]配置yolo26-Mona.yamlultralytics/cfg/models/26/yolo26-Mona.yaml# Ultralytics AGPL-3.0 License - https://ultralytics.com/license# Ultralytics YOLO26 object detection model with P3/8 - P5/32 outputs# Model docs: https://docs.ultralytics.com/models/yolo26# Task docs: https://docs.ultralytics.com/tasks/detect# Parametersnc:80# number of classesend2end:True# whether to use end-to-end modereg_max:1# DFL binsscales:# model compound scaling constants, i.e. modelyolo26n.yaml will call yolo26.yaml with scale n# [depth, width, max_channels]n:[0.50,0.25,1024]# summary: 260 layers, 2,572,280 parameters, 2,572,280 gradients, 6.1 GFLOPss:[0.50,0.50,1024]# summary: 260 layers, 10,009,784 parameters, 10,009,784 gradients, 22.8 GFLOPsm:[0.50,1.00,512]# summary: 280 layers, 21,896,248 parameters, 21,896,248 gradients, 75.4 GFLOPsl:[1.00,1.00,512]# summary: 392 layers, 26,299,704 parameters, 26,299,704 gradients, 93.8 GFLOPsx:[1.00,1.50,512]# summary: 392 layers, 58,993,368 parameters, 58,993,368 gradients, 209.5 GFLOPs# YOLO26n backbonebackbone:# [from, repeats, module, args]-[-1,1,Conv,[64,3,2]]# 0-P1/2-[-1,1,Conv,[128,3,2]]# 1-P2/4-[-1,2,C3k2,[256,False,0.25]]-[-1,1,Conv,[256,3,2]]# 3-P3/8-[-1,2,C3k2,[512,False,0.25]]-[-1,1,Conv,[512,3,2]]# 5-P4/16-[-1,2,C3k2,[512,True]]-[-1,1,Conv,[1024,3,2]]# 7-P5/32-[-1,2,C3k2,[1024,True]]-[-1,1,Mona,[1024,5]]# 9-[-1,2,C2PSA,[1024]]# 10# YOLO26n headhead:-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,6],1,Concat,[1]]# cat backbone P4-[-1,2,C3k2,[512,True]]# 13-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,4],1,Concat,[1]]# cat backbone P3-[-1,2,C3k2,[256,True]]# 16 (P3/8-small)-[-1,1,Conv,[256,3,2]]-[[-1,13],1,Concat,[1]]# cat head P4-[-1,2,C3k2,[512,True]]# 19 (P4/16-medium)-[-1,1,Conv,[512,3,2]]-[[-1,10],1,Concat,[1]]# cat head P5-[-1,1,C3k2,[1024,True,0.5,True]]# 22 (P5/32-large)-[[16,19,22],1,Detect,[nc]]# Detect(P3, P4, P5)实验脚本importwarnings warnings.filterwarnings(ignore)fromultralyticsimportYOLOif__name____main__:# 修改为自己的配置文件地址modelYOLO(./ultralytics/cfg/models/26/yolo26-Mona.yaml)# 修改为自己的数据集地址model.train(data./ultralytics/cfg/datasets/coco8.yaml,cacheFalse,imgsz640,epochs10,single_clsFalse,# 是否是单类别检测batch8,close_mosaic10,workers0,# optimizerMuSGD, # 使用MuSGD优化器会报错optimizerSGD,ampFalse,projectruns/train,nameyolo26-Mona,)结果