YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
一、本文介绍
本文给大家带来的CARAFE(Content-Aware ReAssembly of FEatures)是一种用于增强卷积神经网络特征图的上采样方法。其主要旨在改进传统的上采样方法(就是我们的Upsample)的性能。CARAFE的核心思想是:使用输入特征本身的内容来指导上采样过程,从而实现更精准和高效的特征重建。CARAFE是一种即插即用的上采样机制其本身并没有任何的使用限制。所以在YOLOv5的改进中其也可以做到一个提高精度的改进方法
专栏回顾:YOLOv5改进专栏——持续复现各种顶会内容——内含100+创新
实验效果图如下所示->
目录
一、本文介绍
二、CARAFE的机制原理
2.1 CARAFE的基本原理
2.2 图解CARAFE原理
2.3 CARAFE的效果图
三、CARAFE的复现源码
四、手把手教你添加CARAFE机制
4.1 细节修改教程
4.1.1 修改一
4.1.2 修改二
4.1.3 修改三
4.1.4 修改四
4.2 CARAFE的yaml文件
4.3 CARAFE运行成功截图
五、本文总结
二、CARAFE的机制原理
论文地址:官方论文地址点击即可跳转
代码地址:官方代码地址点击即可跳转
2.1 CARAFE的基本原理
CARAFE(Content-Aware ReAssembly of FEatures)是一种用于增强卷积神经网络特征图的上采样方法。这种方法首次在论文《CARAFE: Content-Aware ReAssembly of FEatures》中提出,旨在改进传统的上采样方法(如双线性插值和转置卷积)的性能。
CARAFE通过在每个位置利用底层内容信息来预测重组核,并在预定义的附近区域内重组特征。由于内容信息的引入,CARAFE可以在不同位置使用自适应和优化的重组核,从而比主流的上采样操作符(如插值或反卷积)表现更好。
CARAFE包括两个步骤:首先预测每个目标位置的重组核,然后用预测的核重组特征。给定一个尺寸为 H×W×C 的特征图和一个上采样比率 U,CARAFE将产生一个新的尺寸为 UH×UW×C 的特征图。其次CARAFE的核预测模块根据输入特征的内容生成位置特定的核,然后内容感知重组模块使用这些核来重组特征。
CARAFE可以无缝集成到需要上采样操作的现有框架中。在主流的密集预测任务中,CARAFE对高级和低级任务(如对象检测、实例分割、语义分割和图像修复)都有益处,且额外的参数微不足道。
2.2 图解CARAFE原理
下图是CARAFE工作机制的示意图。左侧展示了来自Mask R-CNN的多层FPN(特征金字塔网络)特征(直至虚线左侧),右侧展示了集成了CARAFE的Mask R-CNN(直至虚线右侧)。对于采样的位置,该图显示了FPN自上而下路径中累积重组的区域。这样一个区域内的信息被重组到相应的重组中心。
下图展示了CARAFE的整体框架。CARAFE由两个关键部分组成,即核预测模块和内容感知重组模块。在这个框架中,一个尺寸为 H×W×C 的特征图被上采样因子 U(=2) 倍。
下图展示了集成了CARAFE的特征金字塔网络(FPN)架构。在这个架构中,CARAFE在FPN的自上而下路径中将特征图的尺寸上采样2倍。CARAFE通过无缝替换最近邻插值而整合到FPN中,从而优化了特征上采样的过程。
2.3 CARAFE的效果图
下图比较了COCO 2017验证集上基线(上面)和CARAFE(下面)在实例分割结果方面的差异。
总结:我个人觉得其实其效果提升比较一般甚至某些数据集上提点很微弱,但是它主要的作用是减少计算量是一个更加轻量化的上采样方法。
三、CARAFE的复现源码
我们将在“ultralytics/nn/modules”目录下面创建一个文件将其复制进去,使用方法在后面会讲。
import torch
import torch.nn as nn
from ultralytics.nn.modules import Convclass CARAFE(nn.Module):def __init__(self, c, k_enc=3, k_up=5, c_mid=64, scale=2):""" The unofficial implementation of the CARAFE module.The details are in "https://arxiv.org/abs/1905.02188".Args:c: The channel number of the input and the output.c_mid: The channel number after compression.scale: The expected upsample scale.k_up: The size of the reassembly kernel.k_enc: The kernel size of the encoder.Returns:X: The upsampled feature map."""super(CARAFE, self).__init__()self.scale = scaleself.comp = Conv(c, c_mid)self.enc = Conv(c_mid, (scale * k_up) ** 2, k=k_enc, act=False)self.pix_shf = nn.PixelShuffle(scale)self.upsmp = nn.Upsample(scale_factor=scale, mode='nearest')self.unfold = nn.Unfold(kernel_size=k_up, dilation=scale,padding=k_up // 2 * scale)def forward(self, X):b, c, h, w = X.size()h_, w_ = h * self.scale, w * self.scaleW = self.comp(X) # b * m * h * wW = self.enc(W) # b * 100 * h * wW = self.pix_shf(W) # b * 25 * h_ * w_W = torch.softmax(W, dim=1) # b * 25 * h_ * w_X = self.upsmp(X) # b * c * h_ * w_X = self.unfold(X) # b * 25c * h_ * w_X = X.view(b, c, -1, h_, w_) # b * 25 * c * h_ * w_X = torch.einsum('bkhw,bckhw->bchw', [W, X]) # b * c * h_ * w_return X
四、手把手教你添加CARAFE机制
4.1 细节修改教程
4.1.1 修改一
我们找到如下的目录'yolov5-master/models'在这个目录下创建一整个文件目录(注意是目录,因为我这个专栏会出很多的更新,这里用一种一劳永逸的方法)文件目录起名modules,然后在下面新建一个文件,将我们的代码复制粘贴进去。
4.1.2 修改二
然后新建一个__init__.py文件,然后我们在里面添加一行代码。注意标记一个'.'其作用是标记当前目录。
4.1.3 修改三
然后我们找到如下文件''models/yolo.py''在开头的地方导入我们的模块按照如下修改->
(如果你看了我多个改进机制此处只需要添加一个即可,无需重复添加。)
4.1.4 修改四
然后我们找到parse_model方法,按照如下修改->
到此就修改完成了,复制下面的ymal文件即可运行。
4.2 CARAFE的yaml文件
# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license# Parameters
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.25 # layer channel multiple
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]], # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, CARAFE, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, C3, [512, False]], # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, CARAFE, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 3, C3, [256, False]], # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, C3, [512, False]], # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, C3, [1024, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
4.3 CARAFE运行成功截图
附上我的运行记录确保我的教程是可用的。
五、本文总结
到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv5改进有效涨点专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,目前本专栏免费阅读(暂时,大家尽早关注不迷路~),如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~
专栏回顾:YOLOv5改进专栏——持续复现各种顶会内容——内含100+创新
相关文章:

YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
一、本文介绍 本文给大家带来的CARAFE(Content-Aware ReAssembly of FEatures)是一种用于增强卷积神经网络特征图的上采样方法。其主要旨在改进传统的上采样方法(就是我们的Upsample)的性能。CARAFE的核心思想是:使用…...

AWS RDS慢日志文件另存到ES并且每天发送邮件统计慢日志
1.背景:需要对aws rds慢日志文件归档到es,让开发能够随时查看。 2.需求:并且每天把最新的慢日志,过滤最慢的5条sql 发送给各个产品线的开发负责人。 3.准备: aws ak/sk ,如果rds 在不同区域需要认证不同的…...
如何在断线后不重连加入音视频房间
RTC 房间断网后,默认是一直尝试重连的,例如当主播再次联网重连成功后,会自动发布之前在发布的音视频流。针对某些不想断网后重新加入连接的场景,需要如下配置: 1、配置断开后不去重连(这种情况也会重连 4 次…...

RabbitMq交换机详解
目录 1.交换机类型2.Fanout交换机2.1.声明队列和交换机2.2.消息发送2.3.消息接收2.4.总结 3.Direct交换机3.1.声明队列和交换机3.2.消息接收3.3.消息发送3.4.总结 4.Topic交换机4.1.说明4.2.消息发送4.3.消息接收4.4.总结 5.Headers交换机5.1.说明5.2.消息发送5.3.消息接收5.4.…...

智能优化算法应用:基于适应度相关算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于适应度相关算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于适应度相关算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.适应度相关算法4.实验参数设定5.算法…...
spring之基于注解管理Bean
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…...
Wireshark在云计算中的应用
第一章:Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧:过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章:网络协议分析 2.1 网络协议分析:TCP、UDP、ICMP等 2.2 高级协议分析:HTTP…...

三菱plc学习入门(一,认识三菱plc)
今天就开始对三菱的plc软件入一个门,希望小编的文章对读者和初学者有所帮助!欢迎评论指正,废话不多说,下面开始学习。 目录 plc的型号介绍 M表示什么? T表示什么? R表示什么? 为什么三菱没…...

设计模式——中介者模式
引言 中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。 问题 假如你有一个创建和修改客户资料的对话框, 它由各种控件组成, 例如…...

【 USRP安装教程】MATLAB 2023B
步骤 matlabdocusrp驱动包 doc 安装包内容列表 双击“R2023b_Doc_Windows.iso” 打开cmd 查看盘符 切换盘符 因为是F盘,所以cmd输入:“F:” F:进入可安装界面 cd F:\bin\win64安装离线文档库 .\mpm install-doc --matlabroot"C:\MATLAB\R202…...

AI绘画中UNet用于预测噪声
介绍 在AI绘画领域中,UNet是一种常见的神经网络架构,广泛用于图像相关的任务,尤其是在图像分割领域中表现突出。UNet最初是为了解决医学图像分割问题而设计的,但其应用已经扩展到了多种图像处理任务。 特点 对称结构:…...

解决 Hbuilder打包 Apk pad 无法横屏 以及 H5 直接打包 成Apk
解决 Hbuilder打包 Apk pad 无法横屏 前言云打包配置 前言 利用VUE 写了一套H5 想着 做一个APP壳 然后把 H5 直接嵌进去 客户要求 在pad 端 能够操作 然后页面风格 也需要pad 横屏展示 云打包 配置 下面是manifest.json 配置文件 {"platforms": ["iPad"…...

云原生之深入解析如何在K8S环境中使用Prometheus来监控CoreDNS指标
一、什么是 Kubernetes CoreDNS? CoreDNS 是 Kubernetes 环境的DNS add-on 组件,它是在控制平面节点中运行的组件之一,使其正常运行和响应是 Kubernetes 集群正常运行的关键。DNS 是每个体系结构中最敏感和最重要的服务之一。应用程序、微服…...
Unity3D UDP传输大文件怎么提高速度详解
前言 Unity3D是一款强大的游戏开发引擎,但是在处理大文件传输时,往往会遇到速度较慢的问题。本文将详细介绍如何通过使用UDP协议来提高大文件传输的速度,并给出相应的技术详解和代码实现。 对惹,这里有一个游戏开发交流小组&…...

数据结构——栈和队列的应用
1.栈在括号匹配中的应用 算法的思想如下; 1)初始设置一个空栈,顺序读入括号。 2)若是右括号,则或使置于栈顶的最急迫期待得以消解,或是不合法的情况(括号序列不 匹配,退出程序)。 3)若是左括号,则作为一个新的更急迫…...
第7章 排序
前言 在这一章,我们讨论数组元素的排序问题。为简单起见,假设在我们的例子中数组只包含整数,虽然更复杂的结构显然也是可能的。对于本章的大部分内容,我们还假设整个排序工作能够在主存中完成,因此,元素的个…...

