【YOLOv8改进】 ODConv(Omni-Dimensional Dynamic Convolution):全维度动态卷积

简介: ODConv是一种增强型动态卷积方法,通过多维注意力机制在卷积的四个维度上学习互补注意力,提升轻量级CNN准确性和效率。与现有动态卷积不同,ODConv覆盖了空间、输入/输出通道和核数维度。在ImageNet和MS-COCO上,对MobileNetV2|ResNet等模型有显著性能提升,减少参数的同时超越传统方法。代码和论文链接可用。在YOLO系列中,ODConv改进了特征学习,优化了目标检测性能。

摘要

在现代卷积神经网络(CNN)中,每个卷积层中学习单个静态卷积核是常见的训练范式。然而,最近在动态卷积的研究中表明,通过学习 n 个卷积核的线性组合,并且这些卷积核的权重取决于它们的输入相关注意力,可以显著提高轻量级 CNN 的准确性,同时保持高效的推理。但是,我们观察到,现有的工作通过一个维度(关于卷积核数量)赋予卷积核动态属性,但另外三个维度(关于每个卷积核的空间大小、输入通道数和输出通道数)被忽略了。受此启发,我们提出了全方位动态卷积(ODConv),这是一种更通用且优雅的动态卷积设计,以推进这一研究方向。ODConv 利用一种新颖的多维注意力机制和并行策略,在任何卷积层的卷积核空间的所有四个维度上学习卷积核的互补注意力。作为常规卷积的替代品,ODConv 可以插入许多 CNN 架构中。在 ImageNet 和 MS-COCO 数据集上的广泛实验表明,ODConv 为各种主流的 CNN 骨干网络带来了稳固的准确性提升,包括轻量级和大型网络,例如,在 ImageNet 数据集上为 MobileNetV2|ResNet 系列带来了 3.77%∼5.71%|1.86%∼3.72% 的绝对 top-1 改进。有趣的是,由于其改进的特征学习能力,即使只有一个卷积核的 ODConv 也可以与现有的多核动态卷积对应物相竞争或胜过它们,大大减少了额外的参数。此外,ODConv 也优于其他注意力模块,用于调节输出特征或卷积权重。

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

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

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

创新点

ODConv是一种更通用但更优雅的动态卷积设计,它利用一种新颖的多维注意力机制和并行策略来学习卷积核的补充注意力,这些注意力涉及卷积核空间在任何卷积层的所有四个维度(即每个卷积核的空间大小、输入通道数、输出通道数和卷积核数量)。作为常规卷积的直接替代品,ODConv可以嵌入到多种CNN架构中。在ImageNet基准上进行了基础实验,在MS-COCO基准上进行了下游实验。

(a) DyConv(CondConv使用GAP+FC+Sigmoid)与(b) ODConv的示意性比较。与CondConv和DyConv不同,后者为卷积核 $W_{i}$计算单一的注意力标量 $α_{wi}$,ODConv利用一种新颖的多维注意力机制,以并行方式计算 ( Wi ) 在卷积核空间的所有四个维度上的四种类型的注意力 $α\{si}$, $α_{ci}$, $α_{fi}$和 $α_{wi}$。

image-20240117154243631

ODConv中逐步将四种类型的注意力乘以卷积核的示意图。(a) 沿空间维度的位置逐个乘法操作,(b) 沿输入通道维度的通道逐个乘法操作,(c) 沿输出通道维度的滤波器逐个乘法操作,以及 (d) 沿卷积核空间的核维度的核逐个乘法操作。

image-20240117154229110

文章链接

论文地址:论文地址

代码地址:代码地址

yolov8 代码引入


