2026/2/18 23:15:06
网站建设
项目流程
做视频网站收入,ui培训费用,个人中心页面,无锡网站建设专家无锡网站制作前言
本文介绍了多尺度卷积注意力#xff08;MSCA#xff09;及其在YOLOv8中的结合应用。基于变换器的模型在语义分割领域占主导#xff0c;但卷积注意力在编码上下文信息方面更高效。MSCA由深度卷积聚合局部信息、多分支深度卷积捕获多尺度上下文信息、11逐点卷积模拟通道…前言本文介绍了多尺度卷积注意力MSCA及其在YOLOv8中的结合应用。基于变换器的模型在语义分割领域占主导但卷积注意力在编码上下文信息方面更高效。MSCA由深度卷积聚合局部信息、多分支深度卷积捕获多尺度上下文信息、1×1逐点卷积模拟通道关系三部分组成。我们将MSCA代码引入指定目录在ultralytics/nn/tasks.py中注册配置yolov8_MSCA.yaml文件最后通过实验脚本和结果验证了改进的有效性。文章目录 YOLOv8改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLOv8改进专栏文章目录前言介绍摘要文章链接基本原理参考代码引入代码tasks.py 注册步骤1:步骤2配置yolov8_MSCA.yaml实验脚本结果介绍摘要我们提出了SegNeXt一种用于语义分割的简单卷积网络架构。最近基于变换器的模型由于自注意力在编码空间信息方面的效率而在语义分割领域占据主导地位。在本文中我们展示了卷积注意力是一种比变换器中的自注意力机制更高效和有效的编码上下文信息的方式。通过重新审视成功的分割模型所拥有的特征我们发现了几个关键组件这些组件导致了分割模型性能的提升。这激励我们设计了一种新颖的卷积注意力网络该网络使用廉价的卷积操作。没有任何花哨的技巧我们的SegNeXt在包括ADE20K、Cityscapes、COCO-Stuff、Pascal VOC、Pascal Context和iSAID在内的流行基准测试上显著提高了先前最先进方法的性能。值得注意的是SegNeXt超越了EfficientNet-L2 w/ NAS-FPN在Pascal VOC 2012测试排行榜上仅使用1/10的参数就达到了90.6%的mIoU。平均而言与最先进的方法相比SegNeXt在ADE20K数据集上的mIoU提高了约2.0%同时计算量相同或更少。文章链接论文地址论文地址中文论文论文地址代码地址代码地址参考代码地址参考代码地址基本原理MSCA 主要由三个部分组成1一个深度卷积用于聚 合局部信息2多分支深度卷积用于捕获多尺度上下文信息3一个 1 × 1 逐点卷积用于模拟特征中不同通道之间的关系。1 × 1 逐点卷积的输出被直接用 作卷积注意力的权重以重新权衡 MSCA 的输入。MSCA 可以写成 如下形式其中 F 代表输入特征Att 和 Out 分别为注意力权重和输出⊗ 表示逐元素的矩 阵乘法运算DWConv 表示深度卷积Scalei (i ∈ {0, 1, 2, 3}) 表示上图右边侧图中的第 i 个分支Scale0 为残差连接。遵循[130]在 MSCA 的每个分支中SegNeXt 使用两个深度条带卷积来近似模拟大卷积核的深度卷积。每个分支的卷积核大 小分别被设定为 7、11 和 21。 选择深度条带卷积主要考虑到以下两方面原 因一方面相较于普通卷积条带卷积更加轻量化。为了模拟核大小为 7 × 7 的标准二维卷积只需使用一对 7 × 1 和 1 × 7 的条带卷积。另一方面在实际 的分割场景中存在一些条状物体例如人和电线杆。因此条状卷积可以作为 标准网格状的卷积的补充有助于提取条状特征。参考代码下面代码来源于https://github.com/open-mmlab/mmsegmentation/blob/c685fe6767c4cadf6b051983ca6208f1b9d1ccb8/mmseg/models/backbones/mscan.py#L115classMSCAAttention(BaseModule):Attention Module in Multi-Scale Convolutional Attention Module (MSCA). Args: channels (int): The dimension of channels. kernel_sizes (list): The size of attention kernel. Defaults: [5, [1, 7], [1, 11], [1, 21]]. paddings (list): The number of corresponding padding value in attention module. Defaults: [2, [0, 3], [0, 5], [0, 10]]. def__init__(self,channels,kernel_sizes[5,[1,7],[1,11],[1,21]],paddings[2,[0,3],[0,5],[0,10]]):super().__init__()self.conv0nn.Conv2d(channels,channels,kernel_sizekernel_sizes[0],paddingpaddings[0],groupschannels)fori,(kernel_size,padding)inenumerate(zip(kernel_sizes[1:],paddings[1:])):kernel_size_[kernel_size,kernel_size[::-1]]padding_[padding,padding[::-1]]conv_name[fconv{i}_1,fconv{i}_2]fori_kernel,i_pad,i_convinzip(kernel_size_,padding_,conv_name):self.add_module(i_conv,nn.Conv2d(channels,channels,tuple(i_kernel),paddingi_pad,groupschannels))self.conv3nn.Conv2d(channels,channels,1)defforward(self,x):Forward function.ux.clone()attnself.conv0(x)# Multi-Scale Feature extractionattn_0self.conv0_1(attn)attn_0self.conv0_2(attn_0)attn_1self.conv1_1(attn)attn_1self.conv1_2(attn_1)attn_2self.conv2_1(attn)attn_2self.conv2_2(attn_2)attnattnattn_0attn_1attn_2# Channel Mixingattnself.conv3(attn)# Convolutional Attentionxattn*ureturnx下面代码来源于https://zhuanlan.zhihu.com/p/566607168classAttentionModule(BaseModule):def__init__(self,dim):super().__init__()self.conv0nn.Conv2d(dim,dim,5,padding2,groupsdim)self.conv0_1nn.Conv2d(dim,dim,(1,7),padding(0,3),groupsdim)self.conv0_2nn.Conv2d(dim,dim,(7,1),padding(3,0),groupsdim)self.conv1_1nn.Conv2d(dim,dim,(1,11),padding(0,5),groupsdim)self.conv1_2nn.Conv2d(dim,dim,(11,1),padding(5,0),groupsdim)self.conv2_1nn.Conv2d(dim,dim,(1,21),padding(0,10),groupsdim)self.conv2_2nn.Conv2d(dim,dim,(21,1),padding(10,0),groupsdim)self.conv3nn.Conv2d(dim,dim,1)defforward(self,x):ux.clone()attnself.conv0(x)attn_0self.conv0_1(attn)attn_0self.conv0_2(attn_0)attn_1self.conv1_1(attn)attn_1self.conv1_2(attn_1)attn_2self.conv2_1(attn)attn_2self.conv2_2(attn_2)attnattnattn_0attn_1attn_2 attnself.conv3(attn)returnattn*u引入代码在根目录下的ultralytics/nn/目录新建一个attention目录然后新建一个以MSCA为文件名的py文件 把代码拷贝进去。importtorchimporttorch.nnasnnfromtorch.nnimportfunctionalasFclassMSCAAttention(nn.Module):def__init__(self,dim):super().__init__()self.conv0nn.Conv2d(dim,dim,5,padding2,groupsdim)self.conv0_1nn.Conv2d(dim,dim,(1,7),padding(0,3),groupsdim)self.conv0_2nn.Conv2d(dim,dim,(7,1),padding(3,0),groupsdim)self.conv1_1nn.Conv2d(dim,dim,(1,11),padding(0,5),groupsdim)self.conv1_2nn.Conv2d(dim,dim,(11,1),padding(5,0),groupsdim)self.conv2_1nn.Conv2d(dim,dim,(1,21),padding(0,10),groupsdim)self.conv2_2nn.Conv2d(dim,dim,(21,1),padding(10,0),groupsdim)self.conv3nn.Conv2d(dim,dim,1)defforward(self,x):ux.clone()attnself.conv0(x)attn_0self.conv0_1(attn)attn_0self.conv0_2(attn_0)attn_1self.conv1_1(attn)attn_1self.conv1_2(attn_1)attn_2self.conv2_1(attn)attn_2self.conv2_2(attn_2)attnattnattn_0attn_1attn_2 attnself.conv3(attn)returnattn*utasks.py 注册在ultralytics/nn/tasks.py中进行如下操作步骤1:fromultralytics.nn.attention.MSCAimportMSCAAttention步骤2修改def parse_model(d, ch, verboseTrue):只需要添加截图中标明的其他没有的模块不用添加。elif m in {MSCAAttention}: c2 ch[f] args [c2, *args]配置yolov8_MSCA.yamlultralytics/cfg/models/v8/yolov8_MSCA.yaml# Ultralytics YOLO , GPL-3.0 license# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parametersnc:2# number of classesscales:# model compound scaling constants, i.e. modelyolov8n.yaml will call yolov8.yaml with scale n# [depth, width, max_channels]n:[0.33,0.25,1024]# YOLOv8n summary: 225 layers, 3157200 parameters, 3157184 gradients, 8.9 GFLOPss:[0.33,0.50,1024]# YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPsm:[0.67,0.75,768]# YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPsl:[1.00,1.00,512]# YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx:[1.00,1.25,512]# YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs# YOLOv8.0n backbonebackbone:# [from, repeats, module, args]-[-1,1,Conv,[64,3,2]]# 0-P1/2-[-1,1,Conv,[128,3,2]]# 1-P2/4-[-1,3,C2f,[128,True]]-[-1,1,Conv,[256,3,2]]# 3-P3/8-[-1,6,C2f,[256,True]]-[-1,1,Conv,[512,3,2]]# 5-P4/16-[-1,6,C2f,[512,True]]-[-1,1,Conv,[1024,3,2]]# 7-P5/32-[-1,3,C2f,[1024,True]]-[-1,1,SPPF,[1024,5]]# 9-[-1,1,MSCAAttention,[]]# 10# YOLOv8.0n headhead:-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,6],1,Concat,[1]]# cat backbone P4-[-1,3,C2f,[512]]# 13-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,4],1,Concat,[1]]# cat backbone P3-[-1,3,C2f,[256]]# 16 (P3/8-small)-[-1,1,Conv,[256,3,2]]-[[-1,13],1,Concat,[1]]# cat head P4-[-1,3,C2f,[512]]# 19 (P4/16-medium)-[-1,1,Conv,[512,3,2]]-[[-1,10],1,Concat,[1]]# cat head P5-[-1,3,C2f,[1024]]# 22 (P5/32-large)-[[16,19,22],1,Detect,[nc]]# Detect(P3, P4, P5)实验脚本importosfromultralyticsimportYOLO yamlultralytics/cfg/models/v8/yolov8_MSCA.yamlmodelYOLO(yaml)model.info()if__name____main__:resultsmodel.train(dataultralytics/datasets/original-license-plates.yaml,nameyolov8_MSCA,epochs10,workers8,batch1)结果