【YOLOv5-6.x】解决加入CA注意力机制不显示FLOPs的问题

2023-11-18

1、问题描述

问题源自之前写的一篇博客:【魔改YOLOv5-6.x(中)】:加入ACON激活函数、CBAM和CA注意力机制、加权双向特征金字塔BiFPN,尝试在YOLOv5的backbone中加入Coordinate Attention,虽然加入后mAP有提升,但是重要的GFLOPs信息却无法显示!!

2、问题解决

于是我就开始了疯狂debug,在各个位置加断点,加断点,终于锁定源头:CABlock类函数的定义

这是CABlock原始类函数,在__init__中定义了两个自适应平均池化nn.AdaptiveAvgPool2d(),正是这两个自适应平均池化,导致加入CA后GFLOPs信息无法显示,具体原因目前还不清楚,欢迎各位大佬前来交流~

class CABlock(nn.Module):
    def __init__(self, inp, oup, reduction=32):
        super(CABlock, self).__init__()
        # ============================
        # height方向上的均值池化
        self.pool_h = nn.AdaptiveAvgPool2d((None, 1))
        # width方向上的均值池化
        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

于是,我改成了下面这样,问题就得到解决了

class CABlock(nn.Module):
    def __init__(self, inp, oup, reduction=32):
        super(CABlock, self).__init__()
        mip = max(8, inp // reduction)

        self.conv1 = nn.Conv2d(inp, mip, 1, 1, bias=False)
        self.bn1 = nn.BatchNorm2d(mip)
        self.act = h_swish()

        self.conv_h = nn.Conv2d(mip, oup, 1, 1, bias=False)
        self.conv_w = nn.Conv2d(mip, oup, 1, 1, bias=False)

    def forward(self, x):
        identity = x
        _, _, h, w = x.size()
        pool_h = nn.AdaptiveAvgPool2d((h, 1))
        x_h = pool_h(x)
        pool_w = nn.AdaptiveAvgPool2d((1, w))
        x_w = 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)

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

        a_h = self.conv_h(y_h).sigmoid()
        a_w = self.conv_w(y_w).sigmoid()

        return identity * a_w * a_h
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【YOLOv5-6.x】解决加入CA注意力机制不显示FLOPs的问题 的相关文章

