【YOLO改进】主干插入SequentialPolarizedSelfAttention模块(基于MMYOLO)

SequentialPolarizedSelfAttention模块

论文链接:https://arxiv.org/pdf/2107.00782.pdf

将SequentialPolarizedSelfAttention模块添加到MMYOLO中

  1. 将开源代码SequentialSelfAttention.py文件复制到mmyolo/models/plugins目录下

  2. 导入MMYOLO用于注册模块的包: from mmyolo.registry import MODELS

  3. 确保 class SequentialPolarizedSelfAttention中的输入维度为in_channels(因为MMYOLO会提前传入输入维度参数,所以要保持参数名的一致)

  4. 利用@MODELS.register_module()将“class SequentialPolarizedSelfAttention(nn.Module)”注册:

  5. 修改mmyolo/models/plugins/__init__.py文件

  6. 在终端运行:

    python setup.py install
  7. 修改对应的配置文件,并且将plugins的参数“type”设置为“SequentialPolarizedSelfAttention”,可参考【YOLO改进】主干插入注意力机制模块CBAM(基于MMYOLO)-优快云博客

修改后的SequentialSelfAttention.py

import torch
from torch import nn
from mmyolo.registry import MODELS

@MODELS.register_module()
class SequentialPolarizedSelfAttention(nn.Module):

    def __init__(self, in_channels=512):
        super().__init__()
        self.ch_wv=nn.Conv2d(in_channels,in_channels//2,kernel_size=(1,1))
        self.ch_wq=nn.Conv2d(in_channels,1,kernel_size=(1,1))
        self.softmax_channel=nn.Softmax(1)
        self.softmax_spatial=nn.Softmax(-1)
        self.ch_wz=nn.Conv2d(in_channels//2,in_channels,kernel_size=(1,1))
        self.ln=nn.LayerNorm(in_channels)
        self.sigmoid=nn.Sigmoid()
        self.sp_wv=nn.Conv2d(in_channels,in_channels//2,kernel_size=(1,1))
        self.sp_wq=nn.Conv2d(in_channels,in_channels//2,kernel_size=(1,1))
        self.agp=nn.AdaptiveAvgPool2d((1,1))

    def forward(self, x):
        b, c, h, w = x.size()

        #Channel-only Self-Attention
        channel_wv=self.ch_wv(x) #bs,c//2,h,w
        channel_wq=self.ch_wq(x) #bs,1,h,w
        channel_wv=channel_wv.reshape(b,c//2,-1) #bs,c//2,h*w
        channel_wq=channel_wq.reshape(b,-1,1) #bs,h*w,1
        channel_wq=self.softmax_channel(channel_wq)
        channel_wz=torch.matmul(channel_wv,channel_wq).unsqueeze(-1) #bs,c//2,1,1
        channel_weight=self.sigmoid(self.ln(self.ch_wz(channel_wz).reshape(b,c,1).permute(0,2,1))).permute(0,2,1).reshape(b,c,1,1) #bs,c,1,1
        channel_out=channel_weight*x

        #Spatial-only Self-Attention
        spatial_wv=self.sp_wv(channel_out) #bs,c//2,h,w
        spatial_wq=self.sp_wq(channel_out) #bs,c//2,h,w
        spatial_wq=self.agp(spatial_wq) #bs,c//2,1,1
        spatial_wv=spatial_wv.reshape(b,c//2,-1) #bs,c//2,h*w
        spatial_wq=spatial_wq.permute(0,2,3,1).reshape(b,1
使用ResNet改进YOLO主干网络是提升目标检测性能的有效策略,下面从方法和案例两方面进行详细介绍。 ### 方法 利用ResNet改进YOLO主干网络的核心在于利用ResNet独特的结构优势,替换或优化YOLO原本的主干网络,从而提升特征提取能力。ResNet(深度残差网络)通过引入“快捷连接”,解决了深层神经网络训练中的梯度消失问题,允许网络输入直接跳过中间层传递到后面层,专注学习输入与输出之间的残差,简化训练过程,缓解深层网络训练困难,能有效训练极深网络结构并在多视觉识别任务上显著提升性能[^2]。 ### 案例 - **YOLOv11改进:用ResNet50替换主干网络**:通过打印网络参数结构并截取相应层级实现。以下是具体代码,代码中加载预训练的ResNet50模型,提取卷积层并根据切片参数选择不同部分作为新的主干网络模块,以适应不同任务需求 [^1]。 ```python import torchvision.models as models import torch.nn as nn class ResNet50(nn.Module): def __init__(self, slice=1): super().__init__() # 加载预训练 ResNet50 resnet = models.resnet50(pretrained=True) # 提取所有卷积层(去掉最后的 avgpool 和 fc) features = nn.Sequential( resnet.conv1, # [64, 3, 7, 7] resnet.bn1, resnet.relu, resnet.maxpool, # [64, 56, 56] resnet.layer1, # [256, 56, 56] resnet.layer2, # [512, 28, 28] resnet.layer3, # [1024, 14, 14] resnet.layer4, # [2048, 7, 7] ) # 按切片选择不同部分 if slice == 1: self.module = features[:6] # conv1 + maxpool + layer1 (28x28) elif slice == 2: self.module = features[6] # layer2 + layer3 (28x28 -> 14x14) else: self.module = features[7] # layer4 (7x7) def forward(self, x): return self.module(x) ``` - **Yolov5中使用Resnet18作为主干网络**:有用户尝试在Yolov5中使用Resnet18替换主干网络,但遇到原版本召回率、准确率为零的问题,推测是原版本存在bug。该用户在Yolov7模型中进行修改获得较好效果,并给出修改模型路径的相关信息,需修改参数配置文件中的模型路径并删除原有的pt文件 [^3]。 ```python import argparse parser = argparse.ArgumentParser() parser.add_argument('--weights', type=str, default='', help='initial weights path') parser.add_argument('--cfg', type=str, default='你模型的路径', help='model.yaml path') ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值