当前位置: 首页 > news >正文

YOLO26改进 - 卷积Conv _ 引入线性可变形卷积LDConv(Linear Deformable Convolution)增强不规则目标特征捕获能力

# 前言
本文介绍了线性可变形卷积(LDConv)在YOLO26中的结合应用。标准卷积存在局部窗口和固定采样形状的缺陷,可变形卷积虽解决了固定采样问题,但参数数量呈平方增长。LDConv通过新的坐标生成算法和偏移量调整,为卷积核提供任意数量的参数和任意采样形状,将参数增长趋势修正为线性增长。我们将LDConv集成到YOLO26的主干网络中,并在相关配置文件中进行设置。在多个代表性数据集上的实验表明,LDConv可替代标准卷积,提升网络性能。

文章目录: YOLO26改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总

专栏链接: YOLO26改进专栏

@

目录
  • LDConv介绍
    • 摘要
  • 文章链接
  • 主要思想
      • 动机与传统卷积的局限性
      • LDConv的创新
  • 核心代码
  • 实验
    • 脚本
    • 结果

LDConv介绍

LDConv作者的姊妹篇: 【YOLO26改进-卷积Conv 】 AKConv(可改变核卷积):任意数量的参数和任意采样形状的即插即用的卷积
image-20241106144123386

摘要

基于卷积操作的神经网络在深度学习领域取得了显著的成果,但标准卷积操作存在两个固有的缺陷。一方面,卷积操作仅限于局部窗口,因此无法捕捉其他位置的信息,并且其采样形状是固定的。另一方面,卷积核的大小固定为 $k \times k$,这是一个固定的正方形形状,且参数的数量通常会随着大小的增加呈平方增长。尽管可变形卷积(Deformable Convolution,Deformable Conv)解决了标准卷积的固定采样问题,但参数数量也会呈平方增长,并且可变形卷积并未探讨不同初始采样形状对网络性能的影响。针对上述问题,本文提出了线性可变形卷积(Linear Deformable Convolution,LDConv),该方法为卷积核提供了任意数量的参数和任意采样形状,以便为网络开销与性能之间的折中提供更丰富的选择。

在LDConv中,定义了一种新的坐标生成算法,用于为任意大小的卷积核生成不同的初始采样位置。为了适应目标的变化,引入了偏移量来调整每个位置上样本的形状。LDConv将标准卷积和可变形卷积中参数数量的增长趋势从平方增长修正为线性增长。与可变形卷积相比,LDConv提供了更丰富的选择,并且当LDConv的参数数量设置为 $k^2$ 时,可以等效于可变形卷积。与此不同,本文还探讨了使用LDConv在相同大小和不同初始采样形状下对神经网络的影响。LDConv通过不规则的卷积操作完成高效的特征提取,并为卷积采样形状提供了更多的探索选项。

在COCO2017、VOC 7+12 和 VisDrone-DET2021等代表性数据集上的目标检测实验充分证明了LDConv的优势。LDConv是一个即插即用的卷积操作,可以替代标准卷积操作,从而提高网络性能。相关任务的代码可以在 https://github.com/CV-ZhangXin/LDConv 上找到。

文章链接

论文地址:论文地址

代码地址:代码地址

主要思想

LDConv(线性可变形卷积)是一种新型的卷积操作,旨在改进传统卷积神经网络(CNN),解决标准卷积和早期的可变形卷积的不足之处。以下是LDConv的关键特点和创新点:

动机与传统卷积的局限性

  1. 标准卷积的限制

    • 传统卷积仅限于固定的采样网格(如3x3、5x5),难以适应不同对象的多样化形状。
    • 随着卷积核大小增加,参数数量呈平方增长,导致计算成本和存储需求显著提升。
  2. 可变形卷积的改进

    • 可变形卷积引入偏移,灵活调整采样位置以适应不同特征区域,但其参数增长仍呈平方趋势,无法实现完全自由的采样形状。

LDConv的创新

LDConv克服了上述不足,引入了可调整的采样形状和参数数量,从而在计算成本和性能之间实现更灵活的平衡。LDConv的核心创新包括:

  1. 任意采样形状与线性增长的参数数量

    • LDConv允许卷积核具有任意形状的采样点,并使参数数量呈线性增长,这种灵活性更适合硬件资源限制。
  2. 动态采样位置调整

    • 通过一个新的坐标生成算法,为任意大小的卷积核生成初始采样位置,并根据对象形状动态调整这些位置,使其适应目标的变化。
  3. 模块化与易于集成

    • LDConv是一个“即插即用”的卷积模块,可以替代现有网络中的标准卷积操作,从而在目标检测等任务中提升性能。

核心代码