随机推荐

  • react 显示当前时间_react中monent如何获取日期?

    方法 1 使用 npm install moment save 安装moment 2 在组件中使用import语句引入moment 3 使用monent提供的方法来获取日期 例 moment format 获取当前时间 本教程操作环境 wi
  • OneFlow 中的 Softmax

    Softmax 是深度学习模型中的常见算子 PyTorch 的 Softmax 算子直接调用 cuDNN 的接口 而 OneFlow 内部针对输入数据的类别数量 采用3个 kernel 来分别处理 在多数情况下都可以获得比 cuDNN 更优
  • 【Git】(三)回退版本

    1 git reset命令 1 1 回退至上一个版本 git reset hard HEAD 1 2 将本地的状态回退到和远程的一样 git reset hard origin master 注意 谨慎使用 hard 参数 它会删除回退点之
  • redis必杀高级:安全

    题记 我们可以通过 redis 的配置文件设置密码参数 这样客户端连接到 redis 服务就需要密码验证 这样可以让你的 redis 服务更安全 例如 设置密码 查看是否设置了密码验证 127 0 0 1 6379 gt CONFIG ge
  • 【Java日志】你真的知道怎么使用Java日志API吗?

    你真的知道怎么使用Java日志API吗 一 背景 二 Java日志API错误使用示例 1 占位符的错误使用示例 2 异常日志的错误使用示例 三 推荐一个学习Java日志的项目 一 背景 在平时的开发过程中 常常看到一些编码不规范的打印日志的
  • Flask读取RTSP视频流,及其简单的一个案例

    Flask读取RTSP视频流 及其简单的一个案例 此章节包括通过是使用Flask可以实时地显示RTSP视频流 代码确实非常简单 源于Github 主要为为Nvidia Deepstream极致细节 3 Deepstream Python R
  • 华为怎么显示返回按键_华为怎么把返回那三个键调出来

    华为怎么把返回那三个键调出来 其实这个方法一点都不难 1 首先在华为nova3的桌面找到 设置 并点击进入 2 点击打开 系统 3 在系统菜单下 点击进入 系统导航 4 点击勾选 屏幕内虚拟导航栏 即可打开虚拟导航 不勾选即可直接关闭虚拟导
  • vscode配置快捷键注释模板

    文章目录 前言 一 打开配置项 1 首选项编辑配置 2 新建代码片段 3 配置注释文件名 二 新建代码注释模板 三 注释使用 前言 本篇文章可以在vscode中配置快捷键显示代码的信息注释 如作者 描述 创建时间等 一 打开配置项 1 首选
  • SD卡中FAT32文件格式快速入门(图文详细介绍)

    说明 MBR Master Boot Record 主引导记录 DBR DOS Boot Record 引导扇区 FAT File Allocation Table 文件分配表 硬件 本文SD卡为Kingston 4GB FAT32格式 簇
  • 【Python】 Pandas数据导入与导出

    数据读取 import pandas as pd data pd read csv data csv 读取数据文件 print data 数据索引与查看 x data loc x 读取表头为 x 的那一列的数据 print x y data
  • 如何自学现代计算机科学(转)

    简介 这里收集了很多学习资源 都是关于一些适合本科生学习的计算机科学 话题 Topics 这里仅仅只提供 话题 列表 而不会提供诸如知识点剖析 练习题等内容 如果你对某一个话题特别感兴趣 想深入研究一下 但又买不起文中提到的书籍 实体书 那
  • 使用docker搭建FastDFS文件系统

    使用docker搭建FastDFS文件系统 1 拉取fastdfs镜像 docker search fastdfs 这里要选择 delron fastdfs 镜像 docker pull delron fastdfs 2 启动容器 2 1
  • 车祸相关公开数据集(免费下载)

    Vehicle Collisions 纽约市机动车与人相撞 背景描述 这是 2021 年在纽约发生的人与机动车碰撞事故的数据 仅过滤掉超过 1 000 美元的受伤或死亡案件 总结了事件的日期和时间 受伤的位置以及警方对事件的描述 数据说明
  • Dubbo源码分析-Spring与Dubbo整合原理与源码分析(二)

    Spring与Dubbo整合的整体流程 基于apache dubbo 2 7 15 因为dubbo有较多的兼容以前的代码比如 DubboReference 以前就有两个版本 Reference 和 com alibaba dubbo con
  • list 分组_学习笔记系列_10_数据聚合与分组操作

    开篇导包 一 数据聚合 df groupby 详解 DataFrame 参数 by 用作分组的条件对象 mapping function label or list of labels axis 轴方向 0 or index 1 or co
  • Golang笔记:UDP基础使用与广播

    文章目录 目的 基础说明 作为服务器使用 作为客户端使用 广播 总结 目的 UDP是比较基础常用的网络通讯方式 这篇文章将介绍Go语言中UDP基础使用的一些内容 本文中使用 Packet Sender 工具进行测试 其官网地址如下 http
  • 大数据常见错误解决方案(转载)

    1 用 bin spark shell启动spark时遇到异常 java net BindException Can t assign requested address Service sparkDriver failed after 1
  • java代理

    静态代理 import java util logging Level import java util logging Logger 定义接口 代理类和被代理类都要实现这个接口 interface IHello public void h
  • KALI中Arping的使用方法(2023)

    一 介绍 ARP协议是 Address Resolution Protocol 地址解析协议 的缩写 在同一以太网中 通过地址解析协议 源主机可以通过目的主机的IP地址获得目的主机的MAC地址 arping程序就是完成上述过程的程序 arp
  • 【YOLOv5-6.x】解决加入CA注意力机制不显示FLOPs的问题

    1 问题描述 问题源自之前写的一篇博客 魔改YOLOv5 6 x 中 加入ACON激活函数 CBAM和CA注意力机制 加权双向特征金字塔BiFPN 尝试在YOLOv5的backbone中加入Coordinate Attention 虽然加入