DETR:基于Transformer的端到端目标检测新范式解析与实践

发布时间:2026/8/20 2:39:34
DETR:基于Transformer的端到端目标检测新范式解析与实践 还在为YOLO的Anchor调参、NMS后处理而头疼吗当你的小目标检测效果不佳或者密集场景下框体重叠严重时是否感觉传统的检测框架已经到了需要“大力出奇迹”的调参阶段今天我们彻底换一个思路。目标检测领域YOLO系列凭借其速度和工程友好性占据了绝对主流。但你是否想过检测任务本质上就是一个“从图像中找出一组物体并描述它们”的集合预测问题为什么我们一定要依赖手工设计的Anchor、复杂的NMS后处理以及两阶段模型中的区域提议网络RPN呢2019年底Facebook AI Research的一篇论文《End-to-End Object Detection with Transformers》横空出世它带来的DETR模型正是对这个根本问题的直接回答用Transformer架构将目标检测彻底重构为一个端到端的集合预测问题。这篇文章我们不谈空洞的学术概念而是聚焦于一个核心判断DETR及其变种代表了一种更干净、更统一的检测范式它正在解决YOLO等传统方法在特定场景下的固有痛点并指明了算法设计的新方向。对于已经熟悉YOLO但遇到瓶颈的工程师、渴望理解前沿检测思想的研究者或是任何希望拓宽技术视野的CV从业者花1小时理解DETR其价值远超无脑调参几天。我们将从“为什么需要DETR”这个最实际的疑问出发拆解其用Transformer做检测的核心思想然后深入到代码层面看它如何实现并剖析其最初的缺陷如训练慢、小目标检测差以及后续一系列“变种”是如何精准改进的。最后你会获得一套清晰的认知什么时候该坚持YOLO什么时候DETR路线可能是更优解。1. 传统检测的“枷锁”与DETR的“破局”在深入DETR之前我们必须先理解它要解决什么问题。以YOLO、Faster R-CNN为代表的传统检测器其 pipeline 可以概括为几个关键步骤预设Anchor先验框在图像网格或特征图上预先定义大量不同尺寸、比例的框。模型的任务是判断这些Anchor里哪些是物体并微调其位置。产生冗余预测每个Anchor都可能预测一个物体导致同一物体被多个高置信度的框检测到。非极大值抑制NMS后处理步骤用于剔除冗余框只保留一个最好的。NMS需要手动设置阈值如IoU阈值、置信度阈值这个参数对最终结果影响巨大且不优雅。两阶段方法区域提议如Faster R-CNN需要RPN先生成候选区域再精细分类和回归流程复杂。这个过程存在几个固有痛点调参复杂Anchor的尺寸、比例、数量NMS的阈值都是需要根据数据集精心调整的超参数缺乏鲁棒性。设计不统一Anchor的设计是启发式的与数据分布强相关。换一个数据集如从COCO到无人机航拍可能就需要重新设计Anchor。后处理不可微NMS不属于模型的一部分是一个不可微的后处理步骤阻碍了真正的端到端训练。全局关系建模弱CNN骨干网络感受野有限难以建模图像中长距离的物体依赖关系如一个桌子通常搭配几把椅子。DETR的破局思路极其简洁有力抛弃Anchor和NMS将目标检测视为一个集合预测Set Prediction问题。模型直接输出一个固定长度的、无序的物体预测集合比如100个预测并通过一种创新的二分图匹配损失在训练时强制让这100个预测与图像中的真实物体GT一一对应。实现这一点的核心引擎就是来自NLP领域的Transformer。简单来说DETR的想法是让模型学会“主动思考”图像中有哪些物体每个物体的类别和位置是什么并一次性、按需地输出结果列表而不是从一堆预设的框里做筛选。这听起来很理想化但DETR用一套精巧的设计实现了它并在COCO数据集上达到了与Faster R-CNN媲美的性能。2. DETR核心原理Transformer如何做检测理解DETR关键在于理解三个核心组件CNN骨干网络、Transformer编解码器、以及预测头与二分图匹配。我们用一个类比来理解整个过程想象你要描述一张复杂的家庭聚会照片。传统方法YOLO像是先准备一大堆不同大小的相框Anchor然后看哪些相框能框住人再把重复框住同一个人的相框扔掉NMS。而DETR的做法是你先整体看一遍照片CNN提取特征然后像做阅读理解一样带着一系列“问题”可学习的物体查询Object Queries去审视这张照片的全局信息Transformer最终直接列出一个清单“爸爸坐在沙发左侧妈妈站在餐桌旁小狗趴在桌子下……”直接输出预测集合。下面我们拆解这个流程。2.1 整体架构全景DETR的架构图是其思想的完美诠释Backbone骨干网络一个标准的CNN如ResNet输入图像(3, H, W)输出一个低分辨率特征图(C, H/32, W/32)。这保留了图像的二维空间结构。Transformer Encoder编码器首先将上述特征图展平为一系列特征向量(H/32 * W/32, C)并加上位置编码Positional Encoding以保留空间信息。然后送入标准的Transformer Encoder。编码器的核心作用是利用自注意力机制让特征图中的每个“像素点”都能看到全局所有其他点从而整合全局上下文信息这对于理解物体间关系至关重要。Transformer Decoder解码器这是DETR的灵魂。解码器的输入包括两部分一是Encoder输出的、已融合全局信息的特征二是一组可学习的向量称为“物体查询”Object Queries其数量是固定的如100个。你可以把这100个查询理解为100个“空位”或“问题”每个查询都负责向Encoder特征“询问”“我这个位置应该对应什么物体”解码器通过交叉注意力机制让每个查询与Encoder的所有输出特征进行交互最终为每个查询输出一个“答案”嵌入向量。Prediction Heads预测头每个查询对应的解码器输出向量会分别通过两个简单的全连接网络FFN分类头预测该查询对应物体的类别包含一个“无物体”类。框回归头预测该物体的边界框中心坐标、高度和宽度通常归一化为相对图像的比例。最终模型直接输出N个如100个(类别边界框)预测元组。整个流程没有Anchor没有NMS。2.2 灵魂所在二分图匹配损失Hungarian Loss模型输出了100个预测但一张图的真实物体可能只有几个。如何让模型学会把预测分配给正确的真实物体并且让“空位”预测为“无物体”DETR使用了匈牙利算法Hungarian Algorithm来解决这个最优分配问题。在训练时对于每一张图片模型产生100个预测。我们有一个真实物体的集合数量M通常远小于100。为了匹配维度我们将真实集合填充上“无物体”∅标签使其也变为100个。我们计算一个匹配代价Matching Cost它综合考虑了类别预测的置信度和框的位置相似度通常用广义IoU损失和L1损失。使用匈牙利算法在100个预测和100个填充后的真实标签之间找到一个最优的一一匹配使得总匹配代价最小。这个匹配关系确定后我们只对匹配到真实物体非∅的预测计算最终的检测损失分类交叉熵框回归损失。这个机制是端到端训练的关键。它迫使每个“物体查询”在训练过程中学会“ specialize ”专业化有的查询可能专门负责检测远处的小物体有的查询专门检测大物体有的则倾向于保持“无物体”状态。模型学会了如何分配其有限的预测资源。2.3 与YOLO的核心范式对比为了更清晰我们用一个表格对比两种范式特性YOLO (以v5/v8为例)DETR核心思想基于Anchor的密集预测基于查询的集合预测先验知识需要手工设计或聚类Anchor尺寸无需Anchor使用可学习的Object Queries后处理必需NMS来去除冗余框无需NMS输出即最终结果输出大量冗余预测如25200个需过滤固定数量如100个的预测已去冗余全局建模依赖CNN骨干感受野有限通过FPN/SPP等结构增强原生使用Transformer自注意力强全局建模能力流程多步骤部分不可微纯端到端完全可微设计复杂度较高Anchor设计NMS调参概念简洁超参数少训练效率相对较快收敛稳定初期较慢需要更长epoch收敛小目标检测依赖多尺度特征融合如FPN、PANet原生版本效果较差后续变种改进3. 环境准备与快速体验DETR理论之后我们快速搭建一个环境直观感受DETR。这里我们使用PyTorch和Hugging Facetransformers库这是最便捷的方式。3.1 环境配置确保你的Python环境在3.7以上并安装主要依赖# 创建虚拟环境可选 conda create -n detr_demo python3.8 conda activate detr_demo # 安装PyTorch (请根据你的CUDA版本访问官网获取对应命令) # 例如对于CUDA 11.8 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装 transformers 和 timm (包含预训练模型) pip install transformers timm pip install opencv-python pillow matplotlib # 用于图像处理与可视化3.2 使用预训练模型进行预测下面是一个完整的脚本使用Hugging Face提供的DETR预训练模型对一张图片进行目标检测。# 文件detr_inference.py import torch from transformers import DetrImageProcessor, DetrForObjectDetection import cv2 from PIL import Image import matplotlib.pyplot as plt import matplotlib.patches as patches # 1. 加载处理器和模型 # 使用在COCO上预训练的resnet50-backbone DETR模型 processor DetrImageProcessor.from_pretrained(facebook/detr-resnet-50) model DetrForObjectDetection.from_pretrained(facebook/detr-resnet-50) model.eval() # 切换到评估模式 # 2. 准备输入图像 image_path your_image.jpg # 替换为你的图片路径 image Image.open(image_path).convert(RGB) # 3. 预处理 inputs processor(imagesimage, return_tensorspt) # 4. 前向传播 with torch.no_grad(): outputs model(**inputs) # 5. 后处理将模型输出转换为bbox、标签、分数 # 注意DETR的后处理仅包括将logits转换为概率和框的缩放没有NMS target_sizes torch.tensor([image.size[::-1]]) # (height, width) - (width, height) results processor.post_process_object_detection(outputs, target_sizestarget_sizes, threshold0.9)[0] # 6. 可视化结果 fig, ax plt.subplots(1, figsize(12, 9)) ax.imshow(image) for score, label, box in zip(results[scores], results[labels], results[boxes]): if score 0.85: # 可以设置一个可视化阈值非模型后处理 continue box box.tolist() label_name model.config.id2label[label.item()] confidence score.item() # 绘制矩形框 rect patches.Rectangle((box[0], box[1]), box[2]-box[0], box[3]-box[1], linewidth2, edgecolorred, facecolornone) ax.add_patch(rect) # 添加标签文本 plt.text(box[0], box[1]-5, f{label_name}: {confidence:.2f}, bboxdict(facecolorred, alpha0.5), fontsize10, colorwhite) plt.axis(off) plt.savefig(detr_result.jpg, bbox_inchestight, pad_inches0) plt.show() # 7. 打印检测到的物体 print(检测结果) for score, label, box in zip(results[scores], results[labels], results[boxes]): if score 0.85: print(f- {model.config.id2label[label.item()]} (置信度: {score:.3f}), 位置: {box.tolist()})关键点解释DetrImageProcessor负责将图像预处理为模型需要的格式归一化、调整大小等。DetrForObjectDetection封装好的DETR模型。processor.post_process_object_detection这是DETR唯一的后处理功能是将模型输出的归一化坐标0-1之间根据原始图像尺寸进行缩放并过滤掉低置信度threshold参数的预测。这里没有NMS因为模型本身已经输出去冗余的结果。可视化部分我们额外加了一个0.85的阈值来让图片更清晰模型本身的输出在threshold0.9时已经过滤过一次。运行这个脚本你就能看到DETR“端到端”检测的效果。你会发现对于中等和大物体其效果非常干净几乎没有重叠框。4. DETR的“阿喀琉斯之踵”与改进变种DETR概念优美但初代版本存在两个公认的缺点1. 训练收敛非常慢需要500epoch才能在COCO上达到好的效果2. 对小目标的检测性能较差。这催生了一系列优秀的改进工作理解这些变种你才能真正把握DETR生态的精髓。4.1 收敛慢与小目标差的原因分析收敛慢Transformer解码器中的交叉注意力模块是瓶颈。每个物体查询需要与编码器输出的所有特征点空间位置进行计算。初始时查询是随机初始化的与特征图的匹配关系非常模糊导致训练初期梯度更新效率低下。小目标差DETR的编码器输出特征图分辨率较低下采样32倍。一个小物体在特征图上可能只对应一两个像素点信息极易丢失。而Transformer的自注意力机制对所有位置平等对待缺乏对局部细节和多尺度特征的针对性利用而这正是检测小目标的关键。4.2 改进变种一览Deformable DETR, DETR-v2, RT-DETR等针对以上问题社区提出了多种改进方案形成了DETR家族。1Deformable DETR可变形DETR—— 解决收敛慢与小目标问题这是最具影响力的改进之一。其核心思想是将Transformer中全局的、密集的注意力改为局部的、稀疏的、可学习的注意力。可变形注意力Deformable Attention每个查询不再关注所有特征点而是预测一小部分如4个关键的参考点并只在这些参考点周围进行采样和注意力计算。这极大地减少了计算量并让查询能够更精准地聚焦到可能包含物体的区域。多尺度特征融合Deformable DETR直接将CNN骨干网络中的多尺度特征图如C3, C4, C5都送入Transformer让不同尺度的查询可以关注不同分辨率的特征层显著提升了对小目标的检测能力。效果训练周期缩短了10倍50 epoch即可达到很好效果且在小目标检测上性能大幅提升。2DETR-v2 (DAB-DETR, DN-DETR, DINO等) —— 改进查询设计与训练这一系列工作主要优化“物体查询”的设计和训练稳定性。DAB-DETR将查询显式地表示为4D锚框x, y, w, h而不仅仅是向量。这样查询在解码器每一层迭代更新时其空间位置意义更明确加速收敛。DN-DETR去噪训练在训练时向真实标注框加入噪声并让模型学习如何“去噪”还原。这相当于为模型提供了“正样本-噪声样本”的对比学习信号极大地稳定了二分图匹配过程加速收敛。DINO集大成者融合了对比去噪、混合查询选择等策略在多个基准上达到了SOTA。3RT-DETR —— 面向实时性的优化来自百度的RT-DETR旨在证明DETR范式也可以做到实时。其核心创新是混合编码器和IoU感知查询选择。混合编码器设计了一个高效的编码器在保持精度的同时大幅减少计算量。IoU感知查询选择在解码器前根据编码器特征动态选择最有可能包含物体的查询而不是使用所有固定查询提升推理效率。效果在速度和精度上均超越了同规模的YOLO模型证明了端到端检测器在实时场景的潜力。5. 动手训练一个简单的DETR模型理解了原理和变种我们尝试在自定义小数据集上微调Fine-tune一个DETR模型。这里以facebook/detr-resnet-50为例使用一个简单的玩具数据集例如只包含“猫”和“狗”两类。5.1 准备自定义数据集我们假设数据已整理为COCO格式的annotations.json并放在data/coco/目录下。COCO格式是目标检测的通用格式。# 文件dataset.py from torch.utils.data import Dataset from PIL import Image import json import os class CocoDetection(Dataset): def __init__(self, img_folder, ann_file, transformsNone): self.img_folder img_folder with open(ann_file, r) as f: self.coco json.load(f) self.transforms transforms # 创建图像id到标注的映射 self.img_id_to_anns {} for ann in self.coco[annotations]: img_id ann[image_id] if img_id not in self.img_id_to_anns: self.img_id_to_anns[img_id] [] self.img_id_to_anns[img_id].append(ann) # 图像信息列表 self.imgs self.coco[images] def __getitem__(self, idx): img_info self.imgs[idx] img_path os.path.join(self.img_folder, img_info[file_name]) img Image.open(img_path).convert(RGB) img_id img_info[id] anns self.img_id_to_anns.get(img_id, []) # 准备标注boxes (xywh格式) 和 labels boxes [] labels [] for ann in anns: x, y, w, h ann[bbox] # COCO bbox格式是 [x_top_left, y_top_left, width, height] boxes.append([x, y, xw, yh]) # 转换为 (x_min, y_min, x_max, y_max) labels.append(ann[category_id]) target {} target[boxes] torch.as_tensor(boxes, dtypetorch.float32) target[labels] torch.as_tensor(labels, dtypetorch.int64) target[image_id] torch.as_tensor([img_id]) if self.transforms is not None: img, target self.transforms(img, target) return img, target def __len__(self): return len(self.imgs)5.2 定义数据增强与加载器# 文件train.py (部分) import torch from torch.utils.data import DataLoader import torchvision.transforms as T from transformers import DetrImageProcessor # 1. 定义数据增强训练和验证不同 # DETR官方使用RandomResize RandomHorizontalFlip等 def get_transform(train): transforms [] transforms.append(T.ToTensor()) # 转换为Tensor if train: transforms.append(T.RandomHorizontalFlip(0.5)) # 可以添加更多增强但注意DETR对尺寸敏感通常固定到最小边800像素 return T.Compose(transforms) # 2. 初始化处理器包含归一化 processor DetrImageProcessor.from_pretrained(facebook/detr-resnet-50) # 3. 自定义collate_fn因为图像尺寸不一需要padding def collate_fn(batch): pixel_values [item[0] for item in batch] targets [item[1] for item in batch] # 使用processor进行padding和归一化 encoding processor.pad(pixel_values, return_tensorspt) return encoding, targets # 4. 创建数据集和数据加载器 train_dataset CocoDetection(img_folderdata/coco/train2017, ann_filedata/coco/annotations/instances_train2017.json, transformsget_transform(trainTrue)) val_dataset CocoDetection(img_folderdata/coco/val2017, ann_filedata/coco/annotations/instances_val2017.json, transformsget_transform(trainFalse)) train_dataloader DataLoader(train_dataset, batch_size2, shuffleTrue, collate_fncollate_fn) val_dataloader DataLoader(val_dataset, batch_size1, shuffleFalse, collate_fncollate_fn)5.3 配置模型与训练循环# 文件train.py (续) from transformers import DetrForObjectDetection import torch.optim as optim # 1. 加载模型指定自定义类别数COCO是91自定义数据集需修改 model DetrForObjectDetection.from_pretrained( facebook/detr-resnet-50, num_labels3, # 假设2个物体类 1个背景类实际DETR内部已处理 ignore_mismatched_sizesTrue # 忽略分类头尺寸不匹配 ) # 2. 将模型移至GPU device torch.device(cuda) if torch.cuda.is_available() else torch.device(cpu) model.to(device) # 3. 定义优化器和学习率调度器 param_dicts [ {params: [p for n, p in model.named_parameters() if backbone not in n and p.requires_grad]}, {params: [p for n, p in model.named_parameters() if backbone in n and p.requires_grad], lr: 1e-5}, # 骨干网络使用更小的学习率 ] optimizer optim.AdamW(param_dicts, lr1e-4, weight_decay1e-4) lr_scheduler optim.lr_scheduler.StepLR(optimizer, step_size30, gamma0.1) # 4. 训练循环简化版 num_epochs 100 for epoch in range(num_epochs): model.train() for batch_idx, (pixel_values, targets) in enumerate(train_dataloader): pixel_values pixel_values.to(device) # 将targets也移到device并处理为模型需要的格式 # 注意这里需要将targets中的‘boxes’和‘labels’提取出来构造为列表 tgt [] for t in targets: tgt.append({k: v.to(device) for k, v in t.items()}) outputs model(pixel_valuespixel_values[pixel_values], pixel_maskpixel_values[pixel_mask], labelstgt) loss outputs.loss loss_dict outputs.loss_dict optimizer.zero_grad() loss.backward() # 可选梯度裁剪防止训练不稳定 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm0.1) optimizer.step() if batch_idx % 50 0: print(fEpoch [{epoch1}/{num_epochs}], Step [{batch_idx}/{len(train_dataloader)}], Loss: {loss.item():.4f}) lr_scheduler.step() # 每个epoch结束后在验证集上评估略 # ... # 5. 保存模型 torch.save(model.state_dict(), detr_finetuned.pth) print(训练完成模型已保存。)关键提醒DETR训练对超参数敏感且需要较长epoch。上述代码是一个极简示例真实训练需要更完善的数据增强、损失权重调整、验证和日志记录。建议初学者先在COCO等标准数据集上跑通流程再迁移到自定义数据。6. 常见问题与排查思路在实际使用和训练DETR时你可能会遇到以下典型问题问题现象可能原因排查方式解决方案训练Loss为NaN或爆炸学习率过高梯度爆炸数据标注有误如框坐标超出图像。1. 检查初始几个batch的loss变化。2. 检查数据加载器打印几个样本的boxes范围。3. 使用梯度裁剪。1. 大幅降低学习率如从1e-4降至1e-5。2. 确保数据预处理中坐标被正确归一化或限制在[0,1]。3. 添加clip_grad_norm_。模型预测不出任何框训练不收敛类别数配置错误后处理阈值过高。1. 在验证集上评估看mAP是否接近0。2. 检查model.config.num_labels是否与数据集类别数匹配含背景。3. 降低post_process_object_detection中的threshold参数。1. 检查数据标注格式是否正确COCO格式的bbox是[x,y,w,h]。2. 确保正确加载了预训练权重分类头随机初始化需更长时间训练。3. 从更简单的数据集或少量数据开始调试。训练速度极慢批次大小Batch Size太小图像分辨率过高未使用混合精度训练。1. 监控GPU利用率。2. 查看单步迭代时间。1. 在GPU内存允许下增大batch size。2. 降低输入图像尺寸如最小边从800降至600。3. 使用torch.cuda.amp进行自动混合精度训练。小目标检测效果差使用了原生DETR特征图分辨率低。1. 可视化特征图看小目标区域是否有响应。2. 与Deformable DETR等变种对比。1.切换到Deformable DETR或RT-DETR这是最有效的方案。2. 尝试使用更大的骨干网络如ResNet-101或更高分辨率的输入。内存不足OOM图像分辨率过高batch size过大Transformer层数/头数过多。1. 使用nvidia-smi监控GPU内存。2. 尝试更小的模型如detr-resnet-50。1. 减小输入图像尺寸。2. 减小batch size可累积梯度。3. 使用梯度检查点Gradient Checkpointing。评估时mAP低于预期训练epoch不足数据增强不合适验证集后处理参数未调优。1. 绘制训练loss曲线看是否已收敛。2. 检查验证集上的预测可视化结果。1. DETR需要更长epoch训练原生版需数百epoch。2. 调整验证时的threshold和target_sizes。3. 确保验证时模型处于eval()模式。7. 最佳实践与工程建议将DETR应用于实际项目除了跑通代码还需要考虑以下工程细节模型选型指南追求最新精度选择DINO或DINOv2它们集成了多种训练技巧在标准基准上表现最好。追求训练/推理速度选择Deformable DETR或RT-DETR。RT-DETR尤其适合对实时性有要求的部署场景。教学与研究从原生DETR开始理解最基础的概念。工业部署考虑模型大小、推理速度、硬件支持如TensorRT, ONNX导出。RT-DETR和经过优化的Deformable DETR是更稳妥的选择。数据准备与增强标注格式统一使用COCO格式这是大多数代码库支持的标准。数据增强对于DETR随机裁剪需小心处理框、随机缩放、色彩抖动是有效的。避免过度改变宽高比的形变因为二分图匹配对空间位置敏感。类别均衡严重的类别不均衡会影响训练稳定性可以考虑使用Focal Loss或对稀有类别过采样。训练技巧学习率与预热使用线性学习率预热Warmup对于Transformer模型至关重要可以防止训练初期的不稳定。通常预热10个epoch。骨干网络冻结在数据量较小的情况下可以先冻结骨干网络Backbone训练几轮再解冻微调。损失权重DETR的总损失是分类损失、L1框损失和GIoU损失的加权和。默认权重在论文中给出但如果你的任务中框的精度更重要可以适当调高框回归损失的权重。早停Early Stopping根据验证集mAP进行早停避免过拟合。部署与优化模型导出使用torch.onnx.export将PyTorch模型导出为ONNX格式便于在不同推理引擎上部署。注意处理模型中的动态尺寸如pixel_mask。TensorRT加速对于NVIDIA GPU使用TensorRT可以极大提升推理速度。需要为ONNX模型生成TensorRT引擎。量化考虑使用动态量化或训练后静态量化来减小模型体积、提升推理速度对精度影响较小。与YOLO的协同不要非此即彼YOLO和DETR是两种优秀但不同的范式。YOLO在高帧率、资源受限的边缘设备上经过高度优化生态成熟。DETR在需要强全局推理、避免NMS调参、追求简洁架构的场景下更有优势。混合思路你可以借鉴DETR的思想来改进YOLO例如为YOLO设计更好的标签分配策略如SimOTA或者尝试将Transformer模块融入YOLO的Neck或Head中。理解DETR不仅仅是学会使用另一个目标检测模型更是接受一种全新的、端到端的视觉问题建模思想。它剥离了传统检测中许多启发式、手工设计的部分试图用更统一的架构和更纯粹的学习方式解决问题。虽然其变种仍在不断演进以弥补最初的不足但这条技术路线已经深刻影响了目标检测乃至其他视觉任务如分割、姿态估计的研究方向。下次当你面对YOLO调参的繁琐时不妨想一想这个问题是否可以用一组可学习的查询和全局注意力来更优雅地解决这或许就是DETR带给我们的最大启发。