YOLOv8轻量化改进——Coordinate Attention注意力机制

news2025/4/21 1:16:25

现在针对YOLOv8的架构改进越来越多,今天尝试引入了Coordinate Attention注意力机制以改进对小目标物体的检测效率。

yolov8的下载和安装参考我这篇博客:

基于SeaShips数据集的yolov8训练教程_seaships处理成yolov8-CSDN博客

首先我们可以去官网找到CA注意力机制模块的相关文件:

官网链接:GitHub - houqb/CoordAttention: Code for our CVPR2021 paper coordinate attention

接下来我们就可以去下载好的yolov8配置文件中进行修改:

首先是modules.py文件,路径如下:

在最下方添加CA注意力机制类的定义:

class CA(nn.Module):
    def __init__(self, inp, oup, reduction=32):
        super(CA, self).__init__()
        torch.use_deterministic_algorithms(True, warn_only=True)  # 允许非确定性操作但继续运行
        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, oup, kernel_size=1, stride=1, padding=0)
        self.conv_w = nn.Conv2d(mip, oup, 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

结果如下:

接着去tasks.py文件下:

最上方注册CA模块:

用以下代码:

from ultralytics.nn.modules import (C1, C2, C3, C3TR, SPP, SPPF, Bottleneck, BottleneckCSP, C2f, C3Ghost, C3x, Classify,
                                    Concat, Conv, ConvTranspose, Detect, DWConv, DWConvTranspose2d, Ensemble, Focus,
                                    GhostBottleneck, GhostConv, Segment,CA,DualConv)

然后找到parse_model函数:

可以Crtl+F全局搜索一下比较快,找到其中一行:

if m in (Classify, Conv, ConvTranspose, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, Focus,
                 BottleneckCSP, C1, C2, C2f, C3, C3TR, C3Ghost, nn.ConvTranspose2d, DWConvTranspose2d, C3x):

在最后C3x后面加入CA即可。

最后再找到你的yaml配置文件:

修改backbone和检测头head,根据你需要添加CA机制的地方来引入CA模块,注意前后输入输出的一致性,以及添加层之后的层序号变动,这些都是需要考虑的,这里给出我的配置文件代码供参考:

# Parameters
nc: 6  # number of classes
depth_multiple: 1.00  # scales module repeats
width_multiple: 1.00  # scales convolution channels

# YOLOv8.0l backbone-only CA
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]]   # 0-P1/2 [3,64,320,320]
  - [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4 [64,128,160,160]
  - [-1, 3, C2f, [128, True]]   # 2      [128,128,160,160]
  - [-1, 1, CA, [128]]           # 3      [128,128,160,160]
  - [-1, 1, Conv, [256, 3, 2]]  # 4-P3/8 [128,256,80,80]
  - [-1, 6, C2f, [256, True]]   # 5      [256,256,80,80]
  - [-1, 1, CA, [256]]           # 6      [256,256,80,80]
  - [-1, 1, Conv, [512, 3, 2]]  # 7-P4/16 [256,512,40,40]
  - [-1, 6, C2f, [512, True]]   # 8       [512,512,40,40]
  - [-1, 1, CA, [512]]           # 9       [512,512,40,40]
  - [-1, 1, Conv, [512, 3, 2]]  # 10-P5/32 [512,512,20,20]
  - [-1, 3, C2f, [512, True]]   # 11       [512,512,20,20]
  - [-1, 1, CA, [512]]           # 12       [512,512,20,20]
  - [-1, 1, SPPF, [512, 5]]     # 13      [512,512,20,20]

# YOLOv8.0l head
head:
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]  # 14 [512,512,40,40]
  - [[-1, 8], 1, Concat, [1]]                   # 15 拼接 [512,512,40,40] + [512,512,40,40] → [1024,512,40,40]
  - [-1, 3, C2f, [512]]                        # 16 [1024,512,40,40] → [512,512,40,40]
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]  # 17 [512,512,80,80]
  - [[-1, 5], 1, Concat, [1]]                   # 18 拼接 [512,512,80,80] + [256,256,80,80] → [768,768,80,80]
  - [-1, 3, C2f, [256]]                        # 19 [768,256,80,80]
  - [-1, 1, Conv, [256, 3, 2]]                  # 20 [256,256,40,40]
  - [[-1, 16], 1, Concat, [1]]                  # 21 拼接 [256,256,40,40] + [512,512,40,40] → [768,768,40,40]
  - [-1, 3, C2f, [512]]                        # 22 [768,512,40,40]
  - [-1, 1, Conv, [512, 3, 2]]                  # 23 [512,512,20,20]
  - [[-1, 13], 1, Concat, [1]]                  # 24 拼接 [512,512,20,20] + [512,512,20,20] → [1024,1024,20,20]
  - [-1, 3, C2f, [512]]                        # 25 [1024,512,20,20]
  - [[19, 22, 25], 1, Detect, [nc]]            # 26 Detect(P3, P4, P5)

这样就全部改进完毕了,接下来运行命令就可以看结果了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的驾校预约管理系统+LW示例参考

1.项目介绍 系统角色:管理员、普通用户、教练功能模块:用户管理、管理员管理、教练管理、教练预约管理、车辆管理、车辆预约管理、论坛管理、基础数据管理等技术选型:SpringBoot,Vue等测试环境:idea2024,j…

ONNX:统一深度学习工作流的关键枢纽

