YOLOv8改进 | FPN | 新型上采样算子CARAFE【全网独家】

news2024/11/25 20:55:42

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


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


CARAFE(内容感知特征重组)是一种新型的特征上采样算子,它具有大视野范围,能够聚合较大感受野内的上下文信息;能够实现特定实例的内容感知处理;同时,它是一种轻量级且计算快速的算子,可以轻松集成到现代网络架构中。在目标检测、实例/语义分割和修复的标准基准上进行全面评估,CARAFE显示出一致且实质性的增益,而计算开销可以忽略不计。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改并将修改后的完整代码放在文章的最后方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

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

目录

1. 原理

2. CARAFE 代码实现

2.1 将CARAFE 添加到YOLOv8中

2.2 更改init.py文件

2.3 添加yaml文件

2.4 在task.py中进行注册

2.5 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6. 总结


1. 原理

 

论文地址: CARAFE: Content-Aware ReAssembly of FEatures——点击即可跳转_

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

CARAFE(内容感知特征重组)是一种特征上采样算子,旨在提高对象检测、实例分割和语义分割等密集预测任务的性能。下面是其主要原理的详细解释:

CARAFE 的关键原理

  1. 内容感知上采样

  • 与使用固定内核的传统方法(如双线性插值或反卷积)不同,CARAFE 根据输入内容生成自适应内核。这使 CARAFE 能够更有效地处理特征图中的局部变化。

  • 自适应内核是使用轻量级全卷积模块即时生成的,这使得该过程更加高效。

  1. 大接受场

  • CARAFE 可以从大接受场聚合信息。这与通常只考虑小子像素邻域的传统方法形成对比。

  • 这种更大的上下文使 CARAFE 能够捕获更多语义信息,这对于实例分割等任务至关重要。

  1. 轻量级且高效

  • 尽管 CARAFE 对内容的处理非常复杂,但其计算开销却很小。例如,使用 256 个通道对特征图进行两倍上采样仅增加约 199k FLOP(浮点运算),而反卷积层则增加 1180k FLOP。

  • 这种效率使 CARAFE 适合集成到现代网络架构中,而不会显著增加计算成本。

工作机制

CARAFE 的过程可以分为两个主要步骤:

  1. 内核预测模块

  • 通道压缩器:降低输入特征图的通道维度以减少计算负荷。

  • 内容编码器:对压缩特征图的内容进行编码以生成重组内核。此模块使用具有指定内核大小的卷积层。

  • 内核归一化器:应用 softmax 函数对内核进行归一化,确保其值总和为 1。此归一化步骤对于在重组过程中保持特征图的平均值至关重要。

  1. 内容感知重组模块

  • 使用预测的重组内核对预定义局部区域内的输入特征进行加权组合。

  • 此重组过程允许以内容感知的方式对特征图进行上采样,从而增强上采样特征中的语义信息。

优于传统方法

  • 最近邻和双线性插值:这些方法仅考虑空间距离,并且仅限于小邻域,无法捕获丰富的语义信息。

  • 反卷积:尽管反卷积具有自适应性,但它会在整个图像上应用相同的内核,这限制了其响应局部内容变化的能力。此外,使用大内核时计算成本很高。

应用和性能

CARAFE 已在多个基准测试中进行了评估,并在各种任务中表现出持续的改进:

  • 对象检测:在 MS COCO 上将 Faster R-CNN 的性能提高了 1.2% AP。

  • 实例分割:在 MS COCO 上将 Mask R-CNN 的性能提高了 1.3% AP。

  • 语义分割:在 ADE20k 上将 UperNet 的性能提高了 1.8% mIoU。

  • 图像修复:在 Places 上将 Global&Local 的 PSNR 提高了 1.1 dB。

这些改进证明了 CARAFE 的有效性和作为未来密集预测任务研究基本构建块的潜力。

总之,CARAFE 是一个强大而高效的特征上采样运算符,它通过利用内容感知内核和大型感受野来解决传统方法的局限性,使其成为增强各种计算机视觉任务性能的宝贵工具。

