AnyDepth-DETR/-YOLO: Any-depth object detection with a single network
- 推文链接: https://mp.weixin.qq.com/s/JKwq5c0sKwaKh_-VXSqVFA
- 推文标题: 一个模型顶N个!AnyDepth让RT-DETR和YOLOv12秒变"变形金刚",算力切换无须训练!
- 来源: https://arxiv.org/abs/2605.09407
- 本地PDF:
../raw/2026-05-10-anydepth.pdf - 日期: 2026-05-10
- 标签:
any-depth,adaptive inference,RT-DETR,YOLOv12,self-distillation - 研究方向: 2D Object Detection → 自适应推理 → 任意深度检测
- 作者: Woochul Kang, Hyungseop Lee, Jiho Lee (Incheon Nat'l Univ.)
- 会议: CVPR 2026
公众号推文解读
摘要
AnyDepth 框架让单一检测模型覆盖从轻量到高精度的连续区间,推理时通过控制深度切换精度/效率,无需重新训练。每个 stage 拆分为「必要路径」(始终执行)+「细化路径」(可跳过),用自蒸馏训练两个极端(super-net + base-net),中间子网络自动泛化。在 RT-DETR 和 YOLOv12 上验证,super-net 持平 SOTA,base-net AP 仅降 2.0 但速度快 1.82×。
核心设计
- 阶段级模块化:保留完整多尺度层级,不丢弃任何 stage(不同于早期退出)
- 双路径设计:必要路径始终执行 + 细化路径可跳过
- 自蒸馏:仅训练两个极端,预测级(分类KD/回归KD)+ 特征级(GAP对齐)
- 目标分配冲突解决:DETR 中重排 query 顺序对齐 GT;YOLO 中定义冲突集排除冲突 anchor
- 可切换BN/聚合层:让必要路径在不同模式下(细化开/关)适配不同输出分布
结果
| 配置 | GFLOPs | FPS | AP |
|---|---|---|---|
| AnyDepth-DETR(R-50) super | 136 | 92 | 53.3 |
| AnyDepth-DETR(R-50) base | 79 | 165 | 50.6 (-2.7) |
| AnyDepth-YOLO(L) super | 83.3 | 101.5 | 53.9 |
| AnyDepth-YOLO(L) base | 59.6 | 155.3 | 52.1 (-1.8) |
论文解读
1. Introduction
问题: 现代检测器是静态固定深度的网络,为单一算力点优化。不同部署场景需要不同模型,无法在线调整。
现有方法不足:
- 早期退出(early exiting):直接跳过整个 stage,破坏多尺度特征完整性,精度断崖下降
- 宽度自适应(width adaptation):改变通道数,需要特制硬件支持
AnyDepth 贡献:
- 任意深度检测框架:单一网络覆盖连续精度-效率权衡区间
- 阶段级模块化:每个 stage 拆分为必要路径 + 可跳过细化路径,保留完整多尺度层级
- 自蒸馏训练:仅训练两个极端(super-net + base-net),中间子网络自动泛化
- CVPR 2026:RT-DETR/YOLOv12 上 super-net 持平 SOTA,base-net 最高 1.82× 加速仅降 2.0 AP
2. Related Work
- 自适应推理: 早期退出、宽度自适应、条件计算(MoE)——都有各自局限
- AnyDepth 不同: 不丢弃整个 stage,不改变通道数,不引入额外路由开销
3. Method
3.1 架构设计
每个 backbone/neck stage 拆分为两条路径:
- Essential path(必要路径):始终执行,学习核心特征
- Refinement path(细化路径):可跳过,额外算力时进一步精化
RT-DETR(残差块): 取前 m 块为必要路径,后 S-m 块为细化路径。残差加性保证了输出形状兼容。
YOLOv12(CSP 聚合): 拼接通道数不同导致权重无法共享 → 引入专用可切换聚合层,必要路径和完整路径各自独立的 1×1 卷积。
可切换 BN: 必要路径中的模块有两个 BN——细化激活时用一个,跳过时用另一个。
3.2 自蒸馏训练
策略: 每次迭代两次前向-反向传播:
- super-net(全部路径)→ GT loss
- base-net(仅必要路径)→ GT loss + 蒸馏 loss(来自 super-net)
蒸馏 loss 三部分:
- 分类 KD: KL 散度对齐分类 logits
- 回归 KD: IoU loss + 边缘 loss 对齐边界框
- 特征对齐 KD: 每阶段边界做 channel-wise GAP,ℓ2 对齐
- 为什么用 GAP 而非逐像素?GAP 保留细化路径学习空间细化的自由度
3.3 目标分配冲突
DETR 中 super-net 和 base-net 的匈牙利匹配结果不同 → Target-aligned query matching:重新排列 super-net 的 query 顺序,与 base-net 对齐同一 GT。
YOLO 中 → 定义冲突集合(两网络都分配前景但目标不同),只在有效集合上计算蒸馏 loss。
4. Experiments
4.1 COCO 主结果
| 模型 | GFLOPs | FPS | AP | AP50 | APS |
|---|---|---|---|---|---|
| RT-DETR-R50 | 136 | 92 | 53.1 | 71.5 | 33.5 |
| AnyDepth-DETR(R-50) super | 136 | 92 | 53.3 | 71.6 | 33.4 |
| AnyDepth-DETR(R-50) base | 79 | 165 | 50.6 | 69.4 | 30.7 |
| RT-DETR-R101 | 259 | 66 | 54.5 | 72.9 | 34.2 |
| AnyDepth-DETR(R-101) super | 259 | 66 | 54.5 | 72.7 | 34.0 |
| AnyDepth-DETR(R-101) base | 142 | 120 | 52.5 | 71.0 | 32.1 |
| YOLOv12-L | 83.3 | 101.5 | 53.9 | 70.6 | — |
| AnyDepth-YOLO(L) super | 83.3 | 101.5 | 53.9 | 70.6 | — |
| AnyDepth-YOLO(L) base | 59.6 | 155.3 | 52.1 | 68.4 | — |
4.2 消融
组件级消融:必要路径减少 backbone 块 + encoder 路径 + decoder 层数,AP 从 53.3(完整)降至 50.6(base)。
训练组件消融:Switchable BN、Switchable Aggregation、自蒸馏、Target Alignment、Feature Alignment 逐个加入,每个组件都持续提升。
特征对齐策略:GAP(semantic)对齐优于逐像素(spatial)对齐,因为不限制细化路径的空间精化能力。
Feature CKA 分析:本文方法在各层级 CKA 均接近 1.0(Naive joint 在 neck 段降至 0.7),验证了路径对齐的有效性。
5. Conclusion
- AnyDepth 实现单一网络覆盖连续精度-效率权衡
- 阶段级模块化保留完整多尺度层级
- 自蒸馏 + 目标对齐解决训练冲突
- CVPR 2026,代码将开源
局限性: 仅支持深度维度自适应,未涉及宽度或分辨率。自蒸馏训练开销两倍,但推理无额外成本。未来可扩展到 DINO、YOLOv8 等架构。
个人评价
核心价值: 把自适应推理从「宽度/早期退出」思路拓展到「深度」维度,用最简洁的方法(必要+细化路径)实现了连续调节。自蒸馏仅训练两个极端的设计很巧妙,避免了指数量级的子网络训练。
可借鉴点:
- 必要路径 + 细化路径的 stage 拆分思路可迁移到其他检测器
- 自蒸馏 + 目标对齐冲突解决的通用策略
- 可切换 BN / 可切换聚合层处理不同模式下的分布差异
与 EdgeCrafter/TinyFormer 对比:
- EdgeCrafter:蒸馏大 ViT 到紧凑学生,做固定轻量模型
- TinyFormer:架构设计保持小目标分辨率
- AnyDepth:同一模型动态切换深度,覆盖不同算力场景
疑问解答 (Q&A)
Q1: AnyDepth 和早期退出的本质区别?
答: 早期退出跳过整个 stage,破坏多尺度金字塔。AnyDepth 只跳过 stage 内部的细化块,输出是必要路径的特征图,下游 neck 仍能收到完整的多尺度信息。
Q2: 为什么 GAP 对齐比逐像素对齐好?
答: 逐像素 ℓ2 对齐会迫使细化路径的特征图与必要路径一模一样,失去了学习空间细化的意义。GAP 只对齐通道级描述子,保留空间精化的自由度。
Q3: 目标分配冲突为什么在 DETR 和 YOLO 中处理方式不同?
答: DETR 的匈牙利匹配是全局排列,可以重新排序 query 来对齐。YOLO 的 TaskAligned Assigner 是基于局部 anchor 的分配,无法全局重排,只能定义冲突集合排除有冲突的 anchor。
