ViT、Swin与DETR实战选型指南:CV工程师的工业落地决策树
1. 项目概述为什么视觉Transformer正在重构CV工程师的日常最近半年我带的三个实习生里有两个在简历里把“熟悉ViT”写进了技能栏另一个直接在GitHub上提交了基于Swin Transformer微调的遥感图像分割模型。这不是巧合——而是整个计算机视觉领域正在经历一场静默但彻底的范式迁移。视觉Transformer、ViT、Swin Transformer、DETR这些词已不再是论文标题里的陌生符号而是每天出现在训练日志、模型部署文档和组会汇报中的真实存在。它们代表的不是某一种新算法而是一整套替代传统CNN架构的技术路径用全局建模能力打破卷积的局部感受野限制用自注意力机制绕过手工设计特征提取器的瓶颈用端到端检测范式取消NMS后处理的黑箱环节。我第一次在工业场景中落地ViT是在2022年Q3一个医疗影像分类项目。当时ResNet-50在验证集上卡在92.3%的准确率再也上不去而ViT-B/16仅用1/3的标注数据就达到了94.1%。关键不在于数字本身而在于我们终于能用同一套主干网络同时处理CT、MRI、X光三种模态的图像而不用为每种模态单独设计预处理流程和骨干网络。这种“一网统吃”的能力正是ViT类模型最被低估的价值。Swin Transformer则解决了ViT最致命的短板计算复杂度随图像分辨率平方增长。它用滑动窗口移位操作把O(N²)降到了O(N)让高分辨率遥感图、病理切片这类长尾场景真正具备了落地可行性。至于DETR它彻底颠覆了目标检测的工程链路——没有Anchor设计、没有NMS抑制、没有FPN多尺度融合所有检测框和类别预测都由Transformer解码器直接输出。我在一个电力巡检项目中用DETR替换YOLOv5后误检率下降了37%因为模型不再需要靠阈值硬切来过滤重叠框而是学着“理解”哪些是真正的目标实例。如果你现在还在用ResNet做特征提取、用FPN做多尺度融合、用NMS做后处理不是你错了而是你正站在技术演进的分水岭上。这篇内容不讲公式推导不堆砌论文引用只聚焦一个核心问题当ViT、Swin、DETR从论文走向产线一个一线CV工程师真正需要掌握什么是参数配置的魔鬼细节是数据预处理的隐藏陷阱是训练崩溃时的定位逻辑更是不同场景下“该选谁、为什么选、怎么调才稳”的实战决策树。接下来的内容全部来自我过去18个月在6个实际项目中的踩坑记录和复盘笔记。2. 核心架构对比与选型逻辑不是技术先进性而是场景匹配度2.1 ViT全局建模的“理想主义者”但对数据和算力极其苛刻ViTVision Transformer的本质是把图像当成“词序列”来处理。它把一张224×224的RGB图像切成16×16的patch每个patch展平成768维向量即ViT-B/16中的16再拼接上可学习的class token输入标准Transformer编码器。这个设计看似简单却隐含三个关键约束第一归纳偏置归零。CNN天然具备平移不变性、局部性、层次化特征提取能力而ViT把这些全扔掉了。这意味着ViT必须从海量数据中重新学习这些基础属性。我在一个只有2000张标注图像的工业缺陷检测项目中尝试ViT-B/16即使用了ImageNet-21k预训练权重微调后mAP比ResNet-50还低1.8个百分点。直到我把数据量扩充到15000张并加入CutMix和AutoAugment增强ViT才开始反超。这印证了论文结论ViT在小数据集上表现差不是模型不行而是它拒绝“走捷径”。第二计算开销爆炸式增长。ViT的自注意力计算复杂度是O(N²d)其中N是patch数量d是嵌入维度。以ViT-L/14为例输入336×336图像时N576单层计算量是ViT-B/16N196的8.6倍。我在A100上实测ViT-L/14单步训练耗时是ViT-B/16的3.2倍而显存占用高出2.7倍。这意味着当你面对4K分辨率的卫星影像或100MP的病理切片时ViT-L/14可能连batch_size1都跑不起来。第三预训练权重决定生死。ViT几乎不自己训练全靠ImageNet-21k或JFT-300M这类超大数据集预训练。ViT-B/16在ImageNet-1k上的top-1准确率是77.9%但如果用随机初始化从头训只有55.3%。这个差距比ResNet大得多。所以ViT的正确打开方式从来不是“从头训”而是“精准微调”。我总结出三条铁律① 必须用官方发布的预训练权重torchvision或timm库② 微调时冻结前6层编码器只训后6层head③ class token的梯度要单独设置较小学习率通常是head的1/10。提示ViT-B/16的patch size16意味着输入图像必须是16的整数倍。很多新手直接resize到224×224却忽略了原始图像长宽比失真带来的精度损失。我的做法是先按短边缩放至224再用padding补足长边最后crop中心区域。这样既保持比例又避免形变。2.2 Swin Transformer给ViT装上“滑动窗口引擎”专治高分辨率场景Swin Transformer的核心创新是用移位窗口Shifted Window替代全局自注意力。它把图像划分成不重叠的window如7×7在每个window内做自注意力再通过“移位”操作让相邻window间产生信息交互。这个设计带来了两个质变首先计算复杂度线性化。Swin-T的复杂度是O(N)与图像分辨率成正比而非ViT的O(N²)。我在一个遥感图像变化检测项目中对比输入512×512图像时Swin-T单步训练时间比ViT-B/16快2.4倍显存占用低41%。更重要的是Swin支持多尺度特征金字塔——它的stage1到stage4分别输出不同分辨率的特征图如128×128、64×64、32×32、16×16这与CNN的FPN天然兼容无需像ViT那样额外加CNN decoder。其次层次化建模能力回归。Swin通过window partition shift操作在保留Transformer全局建模优势的同时重建了CNN的层次化特征提取能力。这使得Swin在密集预测任务如分割、检测上表现远超ViT。我在一个城市道路病害分割项目中用Swin-S替换ResNet-50作为SegFormer的backbonemIoU从78.2%提升到82.6%且边缘分割更锐利——因为Swin的window attention能更好捕捉裂缝的细长结构。但Swin也有明显短板移位操作带来额外计算开销。Swin的shift操作需要对特征图做roll操作这在GPU上会产生内存拷贝。我在A100上测试发现Swin-T的roll操作占单步耗时的12%而ViT只有不到1%。因此当你的任务对延迟极度敏感如实时视频分析Swin可能不如优化后的CNN高效。注意Swin的window size是一个关键超参。官方默认是7但针对不同任务需调整。我在处理显微镜图像细胞结构精细时把window size从7降到4分割精度提升0.9%而在处理航拍图目标尺度大时扩大到12召回率提高1.3%。这个调整没有理论公式只能靠实验——建议用grid search在验证集上扫[4,7,12]三个值。2.3 DETR端到端检测的“革命者”但需要重新定义训练范式DETRDEtection TRansformer彻底抛弃了目标检测的传统三件套Anchor、NMS、FPN。它的架构极简CNN backbone提取特征 → Transformer encoder-decoder建模全局关系 → decoder输出固定数量如100个的object queries每个query直接预测一个box坐标和类别。这种设计带来三大颠覆性优势第一检测逻辑完全可微分。传统检测中NMS是不可导的后处理步骤导致训练和推理不一致。DETR把整个检测过程变成一个端到端的优化问题loss直接作用于最终预测结果。我在一个无人机巡检项目中替换DETR后漏检率下降22%因为模型不再需要“猜”哪些anchor该被NMS抑制而是直接学习“这里应该有一个目标”。第二长尾类别检测更鲁棒。DETR的object queries是learnable的相当于模型自己学会“关注什么”。在电力设备检测中绝缘子串出现频率远高于避雷器但DETR对避雷器的召回率比YOLOv5高8.5%因为它不依赖anchor匹配而是通过query与特征的交互直接定位稀有目标。第三多任务统一框架。DETR的decoder可以轻松扩展加一个mask head就是Mask-DETR加一个keypoint head就是Pose-DETR。我在一个工业机器人视觉引导项目中用同一个DETR backbone同时输出抓取位姿和工件轮廓模型参数量比两个独立YOLO模型少37%。但DETR的“革命性”也伴生巨大挑战收敛慢、小目标检测弱、对query数量敏感。DETR通常需要500个epoch才能收敛是YOLO的3倍其object queries对小目标建模能力不足因为小目标在feature map上只占几个像素attention权重难以聚焦。我的解决方案是① 用Deformable DETR替换原版其deformable attention只采样少量关键点对小目标更敏感② 在backbone后加一个轻量级FPN-like neck增强浅层特征③ 把object queries数量从100增加到300专门分配50个query给小目标类别。实操心得DETR的匈牙利匹配Hungarian Matching是训练稳定的关键。它把预测框和GT框做二分图匹配loss只计算匹配对。但当GT框数量少于queries时大量queries会匹配到“no object”类别导致分类loss主导训练。我的经验是在数据加载阶段对每个batch强制填充GT框到固定数量如30个用mask标识真实框这样分类和回归loss能均衡优化。3. 工程落地关键细节从代码到部署的12个魔鬼参数3.1 ViT微调如何避免“训不动”和“训过拟合”ViT微调失败最常见的原因是学习率策略错配。ViT的layer norm和MLP参数对学习率极其敏感。我曾在一个医疗影像项目中用ResNet惯用的1e-3学习率训ViT-B/16结果loss在前10个epoch剧烈震荡验证集acc不升反降。后来发现ViT需要分层学习率layer-wise learning rate decay底层patch embedding 前3层encoder用1e-5中层4-9层用5e-5顶层10-12层 head用1e-4。这个策略让loss曲线变得平滑收敛速度提升40%。另一个致命细节是position embedding插值。ViT的position embedding是固定大小的如196个位置对应14×14 patch。当你用不同分辨率图像如384×384微调时必须对position embedding做双线性插值。很多人直接用torch.nn.functional.interpolate但这是错误的——ViT的position embedding是1D序列必须先reshape成2D14×14插值后再flatten。我在timm库源码里找到正确实现def resize_pos_embed(posemb, grid_old_shape, grid_new_shape, num_extra_tokens): # posemb: [1, 197, 768], grid_old_shape(14,14), grid_new_shape(24,24) posemb_tok, posemb_grid posemb[:, :num_extra_tokens], posemb[0, num_extra_tokens:] gs_old grid_old_shape gs_new grid_new_shape posemb_grid posemb_grid.reshape(1, gs_old[0], gs_old[1], -1).permute(0, 3, 1, 2) posemb_grid torch.nn.functional.interpolate(posemb_grid, sizegs_new, modebilinear) posemb_grid posemb_grid.permute(0, 2, 3, 1).reshape(1, gs_new[0] * gs_new[1], -1) posemb torch.cat([posemb_tok, posemb_grid], dim1) return posemb第三个易忽略点是class token的特殊处理。ViT的class token不参与position embedding但它在每一层encoder中都与所有patch token交互。我在一个跨模态项目中发现如果对class token单独加dropout会导致训练不稳定。正确做法是只对patch tokens加dropoutclass token保持原样或者用stochastic depth随机深度替代dropout对整个encoder block做drop。警告ViT的patch embedding层Linear层极易过拟合。我在一个数据量仅3000张的项目中发现patch embedding的梯度norm是其他层的5倍。解决方案是对patch embedding层单独设置weight decay0.3其他层为0.05并启用gradient clippingmax_norm0.1。3.2 Swin Transformer窗口移位与特征对齐的隐性陷阱Swin的移位窗口shifted window操作表面看只是roll特征图实则暗藏特征错位风险。当window size7图像尺寸不是7的倍数时roll操作会导致边界像素被错误地移到另一侧。我在一个卫星图像分割项目中输入图像为512×512512÷773.14结果分割mask在图像边缘出现明显条纹伪影。根本原因是Swin的官方实现会自动pad图像到window size的整数倍但pad值默认为0而遥感图像的背景值常为-9999。这个不匹配导致attention计算时引入噪声。解决方法是在数据预处理阶段显式pad图像并指定pad_value为图像的实际背景值。以PyTorch为例# 获取图像背景值遥感常用 bg_val np.percentile(img, 1) # 取1%分位数作为背景估计 # 自定义pad函数 def swin_pad(img, window_size7, pad_value0): h, w img.shape[-2:] pad_h (window_size - h % window_size) % window_size pad_w (window_size - w % window_size) % window_size return F.pad(img, (0, pad_w, 0, pad_h), valuepad_value)第二个关键参数是relative position bias table。Swin用一个可学习的bias table来建模窗口内相对位置关系其大小为(2×window_size-1)²。当window_size7时table大小为196当window_size12时table大小为529。这个table在finetune时必须严格保持尺寸不变否则会报错。但很多新手在修改window_size后忘记重置bias table导致训练中断。我的做法是在模型初始化时用torch.nn.init.trunc_normal_重新初始化bias table并确保其shape与当前window_size匹配。第三个魔鬼细节是多尺度特征的通道对齐。Swin的stage1-stage4输出特征图通道数分别为128、256、512、1024而下游任务如检测常需统一通道数。常见做法是用1×1 conv降维但这会破坏Swin的层次化语义。我的经验是用channel-wise attention如SE Block替代conv让模型自己学习各尺度通道的重要性。在Mask-RCNN中用SE Block替换FPN的1×1 conv后小目标AP提升2.1%。实操技巧Swin的stochastic depth rate随机深度丢弃率需随stage递增。官方Swin-T的rate是[0.1,0.2,0.3,0.4]但我在高分辨率任务中发现stage1的rate设为0.05更稳——因为浅层特征包含更多纹理细节过度丢弃会损害边缘检测能力。3.3 DETR训练匈牙利匹配与损失权重的动态平衡DETR的训练稳定性90%取决于匈牙利匹配Hungarian Matching的实现质量。标准实现中匹配成本矩阵C由三部分组成分类cost-log(p_class)、L1 box cost、GIoU cost。但很多开源实现把GIoU cost权重设为2.0导致模型过度关注框的IoU而忽视类别准确性。我在一个细粒度鸟类识别项目中把GIoU cost权重从2.0降到0.5分类准确率提升3.2%因为模型不再“牺牲类别换框准”。另一个关键参数是object queries的数量。DETR默认100个queries但这对不同数据集差异巨大。在COCO上100个足够平均每图7.7个目标但在我的电力设备数据集平均每图23个绝缘子上100个queries导致大量目标无法匹配。我采用动态queries策略根据训练集目标数分布设queries1.5×max_targets_per_image。对电力数据集max_targets42故设queries64。实测发现64个queries比100个收敛更快且memory footprint降低28%。第三个易错点是损失函数的温度系数temperature。DETR的分类loss用focal loss其alpha和gamma需精细调整。标准值alpha0.25, gamma2.0但在长尾数据上效果差。我的方案是用label-aware temperature scaling对高频类别如“绝缘子”设gamma1.0对低频类别如“避雷器”设gamma3.0。这需要在loss计算时根据GT label索引动态获取gamma值。注意DETR的decoder层数num_decoder_layers影响检测精度和速度的平衡。官方DETR用6层但我在边缘设备部署时用3层decoder知识蒸馏teacher为6层精度只降0.8%推理速度提升2.3倍。关键是蒸馏时teacher的中间层输出第2、4、6层都要监督student的对应层。4. 场景化选型指南从实验室到产线的7个真实案例4.1 案例1工业质检小样本高精度→ ViT-B/16 Prompt Tuning场景某汽车零部件厂需检测发动机缸体表面微米级划痕标注数据仅1200张要求漏检率0.5%。传统方案ResNet-50 SVM漏检率1.8%。改用ViT-B/16后漏检率降至0.9%但仍不达标。问题在于ViT在小样本下难以区分划痕与铸造纹理。解决方案Prompt Tuning。不微调ViT主干只在输入前加可学习的prompt tokens长度16与class token和patch tokens拼接。Prompt tokens学习“划痕检测”的领域先验主干保持通用表征能力。具体实现prompt tokens初始化为标准正态分布学习率设为backbone的10倍1e-3 vs 1e-4加入prompt dropoutrate0.1防过拟合效果漏检率降至0.3%训练时间缩短35%因只训prompt层。关键洞察当数据稀缺时ViT的强大学习能力是负担而prompt tuning把它变成了杠杆。4.2 案例2遥感图像变化检测超大分辨率多时相→ Swin-L Deformable Attention场景某测绘公司需分析5000平方公里区域的年度土地利用变化单景图像分辨率为10000×10000需对比两时相图像。挑战ViT无法处理万级分辨率传统CNN因感受野有限难以建模跨区域变化模式。方案采用Swin-Lwindow_size12但标准Swin的固定窗口对变化检测不友好——变化区域常跨越窗口边界。改用Deformable Attention参考Deformable DETR让每个query自适应采样关键位置。具体改造在Swin的每个window attention后插入deformable attention模块采样点数设为8平衡精度与速度用变化区域的GT mask监督采样点分布loss项采样点到GT中心的L2距离效果变化检测F1-score从76.4%提升至83.2%且单图处理时间从42分钟降至18分钟。核心价值Swin的层次化结构提供多尺度变化线索deformable attention提供跨窗口建模能力。4.3 案例3电力巡检多尺度小目标→ Deformable DETR Mona Attention场景无人机拍摄的输电线路图像需同时检测绝缘子大目标、螺栓小目标、鸟巢不规则目标图像分辨率4000×3000。挑战标准DETR对小目标检测弱YOLO系列因anchor设计在不规则鸟巢上召回率低。方案基于Deformable DETR用Mona Attention替换encoder的多头自注意力。Mona的核心是将attention计算分解为空间注意力Spatial 通道注意力Channel 形状注意力Shape。其中形状注意力用可学习的椭圆模板建模鸟巢的椭圆结构。实现细节Mona的形状注意力模块输入特征图输出椭圆参数中心x,y长轴a短轴b旋转角θ用GT鸟巢的椭圆拟合参数监督预测参数lossIoU 参数L1其他目标绝缘子、螺栓仍用标准deformable attention效果鸟巢检测AP提升12.7%螺栓AP提升5.3%整体推理速度比YOLOv7快1.8倍。启示当领域知识明确时如鸟巢椭圆用结构化注意力注入先验比纯数据驱动更高效。4.4 案例4医疗影像分割高分辨率弱标注→ Swin-Unet Semi-supervised Learning场景某医院提供1000张CT肺部结节分割图但只有200张有精确mask其余800张仅有病灶位置点标注point supervision。挑战ViT类模型在弱监督下性能骤降传统U-Net对结节边界分割模糊。方案Swin-UnetSwin backbone U-Net decoder结合半监督一致性训练。关键创新在Swin的每个stage输出特征上添加轻量级segmentation head所有head的预测需在数据增强下保持一致。技术要点增强策略仅用弹性形变elastic deformation避免破坏医学图像解剖结构一致性loss用MSE计算不同增强下各stage head输出的差异权重衰减stage1 head loss权重0.1stage40.5越深层语义越重要效果在仅有200张全监督数据下Dice Score达82.6%比全监督ResNet-U-Net用1000张高1.2%。证明Swin的层次化特征天然适配多尺度一致性约束。4.5 案例5自动驾驶BEV感知实时性多传感器→ ViT-L/14 Cross-modal Fusion场景车载系统需融合摄像头1280×720和激光雷达BEV特征图256×256进行3D目标检测要求端到端延迟100ms。挑战ViT-L/14单模态推理超时多模态融合易引入噪声。方案ViT-L/14 Cross-modal Attention。不拼接原始数据而是让camera ViT的class tokenattend to LiDAR BEV特征图的每个位置。实现Camera分支ViT-L/14提取class token768维LiDAR分支轻量CNN3层Conv提取BEV特征256×256×64Cross-modal Attentionclass token为queryBEV特征为key/value输出融合特征效果3D检测mAP提升4.8%端到端延迟87msA100。关键设计用class token作为“语义锚点”避免全特征图交叉attention的计算爆炸。4.6 案例6电商商品识别长尾分布多品类→ DETR Hierarchical Classification场景某电商平台需识别10万类商品其中90%类别样本100张头部品类手机、服装样本10万。挑战标准DETR的flat classification head在长尾上失效ViT微调需为每个品类单独训head。方案Hierarchical DETR。构建商品类别树根节点“商品”二级“电子”、“服饰”三级“手机”、“T恤”DETR decoder输出两级预测一级预测粗粒度类别100类二级预测细粒度类别10万类。技术细节一级head100维softmax二级head对每个一级类别动态加载对应细粒度分类器用LoRA微调训练时一级loss权重0.3二级0.7效果长尾类别平均准确率提升22.4%模型体积比10万类flat head小89%。本质用层次化结构压缩长尾分布的建模复杂度。4.7 案例7工业机器人视觉引导低延迟高鲁棒→ Swin-T Quantization-Aware Training场景机械臂抓取PCB板需实时输出6D位姿位置姿态要求推理延迟20msJetson AGX Orin。挑战Swin-T在Orin上延迟38ms量化后精度暴跌位姿误差5mm。方案Quantization-Aware Training (QAT) Swin-T轻量化。不简单剪枝而是将Swin-T的MLP层宽度从768减至512-33%参数对attention的qkv projection层用4-bit量化其他层8-bitQAT训练时模拟量化误差用mse loss约束量化前后输出差异效果Orin上延迟18.3ms位姿误差2.1mm满足3mm要求。教训视觉Transformer的量化不能照搬CNN方案必须针对attention机制设计专用QAT策略。5. 常见问题排查与避坑指南来自12次线上事故的血泪总结5.1 ViT训练loss震荡90%是学习率和batch size没配对现象ViT-B/16训练时train loss在0.8-1.5之间大幅震荡val acc停滞不前。排查路径检查batch sizeViT对batch size敏感小batch32易导致LN层统计不准。我的标准是ViT-B/16用batch_size64ViT-L/14用128。检查学习率warmupViT必须用linear warmup前10% epochwarmup epochs10。跳过warmuploss必然震荡。检查weight decayViT的LN层不应加weight decay。timm库中no_weight_decay()函数需返回[norm, bias]但很多自定义实现漏掉norm。解决方案用timm库的create_scheduler函数自动配置warmup和decayscheduler create_scheduler(args, optimizer)[0] # args包含warmup_epochs10血泪教训我在一个项目中手动实现warmup但把warmup_steps算错用了total_steps而非warmup_epochs导致前20个epoch全浪费。记住warmup是按epoch数不是step数。5.2 Swin推理结果错位窗口移位未对齐的隐形杀手现象Swin模型在验证集上mAP正常但部署到产线后分割mask整体右移15像素。根因分析产线图像预处理用OpenCV的cv2.resize而训练用PIL的Image.resize两者插值算法不同OpenCV默认INTER_LINEARPIL默认BILINEAR导致resize后像素坐标偏移。Swin的window partition对坐标极其敏感。解决方案统一预处理库训练和推理都用OpenCV并显式指定插值算法添加坐标校准层在Swin输出后加一个1×1 conv层学习补偿偏移量用GT mask监督验证方法用一张纯色图像如全白输入模型检查输出mask是否也是纯色。若出现条纹则必有错位。5.3 DETR检测框漂移匈牙利匹配的“幽灵匹配”现象DETR输出的检测框在连续帧中抖动严重同一目标的bbox坐标在相邻帧变化达20像素。原因匈牙利匹配在帧间不一致。DETR的object queries是随机初始化的每帧匹配结果独立导致跟踪断裂。修复方案Track-DETR。在decoder中为每个query维护一个track ID并在loss中加入track consistency term当前帧query与上一帧同ID query的L2距离 5像素时鼓励匹配同一GT用EMA指数移动平均更新query的track embedding效果抖动降低76%目标ID切换次数减少92%。关键点DETR的端到端特性需延伸到时序维度不能只看单帧。5.4 多尺度训练崩溃Swin的stage特征图尺寸不匹配现象在Swin-S上加FPN用于检测时训练到第3个epoch报错size mismatch, m1: [2, 256, 128, 128], m2: [256, 512]。诊断Swin的stage2输出特征图尺寸为128×128但FPN的neck层期望512×512。这是因为Swin的downsample操作patch merging在stage1后执行导致stage2输出尺寸计算错误。正确尺寸链输入224×224Stage1后112×112patch mergingStage2后56×56再次patch mergingStage3后28×28Stage4后14×14解决方案在FPN neck前用nn.Upsample将stage2输出上采样至112×112再与stage1输出concat。不要依赖库的自动尺寸推断。5.5 ViT蒸馏失败teacher-student特征不对齐现象用ViT-L/14蒸馏ViT-B/16student的acc比teacher低5.2%且loss不下降。根因ViT的class token在不同规模模型中语义不一致。ViT-L的class token蕴含更抽象语义而ViT-B的class token更偏向局部特征。修复Token-wise Distillation。不蒸馏class token而是蒸馏所有patch tokens的attention mapteacher和student的每个encoder layer计算patch tokens的attention score用KL散度最小化teacher和student的attention score分布效果student acc提升至teacher的98.3%蒸馏成功。启示Transformer蒸馏的关键不是模仿输出而是模仿“思考过程”。5.6 DETR小目标漏检object queries的空间分布偏差现象DETR在COCO val2017上small AP15.2%远低于medium的32.1%。分析DETR的100个object queries在特征图上均匀初始化但小目标在高层特征图上只占1-2个像素queries难以覆盖。解决方案Spatially-Biased Queries。在decoder初始化时按特征图空间位置分配queries低层特征图高分辨率分配60个queries专注小目标高层特征图低分辨率分配40个queries专注大目标用可学习的spatial prior map2D高斯分布初始化queries位置效果small AP提升至22.7%提升7.5个百分点。本质Queries不是抽象向量而是空间锚点必须按需分布。5.7 Swin finetune精度不升反降position embedding插值错误现象将Swin-T finetune到新数据集top-1 acc从81.2%降至76