YOLOv8改进 | 卷积模块 | 用坐标卷积CoordConv替换Conv


💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡


专栏目录:《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进


CoordConv 是一种针对卷积神经网络(CNNs)的改进方法,旨在解决传统卷积在处理空间位置信息时的局限性。CoordConv 通过向卷积层引入额外的坐标信息通道,使网络能够更有效地学习空间变换,从而提高在需要理解空间布局的任务上的性能。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

专栏地址YOLOv8改进——更新各种有效涨点方法——点击即可跳转

目录

1. 原理

2. 代码实现

2.1 添加CoordConv到YOLOv8代码中

2.2 更改init.py文件

2.3 新增yaml文件

2.4 注册模块

2.5 执行程序

3. 完整代码分享

4. 进阶

5. 总结


1. 原理

官方论文:An intriguing failing of convolutional neural networks and the CoordConv solution——点击即可跳转

官方代码:官方代码仓库——点击即可跳转

CoordConv,即坐标卷积,解决了标准卷积神经网络 (CNN) 的一个重大限制。传统 CNN 难以完成需要转换空间表示的任务,例如将密集的笛卡尔坐标转换为稀疏的基于像素的表示或反之亦然。CoordConv 通过在卷积层中引入显式坐标信息解决了这个问题。以下是 CoordConv 背后原理的详细解释:

传统卷积及其局限性

标准 CNN 非常适合处理平移不变性有益的任务,例如图像分类。但是,当任务需要了解输入中的空间位置时,例如在生成模型或某些基于坐标的转换中,CNN 表现不佳。这是因为卷积层本身缺乏有关输入空间内绝对位置的信息。卷积在本地运行,在整个输入中应用相同的过滤器,这使得网络难以有效地学习位置信息。

CoordConv:使用坐标信息增强卷积

CoordConv 通过添加编码每个像素坐标的额外输入通道来修改标准卷积运算。这使卷积滤波器能够知道它们在输入空间中的位置,从而显著提高网络学习空间变换的能力。

CoordConv 的工作原理

  1. 坐标通道:CoordConv 层为输入引入了两个额外通道:一个用于 x 坐标,一个用于 y 坐标。这些通道包含输入中每个像素的归一化坐标。

  2. 连接:这些坐标通道与原始输入通道连接,为卷积滤波器提供特征信息和空间坐标。

  3. 学习:通过访问坐标信息,滤波器可以学习空间相关特征,从而提高网络在需要理解空间布局的任务上的性能。

优势

CoordConv 论文通过各种实验证明了这种方法的有效性:

  • 监督坐标分类:在网络必须学习根据其坐标输出特定像素的任务中,即使在所有方面都提供监督,标准 CNN 也难以推广。另一方面,CoordConv 模型可以快速实现完美的准确性,并且参数更少。

  • 监督坐标回归:从基于像素的表示转换为笛卡尔坐标对于传统 CNN 来说同样具有挑战性,但使用 CoordConv 就变得轻而易举。

  • 监督渲染:从坐标输入创建图像是另一项 CoordConv 远远优于传统卷积的任务。

应用和推广

CoordConv 已在各个领域显示出改进,包括:

  • 物体检测:CoordConv 通过提供更好的空间信息提高了 Faster R-CNN 等模型的准确性,从而获得更精确的边界框。

  • 生成模型:在使用 GAN 和 VAE 进行图像生成等任务中,CoordConv 有助于减少模式崩溃并提高生成图像的质量。

  • 强化学习:使用 CoordConv 的代理在某些 Atari 游戏中获得更高的分数,表明具有更好的空间理解和决策能力。

结论

CoordConv 对卷积层进行了简单但功能强大的修改,使其能够更好地处理需要空间感知的任务。通过嵌入显式坐标信息,CoordConv 层允许网络更有效地学习空间变换,从而显著提高各种应用程序的性能。

2. 代码实现

2.1 添加CoordConv到YOLOv8代码中

关键步骤一:将下面代码粘贴到在/ultralytics/ultralytics/nn/modules/conv.py中,并在该文件的__all__中添加“CoordConv”