AR眼镜光学方案_AR眼镜整机硬件定制
增强现实(Augmented Reality,AR)技术通过将计算机生成的虚拟物体或其他信息叠加到真实世界中,实现对现实的增强。AR眼镜作为实现AR技术的重要设备,具备虚实结合、实时交互的特点。为了实现透视效果,AR眼镜需要同时显示真实的外部世…...

Linux shell编程学习笔记36:read命令
*更新日志 *2023-12-18 1.根据[美] 威廉肖特斯 (Willian shotts)所著《Linux命令行大全(第2版)》 更新了-e、-i、-r选项的说明 2.更新了 2.8 的实例,增加了gif动图 3.补充了-i的应用实例 2.1…...
Python表达式
表达式 本章将解释 Python 中组成表达式的各种元素的的含义。 语法注释: 在本章和后续章节中,会使用扩展 BNF 标注来描述语法而不是词法分析。 当(某种替代的)语法规则具有如下形式 name :: othername并且没有给出语义,则这种…...

风速预测(六)基于Pytorch的EMD-CNN-GRU并行模型
目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集,按照8:2划分训练集和测试集 2.2 设置滑动窗口大小为96,制作数据集 3 基于Pytorch的EMD-CNN-GRU并行模型预测 3.1 数据加载&a…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...