引言 在深度学习领域,模型创建与部署的割裂曾是核心挑战。不同框架训练的模型难以在多样环境部署,而 ONNX(Open Neural Network Exchange)作为开放式神经网络交换格式,搭建起从模型创建到部署的统一桥梁,完…

蓝桥杯————23年省赛 ——————平方差

3.平方差 - 蓝桥云课 一开始看题我还没有意识到问题的严重性 我丢,我想 的是用两层循环来做,后来我试了一下最坏情况,也就是l1 r 1000000000 结果运行半天没运行出来,我就知道坏了,孩子们,要出事&#…

一、串行通信基础知识

一、串行通信基础知识 1.处理器与外部设备通信有两种方式 并行通信:数据的各个位用多条数据线同时传输。(传输速度快,但占用引脚资源多。) 串行通信:将数据分成一位一位的形式在一条数据线上逐个传输。(线路…

自带多个接口,完全免费使用!

做自媒体的小伙伴们,是不是经常为语音转文字的事儿头疼? 今天给大家推荐一款超实用的语音转文字软件——AsrTools,它绝对是你的得力助手! AsrTools 免费的语音转文字软件 这款软件特别贴心,完全免费,而且操…

Qt QML解决SVG图片显示模糊的问题

前言 在QML中直接使用SVG图片,使用Image控件加载资源,显示出来图片是模糊的,很影响使用体验。本文介绍重新绘制SVG图片,然后注册到QML中使用。 效果图: 左边是直接使用Image加载资源显示的效果 右边是重绘后的效果 …

【Linux我做主】基础命令完全指南上篇

Linux基础命令完全指南【上篇】 Linux基础命令完全指南github地址前言命令行操作的引入Linux文件系统树形结构的根文件系统绝对路径和相对路径适用场景Linux目录下的隐藏文件 基本指令目录和文件相关1. ls2. cd和pwdcdpwd 3. touch4. mkdir5. cp6. mv移动目录时覆盖写入的两种特…

Designing Dashboards with SAP Analytics Cloud

Designing Dashboards with SAP Analytics Cloud

项目实战系列:基于瑞萨RA6M5构建多节点OTA升级-系统设计<一>

项目背景 原嵌入式控制系统采用分布式模块化架构,由12个功能板卡(通信控制、信号采集、驱动执行等)组成。系统维护阶段存在以下痛点: 低效的本地烧录机制:各板卡固件升级需通过JTAG接口逐一手动连接JLINK仿真器&#x…

《AI大模型趣味实战》 No3:快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色/博客/聊天室/AI管家(下)

《AI大模型趣味实战》 No3:快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色/博客/聊天室/AI管家(下) 摘要 本文介绍了家庭网站V1.3版本的更新内容,主要聚焦于AI管家功能的优化与完善。V1.3版本对AI管家模块进行了全面升级&#xff0…

c++基础知识-图论进阶

一、拓扑排序 1、基础知识 1)什么是拓扑排序 对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若,则u在线性序列中出现在v之前。 2)拓扑排序的操作方法 重复执行…

[Java实战]Spring Boot服务CPU 100%问题排查:从定位到解决

Spring Boot服务CPU 100%问题排查:从定位到解决 1. 引言 当Spring Boot服务出现CPU占用率100%时,系统性能会急剧下降,甚至导致服务不可用。本文将通过真实代码案例,详细讲解如何快速定位问题根源,并提供解决方案。无…

1.6 极限存在准则

1.夹逼定理(迫敛定理) 1.1 数列型 1.1.1 准则 1.2 函数型 2. 两个重要极限

大华SDK协议在智联视频超融合平台中的接入方法

一. 大华SDK协议详解 (一)、大华SDK协议概述 大华SDK(Software Development Kit)协议是大华股份为开发者提供的一套软件开发工具包,旨在帮助开发者快速集成大华设备(如摄像头、NVR、DVR等)的功…

卓越的用户体验需要智能内容

摘要:这篇文章指出静态文档已无法满足现代用户的需求,而智能内容则是构建卓越用户体验的关键。文章从智能内容的定义、优势和实际应用等方面进行了详细阐述,并强调了企业应积极拥抱智能内容,以提升客户满意度、降低成本并创造新的…

【蓝桥杯】1124修建公路1(Kruskal算法)

思路 找到能够连通所有城市的最小树即可,可用Prim或Kruscal。 !!注意,m的范围是包括0的,可就是包含没有道路的情况,要单独输出0 code import os import sys# 输入 n,m map(int,input().split()) road …

传感云揭秘:边缘计算的革新力量

在当今快速发展的科技时代,传感云和边缘计算系统正逐渐成为人们关注的焦点。传感云作为物联网与云计算的结合体,通过虚拟化技术将物理节点转化为多个服务节点,为用户提供高效、便捷的服务。而边缘计算则是一种靠近数据源头或物端的网络边缘侧…

Bigemap Pro 的三种地图下载方式

地图下载通常是是最基础但也最重要的任务之一,无论是进行空间分析、制作专题地图,还是进行数据可视化,高质量的地图数据都是不可或缺的。Bigemap Pro提供了三种地图下载方式,分别适用于不同的场景和需求。无论是免费版用户还是专业…

Python直方图:从核密度估计到高维空间解析

一、直方图的核心原理与数学本质 数据分布的视觉解码器 直方图(Histogram)是数据科学家的"分布显微镜",通过将连续数据划分为等宽区间(Bin),统计各区间的频数/频率,用相邻矩形条直观…