YOLO26改进 - 卷积Conv | RefConv重新参数化重聚焦卷积:突破传统卷积瓶颈,有效减少通道冗余

前言

本文介绍了重新参数化再聚焦卷积(RefConv)在YOLO26中的结合应用。RefConv通过对预训练模型的基础卷积核应用可训练的再聚焦转换,建立参数间连接,利用预训练参数作为先验学习新表示,增强模型表示能力。它能减少通道冗余、平滑损失景观,提升多种基于CNN模型在图像分类、目标检测和语义分割上的性能,且不增加推理成本或改变模型结构。我们将RefConv集成到YOLO26的主干网络中,并进行相关注册和配置。实验结果验证了其有效性。

文章目录: YOLO26改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总

专栏链接: YOLO26改进专栏

文章目录

  • 前言
  • 介绍
    • 摘要
  • 文章链接
  • 基本原理
  • 核心代码
  • YOLO26引入代码
  • 注册
    • 步骤1:
    • 步骤2
  • 配置yolo26-RefConv.yaml
  • 实验
    • 脚本
    • 结果

介绍

摘要

我们提出了重新参数化再聚焦卷积(Re - parameterized Refocusing Convolution, RefConv)作为常规卷积层的替代方案,这是一个即插即用的模块,能够在不增加推理成本的前提下提升性能。具体而言,针对预训练模型,RefConv会对从预训练模型继承而来的基础卷积核实施可训练的再聚焦转换,以此在参数之间构建联系。例如,深度卷积的RefConv能够将特定通道的卷积核参数与其他卷积核的参数相关联,即便这些参数重新聚焦于模型的其他部分,而非仅仅关注输入特征。从另一视角来看,RefConv借助将预训练参数中编码的表示作为先验信息,并对这些先验进行重新聚焦以学习新的表示,进而增强预训练模型的表示能力。实验结果证实,RefConv能够显著提高多种基于卷积神经网络(CNN)的模型在图像分类(在ImageNet上最高可使top - 1准确率提升1.47%)、目标检测和语义分割等任务上的性能,且不会引入任何额外的推理成本,也不会改变原始模型结构。进一步研究显示,RefConv能够减少通道冗余并使损失景观更加平滑,这为其有效性提供了解释。

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

RefConv是一种重新参数化的重聚焦卷积模块,旨在提高卷积神经网络的性能,而无需额外的推断成本。它通过应用可训练的重聚焦变换到预训练模型的基础核来建立参数之间的连接。RefConv可以取代原始的卷积层,使特定通道的卷积核参数与其他卷积核的参数相关联,从而使它们重新聚焦到模型的其他部分,而不仅仅关注输入特征。这样做可以利用预训练参数中编码的表示作为先验,并重新聚焦到这些表示上,从而学习新颖的表示,进一步增强预训练模型的表示能力。

  1. 重聚焦变换:给定一个预训练模型,RefConv应用可训练的重聚焦变换到继承自预训练模型的基础核上,以建立参数之间的连接。例如,一个深度卷积的RefConv可以将特定通道的卷积核参数与其他卷积核的参数相关联,使它们重新聚焦到模型的其他部分,而不仅仅关注输入特征。

  2. 增强模型结构的先验:RefConv通过利用预训练参数中编码的表示作为先验,并重新聚焦到这些表示上,学习新颖的表示,从而增强预训练模型的表示能力。这种方法不改变模型结构,而是通过改变卷积核参数之间的关系来提高模型性能。

  3. 通道冗余减少和损失曲面平滑:RefConv可以减少通道冗余,使损失曲面更加平滑。通过扩大核通道之间的KL散度,减少通道相似性和冗余,RefConv能够学习更多样化的表示,增强模型的表示能力。

核心代码

importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassRepConv(nn.Module):def__init__(self,in_channels,out_channels,kernel_size,stride,padding=None,groups=1,map_k=3):super(RepConv,self).__init__()assertmap_k<=kernel_size# 记录原始卷积核形状self.origin_kernel_shape=(out_channels,in_channels//groups,kernel_size,kernel_size)self.register_buffer('weight',torch.zeros(*self.origin_kernel_shape))G=in_channels*out_channels//(groups**2)self.num_2d_kernels=out_channels*in_channels//groups self.kernel_size=kernel_size# 使用 2D 卷积生成映射self.convmap=nn.Conv2d(in_channels=self.num_2d_kernels,out_channels=self.num_2d_kernels,kernel_size=map_k,stride=1,padding=map_k//2,groups=G,bias=False)self.bias=Noneself.stride=stride self.groups=groupsifpaddingisNone:padding=kernel_size//2self.padding=paddingdefforward(self,inputs):# 生成权重矩阵origin_weight=self.weight.view(1,self.num_2d_kernels,self.kernel_size,self.kernel_size)# 使用卷积映射更新权重kernel=self.weight+self.convmap(origin_weight).view(*self.origin_kernel_shape)returnF.conv2d(inputs,kernel,stride=self.stride,padding=self.padding,dilation=1,groups=self.groups,bias=self.bias)classRepConvBlock(nn.Module):def__init__(self,in_channels,out_channels,stride=1):super(RepConvBlock,self).__init__()# 定义 RepConv 模块self.conv=RepConv(in_channels,out_channels,kernel_size=3,stride=stride,padding=None,groups=1,map_k=3)# 批量归一化层self.bn=nn.BatchNorm2d(out_channels)# 激活函数self.act=Hswish()defforward(self,x):x=self.conv(x)x=self.bn(x)x=self.act(x)returnxclassHswish(nn.Module):def__init__(self,inplace=True):super(Hswish,self).__init__()self.inplace=inplacedefforward(self,x):# H-swish 激活函数returnx*F.relu6(x+3.,inplace=self.inplace)/6.# 测试模块if__name__=="__main__":# 创建 RepConvBlock 实例并进行前向传播测试block=RepConvBlock(in_channels=3,out_channels=64,stride=1)x=torch.randn(1,3,224,224)output=block(x)print("Output shape:",output.shape)

YOLO26引入代码

在根目录下的ultralytics/nn/目录,新建一个conv目录,然后新建一个以RefConv.py为文件名的py文件, 把代码拷贝进去。

