DEIM 从主干到 neck 的所有算子都在空域干活——卷积在空域滑窗、注意力在空域加权,但很多结构信息(纹理、边缘、周期性)在频域里表达得更清晰。针对"全程空域视角"这个盲区,我们做了一批频域处理替换变体,双落点:backbone 走HG_Stage_<X>、neck 走lateral_convs_<X>,全部保持原落点参数格式不变、一行切换。
1. 现有的空域算子有什么问题
不是空域算子"错了",而是"只有空域视角"这个事实本身有盲区:
| 问题 | 机制原因 | 可观测后果 |
|---|---|---|
| 局部 vs 全局割裂 | 卷积感受野是局部的,全局信息要叠很多层 | 周期性/长程结构建模慢 |
| 高频信息被稀释 | 下采样/池化把高频(边缘、纹理)细节逐步抹掉 | 小目标与纹理细节在深层消失(【细分场景】) |
| 分辨率敏感 | 空域卷积对尺度变化不鲁棒 | 同一目标不同尺度,特征差异大 |
| 信息冗余 | 空域表示里相邻像素高度相关 | 参数量与计算量浪费在冗余上 |
一句话总结:空域视角下,高频细节是"藏"在大量冗余像素里的——频域把高频信息单独拎出来,让网络可以直接处理"细节本身"。
2. 可以往哪些方向改进
"把特征切到频域看"有四个方向,也是我们最终落地的四个分组:
| 方向 | 思路 | 代表变体 | 优点 | 代价 |
|---|---|---|---|---|
| 小波分解 | 小波变换拆多尺度频率子带 | WTConv、Down_wt、MWPT、PWD | 多尺度+高频显式,可逆无损 | 实现复杂 |
| 傅里叶/FFT | 频谱调制后反变换 | FFCM、Fre_MLP、Fourier_Modulation_Attention、FSAS、FSDA、KSFA、PFAE、msfn | 全局视野天然 | 复数运算 |
| 频域卷积 | 在频域做卷积/调制 | FEB、FDConv、CEB | 融合空域频域优势 | 与 BN 兼容需处理 |
| 频带学习 | 学习频带重要性/分解 | Down_wt、CEB、PWD | 轻量、可解释 | 提升幅度看场景 |
四路共同点:backbone 落点保持 HG_Stage 外壳不变,neck 落点保持 c→c 同维不变。变体全做,让实验挑最优。
3. HG 的卷积注意力是如何改进的
双落点装配(HG_Stage_<X>/lateral_convs_<X>均由 train_deim_yaml.py 通用分支自动导入):
3.1 小波分解组——多尺度频率子带
| 变体 | 核心机制 |
|---|---|
| WTConv | 小波卷积:db1 小波分解为 LL/LH/HL/HH 子带,LL 递归分解后各尺度卷积再重建(详见第 4 节) |
| Down_wt | 小波下采样:用小波分解替代大步长下采样,保留高频 |
| MWPT | 多级小波包变换(更细的频率划分) |
| PWD | 金字塔小波分解 |
3.2 傅里叶/FFT 组——频谱调制
| 变体 | 核心机制 |
|---|---|
| FFCM | 傅里叶频域通道调制 |
| Fre_MLP | 频域 MLP(频谱上做逐点/逐通道变换) |
| Fourier_Modulation_Attention | 傅里叶调制注意力 |
| FSAS / FSDA | 频域空间注意力 / 频域尺度解耦注意力 |
| KSFA | 核化频谱特征注意力 |
| PFAE | 金字塔频率注意力增强 |
| msfn | 多尺度频域网络 |
3.3 频域卷积组——频域里做卷积
| 变体 | 核心机制 |
|---|---|
| FEB | 频域增强块 |
| FDConv | 频域解耦卷积 |
| CEB | 通道频带均衡 |
设计逻辑:四个分组对应"频域"的四个本质问题——小波回答"如何无损地把频率拆开",傅里叶回答"如何直接在全频谱上调制",频域卷积回答"如何让卷积本身具备频域视野",频带学习回答"哪些频率成分值得单独处理"。变体不是堆数量,而是把'换坐标系看特征'这个动作的每个可设计维度都覆盖了一遍;WTConv 则是其中机制最完整、最可解释的一个。
4.代码和视频讲解
视频讲解:
DEIM:超越 YOLO,快准双绝!DEIM:让 DETR 告别慢收敛,开启实时检测新纪元_哔哩哔哩_bilibili
DEIM:超越 YOLO,快准双绝!一个视频告诉你DEIM如何搭建backbone_哔哩哔哩_bilibili
代码获取:
YOLOv8_improve/DEIM.md at master · tgf123/YOLOv8_improve · GitHub
5.以WTConv小波卷积为例
第一: 将下面的核心代码复制到DEIMv2-main\DEIM_YOLO\change_mode_频域处理
路径下,如下图所示。
第二:自适应导包与模型搭建
第三:将模型配置文件复制到DEIM.YAMY文件中
第四:yaml改进配置文件
backbone: - [-1, 1, HGStem, [3, 16, 16]] # 0 stem - [-1, 1, HG_Stage_WTConv, [16, 16, 64, 1, False, False, 3, 3]] # 1 stage1 - [-1, 1, HG_Stage_WTConv, [64, 32, 256, 1, True, False, 3, 3]] # 2 stage2 - [-1, 1, HG_Stage_WTConv, [256, 64, 512, 2, True, True, 5, 3]] # 3 stage3 - [-1, 1, HG_Stage_WTConv, [512, 128, 1024, 1, True, True, 5, 3]] # 4 stage4 head: - [-1, 1, input_proj, [128]] # 5 P5': layer4(1024) -> 128 - [3, 1, input_proj, [128]] # 6 P4': layer3( 512) -> 128 - [5, 1, TransformerEncoder, [128, 8, 512, 1]] # 7 P5'' - [-1, 1, lateral_convs, [128]] # 8 Y5 - [-1, 1, upsample_feat, [2, "nearest"]] # 9 up2 - [[-1, 6], 1, concat, [1]] # 10 FPN 融合 -> 256ch - [-1, 1, fpn_blocks, [256, 128, 256, 21, 2]] # 11 F4 - [-1, 1, downsample_feat, [128, 128, 3, 2]] # 12 downF4 - [[-1, 8], 1, concat, [1]] # 13 PAN 融合 -> 256ch - [-1, 1, pan_blocks, [256, 128, 256, 21, 2]] # 14 F5 - [[11, -1], 1, DEIMDecoder, [nc, 128, 3, 300, 32, 4, [6, 6]]] # 15 Detect(F4, F5)backbone: - [-1, 1, HGStem, [3, 16, 16]] # 0 stem - [-1, 1, HG_Stage, [16, 16, 64, 1, False, False, 3, 3]] # 1 stage1 - [-1, 1, HG_Stage, [64, 32, 256, 1, True, False, 3, 3]] # 2 stage2 - [-1, 1, HG_Stage, [256, 64, 512, 2, True, True, 5, 3]] # 3 stage3 - [-1, 1, HG_Stage, [512, 128, 1024, 1, True, True, 5, 3]] # 4 stage4 head: - [-1, 1, input_proj, [128]] # 5 P5' - [3, 1, input_proj, [128]] # 6 P4' - [5, 1, TransformerEncoder, [128, 8, 512, 1]] # 7 P5'' - [-1, 1, lateral_convs_WTConv, [128]] # 8 Y5 (频域调制,c->c 同维) - [-1, 1, upsample_feat, [2, "nearest"]] # 9 up2 - [[-1, 6], 1, concat, [1]] # 10 FPN 融合 -> 256ch - [-1, 1, fpn_blocks, [256, 128, 256, 21, 2]] # 11 F4 - [-1, 1, downsample_feat, [128, 128, 3, 2]] # 12 downF4 - [[-1, 8], 1, concat, [1]] # 13 PAN 融合 -> 256ch - [-1, 1, pan_blocks, [256, 128, 256, 21, 2]] # 14 F5 - [[11, -1], 1, DEIMDecoder, [nc, 128, 3, 300, 32, 4, [6, 6]]] # 15 Detect(F4, F5)第五:模型跑出的结果