class AddCoords(nn.Module):def __init__(self, with_r=False):super().__init__()self.with_r = with_rdef forward(self, input_tensor):"""Args:input_tensor: shape(batch, channel, x_dim, y_dim)"""batch_size, _, x_dim, y_dim = input_tensor.size()xx_channel = torch.arange(x_dim).repeat(1, y_dim, 1)yy_channel = torch.arange(y_dim).repeat(1, x_dim, 1).transpose(1, 2)xx_channel = xx_channel.float() / (x_dim - 1)yy_channel = yy_channel.float() / (y_dim - 1)xx_channel = xx_channel * 2 - 1yy_channel = yy_channel * 2 - 1xx_channel = xx_channel.repeat(batch_size, 1, 1, 1).transpose(2, 3)yy_channel = yy_channel.repeat(batch_size, 1, 1, 1).transpose(2, 3)ret = torch.cat([input_tensor,xx_channel.type_as(input_tensor),yy_channel.type_as(input_tensor)], dim=1)if self.with_r:rr = torch.sqrt(torch.pow(xx_channel.type_as(input_tensor) - 0.5, 2) + torch.pow(yy_channel.type_as(input_tensor) - 0.5,2))ret = torch.cat([ret, rr], dim=1)return retclass CoordConv(nn.Module):def __init__(self, in_channels, out_channels, kernel_size=1, stride=1, with_r=False):super().__init__()self.addcoords = AddCoords(with_r=with_r)in_channels += 2if with_r:in_channels += 1self.conv = Conv(in_channels, out_channels, k=kernel_size, s=stride)def forward(self, x):x = self.addcoords(x)x = self.conv(x)return x

CoordConv(坐标卷积)通过将坐标信息集成到网络中来修改标准卷积操作,这有助于网络更有效地处理空间变换。下面逐步分解 CoordConv 所涉及的主要过程:

1. 输入准备

  • 原始输入:从原始输入图像或特征图开始。

  • 坐标生成:为 x 和 y 坐标生成坐标通道。

  • X 坐标通道:一个 2D 数组,其中每个元素代表像素的归一化 x 坐标。

  • Y 坐标通道:一个 2D 数组,其中每个元素代表像素的归一化 y 坐标。

2. 坐标连接

  • 连接通道:沿通道维度将原始输入与 x 和 y 坐标通道连接起来。如果原始输入有 (C) 个通道,而坐标又增加了 2 个通道,那么 CoordConv 层的新输入将有 (C+2) 个通道。

3. CoordConv 层操作

  • 卷积:使用标准卷积滤波器对连接输入执行卷积操作。这些滤波器现在可以访问坐标信息以及原始特征信息。

4. 学习和适应

  • 训练:在训练期间,网络学习可以有效利用特征和坐标信息的滤波器。这使得网络能够比标准卷积更有效地理解和利用空间信息。

5. 集成到网络中

  • 替换标准卷积:CoordConv 层可以替换现有架构中的标准卷积层。这种替换在网络中空间感知至关重要的部分尤其有益,例如在生成模型、对象检测和强化学习任务中。

2.2 更改init.py文件

关键步骤二:修改modules文件夹下的__init__.py文件,先导入函数

然后在下面的__all__中声明函数

2.3 新增yaml文件

关键步骤三:在 \ultralytics\ultralytics\cfg\models\v8下新建文件 yolov8_CoordConv.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# YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [ -1, 1, CoordConv, [ 64, 3, 2 ] ]  # 0-P1/2- [ -1, 1, CoordConv, [ 128, 3, 2 ] ]  # 1-P2/4- [ -1, 3, C2f, [ 128, True ] ]- [ -1, 1, CoordConv, [ 256, 3, 2 ] ]  # 3-P3/8- [ -1, 6, C2f, [ 256, True ] ]- [ -1, 1, CoordConv, [ 512, 3, 2 ] ]  # 5-P4/16- [ -1, 6, C2f, [ 512, True ] ]- [ -1, 1, CoordConv, [ 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, CoordConv, [ 256, 3, 2 ] ]- [ [ -1, 12 ], 1, Concat, [ 1 ] ]  # cat head P4- [ -1, 3, C2f, [ 512 ] ]  # 18 (P4/16-medium)- [ -1, 1, CoordConv, [ 512, 3, 2 ] ]- [ [ -1, 9 ], 1, Concat, [ 1 ] ]  # cat head P5- [ -1, 3, C2f, [ 1024 ] ]  # 21 (P5/32-large)- [ [ 15, 18, 21 ], 1, Detect, [ nc ] ]  # Detect(P3, P4, P5)

温馨提示:因为本文只是对yolov8基础上添加模块,如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。


# YOLOv8n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple# YOLOv8s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# YOLOv8l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple# YOLOv8m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple# YOLOv8x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.4 注册模块

关键步骤四:在parse_model函数中进行注册,添加CoordConv,

2.5 执行程序

在train.py中,将model的参数路径设置为yolov8_CoordConv.yaml的路径

建议大家写绝对路径,确保一定能找到

