YOLOv8多种方法改进CBAM注意力机制有效提升检测精度(已跑通)

一、CBAM概念

        CBAM(Convolutional Block Attention Module)是一种用于卷积神经网络(CNN)的注意力机制,旨在提高网络的表现能力。它通过引入两个注意力模块来增强特征图的表达能力。

二、源码:

class ChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=16):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        self.relu = nn.ReLU()
        self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.f2(self.relu(self.f1(self.avg_pool(x))))
        max_out = self.f2(self.relu(self.f1(self.max_pool(x))))
        out = self.sigmoid(avg_out + max_out)
        return out


class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()
        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1
      
        self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        # 1*h*w
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        # 2*h*w
        x = self.conv(x)
        # 1*h*w
        return self.sigmoid(x)


class CBAM(nn.Module):
    def __init__(self, c1, c2, ratio=16, kernel_size=7):  # ch_in, ch_out, number, shortcut, groups, expansion
        super(CBAM, self).__init__()
        self.channel_attention = ChannelAttention(c1, ratio)
        self.spatial_attention = SpatialAttention(kernel_size)

    def forward(self, x):
        out = self.channel_attention(x) * x
        # c*h*w
        # c*h*w * 1*h*w
        out = self.spatial_attention(out) * out
        return out

三、改进步骤

第一步,在ultralytics/nn/modules/conv.py文件内添加注意力源码

d2f0126059c743c6be85eae2f0b87794.png

第二步,在ultralytics/nn/modules/init.py文件内,按下图标识的地方添加注意力名

第一处:在from .conv import()处最后,添加注意力名称

e09a694c0f544d4da5904b9d3b8d85ed.png

第二处:在__all__={}处最后,添加注意力名称 

f6c0b28f7a7e45b48982052209a16b4b.png

第三步,在ultralytics/nn/tasks.py文件内,

首先,在from ultralytics.nn.modules import 处添加CBAM

50361f26a85f44e6b1fc95a4d49c5fce.png

        其次,键盘点击CTRL+shift+F打开查找界面,搜索elif m in ,在该函数下方有一堆的elif m in XXX,在某一个elif下方添加如下代码

        elif m in {CBAM}:
            c1, c2 = ch[f], args[0]
            if c2 != nc:  # if not output
                c2 = make_divisible(min(c2, max_channels) * width, 8)
            args = [c1, c2, *args[1:]]

 c83a45ec29944c029b553eb675fdbd92.png

 第五步,在ultralytics/cfg/models/v8文件下,复制yolov8.yaml,并改成自己的名字(如yolov8-CBAM.yaml)

第一种修改方法,在backbone中添加CABM,因为添加了一层CABM,所以在Detect处也要相应的做出修改,如下:

b784458bd35b419da353dabf7ef29f5a.png

运行结果:

ea1793c4de0a41c29e669d6092778590.png

第二张修改方法,在backbone和head中分别添加CABM,Detect处也要根据添加的层数做出相应的做出修改,如下:

87e32732709746eabb9a8c0d6e354ff6.png

运行结果:

50fc6b5fbd184e0f96228ac33ce953a2.png

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
YOLOv7算法中添加CBAM注意力机制,可以按照以下步骤进行: 1. 下载CBAM模块的代码,并将其添加到YOLOv7的代码库中。 2. 在YOLOv7的模型定义中,添加CBAM模块。具体来说,在YOLOv7的模型定义中,可以使用以下代码来添加CBAM模块: ``` class CBAM(nn.Module): def __init__(self, channels, reduction): super(CBAM, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc1 = nn.Conv2d(channels, channels // reduction, kernel_size=1, padding=0) self.relu = nn.ReLU(inplace=True) self.fc2 = nn.Conv2d(channels // reduction, channels, kernel_size=1, padding=0) self.sigmoid_channel = nn.Sigmoid() self.conv_after_concat = nn.Conv2d(2, 1, kernel_size=3, stride=1, padding=1) self.sigmoid_spatial = nn.Sigmoid() def forward(self, x): module_input = x avg = self.avg_pool(x) max = self.max_pool(x) avg = self.fc1(avg) max = self.fc1(max) avg = self.relu(avg) max = self.relu(max) avg = self.fc2(avg) max = self.fc2(max) channel_attention = self.sigmoid_channel(avg + max) spatial_attention = torch.cat([avg, max], dim=1) spatial_attention = self.conv_after_concat(spatial_attention) spatial_attention = self.sigmoid_spatial(spatial_attention) x = x * channel_attention * spatial_attention return x ``` 3. 在YOLOv7的网络结构中,添加CBAM模块。具体来说,在YOLOv7的网络结构中,可以使用以下代码来添加CBAM模块: ``` class YOLOv7(nn.Module): def __init__(self, num_classes, anchors, num_anchors, strides, scales, cbam=False): super(YOLOv7, self).__init__() self.num_classes = num_classes self.anchors = anchors self.num_anchors = num_anchors self.strides = strides self.scales = scales self.cbam = cbam self.backbone = nn.ModuleList() self.neck = nn.ModuleList() self.head = nn.ModuleList() # backbone self.backbone.append(CSPDarknet53()) # neck self.neck.append(Conv(1024, 512, 1)) self.neck.append(Conv(512, 1024, 3)) self.neck.append(Conv(1024, 512, 1)) self.neck.append(Conv(512, 1024, 3)) self.neck.append(Conv(1024, 512, 1)) # CBAM module if self.cbam: self.cbam_module = CBAM(512, 16) # head final_out_filter = len(anchors[0]) * (num_classes + 5) self.head.append(Conv(512, 1024, 3)) self.head.append(nn.Conv2d(1024, final_out_filter, 1, 1, 0)) def forward(self, x): x = self.backbone[0](x) x = self.neck[0](x) x = self.neck[1](x) x = self.neck[2](x) x = self.neck[3](x) x = self.neck[4](x) # CBAM module if self.cbam: x = self.cbam_module(x) x = self.head[0](x) x = self.head[1](x) return x ``` 4. 在训练YOLOv7模型时,将CBAM模块添加到模型中。 以上是在YOLOv7算法中添加CBAM注意力机制的步骤,这样可以提高YOLOv7模型的精度和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兜里没有一毛钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值