# ODConv2d类继承自nn.Module 
class ODConv2d(nn.Module):
    def __init__(self, in_planes, out_planes, kernel_size, stride=1, padding=0, dilation=1, groups=1,
                 reduction=0.0625, kernel_num=4):
        super(ODConv2d, self).__init__()
        self.in_planes = in_planes  # 输入通道数
        self.out_planes = out_planes  # 输出通道数
        self.kernel_size = kernel_size  # 卷积核尺寸
        self.stride = stride  # 步长
        self.padding = padding  # 填充
        self.dilation = dilation  # 膨胀
        self.groups = groups  # 分组卷积的组数
        self.kernel_num = kernel_num  # 核数目,用于核注意力机制

        # 初始化注意力模块
        self.attention = Attention(in_planes, out_planes, kernel_size, groups=groups,
                                   reduction=reduction, kernel_num=kernel_num)
        # 初始化权重参数
        self.weight = nn.Parameter(torch.randn(kernel_num, out_planes, in_planes//groups, kernel_size, kernel_size),
                                   requires_grad=True)
        self._initialize_weights()

        # 根据卷积核尺寸和核数目选择不同的前向传播实现
        if self.kernel_size == 1 and self.kernel_num == 1:
            self._forward_impl = self._forward_impl_pw1x
        else:
            self._forward_impl = self._forward_impl_common

    def _initialize_weights(self):
        # 初始化权重
        for i in range(self.kernel_num):
            nn.init.kaiming_normal_(self.weight[i], mode='fan_out', nonlinearity='relu')

    def update_temperature(self, temperature):
        # 更新注意力机制的温度参数,用于调整注意力的强度
        self.attention.update_temperature(temperature)

    def _forward_impl_common(self, x):
        # 通用的前向传播实现,适用于多种注意力机制
        channel_attention, filter_attention, spatial_attention, kernel_attention = self.attention(x)
        batch_size, in_planes, height, width = x.size()
        x = x * channel_attention  # 应用通道注意力
        x = x.reshape(1, -1, height, width)
        # 合并多个注意力权重
        aggregate_weight = spatial_attention * kernel_attention * self.weight.unsqueeze(dim=0)
        aggregate_weight = torch.sum(aggregate_weight, dim=1).view(
            [-1, self.in_planes // self.groups, self.kernel_size, self.kernel_size])
        # 执行卷积操作
        output = F.conv2d(x, weight=aggregate_weight, bias=None, stride=self.stride, padding=self.padding,
                          dilation=self.dilation, groups=self.groups * batch_size)
        output = output.view(batch_size, self.out_planes, output.size(-2), output.size(-1))
        output = output * filter_attention  # 应用滤波器注意力
        return output

    def _forward_impl_pw1x(self, x):
        # 点卷积1x1的特殊前向传播实现
        channel_attention, filter_attention, spatial_attention, kernel_attention = self.attention(x)
        x = x * channel_attention  # 应用通道注意力
        output = F.conv2d(x, weight=self.weight.squeeze(dim=0), bias=None, stride=self.stride, padding=self.padding,
                          dilation=self.dilation, groups=self.groups)
        output = output * filter_attention  # 应用滤波器注意力
        return output

    def forward(self, x):
        # 根据初始化时选择的实现进行前向传播
        return self._forward_impl(x)

task与yaml配置

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

相关文章
|
1月前
|
机器学习/深度学习 计算机视觉 Python
【DRConv】动态区域感知卷积结构可提升卷积的表示能力 | 复现《Dynamic Region-Aware Convolution》
【DRConv】动态区域感知卷积结构可提升卷积的表示能力 | 复现《Dynamic Region-Aware Convolution》
88 1
【DRConv】动态区域感知卷积结构可提升卷积的表示能力 | 复现《Dynamic Region-Aware Convolution》
|
1月前
|
机器学习/深度学习 并行计算 算法
YOLOv8改进 | 卷积篇 |手把手教你添加动态蛇形卷积(Dynamic Snake Convolution)
YOLOv8改进 | 卷积篇 |手把手教你添加动态蛇形卷积(Dynamic Snake Convolution)
418 0
|
机器学习/深度学习 PyTorch Go
YOLOv5的Tricks | 【Trick4】参数重结构化(融合Conv+BatchNorm2d)
这篇文章是想要记录yolov5在模型搭建过程中的一个融合模块,就是把卷积与批归一化的参数进行融合,想卷积带有批归一化的性质,使得推理过程中可以加快模型推理速度,简化整个模型结构,实现训练与推理两个阶段的解耦。
780 0
YOLOv5的Tricks | 【Trick4】参数重结构化(融合Conv+BatchNorm2d)
|
6天前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】CAFM(Convolution and Attention Fusion Module):卷积和注意力融合模块
**HCANet: 高光谱图像去噪新方法** HCANet是一种结合CNN与Transformer的深度学习模型,专为高光谱图像设计。它使用卷积注意力融合模块(CAFM)捕捉局部和全局特征,并通过多尺度前馈网络(MSFN)增强多尺度信息聚合,提升去噪效果。CAFM包含卷积和注意力分支,整合局部细节与长距离依赖。代码已开源:[GitHub](https://github.com/summitgao/HCANet)。
|
26天前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】EMA(Efficient Multi-Scale Attention):基于跨空间学习的高效多尺度注意力 (论文笔记+引入代码)
YOLO目标检测专栏介绍了创新的多尺度注意力模块EMA,它强化通道和空间信息处理,同时降低计算负担。EMA模块通过通道重塑和并行子网络优化特征表示,增强长距离依赖建模,在保持效率的同时提升模型性能。适用于图像分类和目标检测任务,尤其在YOLOv8中表现出色。代码实现和详细配置可在文中链接找到。
|
6天前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】 ParameterNet:DynamicConv(Dynamic Convolution):2024最新动态卷积
**摘要** ParameterNet是新提出的框架,旨在让低FLOPs模型也能受益于大规模视觉预训练,通过动态卷积在增加参数量的同时控制计算量。动态卷积利用条件生成的卷积核增强模型适应性。在ImageNet上,ParameterNet-600M在准确性上超过Swin Transformer,且FLOPs更低。该方法也被拓展至语言领域,提升LLaMA模型性能。代码可在<https://parameternet.github.io/>获取。
|
6天前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】MSFN(Multi-Scale Feed-Forward Network):多尺度前馈网络
**HCANet: 高光谱图像去噪新方法**\n混合卷积与注意力网络(Hybrid Convolutional and Attention Network)是针对HSI去噪的创新模型,结合CNN和Transformer,强化全局与局部特征。它使用卷积注意力融合模块捕获长距离依赖和局部光谱相关性,多尺度前馈网络提升多尺度信息聚合。代码可在[GitHub](https://github.com/summitgao/HCANet)获取。
|
1月前
|
计算机视觉
【YOLOv8改进】动态蛇形卷积(Dynamic Snake Convolution)用于管状结构分割任务
YOLO目标检测专栏介绍了DSCNet,它针对血管和道路等管状结构的分割任务进行优化。DSCNet采用动态蛇形卷积(DSConv)聚焦细长结构,多视角融合策略增强全局形态理解,且通过持久同调的连续性约束损失改善拓扑连续性。DSConv在2D和3D数据集上表现优于传统方法,实现更高精度和连续性。该技术已应用于yolov8,提升对管状结构的检测效果。
|
1月前
|
数据可视化
R语言nlme、nlmer、lme4用(非)线性混合模型non-linear mixed model分析藻类数据实例(上)
R语言nlme、nlmer、lme4用(非)线性混合模型non-linear mixed model分析藻类数据实例
|
1月前
|
资源调度 安全
R语言nlme、nlmer、lme4用(非)线性混合模型non-linear mixed model分析藻类数据实例(下)
R语言nlme、nlmer、lme4用(非)线性混合模型non-linear mixed model分析藻类数据实例