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)

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Yolov5是一种常用于目标检测的神经网络模型,而极化自注意力PSA是一种用于增强特征表示的注意力机制。如何在Yolov5模型中改进和应用PSA? 要改进Yolov5模型并应用PSA,可以按照以下步骤进行: 1. 理解Yolov5模型结构:首先,需要深入了解Yolov5模型的网络结构,包括骨干网络、特征提取层、检测层等。这有助于我们了解如何集成PSA注意力机制。 2. 研究极化自注意力PSAPSA注意力机制可以增强特征表示和区分能力,我们需要详细了解PSA自注意力的工作原理和数学表达式,以及如何将其与Yolov5模型相结合。 3. 修改Yolov5模型结构:在Yolov5模型中引入PSA注意力机制,通常可以通过插入新的PSA模块来实现。这个模块应该被放置在适当的层级上,以确保在特定阶段捕获和加强有用的特征信息。 4. 模型训练和调优:完成模型修改后,需要重新训练Yolov5模型,并根据实际数据集进行调优。这可能需要在训练阶段进行多次试验和验证,以找到有效的超参数和最佳的模型性能。 5. 模型评估和性能比较:在完成训练后,需要对改进后的Yolov5模型进行评估。通过使用测试集数据,计算模型的精确度、召回率、mAP等指标,以及与原始Yolov5模型的性能比较,以验证PSA在模型性能上的改进。 通过以上步骤,我们可以将PSA注意力机制有效地集成到Yolov5模型中,从而改进模型的特征表示能力和目标检测性能。进一步的改进可以包括调整PSA模块的参数、模型融合技术等。这些努力有望提高模型的准确性和鲁棒性,使其在目标检测任务中更具优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值