【YOLOv8改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

简介: 【YOLOv8改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

YOLOv8目标检测创新改进与实战案例专栏

专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLOv8基础解析+创新改进+实战案例

介绍

image-20240626154357361

摘要

我们提出了DySample,这是一种超轻量且高效的动态上采样器。尽管最近基于内核的动态上采样器(如CARAFE、FADE和SAPA)在性能上取得了显著提升,但它们引入了大量工作负载,主要是由于耗时的动态卷积以及用于生成动态内核的额外子网络。此外,FADE和SAPA需要高分辨率特征的指导,这在某种程度上限制了它们的应用场景。为了解决这些问题,我们绕过了动态卷积,从点采样的角度来构建上采样,这种方法更节省资源,并且可以轻松使用PyTorch中的标准内置函数实现。我们首先展示了一个简单的设计,然后一步步展示如何增强其上采样行为,最终实现我们新的上采样器DySample。与之前基于内核的动态上采样器相比,DySample不需要定制的CUDA包,并且参数、FLOPs、GPU内存和延迟都大大减少。除了轻量级的特点外,DySample在五个密集预测任务(包括语义分割、目标检测、实例分割、全景分割和单目深度估计)中表现优于其他上采样器。代码可在 https://github.com/tiny-smart/dysample 获取。

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

DySample是一种超轻量级且高效的动态上采样器,旨在通过学习采样来学习上采样。与传统的基于卷积核的动态上采样方法不同,DySample从点采样的角度设计,将一个点分割成多个点以实现更清晰的边缘。其核心技术原理是通过动态采样来实现上采样过程,而不需要额外的CUDA包。DySample通过寻找每个上采样点的正确语义聚类来进行采样过程,从而实现高效的上采样。与Deformable Attention等方法不同,DySample针对上采样进行了定制化设计,为每个上采样位置采样单个点,将一个点分割成s^2个上采样点。通过高度优化的PyTorch内置函数,DySample的反向传播速度较快,训练时间增加可忽略不计。在推理时间、训练内存、训练时间、GFLOPs和参数数量等方面,DySample相比其他动态上采样器具有更低的成本,且在多个密集预测任务中表现出色,包括语义分割、目标检测、实例分割、全景分割和单目深度估计。

image-20240626154819759

DySample与CARAFE、FADE和SAPA等动态上采样方法的不同之处:

  1. DySample是基于点采样的设计,将一个点分割成多个点以实现更清晰的边缘,而CARAFE、FADE和SAPA等方法是基于卷积核的动态上采样方法,通过生成动态卷积核或聚类来实现上采样。

  2. DySample不需要高分辨率的引导特征作为输入,也不需要额外的CUDA包,而CARAFE、FADE和SAPA等方法通常需要高分辨率的引导特征以及额外的子网络或动态卷积操作。

  3. DySample通过动态采样来实现上采样过程,寻找每个上采样点的正确语义聚类,而CARAFE、FADE和SAPA等方法通常使用动态卷积或聚类来重新组合输入特征。

  4. DySample在实现上更加轻量级,不需要定制化的CUDA包,具有更低的计算资源消耗,而CARAFE、FADE和SAPA等方法通常需要更多的参数、FLOPs、GPU内存和推理时间。

核心代码

import torch
import torch.nn as nn
import torch.nn.functional as F

def normal_init(module, mean=0, std=1, bias=0):
    """
    使用正态分布初始化网络模块的权重和偏置(如果存在)。

    Args:
        module (nn.Module): 要初始化的网络模块。
        mean (float): 正态分布的均值。默认为0。
        std (float): 正态分布的标准差。默认为1。
        bias (float): 偏置的初始值。默认为0。
    """
    if hasattr(module, 'weight') and module.weight is not None:
        nn.init.normal_(module.weight, mean, std)
    if hasattr(module, 'bias') and module.bias is not None:
        nn.init.constant_(module.bias, bias)

def constant_init(module, val, bias=0):
    """
    使用常数初始化网络模块的权重和偏置(如果存在)。

    Args:
        module (nn.Module): 要初始化的网络模块。
        val (float): 权重和偏置的常数初始值。
        bias (float): 偏置的初始值。默认为0。
    """
    if hasattr(module, 'weight') and module.weight is not None:
        nn.init.constant_(module.weight, val)
    if hasattr(module, 'bias') and module.bias is not None:
        nn.init.constant_(module.bias, bias)

