YOLO11改进 - 卷积Conv | HLKConv层次大核卷积,动态增强局部上下文感知,缓解空洞伪影,助力红外小目标检测涨点 | TGRS 2025 前言本文介绍了面向红外小目标检测的分层大核卷积模块——HLKConv用于在低计算成本下增强局部细节与大范围上下文建模能力。该方法通过深度卷积提取密集局部特征再结合空洞深度卷积扩大感受野并利用 1×1 卷积完成特征融合从而缓解传统空洞卷积的网格伪影问题。我们将 HLKConv 集成进 YOLO11 的多尺度检测特征层对 P3、P4、P5 特征进行大核增强使模型更好兼顾小目标边缘响应与复杂背景判别。文章目录 YOLO11改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLO11改进专栏介绍红外小目标检测ISTD任务存在诸多难点背景环境复杂、信杂比低、目标尺寸与形态多变。高效检测的关键在于在适配尺度下提取局部上下文信息。小卷积核卷积神经网络感受野有限易产生虚警而具备全局感受野的 Transformer 模型常将小目标判定为噪声进而造成漏检混合模型难以弥合卷积网络与 Transformer 之间的语义鸿沟模型复杂度偏高。针对上述问题本文提出一种全新红外小目标检测网络 LCRNet该网络可学习动态局部上下文特征表征。模型包含三大模块1C2FBlock借鉴偏微分方程求解器设计高效提取小目标特征信息2DLC 注意力机制一种大核注意力结构可动态构建上下文关联并削减特征冗余3分层大核卷积 HLKConv基于大卷积核分解实现分层卷积运算保留特征稀疏性同时缓解空洞卷积固有缺陷。该网络结构简洁参数量仅 165 万却取得当前最优SOTA检测性能。本文在多组数据集上将 LCRNet 与 33 种主流最优算法开展对比实验验证了该模型优异的检测精度与运行效率。文章链接论文地址论文地址代码地址代码地址基本原理1. 解决的关键问题这篇文章面向红外小目标检测任务核心难点是目标尺寸小、纹理弱、信噪比低且背景杂波复杂。传统小卷积核 CNN 虽然擅长保留局部细节但感受野有限容易把背景亮点误判为目标Transformer 或全局注意力方法虽然能建模长距离依赖但红外小目标往往只有几个像素容易在全局建模中被当作噪声忽略造成漏检。大核卷积可以扩大感受野但直接使用大卷积核计算量高采用空洞卷积分解大核又可能在特征图中产生网格状或块状伪影损害小目标的精细边缘和局部响应。因此HLKConv 要解决的问题是如何低成本获得大感受野同时保留小目标检测所需的局部细节并减少空洞卷积带来的特征不连续问题。2. 整体架构HLKConv 是论文提出的 LCRNet 中的重要组件。LCRNet 整体采用类似 U-Net 的编码器-解码器结构由多个 C2FBlock 堆叠组成。输入红外图像先经过 3×3 InitConv 提升通道数然后在不同分辨率阶段通过 C2FBlock 提取特征最后由 3×3 OutConv 输出目标置信图。C2FBlock 内部包含两个关键部分DLC-Attention 和 HLKConv。DLC-Attention 负责动态局部上下文建模通过多分支、多尺度方式分配不同感受野HLKConv 则作为其中的大核卷积算子用于在注意力分支中建模长程依赖。具体来说DLC-Attention 会将特征按通道分组不同分支经过不同程度的下采样再使用 7×7 HLKConv 提取上下文信息随后上采样回原分辨率并融合。这样既能在较低计算成本下获得大范围背景信息又能保持对小目标区域的像素级关注。3. 技术原理HLKConv 基于 VAN 中的大核分解思想但进一步引入层次化卷积设计。标准 K×K 大卷积核可以被拆解为三部分深度卷积 DWConv、深度空洞卷积 DWDConv以及 1×1 点卷积 PWConv。论文中的 HLKConv 先使用较小的深度卷积提取密集局部信息再使用空洞深度卷积扩大感受野最后通过 1×1 卷积进行通道融合。其计算过程可以概括为先对输入 X 进行 DWConv得到局部增强特征再将该特征与 DWDConv 输出进行拼接最后通过 1×1 Conv 得到输出 Y。这样的设计保留了大核分解的低计算优势同时用层次结构缓解单纯空洞卷积造成的特征孔洞和块状伪影。HLKConv 的价值在于同时覆盖“小感受野”和“大感受野”小感受野帮助捕获红外小目标的局部亮斑、边缘和精细响应大感受野帮助理解目标周围背景上下文降低复杂背景中的虚警。论文还指出HLKConv 形成的有效感受野更接近人类中心视觉感知即中心区域响应更集中、周围区域提供辅助上下文这对小目标、细粒度分割类任务更友好。因此HLKConv 可以理解为一种面向红外小目标检测优化的层次大核卷积模块在轻量计算下增强空间上下文建模能力。核心代码importtorchimporttorch.nnasnnclassHLKConv(nn.Module):def__init__(self,dim,k_size):super().__init__()self.k_sizek_sizeifk_size7:self.conv0nn.Conv2d(dim,dim,kernel_size3,stride1,padding((3-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size3,stride1,padding2,groupsdim,dilation2)elifk_size11:self.conv0nn.Conv2d(dim,dim,kernel_size3,stride1,padding((3-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size5,stride1,padding4,groupsdim,dilation2)elifk_size23:self.conv0nn.Conv2d(dim,dim,kernel_size5,stride1,padding((5-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size7,stride1,padding9,groupsdim,dilation3)elifk_size35:self.conv0nn.Conv2d(dim,dim,kernel_size5,stride1,padding((5-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size11,stride1,padding15,groupsdim,dilation3)elifk_size41:self.conv0nn.Conv2d(dim,dim,kernel_size5,stride1,padding((5-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size13,stride1,padding18,groupsdim,dilation3)elifk_size53:self.conv0nn.Conv2d(dim,dim,kernel_size5,stride1,padding((5-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size17,stride1,padding24,groupsdim,dilation3)self.conv1nn.Conv2d(dim*2,dim,1)defforward(self,x):xself.conv0(x)xself.conv1(torch.cat([x,self.conv_spatial(x)],dim1))returnxif__name____main__:xtorch.randn((2,2,512,512))modelHLKConv(2,53)print(model(x).shape)YOLO11引入代码在根目录下的ultralytics/nn/目录新建一个conv目录然后新建一个以HLKConv为文件名的py文件 把代码拷贝进去。importtorchimporttorch.nnasnnclassHLKConv(nn.Module): HLKConv: Heterogeneous Large Kernel Convolution 通过两个并行分支捕获不同感受野的局部特征: - conv0: 小核 depthwise conv 捕获局部细节 - conv_spatial: 深度可分离大核(带 dilation) 捕获大范围空间上下文 最后用 1x1 conv 融合两路特征。 def__init__(self,dim,k_size):super().__init__()self.k_sizek_size self.dimdimifk_size7:self.conv0nn.Conv2d(dim,dim,kernel_size3,stride1,padding((3-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size3,stride1,padding2,groupsdim,dilation2)elifk_size11:self.conv0nn.Conv2d(dim,dim,kernel_size3,stride1,padding((3-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size5,stride1,padding4,groupsdim,dilation2)elifk_size23:self.conv0nn.Conv2d(dim,dim,kernel_size5,stride1,padding((5-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size7,stride1,padding9,groupsdim,dilation3)elifk_size35:self.conv0nn.Conv2d(dim,dim,kernel_size5,stride1,padding((5-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size11,stride1,padding15,groupsdim,dilation3)elifk_size41:self.conv0nn.Conv2d(dim,dim,kernel_size5,stride1,padding((5-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size13,stride1,padding18,groupsdim,dilation3)elifk_size53:self.conv0nn.Conv2d(dim,dim,kernel_size5,stride1,padding((5-1)//2),groupsdim)self.conv_spatialnn.Conv2d(dim,dim,kernel_size17,stride1,padding24,groupsdim,dilation3)else:raiseValueError(fUnsupported k_size{k_size}. Expected one of [7, 11, 23, 35, 41, 53].)self.conv1nn.Conv2d(dim*2,dim,1)defforward(self,x):xself.conv0(x)xself.conv1(torch.cat([x,self.conv_spatial(x)],dim1))returnx注册在ultralytics/nn/tasks.py中进行如下操作步骤1:fromultralytics.nn.conv.HLKConvimportHLKConv步骤2修改def parse_model(d, ch, verboseTrue):elifmisHLKConv:c2ch[f]args[ch[f],*args]配置yolo11-HLKConv.yaml# Ultralytics YOLO , AGPL-3.0 license# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parametersnc:8# number of classesscales:# model compound scaling constants, i.e. modelyolo11n.yaml will call yolo11.yaml with scale n# [depth, width, max_channels]n:[0.50,0.25,1024]# summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPss:[0.50,0.50,1024]# summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPsm:[0.50,1.00,512]# summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPsl:[1.00,1.00,512]# summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPsx:[1.00,1.50,512]# summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs# YOLO11n backbonebackbone:# [from, repeats, module, args]-[-1,1,Conv,[64,3,2]]# 0-P1/2-[-1,1,Conv,[128,3,2]]# 1-P2/4-[-1,2,C3k2,[256,False,0.25]]-[-1,1,Conv,[256,3,2]]# 3-P3/8-[-1,2,C3k2,[512,False,0.25]]-[-1,1,Conv,[512,3,2]]# 5-P4/16-[-1,2,C3k2,[512,True]]-[-1,1,Conv,[1024,3,2]]# 7-P5/32-[-1,2,C3k2,[1024,True]]-[-1,1,SPPF,[1024,5]]# 9-[-1,2,C2PSA,[1024]]# 10# YOLO11n headhead:-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,6],1,Concat,[1]]# cat backbone P4-[-1,2,C3k2,[512,False]]# 13-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,4],1,Concat,[1]]# cat backbone P3-[-1,2,C3k2,[256,False]]# 16 (P3/8-small)-[-1,1,HLKConv,[23]]# 17 - 位置1: P3 大核增强 (小目标)-[-1,1,Conv,[256,3,2]]-[[-1,13],1,Concat,[1]]# cat head P4-[-1,2,C3k2,[512,False]]# 19 (P4/16-medium)-[-1,1,HLKConv,[11]]# 20 - 位置2: P4 大核增强 (中目标)-[-1,1,Conv,[512,3,2]]-[[-1,10],1,Concat,[1]]# cat head P5-[-1,2,C3k2,[1024,True]]# 22 (P5/32-large)-[-1,1,HLKConv,[7]]# 23 - 位置3: P5 大核增强 (大目标)-[[17,21,25],1,Detect,[nc]]# Detect(P3, P4, P5)实验脚本importwarnings warnings.filterwarnings(ignore)fromultralyticsimportYOLOif__name____main__:# 修改为自己的配置文件地址modelYOLO(./ultralytics/cfg/models/11/yolo11-HLKConv.yaml)# 修改为自己的数据集地址model.train(data./ultralytics/cfg/datasets/coco8.yaml,cacheFalse,imgsz640,epochs10,single_clsFalse,# 是否是单类别检测batch8,close_mosaic10,workers0,optimizerSGD,ampTrue,projectruns/train,nameHLKConv,)结果