from ultralytics import YOLO# Load a model
# model = YOLO('yolov8n.yaml')  # build a new model from YAML
# model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)model = YOLO(r'/projects/ultralytics/ultralytics/cfg/models/v8/yolov8_CoordConv.yaml')  # build from YAML and transfer weights# Train the model
model.train(device = [3], batch=16)

🚀运行程序,如果出现下面的内容则说明添加成功🚀

3. 完整代码分享

https://pan.baidu.com/s/1EUh4JiCj4Jhc31BeH3eSOQ?pwd=utvm

提取码: utvm 

4. 进阶

可以与其他的注意力机制或者损失函数等结合,进一步提升检测效果

5. 总结

CoordConv(坐标卷积)通过将显式坐标信息集成到卷积层来增强标准卷积神经网络。它引入了两个额外的通道,分别表示每个像素的归一化 x 和 y 坐标,并与原始输入通道连接。这使得卷积滤波器能够访问特征和位置信息,从而使网络能够更有效地学习空间相关特征。因此,CoordConv 显著提高了需要精确空间感知的任务(例如物体检测、生成建模和强化学习)的性能。

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

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

相关文章

期货的心态

1.跌倒之后爬起过程中的收获 失败跌倒了,一定不要自暴自弃,而是要有跌倒不要紧,要相信爬起来的过程中都会有一定的收获,从交易错误中走出并升华,这就会一步步的使我们迈向更高层次的交易。 2.不要让今天的交易影响到明…

用Selenium自动化Web应用测试!

在开发和维护Web应用时,测试是确保应用正常运行的关键环节。手动测试不仅费时费力,而且容易出错。而通过使用Selenium,程序员可以轻松模拟用户交互、验证页面元素,从而自动化测试过程,提升测试效率和准确性。 解决的问…

第十五章 观察者模式

目录 1 观察者模式介绍 2 观察者模式原理 3 观察者模式实现 4 观察者模式应用实例 5 观察者模式总结 1 观察者模式介绍 观察者模式的应用场景非常广泛,小到代码层面的解耦,大到架构层面的系统解耦,再或者 一些产品的设计思路&#xff0c…

FREERTOS中,队列按键捕获

队列消息获取的按键任务优先级 < 队列消息释放的按键任务优先级 会出现错误&#xff0c;必须先按KEY1&#xff0c;才能按KEY0 解决方法&#xff1a;修改任务的优先级&#xff0c;队列消息获取的按键任务优先级 > 队列消息释放的按键任务优先级

Javaweb之web开发概述

一、Javaweb简介 用Java技术来解决相关web互联网领域的技术栈.使用JAVAEE技术体系开发企业级互联网项目. 项目规模和架构模式与JAVASE阶段有着很大的差别. 在互联网项目下,首先需要明白客户端和服务器的概念 客户端 :与用户进行交互&#xff0c;用于接收用户的输入(操作)、展示…

❤️‍❤️‍❤️‍FlyFlow 工作流:支持字典管理并支持表单引用

FlyFlow 介绍 官网地址&#xff1a;www.flyflow.cc 演示网址&#xff1a;pro.flyflow.cc FlyFlow 借鉴了钉钉与飞书的界面设计理念&#xff0c;致力于打造一款用户友好、快速上手的工作流程工具。相较于传统的基于 BPMN.js 的工作流引擎&#xff0c;我们提供的解决方案显著简…

20240619每日小程序-------朋友想开发微信小程序,那就搞一把demo

下载开发工具 hbuildX 微信开发者工具 随便搞个开源项目 会员小程序 下载后导入到hbuildX 安装依赖 npm i 安装hbuildX插件 工具—》插件安装 推荐安装&#xff1a; 微信小程序一键打包插件sass编译 启动 选择5.用微信开发者工具启动 报错不要怕 比如&#xff1a…

微信小程序生命周期分为3种:页面级别,应用级别,组件级别

应用级别&#xff1a; onLaunch&#xff0c;onShow&#xff0c;onHide 页面级别&#xff1a;onLoad&#xff0c;onShow&#xff0c;onReady&#xff0c;onHide&#xff0c;onUnload 组件级别&#xff1a;

硕思闪客精灵_2024最新版下载-闪客精灵软件下载_闪客精灵应用软件

​不同领域的应用证明了能够解析Flash动画片中的视频文件并以*.fla格式进行导出。人所共知的是支持预览和播放所选的Flash动画片或元素。我们都知道除了将静态文字恢复为文本外&#xff0c;硕思闪客精灵提供了将它转换为矢量图的功能。相信大家都认同闪客精灵专业版的优势&…

【3】Mcgs屏幕脚本程序

