【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())

task与yaml配置

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

相关文章
|
自然语言处理 算法 数据挖掘
自蒸馏:一种简单高效的优化方式
背景知识蒸馏(knowledge distillation)指的是将预训练好的教师模型的知识通过蒸馏的方式迁移至学生模型,一般来说,教师模型会比学生模型网络容量更大,模型结构更复杂。对于学生而言,主要增益信息来自于更强的模型产出的带有更多可信信息的soft_label。例如下右图中,两个“2”对应的hard_label都是一样的,即0-9分类中,仅“2”类别对应概率为1.0,而soft_label
自蒸馏:一种简单高效的优化方式
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch 中的动态计算图:实现灵活的神经网络架构
【8月更文第27天】PyTorch 是一款流行的深度学习框架,它以其灵活性和易用性而闻名。与 TensorFlow 等其他框架相比,PyTorch 最大的特点之一是支持动态计算图。这意味着开发者可以在运行时定义网络结构,这为构建复杂的模型提供了极大的便利。本文将深入探讨 PyTorch 中动态计算图的工作原理,并通过一些示例代码展示如何利用这一特性来构建灵活的神经网络架构。
339 1
|
26天前
|
机器学习/深度学习 自然语言处理 语音技术
揭秘深度学习中的注意力机制:兼容性函数的深度解析
揭秘深度学习中的注意力机制:兼容性函数的深度解析
|
2月前
|
机器学习/深度学习 计算机视觉 网络架构
【YOLO11改进 - C3k2融合】C3k2融合YOLO-MS的MSBlock : 分层特征融合策略,轻量化网络结构
【YOLO11改进 - C3k2融合】C3k2融合YOLO-MS的MSBlock : 分层特征融合策略,轻量化网络结构
|
2月前
|
机器学习/深度学习 编解码 负载均衡
MoH:融合混合专家机制的高效多头注意力模型及其在视觉语言任务中的应用
本文提出了一种名为混合头注意力(MoH)的新架构,旨在提高Transformer模型中注意力机制的效率。MoH通过动态注意力头路由机制,使每个token能够自适应选择合适的注意力头,从而在减少激活头数量的同时保持或提升模型性能。实验结果显示,MoH在图像分类、类条件图像生成和大语言模型等多个任务中均表现出色,尤其在减少计算资源消耗方面有显著优势。
67 1
|
5月前
|
机器学习/深度学习 大数据 计算机视觉
【YOLOv8改进 - 特征融合】 GELAN:YOLOV9 通用高效层聚合网络,高效且涨点
YOLOv8专栏探讨了深度学习中信息瓶颈问题,提出可编程梯度信息(PGI)和广义高效层聚合网络(GELAN),改善轻量级模型的信息利用率。GELAN在MS COCO数据集上表现优越,且PGI适用于不同规模的模型,甚至能超越预训练SOTA。[论文](https://arxiv.org/pdf/2402.13616)和[代码](https://github.com/WongKinYiu/yolov9)已开源。核心组件RepNCSPELAN4整合了RepNCSP块和卷积。更多详情及配置参见相关链接。
|
5月前
|
测试技术 计算机视觉 网络架构
【YOLOv8改进 - 特征融合】CARAFE:轻量级新型上采样算子,助力细节提升
【YOLOv8改进 - 特征融合】CARAFE:轻量级新型上采样算子,助力细节提升
|
7月前
|
机器学习/深度学习 编解码 算法
YOLOv8改进 | 主干网络 | 增加网络结构增强小目标检测能力【独家创新——附结构图】
YOLOv8在小目标检测上存在挑战,因卷积导致信息丢失。本文教程将原网络结构替换为更适合小目标检测的backbone,并提供结构图。通过讲解原理和手把手教学,指导如何修改代码,提供完整代码实现,适合新手实践。文章探讨了大特征图对小目标检测的重要性,如细节保留、定位精度、特征丰富度和上下文信息,并介绍了FPN等方法。YOLOv8流程包括预处理、特征提取、融合和检测。修改后的网络结构增加了上采样和concatenate步骤,以利用更大特征图检测小目标。完整代码和修改后的结构图可在文中链接获取。
|
7月前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】 YOLOv8 更换骨干网络之GhostNetV2 长距离注意力机制增强廉价操作,构建更强端侧轻量型骨干 (论文笔记+引入代码)
该专栏聚焦YOLO目标检测的创新改进与实战,介绍了轻量级CNNs和注意力机制在移动设备上的应用。文章提出了一种名为GhostNetV2的新架构,结合了硬件友好的DFC注意力机制,强化了特征表达能力和全局信息捕获,同时保持低计算成本和高效推理。GhostNetV2在ImageNet上以167M FLOPs达到75.3%的top-1准确率,优于同类模型。创新点包括DFC注意力、模型结构优化和效率提升。源代码可在GitHub和MindSpore平台上找到。此外,还提到了YOLOv8的相关实现和任务配置。
|
7月前
|
机器学习/深度学习 算法 数据可视化
LightCLIP来啦 | 其实可以使用多级交互范式来训练轻量级CLIP模型
LightCLIP来啦 | 其实可以使用多级交互范式来训练轻量级CLIP模型
425 2
下一篇
DataWorks