2. CARAFE 代码实现

2.1 将CARAFE 添加到YOLOv8中

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

class CARAFE(nn.Module):
    # CARAFE: Content-Aware ReAssembly of FEatures       https://arxiv.org/pdf/1905.02188.pdf
    def __init__(self, c1, c2, kernel_size=5, up_factor=2):
        super(CARAFE, self).__init__()
        self.kernel_size = 5
        self.up_factor = 2
        self.down = nn.Conv2d(c1, c1 // 4, 1)
        self.encoder = nn.Conv2d(c1 // 4, self.up_factor ** 2 * self.kernel_size ** 2, self.kernel_size, 1,
                                 self.kernel_size // 2)
        self.out = nn.Conv2d(c1, c2, 1)

    def forward(self, x):
        N, C, H, W = x.size()
        # N,C,H,W -> N,C,delta*H,delta*W
        # kernel prediction module
        kernel_tensor = self.down(x)  # (N, Cm, H, W)
        kernel_tensor = self.encoder(kernel_tensor)  # (N, S^2 * Kup^2, H, W)
        kernel_tensor = F.pixel_shuffle(kernel_tensor, self.up_factor)  # (N, S^2 * Kup^2, H, W)->(N, Kup^2, S*H, S*W)
        kernel_tensor = F.softmax(kernel_tensor, dim=1)  # (N, Kup^2, S*H, S*W)
        kernel_tensor = kernel_tensor.unfold(2, self.up_factor, step=self.up_factor)  # (N, Kup^2, H, W*S, S)
        kernel_tensor = kernel_tensor.unfold(3, self.up_factor, step=self.up_factor)  # (N, Kup^2, H, W, S, S)
        kernel_tensor = kernel_tensor.reshape(N, self.kernel_size ** 2, H, W,
                                              self.up_factor ** 2)  # (N, Kup^2, H, W, S^2)
        kernel_tensor = kernel_tensor.permute(0, 2, 3, 1, 4)  # (N, H, W, Kup^2, S^2)

        # content-aware reassembly module
        # tensor.unfold: dim, size, step
        x = F.pad(x, pad=(self.kernel_size // 2, self.kernel_size // 2, self.kernel_size // 2, self.kernel_size // 2),
                  mode='constant', value=0)  # (N, C, H+Kup//2+Kup//2, W+Kup//2+Kup//2)
        x = x.unfold(2, self.kernel_size, step=1)  # (N, C, H, W+Kup//2+Kup//2, Kup)
        x = x.unfold(3, self.kernel_size, step=1)  # (N, C, H, W, Kup, Kup)
        x = x.reshape(N, C, H, W, -1)  # (N, C, H, W, Kup^2)
        x = x.permute(0, 2, 3, 1, 4)  # (N, H, W, C, Kup^2)

        out_tensor = torch.matmul(x, kernel_tensor)  # (N, H, W, C, S^2)
        out_tensor = out_tensor.reshape(N, H, W, -1)
        out_tensor = out_tensor.permute(0, 3, 1, 2)
        out_tensor = F.pixel_shuffle(out_tensor, self.up_factor)
        out_tensor = self.out(out_tensor)
        # print("up shape:",out_tensor.shape)
        return out_tensor

 

2.2 更改init.py文件

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

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

2.3 添加yaml文件

关键步骤三:在/ultralytics/ultralytics/cfg/models/v8下面新建文件yolov8_CARAFE.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, 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, CARAFE, [ 512,3,2 ] ]
  - [ [ -1, 6 ], 1, Concat, [ 1 ] ]  # cat backbone P4
  - [ -1, 3, C2f, [ 512 ] ]  # 12

  - [ -1, 1, CARAFE, [ 256,3,2 ] ]
  - [ [ -1, 4 ], 1, Concat, [ 1 ] ]  # cat backbone P3
  - [ -1, 3, C2f, [ 256 ] ]  # 15 (P3/8-small)

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

  - [ -1, 1, Conv, [ 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 在task.py中进行注册

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

2.5 执行程序

关键步骤五:在ultralytics文件中新建train.py,将model的参数路径设置为yolov8_CARAFE.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_C3RFEM.yaml')  # build from YAML and transfer weights
 
# Train the model
model.train(device = [3], batch=16)

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

3. 完整代码分享

https://pan.baidu.com/s/1zsW4LxxHQcHR8riia6ckdw?pwd=58at

提取码: 58at 

4. GFLOPs

关于GFLOPs的计算方式可以查看:百面算法工程师 | 卷积基础知识——Convolution

未改进的YOLOv8nGFLOPs

img

改进后的GFLOPs

5. 进阶

可以结合损失函数或者注意力机制进行多重改进

6. 总结

CARAFE(内容感知特征重组)是一种创新的特征上采样运算符,它通过生成自适应的内容感知内核来重组输入特征,从而增强密集预测任务。与传统的固定内核方法相比,此方法可从大型接受场中聚合信息,从而能够捕获更丰富的语义上下文。CARAFE 效率高,计算开销极小,并且可以无缝集成到现有的神经网络架构中,从而显著提高对象检测、实例分割和语义分割等任务的性能。

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

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

相关文章

构建个人文件上传服务:Python Flask实现上传和下载完整指南

介绍 在本教程中,我们将学习如何使用Python Flask框架将文件上传到服务器,并使用SQLite数据库来跟踪上传的文件。我们将提供后端代码和一个示例项目的Git链接,以便您可以轻松地跟随本教程。 准备工作 首先,您需要安装Python和F…

揭秘无局放电源:定义、工作原理及其在工业设备中的重要性

当代社会对电源安全性,精密性要求越来也高,对电源设备的需求也越来越高。无局放电源作为电源设备中的一种,由于其独特的优点,越来越受到各行各业的关注。目前,无局放电源在全球范围内得到了广泛应用,尤其是…

springboot特殊问题处理2——springboot集成flowable实现工作流程的完整教程(一)

在实际项目开发过程中,流程相关的业务实现采用工作流会异常清晰明了,但是Activity学习成本和开发难度对追求效率的开发工作者来说异常繁琐,但是作为Activity的亲儿子之一的flowable,其轻量化的使用和对应的api会让开发者感受简单&…

今日分享丨浅谈RAG的技术特点及优势

一、引言 随着AI技术的发展,我们见证了人工智能在理解和处理自然语言方面取得的巨大进步。特别是结合了检索增强生成(Retrieval-Augmented Generation, RAG)和大语言模型(Large Language Model, LLM)的系统&#xff0…

华企网安技术博弈:白帽子团队如何破解网赌网站

在数字化时代,網賭作为一种新型犯罪形式,其隐蔽性和跨国性给执法机关带来了前所未有的挑战。一批专业的网络安全团队——白帽子,正利用他们的专业技能与犯罪分子进行技术博弈,有效地破解網賭网站,为打击網賭犯罪贡献力…

银河麒麟V10安装docker和docker-compose

1. 说明 系统镜像使用的是Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso如果是在VMware中安装这个系统,需选择Ubuntu,如果选Centos会有问题。 尝试使用在线方式安装docker,报了很多错误,比较麻烦,建议使用离…

Bilibili开源发布轻量级 Index 系列语言模型:2.8T 训练数据,支持角色扮演

Bilibili首次发布 Index 系列模型中的轻量版本:Index-1.9B 系列 本次开源的 Index-1.9B系列包含以下模型: Index-1.9Bbase:基座模型,具有 19 亿 非词嵌入参数量,在 2.8T 中英文为主的语料上预训练,多个评测基准上与…

Marin说PCB之电源完整性PDN--Murata三端子电容--01

不知道诸位老铁们有没有忘记我们常用的电容的一些特性,例如在其谐振频率左边,电容主要呈容性,在谐振频率右边,电容主要呈感性。我随便找了一个电容:GRT188C80J226ME13,其频率特性图如下所示: 我…

Qt creator day5练习

Qt 中实现TCP 聊天服务器 大致流程 创建套接字服务器QTcpServer对象 通过QTcpServer对象设置监听,即QTcpServer::listen() 基于QTcpServer::newConnection()信号检测…

大模型面试题目精选分享

前言 掌握大模型面试关键,我精选了一系列面试题目。从模型理解到应用实践,全方位考察大模型知识。无论你是初学者还是资深专家,这里都有适合你的题目。快来挑战自己,提升面试技能吧! 面试题笔记分享 为了助力朋友们…

日常工作中常用的管理工具

日常工作中常用的管理工具 SWOT分析法: 帮你清晰地把我全局,分析自己在资源方面的优势域劣势,把握环境提供的机会,防范可能存在的风险与威胁,对我们的成功有非常重要的意义 PDCA循环规则: 每一项工作&#…

RPM 打包入门(基于openEuler)

主要参考内容(均为官方文档): https://rpm-packaging-guide.github.io/#building-rpms https://docs.redhat.com/zh_hans/documentation/red_hat_enterprise_linux/8/html/packaging_and_distributing_software/introduction-to-rpm_packagin…

用Python设置Excel工作表网格线的隐藏与显示

Excel表格界面的直观性很大程度上得益于表格中的网格线设计,这些线条帮助用户精确对齐数据,清晰划分单元格。网格线是Excel界面中默认显示的辅助线,用于辅助定位,与单元格边框不痛,不影响打印输出。然而,在…

Spring的启动扩展点机制详解

在Java的世界中,我们知道Spring是当下最主流的开发框架,没有之一。而在使用Dubbo、Mybatis等开源框架时,我们发现可以采用和Spring完全一样的使用方式来使用它们。 可能你在平时的使用过程中并没有意识到这一点,但仔细想一想&…

34 张动图:线缆,以太网与网络寻址

以太网 本地主机访服务器 以太网标准 非屏蔽双绞线(UTP) 电磁干扰 串扰 双绞线 真实的双绞线 线缆与引脚对齐方式 科普:网线每根芯的作用 引脚连接 数据传输与接收 主机直连到交换机 主机直连到主机(或交换器) Auto M…

C++ 矩阵的最小路径和解法

描述 给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。 数据范围: 1≤𝑛,𝑚≤5001≤n,m≤500&…

# 消息中间件 RocketMQ 高级功能和源码分析(九)

消息中间件 RocketMQ 高级功能和源码分析(九) 一、消息中间件 RocketMQ 源码分析: 同步刷盘分析 1、刷盘机制 RocketMQ 的存储是基于 JDK NIO 的内存映射机制(MappedByteBuffer)的,消息存储首先将消息追…

好用的便签是什么 电脑桌面上好用的便签

作为一名文字工作者,我经常需要在繁杂的思绪中捕捉灵感,记录下那些一闪而过的想法。在寻找一款适合电脑桌面的便签应用时,我偶然发现了敬业签便签软件简直是为我量身定制的,它不仅界面简洁,操作便捷,更重要…

前瞻展望,中国信通院即将发布“2024云计算十大关键词”

人类对于未知领域的探索欲望,似乎总是无穷无尽,而探索欲反过来推动了技术的革新与进步。今年以来,AI大模型成为科技领域最为确定的趋势之一。在大模型开启的AI原生时代,AI原生正在重构云计算的演化逻辑和发展走向,MaaS…

含铬废水有哪些危害?含铬废水怎么处理呢?

铬化物可以通过消化道、呼吸道、皮肤和粘膜侵人人体,主要积聚在肝、肾、内分泌系统和肺部。毒理作用是影响体内物质氧化、还原和水解过程,与核酸、核蛋白结合影响组织中的磷含量。铬化合物具有致癌作用。 铬化合物以蒸汽和粉尘的方式进入人体组织中&…