class LDConv(nn.Module):def __init__(self, inc, outc, num_param, stride=1, bias=None):super(LDConv, self).__init__()self.num_param = num_paramself.stride = strideself.conv = nn.Sequential(nn.Conv2d(inc, outc, kernel_size=(num_param, 1), stride=(num_param, 1), bias=bias),nn.BatchNorm2d(outc),nn.SiLU())  # the conv adds the BN and SiLU to compare original Conv in YOLOv5.self.p_conv = nn.Conv2d(inc, 2 * num_param, kernel_size=3, padding=1, stride=stride)nn.init.constant_(self.p_conv.weight, 0)self.p_conv.register_full_backward_hook(self._set_lr)@staticmethoddef _set_lr(module, grad_input, grad_output):grad_input = (grad_input[i] * 0.1 for i in range(len(grad_input)))grad_output = (grad_output[i] * 0.1 for i in range(len(grad_output)))def forward(self, x):# N is num_param.offset = self.p_conv(x)dtype = offset.data.type()N = offset.size(1) // 2# (b, 2N, h, w)p = self._get_p(offset, dtype)# (b, h, w, 2N)p = p.contiguous().permute(0, 2, 3, 1)q_lt = p.detach().floor()q_rb = q_lt + 1q_lt = torch.cat([torch.clamp(q_lt[..., :N], 0, x.size(2) - 1), torch.clamp(q_lt[..., N:], 0, x.size(3) - 1)],dim=-1).long()q_rb = torch.cat([torch.clamp(q_rb[..., :N], 0, x.size(2) - 1), torch.clamp(q_rb[..., N:], 0, x.size(3) - 1)],dim=-1).long()q_lb = torch.cat([q_lt[..., :N], q_rb[..., N:]], dim=-1)q_rt = torch.cat([q_rb[..., :N], q_lt[..., N:]], dim=-1)# clip pp = torch.cat([torch.clamp(p[..., :N], 0, x.size(2) - 1), torch.clamp(p[..., N:], 0, x.size(3) - 1)], dim=-1)# bilinear kernel (b, h, w, N)g_lt = (1 + (q_lt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_lt[..., N:].type_as(p) - p[..., N:]))g_rb = (1 - (q_rb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_rb[..., N:].type_as(p) - p[..., N:]))g_lb = (1 + (q_lb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_lb[..., N:].type_as(p) - p[..., N:]))g_rt = (1 - (q_rt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_rt[..., N:].type_as(p) - p[..., N:]))# resampling the features based on the modified coordinates.x_q_lt = self._get_x_q(x, q_lt, N)x_q_rb = self._get_x_q(x, q_rb, N)x_q_lb = self._get_x_q(x, q_lb, N)x_q_rt = self._get_x_q(x, q_rt, N)# bilinearx_offset = g_lt.unsqueeze(dim=1) * x_q_lt + \g_rb.unsqueeze(dim=1) * x_q_rb + \g_lb.unsqueeze(dim=1) * x_q_lb + \g_rt.unsqueeze(dim=1) * x_q_rtx_offset = self._reshape_x_offset(x_offset, self.num_param)out = self.conv(x_offset)return out# generating the inital sampled shapes for the LDConv with different sizes.def _get_p_n(self, N, dtype):base_int = round(math.sqrt(self.num_param))row_number = self.num_param // base_intmod_number = self.num_param % base_intp_n_x,p_n_y = torch.meshgrid(torch.arange(0, row_number),torch.arange(0,base_int))p_n_x = torch.flatten(p_n_x)p_n_y = torch.flatten(p_n_y)if mod_number >  0:mod_p_n_x,mod_p_n_y = torch.meshgrid(torch.arange(row_number,row_number+1),torch.arange(0,mod_number))mod_p_n_x = torch.flatten(mod_p_n_x)mod_p_n_y = torch.flatten(mod_p_n_y)p_n_x,p_n_y  = torch.cat((p_n_x,mod_p_n_x)),torch.cat((p_n_y,mod_p_n_y))p_n = torch.cat([p_n_x,p_n_y], 0)p_n = p_n.view(1, 2 * N, 1, 1).type(dtype)return p_n# no zero-paddingdef _get_p_0(self, h, w, N, dtype):p_0_x, p_0_y = torch.meshgrid(torch.arange(0, h * self.stride, self.stride),torch.arange(0, w * self.stride, self.stride))p_0_x = torch.flatten(p_0_x).view(1, 1, h, w).repeat(1, N, 1, 1)p_0_y = torch.flatten(p_0_y).view(1, 1, h, w).repeat(1, N, 1, 1)p_0 = torch.cat([p_0_x, p_0_y], 1).type(dtype)return p_0def _get_p(self, offset, dtype):N, h, w = offset.size(1) // 2, offset.size(2), offset.size(3)# (1, 2N, 1, 1)p_n = self._get_p_n(N, dtype)# (1, 2N, h, w)p_0 = self._get_p_0(h, w, N, dtype)p = p_0 + p_n + offsetreturn pdef _get_x_q(self, x, q, N):b, h, w, _ = q.size()padded_w = x.size(3)c = x.size(1)# (b, c, h*w)x = x.contiguous().view(b, c, -1)# (b, h, w, N)index = q[..., :N] * padded_w + q[..., N:]  # offset_x*w + offset_y# (b, c, h*w*N)index = index.contiguous().unsqueeze(dim=1).expand(-1, c, -1, -1, -1).contiguous().view(b, c, -1)x_offset = x.gather(dim=-1, index=index).contiguous().view(b, c, h, w, N)return x_offset#  Stacking resampled features in the row direction.@staticmethoddef _reshape_x_offset(x_offset, num_param):b, c, h, w, n = x_offset.size()# using Conv3d# x_offset = x_offset.permute(0,1,4,2,3), then Conv3d(c,c_out, kernel_size =(num_param,1,1),stride=(num_param,1,1),bias= False)# using 1 × 1 Conv# x_offset = x_offset.permute(0,1,4,2,3), then, x_offset.view(b,c×num_param,h,w)  finally, Conv2d(c×num_param,c_out, kernel_size =1,stride=1,bias= False)# using the column conv as follow, then, Conv2d(inc, outc, kernel_size=(num_param, 1), stride=(num_param, 1), bias=bias)x_offset = rearrange(x_offset, 'b c h w n -> b c (h n) w')return x_offset

