YOLOv8改进-添加YOLOv10的PSA注意力机制

在 1×1 卷积之后将跨通道的特征均匀地划分为两部分。将一个部件馈入由多头自注意力模块 (MHSA) 和前馈网络 (FFN) 组成的 NPSA 模块中。然后,通过 1×1 卷积将两个部分连接并融合。此外,按照将查询和键的维度分配给 MHSA 中值的一半,并将 LayerNorm [1] 替换为 BatchNorm以实现快速推理。此外,PSA仅放置在分辨率最低的阶段4之后,避免了自注意力的二次计算复杂度带来的过多开销。通过这种方式,可以将全局表示学习能力以较低的计算成本融入到YOLOs中,从而很好地增强了模型的能力,从而提高了性能。

添加PSA注意力机制到block模块

class Attention(nn.Module):
    def __init__(self, dim, num_heads=8,
                 attn_ratio=0.5):
        super().__init__()
        self.num_heads = num_heads
        self.head_dim = dim // num_heads
        self.key_dim = int(self.head_dim * attn_ratio)
        self.scale = self.key_dim ** -0.5
        nh_kd = nh_kd = self.key_dim * num_heads
        h = dim + nh_kd * 2
        self.qkv = Conv(dim, h, 1, act=False)
        self.proj = Conv(dim, dim, 1, act=False)
        self.pe = Conv(dim, dim, 3, 1, g=dim, act=False)

    def forward(self, x):
        B, C, H, W = x.shape
        N = H * W
        qkv = self.qkv(x)
        q, k, v = qkv.view(B, self.num_heads, self.key_dim * 2 + self.head_dim, N).split(
            [self.key_dim, self.key_dim, self.head_dim], dim=2)

        attn = (
                (q.transpose(-2, -1) @ k) * self.scale
        )
        attn = attn.softmax(dim=-1)
        x = (v @ attn.transpose(-2, -1)).view(B, C, H, W) + self.pe(v.reshape(B, C, H, W))
        x = self.proj(x)
        return x


class psa(nn.Module):

    def __init__(self, c1, c2, e=0.5):
        super().__init__()
        assert (c1 == c2)
        self.c = int(c1 * e)
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv(2 * self.c, c1, 1)

        self.attn = Attention(self.c, attn_ratio=0.5, num_heads=self.c // 64)
        self.ffn = nn.Sequential(
            Conv(self.c, self.c * 2, 1),
            Conv(self.c * 2, self.c, 1, act=False)
        )

    def forward(self, x):
        a, b = self.cv1(x).split((self.c, self.c), dim=1)
        b = b + self.attn(b)
        b = b + self.ffn(b)
        return self.cv2(torch.cat((a, b), 1))

将该代码放ultralytics/nn/modules/block.py中。

再将模块添加到block.py的__all__中。

 到ultralytics/nn/modules/__init__.py中添加psa模块。

 分别在.block导入psa和在__all__添加psa。

然后,需要在 ultralytics/nn/tasks.py中加入psa。

在这个里面直接导入psa即可。 

 或者直接全部导入。

然后再到parse_model函数中加入psa即可。

 

然后,就可以再yaml文件里里面添加该模块了。

  # Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.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 GFLOPs
  s: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs

# YOLOv8.0n backbone
backbone:
  # [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, psa, [1024]]
# YOLOv8.0n head
head:
  - [-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, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f, [1024]]  # 22 (P5/32-large)

  - [[16, 19, 22], 1, Detect, [nc]]  # Detect(P3, P4, P5)

### YoloV10PSA 技术文档、项目示例及实现方式 #### 关于YoloV10PSA的技术背景和发展历程 YOLO系列算法自推出以来不断迭代更新,在目标检测领域取得了显著成就。然而,对于特定版本如YoloV10PSA的信息较为有限,当前主流讨论集中于YOLOv8及其之前的版本[^2]。 #### 数据准备与配置调整 针对任何YOLO变体模型的数据准备工作通常涉及创建并编辑相应的配置文件,例如`traindata.yaml`。此文件用于指定数据集路径及其他必要参数。为了适应新模型的需求,可能需要按照相似的方式修改配置文件中的`path`字段来指向本地存储的数据集位置[^3]。 #### 模型架构改进与创新点 尽管未找到直接关于YoloV10PSA的具体描述,但从其他先进YOLO版本的发展趋势来看,该版本可能会引入一些独特的特性或优化措施。比如,某些研究提出了新型损失函数的设计思路——动态缩放的交叉熵损失,旨在更好地解决类别不平衡问题;这种机制能够使模型更加专注于难以分类的例子,从而提升整体性能表现[^4]。 #### 开源资源与社区支持 虽然目前尚未发现确切名为“YoloV10PSA”的开源项目,但可以参考类似的高性能YOLO分支,如PP-YOLOv2。后者由PaddleDetection团队维护,不仅涵盖了完整的开发流程指导(包括但不限于数据预处理、模型训练以及超参调节),还提供了丰富的API接口供开发者灵活调用和扩展功能[^1]。 ```python from paddleocr import PPOCRv2 detector = PPOCRv2() result = detector.detect(image_path='example.jpg') print(result) ``` 上述代码片段展示了基于PaddleOCR库的一个简易实例,实际应用中可根据需求替换为目标检测模块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值