class DySample(nn.Module):
    def __init__(self, in_channels, scale=2, style='lp', groups=4, dyscope=False):
        """
        动态采样模块的初始化函数。

        Args:
            in_channels (int): 输入通道数。
            scale (int): 尺度因子。默认为2。
            style (str): 采样风格,可以是'lp'(低-高)或'pl'(高-低)。默认为'lp'。
            groups (int): 分组数。默认为4。
            dyscope (bool): 是否启用动态范围。默认为False。
        """
        super().__init__()
        self.scale = scale
        self.style = style
        self.groups = groups
        assert style in ['lp', 'pl']
        if style == 'pl':
            assert in_channels >= scale ** 2 and in_channels % scale ** 2 == 0
        assert in_channels >= groups and in_channels % groups == 0

        if style == 'pl':
            in_channels = in_channels // scale ** 2
            out_channels = 2 * groups
        else:
            out_channels = 2 * groups * scale ** 2

        self.offset = nn.Conv2d(in_channels, out_channels, 1)
        normal_init(self.offset, std=0.001)
        if dyscope:
            self.scope = nn.Conv2d(in_channels, out_channels, 1, bias=False)
            constant_init(self.scope, val=0.)

        self.register_buffer('init_pos', self._init_pos())
AI 代码解读

task与yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/139990001

目录
打赏
0
2
2
0
97
分享
相关文章
YOLOv11改进策略【SPPF】| SimSPPF,简化设计,提高计算效率
YOLOv11改进策略【SPPF】| SimSPPF,简化设计,提高计算效率
108 13
YOLOv11改进策略【SPPF】| SimSPPF,简化设计,提高计算效率
YOLOv11改进策略【模型轻量化】| GhostNetV2:利用远距离注意力增强廉价操作
YOLOv11改进策略【模型轻量化】| GhostNetV2:利用远距离注意力增强廉价操作
100 12
YOLOv11改进策略【模型轻量化】| GhostNetV2:利用远距离注意力增强廉价操作
YOLOv11改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
YOLOv11改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
340 10
YOLOv11改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
RT-DETR改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
RT-DETR改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
103 4
RT-DETR改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
249 19
YOLOv11改进策略【模型轻量化】| ShufflenetV2,通过通道划分构建高效网络
YOLOv11改进策略【模型轻量化】| ShufflenetV2,通过通道划分构建高效网络
174 14
PyTorch 中的动态计算图:实现灵活的神经网络架构
【8月更文第27天】PyTorch 是一款流行的深度学习框架,它以其灵活性和易用性而闻名。与 TensorFlow 等其他框架相比,PyTorch 最大的特点之一是支持动态计算图。这意味着开发者可以在运行时定义网络结构,这为构建复杂的模型提供了极大的便利。本文将深入探讨 PyTorch 中动态计算图的工作原理,并通过一些示例代码展示如何利用这一特性来构建灵活的神经网络架构。
752 1
基于深度混合架构的智能量化交易系统研究: 融合SSDA与LSTM自编码器的特征提取与决策优化方法
本文探讨了在量化交易中结合时序特征和静态特征的混合建模方法。通过整合堆叠稀疏降噪自编码器(SSDA)和基于LSTM的自编码器(LSTM-AE),构建了一个能够全面捕捉市场动态特性的交易系统。SSDA通过降噪技术提取股票数据的鲁棒表示,LSTM-AE则专注于捕捉市场的时序依赖关系。系统采用A2C算法进行强化学习,通过多维度的奖励计算机制,实现了在可接受的风险水平下最大化收益的目标。实验结果显示,该系统在不同波动特征的股票上表现出差异化的适应能力,特别是在存在明确市场趋势的情况下,决策准确性较高。
131 5
基于深度混合架构的智能量化交易系统研究: 融合SSDA与LSTM自编码器的特征提取与决策优化方法
TSMamba:基于Mamba架构的高效时间序列预测基础模型
TSMamba通过其创新的架构设计和训练策略,成功解决了传统时间序列预测模型面临的多个关键问题。
581 4
TSMamba:基于Mamba架构的高效时间序列预测基础模型
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等