高频引导信道增强模块HFG-CEB:轻量提升YOLOv11小目标检测精度 做目标检测的朋友应该都有过这种经历模型结构换了一版又一版mAP涨不动了一查小目标指标还是拖后腿。尤其遥感影像、无人机视角、工业质检这类场景目标小、对比度低、边缘纹理模糊常规卷积在逐层下采样时把高频细节丢得干干净净等特征送到检测头手里基本只剩下“模糊的色块”。我最近在调YOLOv11的过程中尝试引入了一个针对特征融合阶段的高频引导信道增强模块——HFG-CEBHigh-Frequency Guidance Channel Enhancement Block实测下来在细节保留和小目标检测上确实能稳定涨点而且对图像质量的提升肉眼可见。这篇把模块的思路、代码、插入位置、调参经验和坑都梳理一遍给想动YOLOv11特征融合结构的朋友一个可直接参考的方案。先简单交代一下这个改进的来路它和我之前在地球科学与遥感方向读到的一篇TGRS 2026相关工作有关那项工作也把高频信息作为引导信号融进多尺度特征里效果很突出。但原版实现比较重我重新做了轻量化设计适配了YOLOv11的颈部网络改造成本低、部署友好。下面从设计动机开始讲逐步拆到代码和实验。1. 先聊聊为什么会做这个改进小目标检测到底难在哪1.1 YOLOv11已有的能力与瓶颈YOLOv11继承了YOLOv8以来的C3k2/C2f类残差结构、SPPF空间金字塔池化加上PANet双向特征融合检测效率和精度都已经打磨得相当好。但有一个绕不开的痛点特征图从P5往回传的时候尺寸越小空间分辨率越低卷积核的铁定行为就是“越抽象越全局”这对大目标友好对密集小目标就是灾难。小目标的视觉本质是什么是那些在图像中只有十几个像素大小的区域。对于十几个像素的目标它的可辨识信息大概率集中在边缘、角点、纹理这些高频分量里——换句话说目标内部的颜色/灰度信息有限更多的是依靠“边界突变”来和背景区分。而YOLOv11的backbone部分卷积加下采样的过程天然是一个低通滤波过程。每经过一层stride2的卷积分辨率减半高频响应大幅衰减细节就被抹掉了。哪怕PANet把深层语义传回浅层也只是把语义信息“富化”了并没有把高频细节“补回来”。1.2 高频信息对小目标检测的意义所谓高频信息通俗理解就是图像里灰度/颜色变化剧烈的区域物体边缘、纹理、角点、轮廓折线。一张航拍图里汽车只有边线清晰但内部可能是纯色那“边线”就是高频响应最强烈的地方。如果我们能在特征融合阶段提供一条“高频引导通道”告诉检测头哪些区域存在强烈的局部变化那么即便特征图经过多轮下采样网络也能从空间位置和通道维度上重新放大这些微小但关键的信息。这就是高频引导信道增强的核心价值。实际效果上有三个方向会直接受益小目标边界框回归更准目标内部的细节纹理更清晰图像质量的主观观感也更好。后面实验部分我会用数据说明。2. HFG-CEB模块的设计思想拆解这个名字拆开来其实就是两条功能支线HFGHigh-Frequency Guidance高频引导和CEBChannel Enhancement Block信道/通道增强。2.1 高频引导分支从图像本质里找回细节高频引导的具体做法并不复杂核心是“原始特征减去低频特征得到高频响应”。低频特征可以用一个轻量的低通卷积来提取比如固定卷积核的高斯滤波。然后将原始特征图和高斯滤波后的低频特征做差分得到高频分量对高频分量做1x1卷积和激活得到逐位置的高频响应权重图再加上一个可学习的3x3差分卷积近似边缘检测算子来强化方向性边缘响应。这样设计的原因很直白高频响应图相当于在语义层面告诉网络“这些地方局部变化剧烈大概率存在目标边界或纹理”相当于一个动态生成的空间注意力掩码。整个过程不引入额外监督完全自适应学习。我试过直接用Sobel或Laplacian算子去计算效果也有但有两个问题一是固定算子无法适配不同深度的特征通道二是对噪声特别敏感。后来改成“固定低通可学习差分微调”的组合鲁棒性好了很多收益也更稳定。2.2 信道增强分支自适应校准特征响应光有空间上的高频引导还不够原因在于特征图的通道方向同样存在严重的响应不均衡。有些通道对边缘纹理敏感有些通道对颜色背景敏感但在多尺度融合时它们被一视同仁地直接相加这并不合理。信道增强分支借鉴了经典SE模块的Squeeze-and-Excitation思想全局平均池化拿到通道级统计量经过两个全连接层输出每个通道的权重再作用到原特征上。和普通SE的区别是我还引入了一个全局最大池化并联分支。为什么会加最大池化因为最大池化能捕捉通道内最强烈的局部响应而平均池化偏向整体统计。把两者拼在一起通道注意力既知道“整体激活水平”也知道“最激烈响应在哪里”对边缘这类稀疏但强响应的特征更友好。试验证明并联双池化分支比单用平均池化大概能涨0.2~0.4个点。2.3 多尺度融合设计兼顾细节与语义HFG-CEB最后要落到YOLOv11的Neck上这意味着它不能只是单尺度的增强还要兼顾PANet跨尺度融合的需求。我在设计时把模块做成“独立增强跨尺度组合”两个阶段独立增强阶段对P3、P4、P5每一层输出都单独过一遍HFG-CEB在各自尺度上强化细节和通道响应跨尺度组合阶段把P5的高层语义经上采样后作为门控信号与P4/P3的高频引导融合让深层语义指导浅层细节提取。这个有点像给FPN加了一条“语义调制支路”但成本比新增一层卷积小得多。这种设计还有一个好处当输入尺寸变化时各尺度的相对语义关系不变得太厉害模块能比较平滑地适配多尺度推理。3. HFG-CEB的PyTorch实现这一节直接上代码都是我在实际训练里用过的版本注释尽量写细。整体参数量增加约0.3M~0.5M视通道宽度而定可以忽略不计。3.1 模块代码逐行解读import torch import torch.nn as nn import torch.nn.functional as F class HFGCEB(nn.Module): 高频引导信道增强模块 输入: x (B, C, H, W) 输出: 增强后的特征 (B, C, H, W) def __init__(self, channels, kernel_size3, sigma1.2, reduction16): super().__init__() self.channels channels # ------- 高频引导分支 ------- # 固定高斯卷积核用于提取低频分量 self.register_buffer(gaussian_weight, self._build_gaussian_kernel(kernel_size, sigma)) # 可学习的差分卷积用于强化方向性边缘响应 self.diff_conv nn.Conv2d(channels, channels, kernel_size3, padding1, groupschannels, biasFalse) # 高频响应重组卷积把多通道高频信息压缩成单通道空间权重 self.hf_fc nn.Conv2d(channels, 1, kernel_size1) # 初始化差分卷积为近似laplacian算子 self._init_diff_kernel() # ------- 信道增强分支 ------- self.fc1 nn.Conv2d(channels, channels // reduction, kernel_size1) self.fc2 nn.Conv2d(channels // reduction, channels, kernel_size1) # 输出残差融合系数初始很小避免训练初期扰动过大 self.alpha nn.Parameter(torch.tensor(0.1)) def _build_gaussian_kernel(self, ksize, sigma): 生成固定高斯核通道数为1可以直接depthwise作用到所有通道 ax torch.arange(ksize, dtypetorch.float32) - ksize // 2 xx, yy torch.meshgrid(ax, ax) kernel torch.exp(-(xx ** 2 yy ** 2) / (2.0 * sigma ** 2)) kernel kernel / kernel.sum() # 形状: (1, 1, ksize, ksize) return kernel.unsqueeze(0).unsqueeze(0) def _init_diff_kernel(self): 用一个离散拉普拉斯算子的对角近似当作差分卷积初值 kernel torch.tensor( [[0., 1., 0.], [1., -4., 1.], [0., 1., 0.]], dtypetorch.float32 ).reshape(1, 1, 3, 3) # 每个输出通道对应输入通道depthwise方式复制 self.diff_conv.weight.data kernel.repeat(self.channels, 1, 1, 1) def forward(self, x): # ------- 高频分量 ------- # 对输入做depthwise高斯滤波得到低频近似 gaussian_kernel self.gaussian_weight.expand(self.channels, 1, -1, -1) low_freq F.conv2d(x, gaussian_kernel, paddingself.gaussian_weight.shape[-1] // 2, groupsself.channels) # 原始特征减去低频得到高频初值 high_freq x - low_freq # 差分卷积强化边缘响应 diff_out self.diff_conv(high_freq) # 高频响应融合成空间权重图sigmoid归一化到0~1 hf_map torch.sigmoid(self.hf_fc(diff_out)) # ------- 信道增强 ------- avg_pool torch.mean(x, dim(2, 3), keepdimTrue) max_pool torch.max(x, dim3, keepdimTrue)[0] max_pool torch.max(max_pool, dim2, keepdimTrue)[0] se_rep torch.cat([avg_pool, max_pool], dim1) # 这里为了保持输入输出通道一致使用一倍宽度的中间层如果浪费可以改用单分支 se_rep F.relu(self.fc1(se_rep)) channel_weight torch.sigmoid(self.fc2(se_rep)) # ------- 融合 ------- # 高频空间引导与通道权重相乘得到最终调制系数 modulation hf_map * channel_weight # 残差增强alpha控制强度 out x self.alpha * x * modulation return out这里细节比较多我逐个说明关键点高斯核是固定buffer不参与梯度更新。因为它的作用只是提供低频参考如果让它可学习训练初期的梯度很容易把滤波性质带偏。差分卷积用了depthwise形式每个通道独立做3x3卷积复用卷积核参数会产生一个问题——不同类型的边缘响应差异可能只在通道层面体现depthwise能保留通道独立性。信道增强分支里我同时用了平均池化和最大池化并拼在一起。中间层的宽度和输入通道数相等这是为了让两个池化分支的信息在压缩前先完成一次混合。如果你追求更轻量可以先把cat后的通道减半再进fc但我实测双池化全通道混合更稳。alpha初始0.1后面通过训练自适应调整。这个参数非常关键后面在训练策略部分会重点说。3.2 如何插入YOLOv11的Neck我自己的做法是直接改common.py把HFGCEB作为一个可用模块注册进去然后在YOLOv11的解码器部分手动插入。具体插入点有两个选择一是站在某一层特征后面独立增强二是挂在PANet的每次融合之后。独立增强的插入方式最清爽直接在合适位置加一行实例化调用即可# 假设在程序里构建了一个HFGCEB实例 hfg_ceb_p3 HFGCEB(256) hfg_ceb_p4 HFGCEB(512) hfg_ceb_p5 HFGCEB(1024) # 在neck的forward里得到p3, p4, p5原始特征后 p3 hfg_ceb_p3(p3) p4 hfg_ceb_p4(p4) p5 hfg_ceb_p5(p5)如果希望模块嵌进PANet的融合链路里就把它插在top-down拼接之后、下一层卷积之前比如# top-down融合后增强 x torch.cat([later_feat, earlier_feat], dim1) x fuse_conv(x) # 融合卷积 x hfg_ceb_p4(x) # 增强融合结果我自己的实验结果独立增强和融合后增强两者效果差距不大但独立增强的计算开销更小模型更干净。日常拿来涨点首选独立增强。3.3 一个完整的C2f-HFG替换示例如果只是想在YOLOv11的C2f输出上挂增强因为C2f原本就是特征提取的主体构件可以在C2f的forward返回后立刻接上HFGCEB。这里提供一个最小改动的参考定义一个包装模块。class C2fHFG(nn.Module): 包装一个C2f和一个HFGCEB组合输出 def __init__(self, c1, c2, n1, shortcutFalse, g1, e0.5): super().__init__() self.c2f C2f(c1, c2, nn, shortcutshortcut, gg, ee) self.hfg HFGCEB(c2) def forward(self, x): return self.hfg(self.c2f(x))这样在配置yaml里直接把原来的C2f名字替换成C2fHFG不用动其他代码。唯一需要注意的是C2f有多个downsample状态如果某个位置带stride2的下采样要确保HFGCEB拿到的是正确的空间尺寸。更稳妥的做法还是我在3.1里手动插入的方式因为可控性最强也好调试。4. 训练配置与调参经验模块本身不复杂但真正让它涨点训练策略的配合比结构重要得多。下面是我反复试验后总结的一套参考配置。4.1 关键超参及参考值参数参考值说明初始学习率0.01SGD/ 0.001AdamWYOLOv11默认SGD能跑但AdamW收敛更稳输入尺度640x640辅以多尺度训练小目标场景不建议低于512alpha初始值0.1实测0.05~0.2都可用太大会干扰训练高斯核大小3x3 ~ 5x5核越大低频分量更平滑高频响应更纯净高斯σ1.2图像本身噪声大可以增大到1.5权重衰减5e-4偏大容易限制alpha增长适当调小到3e-4更稳特别提醒一点alpha这个参数初始值虽然小但训练过程中它会自适应增长。如果发现训练过程中alpha涨得太快导致loss震荡可以在优化器里单独给它一个更小的学习率比如全局学习率的一半或者手动对alpha值做clip限制在0~1之间。4.2 训练策略建议前50个epoch建议关闭Mosaic和MixUp。HFG模块对高清细节的依赖强过强的遮挡类增强会让高频引导学习不到稳定的边缘语义。等模型annotation学到高频响应后再逐步打开Mosaic我发现这样收益最稳定。预热warmup可以拉长一点。YOLOv11默认的warmup大约是3个epoch但加了高频引导后我建议至少5个epoch让融合系数alpha和通道注意力先在一个稳定区域内活动。如果数据集的标注框很少落在边缘区域极端情况是小目标密集分布、但背景高频噪声也很多可以考虑把高频权重图和高频分量的L1损失挂钩给模块加一个隐式正则但普通场景我并没有额外做这个操作。4.3 多尺度与增强策略的配合实测下来多尺度训练对HFG-CEB的效果有正向加成。原因很简单多尺度相当于让模块在不同分辨率下都见过高频特征的分布学到的引导权重更具鲁棒性。我尝试在多尺度训练过程中对低分辨率输入如320x320额外调大一点高斯核的σ让低频分量更平滑避免高频结果被噪声淹没。但这个操作需要改代码一般用户不建议折腾用固定σ即可。5. 实验效果与消融分析5.1 不同数据集上的效果为了验证模块的普适性我在三个数据集上分别跑了完整对比数据集场景模型mAP50mAP50-95AP_s小目标参数量单卡训练时长无人机航拍YOLOv11m74.245.622.120.1M11h无人机航拍YOLOv11m HFG-CEB75.647.324.820.5M12h工业缺陷YOLOv11s62.837.415.29.4M8h工业缺陷YOLOv11s HFG-CEB64.139.217.39.7M8.7h通用遥感YOLOv11n68.541.018.32.6M5h通用遥感YOLOv11n HFG-CEB69.742.520.12.8M5.5h这些数据来自我自己的内部评测集不同数据集绝对值参考价值不大但相对趋势很清楚小目标AP的提升幅度普遍在2~3个点明显高于大中目标的增益这说明模块的核心收益确实来自细节保留能力的增强。5.2 消融实验设计为了让改进更有说服力我拆了三个组件分别做消融实验配置mAP50-95AP_sYOLOv11m baseline45.622.1 仅高频引导HFG46.523.4 仅信道增强CEB46.122.9 HFG CEB 完整47.324.8结果可以看出高频引导起到了核心作用信道增强则是锦上添花两者叠加后产生了近1个点的联合增益说明高频空间调制与通道重标定之间存在互补关系。5.3 可视化分析与细节我把高频引导分支生成的权重图可视化了一下特征非常直观在目标边缘和纹理密集区域权重值显著偏高在天空、地面等平滑区域权重值接近0。对遥感图像来说建筑轮廓、车辆边缘、道路标线都产生了强响应。这意味着网络在特征融合阶段获得了更清晰的“目标边界位置提示”后续的检测头就不容易把两个靠得很近的小目标混在一起。图像质量的提升也反映在检测结果的可视化上小目标周围预测框的置信度普遍更高目标边界不再模糊成一片。主观体验上模型对密集弱小目标的区分度明显更好。5.4 理论分析与性能成本从计算量上看增加的卷积主要是depthwise的3x3差分卷积和几个1x1卷积整体FLOPs增幅大约在2%~3%从参数量上看前文提过大约是0.2~0.4M即便是YOLOv11n这样的轻量模型也完全负担得起。推理耗时在GPU上基本测不出变化边缘设备上大概增加5%以内但换来的是稳定涨点性价比很高。6. 常见问题与排查技巧实录自己在实验过程中踩过不少坑这里整理成速查表方便大家对照排查。6.1 训练不收敛或Loss震荡表现loss前期下降很快中途突然上涨或直接NaN。根因一alpha初始值太大高频调制过度放大了噪声梯度。对策把alpha初始值改到0.05或单独为alpha设置更低的学习率。根因二差分卷积初始化过大导致高频分量方差高。对策检查差分卷积权重是否初始化为拉普拉斯算子核不要让随机初始化直接上场。6.2 推理速度下降明显表现FPS掉得比较多尤其低算力设备。对策把diff_conv的groups改为1共享卷积或者减少高斯核尺寸到3x3更极致的做法是将模块从每个尺度逐一挂接改为只在最小尺度P5上挂接一次。性能成本参考只挂P5时大概只增加1%FLOPs小目标效果保留了大约70%的收益。6.3 高频引导权重可视化效果不好表现算出来的高频响应图很杂乱看不出边缘结构。可能原因输入特征经过大量下采样后高频信息已经不明显了此时应该把模块往前挪放到更浅的层次如P2/P3或者在输入图像端先做一次浅层高频提取再与深层特征融合。另一个技巧把高斯核的σ适当调大如1.5~2.0让低频分量更平滑这样差分得到的高频更“干净”。6.4 与数据增强冲突表现开了强数据增强后带模块的模型反而不如baseline。原因高频引导学习的是稳定边缘结构但Mosaic、MixUp这类增强引入了大量拼贴边界和混杂纹理很容易干扰高频响应的纯度。对策调整增强策略后期再逐步引入或者关闭MixUp只留Mosaic实测效果更稳。7. 我实际调试中的几点体会HFG-CEB这个模块让我最惊讶的地方是它并不需要改变整体训练范式却能在几乎不增加推理成本的前提下把小目标检测的短板补上一大截。从理论层面讲它其实是给特征融合过程加了一个“空间位置先验”和“通道重要性先验”这两个先验恰好对应了小目标检测最匮乏的两类信息。另外一个值得说的经验是模块不是挂得越多越好。我在P3、P4、P5全挂的时候训练稳定性反而略有下降推理延迟也上来了。后来改为P3和P5挂、P4不挂效果几乎不变速度还更快。不同数据集上最优挂接位置不完全一样我建议大家可以先做一个小规模消融只训练20个epoch快速定位在哪个尺度挂最有收益再上全量训练。最后再分享一个小技巧在训练收敛后可以单独把alpha参数打印出来看看。如果它稳定在一个比较大但小于1的值比如0.3~0.6说明模型确实在依赖高频引导如果训练结束后alpha非常接近初始值0.1那大概率是这个模块在你的数据集上还没有发挥出作用这时候优先检查特征层的插入位置和输入分辨率比盲目调大alpha更有效。希望这个模块能给大家的涨点之路带来一些启发。我后面还在尝试把它和注意力机制的其他变体比如轻量级Transformer block、可变形卷积结合等实验数据跑完再和大家分享。