YOLOv8改进系列,YOLOv8添加CA注意力机制+新增小目标检测头



前言

在本文中,提出了一种新的移动网络注意力机制,将位置信息嵌入到信道注意力中称之为“协调注意力”。与渠道关注不同通过2D全局池将特征张量转换为单个特征向量,坐标注意力因子将通道注意力转化为两个1D特征编码过程,这两个过程分别沿着两个空间方向聚合特征。通过这种方式,可以沿着一个空间方向捕获长程依赖性和均值,同时可以沿着另一个空间方向。生成的特征图为然后分别编码为一对方向感知和位置敏感注意力图,其可以被完全应用于输入特征图以增加感兴趣对象的表示。坐标保持简单,可以灵活插入经典网络,CA注意机制理论详解可以参考链接: 论文地址)


一、YOLOv8原始版本代码下载

源码下载地址 :链接: link
源码提取码: rpe7

二、CA代码

# -*- coding: utf-8 -*-
"""
@Auth : 挂科边缘
@File :CA.py
@IDE :PyCharm
@Motto:学习新思想,争做新青年
@Email :179958974@qq.com
@qq :179958974
"""
import torch
import torch.nn as nn
import torch.nn.functional as F


class h_sigmoid(nn.Module):
    def __init__(self, inplace=True):
        super(h_sigmoid, self).__init__()
        self.relu = nn.ReLU6(inplace=inplace)

    def forward(self, x):
        return self.relu(x + 3) / 6


class h_swish(nn.Module):
    def __init__(self, inplace=True):
        super(h_swish, self).__init__()
        self.sigmoid = h_sigmoid(inplace=inplace)

    def forward(self, x):
        return x * self.sigmoid(x)


class CoordAtt(nn.Module):
    def __init__(self, inp, reduction=32):
        super(CoordAtt, self).__init__()
        self.pool_h = nn.AdaptiveAvgPool2d((None, 1))
        self.pool_w = nn.AdaptiveAvgPool2d((1, None))

        mip = max(8, inp // reduction)

        self.conv1 = nn.Conv2d(inp, mip, kernel_size=1, stride=1, padding=0)
        self.bn1 = nn.BatchNorm2d(mip)
        self.act = h_swish()

        self.conv_h = nn.Conv2d(mip, inp, kernel_size=1, stride=1, padding=0)
        self.conv_w = nn.Conv2d(mip, inp, kernel_size=1, stride=1, padding=0)

    def forward(self, x):
        identity = x

        n, c, h, w = x.size()
        x_h = self.pool_h(x)
        x_w = self.pool_w(x).permute(0, 1, 3, 2)

        y = torch.cat([x_h, x_w], dim=2)
        y = self.conv1(y)
        y = self.bn1(y)
        y = self.act(y)

        x_h, x_w = torch.split(y, [h, w], dim=2)
        x_w = x_w.permute(0, 1, 3, 2)

        a_h = self.conv_h(x_h).sigmoid()
        a_w = self.conv_w(x_w).sigmoid()

        out = identity * a_w * a_h

        return out

三、在YOLOv8添加CA代码

1.在modules目录下添加上述的CA代码

在ultralytics/nn/modules目录下,新建一个文件名,我这里取名为CA.py,把上面代码复制进去,如图所示
在这里插入图片描述

在__init__.py文件导入CA模块,

文件路径为:ultralytics/nn/modules/init.py,在__init__.py开头导入CA,导入截图所示

from .CA import CoordAtt

在这里插入图片描述

3.在tasks.py文件注册CoordAtt

该文件路径为:ultralytics/nn/tasks.py,在开头导入CoordAtt,添加如截图所示
在这里插入图片描述

之后在这个文件的parse_model方法,添加CoordAtt,如果有其它注意机制添加到{}里面就行,CBAM是上一期的注意机制,所用的参数是一样的,所示只需在{}添加其它注意机制就行,添加如截图所示
在这里插入图片描述

看到这里已经成功把改进的模块添加进YOLOv8源码了,接下来配置yaml文件调用改进的模块就行了


四、yaml文件修改

在ultralytics/cfg/models/v8目录下,新建一个yaml文件,复制yolov8.yaml文件,然后取名为yolov8-min-CA.yaml,我这个文件代码如下所示:
为提升远距离小目标的识别准确率,在YOLOv8原始网络上增加一个预测层,整个模型改进后采用4个预测尺度的预测层,将底层特征高分辨率和深层特征高语义信息充分利用,并结合CA注意机制,CA注意机制就可以换成其它注意机制,只需改一改yaml文件的注意机制名字就行,往期文章有教添加了注意机制代码了,yaml文件已经写好了,只需要替换其它注意机制就行
下面将展示在主干网络添加新的小目标层+CA注意机制,你也在其它地方添加,即插即用,多多实验出结果

在主干添加

yolov8-min-CA.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

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 6], 1, Concat, [1]]  # cat backbone P4
  - [-1, 3, C2f, [512]]  # 12

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C2f, [256]]  # 15 (P3/8-small)

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 2], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C2f, [128]]  # 18 (P3/8-small)
  - [-1, 1, CoordAtt,[]]  #19

  - [ -1, 1, Conv, [128, 3, 2] ]
  - [ [ -1, 15 ], 1, Concat, [1]]  # cat head P4
  - [ -1, 3, C2f, [256] ]  # 22 (P4/16-medium)
  - [-1, 1, CoordAtt,[]]  #23

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f, [512]]  # 26 (P4/16-medium)
  - [-1, 1, CoordAtt,[]]  #27

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f, [1024]]  # 30 (P5/32-large)
  - [-1, 1, CoordAtt,[]]  #31

  - [[19, 23, 27,31], 1, Detect, [nc]]  # Detect(P3, P4, P5)

五、训练文件修改

YOLOv8训练方式跟YOLOv5是有区别的,但是训练数据集格式跟YOLOv5一样的,你只需把处理好的数据集就行,这里就不在阐述了,废话不多说,我的训练文件如下,根据你训练需求修改指定参数就行,圈起来的修改成你的路径就行
在这里插入图片描述

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO

if __name__ == '__main__':
    model = YOLO(r'E:\Desktop\new-yolov8\ultralytics-main\ultralytics\cfg\models\v8\yolov8-DCNv2.yaml')
    model.train(data=r'data.yaml',
                cache=False,
                imgsz=640,
                epochs=5,
                single_cls=False, 
                batch=4,
                close_mosaic=10,
                workers=0,
                device='cpu',
                optimizer='SGD',
                project='runs/train',
                name='exp',
                )

device=‘cpu’,参数意思是:你电脑是GPU你就填0,CPU就填cpu,GPU是有英伟达显卡的电脑使用的,如果没有英伟达显卡训练非常慢,因为我电脑没有英伟达显卡,这里训练只用了几张数据集进行测试,你们也可以租云服务器训练,方法都是一样的,后期有空会出一起环境配置视频,我以前的作品也有环境配置教程的,你们可以翻一下看看
测试一下训练,打印出来的YOLOv8结构可以看到添加CA注意机制成功,并且多了一个小目标检测层,就四个输出头
在这里插入图片描述

总结

请在我提供的YOLOv8代码修改,把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,谢谢观看

  • 28
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

挂科边缘(毕业版)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值