目录 1.脚本程序概述1.1 脚本程序简介1.2 脚本程序编辑环境 2.脚本程序语言要素2.1 变量和常量2.2 对象2.3 事件2.4 表达式2.5 联行符2.6 运算符2.7 系统函数 3. 基本语句3.1 赋值语句3.2 条件语句3.3 循环语句3.4 跳出语句3.5 退出语句3.6 注释语句3.7 声明语句3.6 命名规则 1…

AI从云端到边缘:人员入侵检测算法的技术原理和视频监控方案应用

在当今数字化、智能化的时代&#xff0c;安全已成为社会发展的重要基石。特别是在一些关键领域&#xff0c;如公共安全、智能化监管以及智慧园区/社区管理等&#xff0c;确保安全无虞至关重要。而人员入侵检测AI算法作为一种先进的安全技术&#xff0c;正逐渐在这些领域发挥着不…

Web后端Javaee企业级开发之定时任务 Springboot整合任务框架Quartz和Task详解

定时任务 在Java EE企业级开发中&#xff0c;定时任务&#xff08;也称为后台调度或周期性任务&#xff09;是非常常见的一种功能&#xff0c;主要用于执行那些不需要用户交互&#xff0c;但需要按照预定时间间隔或事件触发的任务。Java EE提供了几个框架和API来处理这种需求&…

如何制作 PDF 文件

本文概述了如何使用 Microsoft Word、GeekerPDF、Google Docs 和 Mac Pages 创建 PDF。您还可以使用免费的 PDF 创建器&#xff1b;有许多可供下载或在线使用的创建器。 如何使用 Microsoft Word 创建 PDF 如果您拥有 2007 或更高版本的 Microsoft Word&#xff0c;创建 PDF 的…

深入解析软件架构中的分层架构

目录 前言1. 什么是分层架构1.1 分层架构的基本概念1.2 分层架构的优势 2. 分层架构的具体实现2.1 表示层2.2 应用层2.3 数据访问层2.4 数据层 3. 分层架构的实践与挑战3.1 分层架构的实践经验3.2 分层架构的常见挑战 结语 前言 在软件开发过程中&#xff0c;架构设计是决定项…

【 ClickHouse】 ClickHouse数据类型(整型、浮点型、布尔型、Decimal型、字符串、数组、时间类型)(二)

ClickHouse数据类型 整型 固定长度的整型&#xff0c;包括有符号整型或无符号整型。 1)整型范围&#xff1a; Int8 - [-128 : 127] Int16 - [-32768 : 32767] Int32 - [-2147483648 : 2147483647] Int64 - [-9223372036854775808 : 9223372036854775807]2)无符号整型范围&…

结构思考力:让你的思维更有条理

在这个信息爆炸的时代&#xff0c;如何让自己的思维更有条理&#xff0c;更高效地沟通显得尤为重要。最近读了《结构思考力》一书。今天&#xff0c;我想和大家分享一下读后感&#xff0c;从以下几个方面展开&#xff1a;1. 什么是结构思考力及其重要性&#xff1b;2. 为什么要…

SpringMVC—RequestMapping注解

一、RequestMapping注解 RequestMapping注解&#xff1a;是Spring MVC框架中的一个控制器映射注解&#xff0c;用于将请求映射到相应的处理方法上&#xff0c;具体来说&#xff0c;他可以将指定URL的请求绑定到一个特定的方法或类上&#xff0c;从而实现对请求的处理和响应。 …

leetcode498 对角线遍历

题目 给你一个大小为 m x n 的矩阵 mat &#xff0c;请以对角线遍历的顺序&#xff0c;用一个数组返回这个矩阵中的所有元素。 示例 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,4,7,5,3,6,8,9] 解析 本题目主要考察的就是模拟法&#xff0c;首…

【C语言】解决C语言报错:Null Pointer Dereference

文章目录 简介什么是Null Pointer DereferenceNull Pointer Dereference的常见原因如何检测和调试Null Pointer Dereference解决Null Pointer Dereference的最佳实践详细实例解析示例1&#xff1a;未初始化的指针示例2&#xff1a;释放内存后未将指针置为NULL示例3&#xff1a;…

MacOS - 启动台(LaunchPad)缺少应用软件图标

问题描述 MacOS 有时会遇到已安装的软件在启动台&#xff08;LaunchPad&#xff09;中找不到的 bug&#xff0c;这种情况在新安装软件时易出现。 原因分析 首先去访达&#xff08;Finder&#xff09;中的“应用程序”文件夹确认是否已安装某软件&#xff08;LaunchPad 中图标…