青岛万维网站设计昆网站制作
2026/2/14 15:02:52 网站建设 项目流程
青岛万维网站设计,昆网站制作,新手怎么做销售,深圳的设计网站公司前言 本文介绍了重新参数化再聚焦卷积#xff08;RefConv#xff09;在YOLO26中的结合应用。RefConv通过对预训练模型的基础卷积核应用可训练的再聚焦转换#xff0c;建立参数间连接#xff0c;利用预训练参数作为先验学习新表示#xff0c;增强模型表示能力。它能减少通…前言本文介绍了重新参数化再聚焦卷积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可以取代原始的卷积层使特定通道的卷积核参数与其他卷积核的参数相关联从而使它们重新聚焦到模型的其他部分而不仅仅关注输入特征。这样做可以利用预训练参数中编码的表示作为先验并重新聚焦到这些表示上从而学习新颖的表示进一步增强预训练模型的表示能力。重聚焦变换给定一个预训练模型RefConv应用可训练的重聚焦变换到继承自预训练模型的基础核上以建立参数之间的连接。例如一个深度卷积的RefConv可以将特定通道的卷积核参数与其他卷积核的参数相关联使它们重新聚焦到模型的其他部分而不仅仅关注输入特征。增强模型结构的先验RefConv通过利用预训练参数中编码的表示作为先验并重新聚焦到这些表示上学习新颖的表示从而增强预训练模型的表示能力。这种方法不改变模型结构而是通过改变卷积核参数之间的关系来提高模型性能。通道冗余减少和损失曲面平滑RefConv可以减少通道冗余使损失曲面更加平滑。通过扩大核通道之间的KL散度减少通道相似性和冗余RefConv能够学习更多样化的表示增强模型的表示能力。核心代码importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassRepConv(nn.Module):def__init__(self,in_channels,out_channels,kernel_size,stride,paddingNone,groups1,map_k3):super(RepConv,self).__init__()assertmap_kkernel_size# 记录原始卷积核形状self.origin_kernel_shape(out_channels,in_channels//groups,kernel_size,kernel_size)self.register_buffer(weight,torch.zeros(*self.origin_kernel_shape))Gin_channels*out_channels//(groups**2)self.num_2d_kernelsout_channels*in_channels//groups self.kernel_sizekernel_size# 使用 2D 卷积生成映射self.convmapnn.Conv2d(in_channelsself.num_2d_kernels,out_channelsself.num_2d_kernels,kernel_sizemap_k,stride1,paddingmap_k//2,groupsG,biasFalse)self.biasNoneself.stridestride self.groupsgroupsifpaddingisNone:paddingkernel_size//2self.paddingpaddingdefforward(self,inputs):# 生成权重矩阵origin_weightself.weight.view(1,self.num_2d_kernels,self.kernel_size,self.kernel_size)# 使用卷积映射更新权重kernelself.weightself.convmap(origin_weight).view(*self.origin_kernel_shape)returnF.conv2d(inputs,kernel,strideself.stride,paddingself.padding,dilation1,groupsself.groups,biasself.bias)classRepConvBlock(nn.Module):def__init__(self,in_channels,out_channels,stride1):super(RepConvBlock,self).__init__()# 定义 RepConv 模块self.convRepConv(in_channels,out_channels,kernel_size3,stridestride,paddingNone,groups1,map_k3)# 批量归一化层self.bnnn.BatchNorm2d(out_channels)# 激活函数self.actHswish()defforward(self,x):xself.conv(x)xself.bn(x)xself.act(x)returnxclassHswish(nn.Module):def__init__(self,inplaceTrue):super(Hswish,self).__init__()self.inplaceinplacedefforward(self,x):# H-swish 激活函数returnx*F.relu6(x3.,inplaceself.inplace)/6.# 测试模块if__name____main__:# 创建 RepConvBlock 实例并进行前向传播测试blockRepConvBlock(in_channels3,out_channels64,stride1)xtorch.randn(1,3,224,224)outputblock(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,paddingNone,groups1,map_k3):super(RefConv,self).__init__()assertmap_kkernel_size self.origin_kernel_shape(out_channels,in_channels//groups,kernel_size,kernel_size)self.register_buffer(weight,torch.zeros(*self.origin_kernel_shape))Gin_channels*out_channels//(groups**2)self.num_2d_kernelsout_channels*in_channels//groups self.kernel_sizekernel_size self.convmapnn.Conv2d(in_channelsself.num_2d_kernels,out_channelsself.num_2d_kernels,kernel_sizemap_k,stride1,paddingmap_k//2,groupsG,biasFalse)# nn.init.zeros_(self.convmap.weight)self.biasNone# nn.Parameter(torch.zeros(out_channels), requires_gradTrue) # must have a bias for identical initializationself.stridestride self.groupsgroupsifpaddingisNone:paddingkernel_size//2self.paddingpaddingdefforward(self,inputs):origin_weightself.weight.view(1,self.num_2d_kernels,self.kernel_size,self.kernel_size)kernelself.weightself.convmap(origin_weight).view(*self.origin_kernel_shape)returnF.conv2d(inputs,kernel,strideself.stride,paddingself.padding,dilation1,groupsself.groups,biasself.bias)defconv_bn(inp,oup,stride,conv_layernn.Conv2d,norm_layernn.BatchNorm2d,nlin_layernn.ReLU):returnnn.Sequential(RefConv(inp,oup,kernel_size3,stridestride,paddingNone,groups1,map_k3),# conv_layer(inp, oup, 3, stride, 1, biasFalse),norm_layer(oup),nlin_layer(inplaceTrue))defconv_1x1_bn(inp,oup,conv_layernn.Conv2d,norm_layernn.BatchNorm2d,nlin_layernn.ReLU):returnnn.Sequential(conv_layer(inp,oup,1,1,0,biasFalse),norm_layer(oup),nlin_layer(inplaceTrue))classHswish(nn.Module):def__init__(self,inplaceTrue):super(Hswish,self).__init__()self.inplaceinplacedefforward(self,x):returnx*F.relu6(x3.,inplaceself.inplace)/6.classHsigmoid(nn.Module):def__init__(self,inplaceTrue):super(Hsigmoid,self).__init__()self.inplaceinplacedefforward(self,x):returnF.relu6(x3.,inplaceself.inplace)/6.classSEModule(nn.Module):def__init__(self,channel,reduction4):super(SEModule,self).__init__()self.avg_poolnn.AdaptiveAvgPool2d(1)self.fcnn.Sequential(nn.Linear(channel,channel//reduction,biasFalse),nn.ReLU(inplaceTrue),nn.Linear(channel//reduction,channel,biasFalse),Hsigmoid()# nn.Sigmoid())defforward(self,x):b,c,_,_x.size()yself.avg_pool(x).view(b,c)yself.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_by8):importnumpyasnpreturnint(np.ceil(x*1./divisible_by)*divisible_by)注册在ultralytics/nn/tasks.py中进行如下操作步骤1:fromultralytics.nn.conv.RefConvimportRefConv步骤2修改def parse_model(d, ch, verboseTrue):RefConv配置yolo26-RefConv.yamlultralytics/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. 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,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__:# 修改为自己的配置文件地址modelYOLO(./ultralytics/cfg/models/26/yolo26-RefConv.yaml)# 修改为自己的数据集地址model.train(data./ultralytics/cfg/datasets/coco8.yaml,cacheFalse,imgsz640,epochs10,single_clsFalse,# 是否是单类别检测batch8,close_mosaic10,workers0,optimizerMuSGD,ampTrue,projectruns/train,nameyolo26-RefConv,)结果

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询