实验

脚本

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLOif __name__ == '__main__':
#     修改为自己的配置文件地址model = YOLO('./ultralytics/cfg/models/26/yolo26-LDConv.yaml')
#     修改为自己的数据集地址model.train(data='./ultralytics/cfg/datasets/coco8.yaml',cache=False,imgsz=640,epochs=10,single_cls=False,  # 是否是单类别检测batch=8,close_mosaic=10,workers=0,optimizer='MuSGD',amp=True,project='runs/train',name='yolo26-LDConv',)

结果

在这里插入图片描述

http://www.jsqmd.com/news/347282/

相关文章:

  • 开题报告qq信管黄莹
  • Flink Watermark机制:解决大数据流处理中的乱序问题
  • YOLO26改进 - 注意力机制 Deformable-LKA 可变形大核注意力:自适应采样网格优化特征捕捉,提升不规则目标感知
  • YOLO26改进 - 卷积Conv SCConv空间和通道重建卷积:轻量化设计助力复杂场景与小目标检测
  • 揭秘国家级卫星超级工厂!年产能150颗、产值破500亿的商业航天“新质生产力“范本(WORD)
  • 【无人机路径规划】无人机结构巡检飞行规划系统,核心用于针对已知三维结构(通过 STL 文件导入)完成无人机观测点生成、路径优化(基于 TSP 问题)、能耗分析、重叠率分析及轨迹可视化附Matlab代码
  • YOLO26改进 - 卷积Conv SPD-Conv空间深度转换卷积优化空间信息编码,攻克小目标检测难题
  • 实现ai循环中插入用户对话的方法
  • 【DVMCNN诊断网络】基于离散韦格纳分布DWVD结合MCNN多尺度卷积神经网络的故障诊断研究附matlab代码
  • YOLO26改进 - 卷积Conv 加权卷积wConv2D:无损替换标准卷积,增强空间建模与特征提取质量 arXiv 2025
  • YOLO26涨点改进 | 独家创新、Neck特征融合改进篇 | ICLR 2025 | 引入FMoM频率调制融合模块,实现空间与频率的协同特征增强,助力多模态融合、小目标检测、遥感目标检测有效涨点
  • 【AAAI 2026即插即用】Mamba模块篇 | MUB曼巴上采样模块,特别适用于图像恢复、图像超分辨率、图像恢复、暗光增强、遥感任务、目标检测、图像分割 和 医学影像分析等CV任务通用,涨点起飞
  • YOLO26改进 - 卷积Conv 注入多阶门控聚合机制:Multi-Order Gated Aggregation 突破表示瓶颈,增强复杂场景目标感知能力
  • 沙丘猫算法+哈里斯鹰+鲸鱼+黏菌算法+蝴蝶算法优化ELMAN神经网络回归预测附Matlab代码
  • 开题报告vb酒店客房部
  • 【无人机三维路径规划】基于启发式算法的无人机三维路径规划动态避障算法附Matlab代码
  • 拼多多商家端 anti-content 分析
  • 开题报告【因泰魔锋商城的设计与实现】
  • 【DVRN故障诊断】基于离散韦格纳分布DWVD结合卷积神经网络(CNN)和残差网络(ResNet)的故障诊断研究附Matlab代码
  • 一文讲透 LLM、RAG、MCP 与 AI Agent:AI 系统的四个核心层级
  • YOLO26改进 - 卷积Conv DualConv( Dual Convolutional):用于轻量级深度神经网络的双卷积核
  • 从零构建 MCP Server:协议原理 + 完整实战
  • MySQL数据库讲解,如何使用聚合函数方法?
  • YOLO26改进 - C3k2 C3k2 融合 LSConv (Large-Small Conv)融合大核感知与小核聚合,提升小目标特征判别力
  • YOLO26改进 - 卷积Conv GCNet之金箍棒块GCBlock : 重参数化捕获全局依赖 CVPR 2025
  • 从蜜蜂导航到无人机自主飞行:基于ZYNQ的仿生偏振导航系统全解析
  • MySQL 逻辑备份 vs 物理备份:区别与生产级实战指南
  • target_include_directories对比 PUBLIC / PRIVATE
  • YOLO26改进 - 卷积Conv LAE 轻量级自适应提取卷积,从多尺度特征图中获得更多的上下文信息和高分辨率细节
  • CMake制作动态库与静态库对比