:HGNetv2 stem 改进 —— 从单路径卷积到多先验入口)
DEIM 的 backbone 由 HGNetv2 构成其最前端是一段经典的 HGStem—— 两条 stride2 的方形卷积把输入从 3 通道压到 16 通道、4 倍下采样。它是整个网络的第一层却在设计上最 朴素单一路径、纯方形卷积既没有多尺度也没有边缘 / 方向 / 频域先验下采样还是一次性信息丢失。我们做了一批stem_X替换变体全部保持 输出 16 通道、stride 4 的接口不变、一行 yaml 切换下游 HG_Stage 与 decoder 零改动。DEIM_n结构图DEIM_S结构图1. 为什么盯着 第一层 改一个检测器对一张图做的第一件事就是 stem。stem 是 backbone 的第 0 层它把原始像素3 通道、全分辨率变成第一张特征图16 通道、1/4 分辨率。stem 是网络的门面HGStem 却用最朴素的方式开门 —— 单路径、无先验、下采样丢信息。方向思路典型手段结构重参化训练时多分支、推理时折叠成单卷积RepVGG / MobileOne 式可重参化块空间切分重组下采样前先按空间位置切分保留全部像素信息space-to-depth / PixelUnshuffle 式切分频域切分用 Haar 小波把 2×2 块分解成低频 高频子带小波变换 子带加权边缘先验在 stem 里显式注入边缘 / 平滑信息LoG高斯拉普拉斯边缘检测核方向建模用方向性滤波器捕捉各向异性纹理方向 LoG 方向门控这个位置的特殊性在于所有后续特征都从这里长出来——stem 丢的信息后面的 stage 再也找不回来它工作在最高分辨率—— 同样的卷积核在 stem 上算的 FLOPs 占比很高改它性价比极高它离像素最近—— 边缘、纹理、频率这些底层先验只有在 stem 这个位置注入才最自然。2. stem是如何改进的我们实现了一批stem_X替换变体全部满足同一个接口约定输入 3 通道、输出 stem_dim16 通道、整体 stride4—— 和 HGStem 完全一致所以下游第一个 HG_Stage16→64与 decoderfeat_strides[16,32]都无需任何改动yaml 里把 backbone 第一行的HGStem换成stem_X即可。变体路线核心机制stem_RepStem结构重参化3 个 MobileOneBlock 堆叠3×3 s2 → 3×3 dw s2 → 1×1训练时多分支、推理时折叠成单卷积stem_SRFD空间切分重组静态 Cut 切分2×2 位置切 4 份 concat 后 1×1 融合下采样不丢像素第二段 conv/maxpool/cut 三路融合stem_DPAS自适应切分 门控切分位置带可学习权重softmax 加权两条路径用 PathGate 软门控融合stem_WGFS频域切分Haar 小波把 2×2 块分解为 LL/LH/HL/HH 子带可学习 band 权重sigmoid再融合stem_LoGStem边缘先验LoG 固定核提取边缘响应 高斯平滑残差 DRFD 精炼stem_ODALStem方向建模各向同性 LoG 方向性 LoG 双滤波OrientationGate 方向门控 可学习方向缩放4.代码和视频讲解视频讲解DEIM超越 YOLO快准双绝DEIM让 DETR 告别慢收敛开启实时检测新纪元_哔哩哔哩_bilibiliDEIM超越 YOLO快准双绝一个视频告诉你DEIM如何搭建backbone_哔哩哔哩_bilibili代码获取https://github.com/tgf123/YOLOv8_improve/blob/master/DEIM.md5.以WTConv小波卷积为例第一: 将下面的核心代码复制到DEIMv2-main\DEIM_YOLO\change_mode_stem路径下如下图所示。第二自适应导包与模型搭建第三将模型配置文件复制到DEIM.YAMY文件中第四yaml改进配置文件backbone: # [from, repeats, module, args] # HG_Stage args hgnetv2.py 里 arch_configs[B0][stage_config] 原样 # [in_ch, mid_ch, out_ch, num_blocks, downsample, light_block, kernel_size, layer_num] - [-1, 1, stem_DPAS, [3, 16]] # 0 stemstem_channels - P2/4stem_DPAS - [-1, 1, HG_Stage, [16, 16, 64, 1, False, False, 3, 3]] # 1 stage1 - P2/4 - [-1, 1, HG_Stage, [64, 32, 256, 1, True, False, 3, 3]] # 2 stage2 - P3/8n 档不用 - [-1, 1, HG_Stage, [256, 64, 512, 2, True, True, 5, 3]] # 3 stage3 - P4/16, 512ch - [-1, 1, HG_Stage, [512, 128, 1024, 1, True, True, 5, 3]] # 4 stage4 - P5/32, 1024ch head: # ---- 1) input_proj官方 forward 的 proj_feats 循环n 档 num_levels2 故循环 2 次---- # 每个尺度一个独立层from 显式连到对应 backbone 层 - [-1, 1, input_proj, [128]] # 5 proj_feats[1] P5: layer4(1024) - 128 - [3, 1, input_proj, [128]] # 6 proj_feats[0] P4: layer3( 512) - 128 # ---- 2) intra-scale encoderDEIM 的 HybridEncoder.encoder作用于 use_encoder_idx[1] 即 P5---- - [5, 1, TransformerEncoder, [128, 8, 512, 1]] # 7 P5 # ---- 3) 自顶向下 FPN ---- - [-1, 1, lateral_convs, [128]] # 8 Y5 lateral_convs.0(P5)1x1 conv BN无激活 - [-1, 1, upsample_feat, [2, nearest]] # 9 上采样 2 倍Y5 - P4 分辨率 - [[-1, 6], 1, concat, [1]] # 10 concat(↑Y5, P4) - 256ch - [-1, 1, fpn_blocks, [256, 128, 256, 21, 2]] # 11 F4 fpn_blocks.0 (c1,c2,c3,c4,n) # ---- 4) 自底向上 PAN ---- - [-1, 1, downsample_feat, [128, 128, 3, 2]] # 12 ↓F4SCDown: 1x1 3x3 dw s2 - [[-1, 8], 1, concat, [1]] # 13 concat(↓F4, Y5) - 256ch - [-1, 1, pan_blocks, [256, 128, 256, 21, 2]] # 14 F5 pan_blocks.0 - P5/32 - [[11, -1], 1, DEIMDecoder, [nc, 128, 3, 300, 32, 4, [6, 6]]] # 15 Detect(F4, F5) # ^hidden, layers, queries, reg_max, reg_scale, num_points第五模型跑出的结果