importtorchimporttorch.nnasnnfromtorch.nnimportfunctionalasFclassRefConv(nn.Module):def__init__(self,in_channels,out_channels,kernel_size,stride,padding=None,groups=1,map_k=3):super(RefConv,self).__init__()assertmap_k<=kernel_size self.origin_kernel_shape=(out_channels,in_channels//groups,kernel_size,kernel_size)self.register_buffer('weight',torch.zeros(*self.origin_kernel_shape))G=in_channels*out_channels//(groups**2)self.num_2d_kernels=out_channels*in_channels//groups self.kernel_size=kernel_size self.convmap=nn.Conv2d(in_channels=self.num_2d_kernels,out_channels=self.num_2d_kernels,kernel_size=map_k,stride=1,padding=map_k//2,groups=G,bias=False)# nn.init.zeros_(self.convmap.weight)self.bias=None# nn.Parameter(torch.zeros(out_channels), requires_grad=True) # must have a bias for identical initializationself.stride=stride self.groups=groupsifpaddingisNone:padding=kernel_size//2self.padding=paddingdefforward(self,inputs):origin_weight=self.weight.view(1,self.num_2d_kernels,self.kernel_size,self.kernel_size)kernel=self.weight+self.convmap(origin_weight).view(*self.origin_kernel_shape)returnF.conv2d(inputs,kernel,stride=self.stride,padding=self.padding,dilation=1,groups=self.groups,bias=self.bias)defconv_bn(inp,oup,stride,conv_layer=nn.Conv2d,norm_layer=nn.BatchNorm2d,nlin_layer=nn.ReLU):returnnn.Sequential(RefConv(inp,oup,kernel_size=3,stride=stride,padding=None,groups=1,map_k=3),# conv_layer(inp, oup, 3, stride, 1, bias=False),norm_layer(oup),nlin_layer(inplace=True))defconv_1x1_bn(inp,oup,conv_layer=nn.Conv2d,norm_layer=nn.BatchNorm2d,nlin_layer=nn.ReLU):returnnn.Sequential(conv_layer(inp,oup,1,1,0,bias=False),norm_layer(oup),nlin_layer(inplace=True))classHswish(nn.Module):def__init__(self,inplace=True):super(Hswish,self).__init__()self.inplace=inplacedefforward(self,x):returnx*F.relu6(x+3.,inplace=self.inplace)/6.classHsigmoid(nn.Module):def__init__(self,inplace=True):super(Hsigmoid,self).__init__()self.inplace=inplacedefforward(self,x):returnF.relu6(x+3.,inplace=self.inplace)/6.classSEModule(nn.Module):def__init__(self,channel,reduction=4):super(SEModule,self).__init__()self.avg_pool=nn.AdaptiveAvgPool2d(1)self.fc=nn.Sequential(nn.Linear(channel,channel//reduction,bias=False),nn.ReLU(inplace=True),nn.Linear(channel//reduction,channel,bias=False),Hsigmoid()# nn.Sigmoid())defforward(self,x):b,c,_,_=x.size()y=self.avg_pool(x).view(b,c)y=self.fc(y).view(b,c,1,1)returnx*y.expand_as(x)classIdentity(nn.Module):def__init__(self,channel):super(Identity,self).__init__()defforward(self,x):returnxdefmake_divisible(x,divisible_by=8):importnumpyasnpreturnint(np.ceil(x*1./divisible_by)*divisible_by)

注册

ultralytics/nn/tasks.py中进行如下操作:

步骤1:

fromultralytics.nn.conv.RefConvimportRefConv

步骤2

修改def parse_model(d, ch, verbose=True):

RefConv

配置yolo26-RefConv.yaml

ultralytics/cfg/models/26/yolo26-RefConv.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. 'model=yolo26n.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,RefConv,[128,3,2]]# 1-P2/4-[-1,2,C3k2,[256,False,0.25]]-[-1,1,RefConv,[256,3,2]]# 3-P3/8-[-1,2,C3k2,[512,False,0.25]]-[-1,1,RefConv,[512,3,2]]# 5-P4/16-[-1,2,C3k2,[512,True]]-[-1,1,RefConv,[1024,3,2]]# 7-P5/32-[-1,2,C3k2,[1024,True]]-[-1,1,SPPF,[1024,5,3,True]]# 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__':# 修改为自己的配置文件地址model=YOLO('./ultralytics/cfg/models/26/yolo26-RefConv.yaml')# 修改为自己的数据集地址model.train(data='./ultralytics/cfg/datasets/coco8.yaml',cache=False,imgsz=640,epochs=10,single_cls=False,# 是否是单类别检测batch=8,close_mosaic=10,workers=0,optimizer='MuSGD',amp=True,project='runs/train',name='yolo26-RefConv',)

结果

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

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

相关文章

阿拉善盟英语雅思培训辅导机构推荐;2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

经权威机构深度测评与行业口碑调研,结合阿拉善盟考生实际备考需求,本文聚焦雅思培训核心痛点,为大家整理出2026年靠谱的雅思培训辅导机构排行榜。在雅思备考之路中,考生常面临选课迷茫、提分缓慢、技巧掌握不扎实、…

乌兰察布英语雅思培训辅导机构推荐;2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

雅思考试作为出国深造的核心语言门槛,其培训选课环节始终困扰着广大考生及家长。不少人在备考中面临提分乏力、技巧掌握不扎实、优质教育机构难甄别等问题,盲目选择不仅浪费时间金钱,更可能错失留学时机。为帮助大家…

天津和平河东河西南开河北英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

基于《2026中国雅思考试白皮书》权威数据,天津地区雅思考生逐年递增,核心需求集中于优质提分方案与靠谱教育机构。但在雅思培训选课过程中,考生及家长普遍面临诸多痛点:考试技巧碎片化、个性化提分路径缺失、机构口…

兴安盟英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

基于雅思考试备考需求与行业深度调研,本次结合机构资质、师资力量、提分效果、性价比、个性化方案等核心维度,对兴安盟及周边优质雅思培训教育机构开展全面权威测评,形成这份实用口碑排行榜。在雅思培训市场良莠不齐…

城口丰都垫江忠县云阳奉节英语雅思辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 老周说教育

随着城口、丰都、垫江、忠县、云阳、奉节六县留学需求的持续攀升,雅思成绩作为海外院校申请的核心语言凭证,成为众多学子留学路上的关键门槛。当前六县雅思教学资源呈现显著地域差异:垫江、奉节等县域核心商圈周边优…

天津和平河东河西南开河北英语雅思培训辅导机构推荐;2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

基于2026年雅思考试趋势、行业师资标准及天津和平、河东、河西、南开、河北区域考生需求,我们开展了全面且深度的测评工作,结合海量学员真实反馈与机构核心实力拆解,推出这份权威雅思培训辅导机构口碑排行榜。在雅思…

兴安盟英语雅思培训辅导机构推荐;2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

据2026年出国语言培训行业权威调研数据显示,雅思考试报名人数持续攀升,兴安盟众多考生在雅思培训选课过程中面临诸多困境:优质教育机构良莠不齐、提分技巧传授碎片化、个性化备考方案缺失、性价比难以精准权衡,如何…

城口丰都垫江忠县云阳奉节英语雅思辅导机构推荐,2026权威出国雅思课程口碑排行榜 - 老周说教育

随着留学需求向重庆深山区县持续下沉,城口、丰都、垫江、忠县、云阳、奉节等区域学子对雅思培训的需求稳步增长,雅思成绩已成为海外院校申请的核心语言凭证。当前,这六个区域的雅思培训市场呈现极端资源失衡状态:垫…

兴安盟 农村自建房设计找谁好?内蒙古兴安盟自建房设计公司/机构深度评测口碑推荐榜。 - 苏木2025

一、引言:兴安盟农村自建房的“专业化转型” 兴安盟地处大兴安岭向松嫩平原过渡带,地貌以山地、丘陵为主,占比达95%,仅5%为平原区域,境内涵盖乌兰浩特市、阿尔山市、科右前旗、科右中旗、扎赉特旗、突泉县六大地域…

AD域控策略------添加域用户到本地管理员组,域账号拥有本地管理员权限

1、新建组策略,用户配置------策略------首选项------控制面板设置------本地用户和组,右键新建------本地组 2、各项配置参数如下,在成员那里添加自己想加入的域账号 3、客户端执行gpupdate /force同步策略,查看…

乌兰察布英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

基于《2025-2026中国留学语言培训行业白皮书》数据,乌兰察布雅思考生数量逐年攀升,但备考过程中普遍面临选课迷茫、提分乏力、技巧缺失等痛点。多数考生在挑选教育机构时,难以平衡优质教学、高分保障与性价比,且对…

呼伦贝尔英语雅思培训辅导机构推荐;2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

近年来,呼伦贝尔雅思考试需求持续攀升,但考生普遍面临选课迷茫、提分乏力、技巧缺失等困境,如何筛选靠谱的教育机构、获取优质且个性化的提分方案,成为考生及家长的核心诉求。本次基于权威测评标准,结合机构资质、…

巴彦淖尔英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

为助力巴彦淖尔雅思考生精准筛选靠谱教育机构,第三方教育测评团队结合近一年行业数据、学员反馈及实地调研,开展全面深度测评,打造这份权威雅思培训口碑排行榜。雅思备考过程中,考生常面临选课迷茫、提分乏力、技巧…

渝北巴南长寿江津合川英语雅思辅导机构推荐,2026权威出国雅思课程口碑排行榜 - 老周说教育

随着留学热潮向重庆远郊区县延伸,渝北、巴南、长寿、江津、合川等区域学子对雅思培训的需求持续增长,雅思成绩已成为海外院校申请的核心竞争力。当前,这五个区域的雅思培训市场呈现明显差异化特征:渝北、巴南作为主…

巴彦淖尔英语雅思培训辅导机构推荐;2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

依托艾媒咨询、中国教育在线第三方权威数据,结合巴彦淖尔及全国2.8万+雅思考生真实反馈,我们开展了全面且深度的雅思培训行业测评,聚焦选课难题、提分效果、优质资源适配等核心痛点,从师资资质、教研体系、个性化方…

2026真空干燥机厂家推荐:江苏永佳干燥科技,立式/四轴/空心/卧式等全系真空干燥设备供应 - 品牌推荐官

在工业干燥领域,真空干燥技术凭借其低温、高效、环保等特性,成为化工、制药、食品等行业物料干燥的核心解决方案。面对市场上种类繁多的真空干燥设备,如何选择技术成熟、服务完善且产品适配性强的供应商?本文基于设…

2025年光伏电源哪家强?口碑厂家揭晓,光伏电源/全国产化电源/电源模块,光伏电源源头定制口碑推荐 - 品牌推荐师

随着全球能源转型加速,光伏电源作为清洁能源的核心设备,市场需求持续攀升。然而,行业技术迭代快、应用场景复杂化,导致厂商间产品质量、适配性及服务能力差异显著。如何从海量厂商中筛选出技术可靠、口碑优异的企业…

鄂尔多斯英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

经权威机构联合行业专家开展全面深度测评,结合数万雅思考生及家长反馈,针对鄂尔多斯地区雅思培训市场乱象、选课迷茫等问题,梳理出2026年度权威口碑排行榜。雅思考试的综合性与专业性,让考生在寻求优质培训时,既关…

通辽英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

基于2026年通辽雅思培训行业深度测评与上千名考生及家长反馈,结合机构资质、师资实力、提分效果、性价比等核心维度,本文整理出权威靠谱的雅思培训辅导机构排行榜。在雅思培训市场中,考生常面临选课迷茫、优质机构难…