🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度
在实际计算机视觉项目或学术研究中,选择目标检测模型框架是一个关键的起点。YOLO系列以其极致的速度和工程友好性,长期占据着工业部署和实时检测场景的主流地位。然而,以DETR为代表,基于Transformer架构的检测器,凭借其简洁的端到端设计、无需手工设计锚框(Anchor)和非极大值抑制(NMS)后处理等特性,正成为研究热点和许多新论文的基石。对于希望在2024年及之后进行前沿探索或撰写高质量论文的研究者和开发者而言,深入理解DETR不仅是为了“水论文”,更是为了掌握一种可能定义未来检测范式的新思路。
本文旨在提供一个从零开始的DETR(Detection Transformer)实战教程。我们将绕过复杂的数学推导,聚焦于如何亲手搭建、训练并理解一个DETR模型。你将了解到DETR的核心工作机制,准备好所需的环境和数据集,完成模型训练的关键步骤,并学会如何解读训练过程中的现象与结果。最终,你将获得一个能够对自定义数据集进行目标检测的完整流程,并理解在学术探索与工程落地中,DETR与YOLO各自的优劣与选型考量。
1. 理解DETR:为什么说它“颠覆”了传统目标检测?
在动手写代码之前,必须厘清DETR的设计哲学。传统目标检测模型,无论是单阶段的YOLO、SSD,还是两阶段的Faster R-CNN,其流程都包含一些“人为设计”的组件:预先定义好不同尺度和长宽比的锚框,模型负责预测这些锚框的偏移量和类别;最后,通过非极大值抑制(NMS)来去除大量重叠的冗余预测框。这些组件有效,但也引入了超参数(如锚框尺寸、NMS阈值)和复杂的后处理逻辑。
1.1 DETR的核心思想:将检测视为集合预测问题
DETR(DEtection TRansformer)提出了一种截然不同的范式。它摒弃了锚框和NMS,将目标检测直接建模为一个**集合预测(Set Prediction)**问题。模型一次性预测一个固定大小的无序集合(比如100个预测结果),每个结果包含一个边界框(bbox)和一个类别标签。模型的任务是学习将这个预测集合与图像中真实物体的集合进行最优匹配。
这个“匹配”过程是理解DETR的关键。在训练时,DETR使用匈牙利算法(Hungarian Algorithm)来为预测的100个结果和真实的N个目标(N通常远小于100)计算一个最优的双边匹配,使得整体的匹配损失最小。匹配完成后,只对匹配上的预测结果计算损失(如框的位置损失和分类损失),未匹配上的预测则被鼓励预测为“无物体”(背景)类别。
1.2 DETR的三大核心组件
DETR的架构可以清晰地分为三个部分:
- CNN骨干网络(Backbone): 通常是一个预训练好的卷积神经网络(如ResNet),负责从输入图像中提取二维特征图。这和我们熟悉的任何CNN检测器(如YOLO用DarkNet/CSPNet)的第一步是一样的。
- Transformer编码器-解码器(Encoder-Decoder): 这是DETR的灵魂。
- 编码器(Encoder): 接收CNN骨干网络提取的特征图,并加入位置编码(Positional Encoding)。通过自注意力(Self-Attention)机制,编码器让特征图中的每个像素都能“看到”全局上下文信息,从而更好地理解物体之间的关系和场景布局。
- 解码器(Decoder): 这是实现集合预测的关键。解码器输入一组固定数量的“对象查询(Object Queries)”(例如100个可学习的向量)。这些查询向量在解码器中与编码器输出的特征进行交互(通过交叉注意力,Cross-Attention),每个查询最终“关注”到图像中某个特定的区域或物体,并输出一个对应的特征表示。
- 预测前馈网络(FFN): 一个简单的前馈神经网络,接收解码器输出的每个对象查询的特征,并行地预测其对应的边界框(中心点坐标、宽高)和类别概率。
# 一个高度简化的DETR前向过程伪代码,帮助理解数据流 def forward_detr(image): # 1. 骨干网络提取特征 features = backbone(image) # 形状: [batch, channels, H, W] # 2. 将特征图展平并加入位置编码,送入Transformer编码器 # 编码器进行全局上下文建模 encoded_features = transformer_encoder(features, positional_encoding) # 3. 解码器使用可学习的对象查询与编码特征交互 # object_queries 是一个可学习的参数,形状: [num_queries, d_model] decoder_output = transformer_decoder(object_queries, encoded_features) # 4. 预测头并行输出结果 # 每个查询输出一个预测 class_logits = class_head(decoder_output) # 形状: [batch, num_queries, num_classes+1] bbox_coords = bbox_head(decoder_output) # 形状: [batch, num_queries, 4] (cx, cy, w, h) return class_logits, bbox_coords1.3 DETR的优势与挑战
优势:
- 设计简洁: 端到端,无需手工设计锚框和NMS, pipeline 更干净。
- 全局推理能力: Transformer的自注意力机制使其能建模图像中所有物体间的长程依赖关系,对于理解复杂场景、处理遮挡物体有潜在优势。
- 易于扩展: 由于其集合预测的特性,可以相对容易地扩展到其他视觉任务,如全景分割(DETR的扩展模型Mask2Former等)。
挑战(也是早期被诟病的地方):
- 训练收敛慢: 相比YOLO,DETR需要更长的训练周期才能达到良好性能。
- 小物体检测性能相对较弱: Transformer在处理高分辨率特征图时计算开销大,早期DETR使用较低分辨率的特征图,导致小物体信息丢失。
- 计算资源要求高: Transformer的自注意力计算复杂度与序列长度平方成正比,对显存和算力要求更高。
后续的改进工作(如Deformable DETR、DINO-DETR)很大程度上针对这些挑战进行了优化,显著提升了收敛速度和检测性能,尤其是对小物体的检测。但原始的DETR仍然是理解这一系列工作的基石。
2. 环境准备与依赖配置
我们将使用PyTorch和Facebook Research官方开源的DETR实现进行实验。这个实现代码清晰,非常适合学习和研究。
2.1 硬件与软件环境要求
- 操作系统: Linux (Ubuntu 18.04/20.04/22.04) 或 Windows (WSL2推荐)。macOS (M系列芯片) 也可运行,但需注意PyTorch的ARM版本。
- Python: 3.8 或 3.9。建议使用conda或venv创建独立的虚拟环境。
- CUDA(GPU训练必需): CUDA 11.3 或 11.7,与你的PyTorch版本匹配。确保
nvidia-smi命令能正确显示GPU信息。 - GPU: 至少8GB显存(如NVIDIA RTX 3070/3080, Tesla V100等)。训练DETR在COCO数据集上,batch size为2时,显存占用约11GB。如果显存不足,可以减小
batch_size或使用梯度累积。
2.2 创建虚拟环境并安装依赖
强烈建议使用虚拟环境来管理依赖,避免与系统或其他项目的包冲突。
# 1. 创建并激活conda虚拟环境 (以Python 3.8为例) conda create -n detr-tutorial python=3.8 conda activate detr-tutorial # 2. 安装与CUDA版本对应的PyTorch # 访问 https://pytorch.org/get-started/locally/ 获取最新安装命令 # 例如,对于CUDA 11.7: pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117 # 3. 安装DETR所需的其他核心依赖 pip install cython scipy matplotlib opencv-python-headless pycocotools # 4. 克隆官方DETR仓库 git clone https://github.com/facebookresearch/detr.git cd detr # 5. 以可编辑模式安装DETR包本身及其依赖 pip install -e .安装完成后,可以通过一个简单的导入测试来验证环境:
import torch import torchvision import detr from detr import build_model print(f"PyTorch version: {torch.__version__}") print(f"Torchvision version: {torchvision.__version__}") print(f"CUDA available: {torch.cuda.is_available()}") # 如果CUDA可用,会打印出GPU型号 if torch.cuda.is_available(): print(f"GPU: {torch.cuda.get_device_name(0)}")2.3 准备数据集:COCO 2017
为了复现经典实验并与主流研究对比,我们使用COCO(Common Objects in Context)2017数据集。你也可以后续将其替换为自己的数据集。
下载数据集: 前往 COCO官网 ,下载以下文件:
train2017.zip(训练集图像,~18GB)val2017.zip(验证集图像,~1GB)annotations_trainval2017.zip(训练和验证的标注,~241MB)
组织目录结构: 解压后,将文件组织成如下结构。DETR的代码默认从这个结构读取数据。
/path/to/your/coco/ ├── annotations/ │ ├── instances_train2017.json │ └── instances_val2017.json ├── train2017/ │ ├── 000000000009.jpg │ ├── 000000000025.jpg │ └── ... └── val2017/ ├── 000000000139.jpg ├── 000000000285.jpg └── ...注意:数据集路径
/path/to/your/coco/将在后续的训练命令和配置中用到,请替换为你的实际路径。
3. 从零开始:训练你的第一个DETR模型
现在,我们将使用官方代码在COCO数据集上训练一个基础的DETR模型(ResNet-50骨干网络)。这个过程会让你熟悉DETR的训练流程、关键参数和监控方法。
3.1 理解训练脚本与关键参数
DETR仓库的主训练脚本是main.py。我们不会直接修改它,而是通过命令行参数来控制训练。以下是一些最关键的参数:
| 参数 | 说明 | 典型值/示例 | 影响与注意事项 |
|---|---|---|---|
--coco_path | COCO数据集根目录的路径。 | /home/user/data/coco | 必须正确设置,否则找不到数据。 |
--batch_size | 每个GPU的批处理大小。 | 2 | 受GPU显存限制。RTX 3090 (24GB) 可设为4。值越大,训练越稳定,但显存占用越高。 |
--epochs | 训练的总轮数。 | 300 | DETR需要较长轮数收敛。论文中训练了300个epoch。 |
--lr | 初始学习率。 | 1e-4 | 对于AdamW优化器,这是一个常用的起点。 |
--lr_backbone | 骨干网络(ResNet)的学习率。 | 1e-5 | 通常设得比主学习率小,因为骨干是预训练的,微调即可。 |
--weight_decay | 权重衰减(L2正则化)。 | 1e-4 | 帮助防止过拟合。 |
--num_queries | 对象查询的数量(即预测的固定集合大小)。 | 100 | 论文默认值。必须大于图像中可能的最大物体数。 |
--output_dir | 模型检查点、日志的输出目录。 | outputs/ | 训练过程中会自动创建。 |
--resume | 从某个检查点恢复训练。 | checkpoint.pth | 用于中断后继续训练或微调。 |
3.2 启动训练命令
在detr目录下,执行以下命令开始训练。请务必将--coco_path替换为你自己的数据集路径。
python main.py \ --coco_path /path/to/your/coco \ --batch_size 2 \ --epochs 300 \ --lr 1e-4 \ --lr_backbone 1e-5 \ --weight_decay 1e-4 \ --num_queries 100 \ --output_dir outputs/detr_r50_300epoch命令解释:
- 我们使用单卡(默认)进行训练。
- 指定了COCO数据集的路径。
- 批大小设为2,这是大多数8GB以上显存GPU的保守安全值。
- 计划训练300个epoch。
- 学习率、骨干学习率和权重衰减使用论文推荐的默认值。
- 输出目录为
outputs/detr_r50_300epoch,所有日志和模型权重将保存在这里。
3.3 训练过程监控与解读
启动训练后,终端会打印日志。理解这些日志对于调试和评估训练状态至关重要。
Epoch: [0] [ 0/73815] eta: 10 days, 23:06:41 lr: 0.000000 loss: 13.0342 (13.0342) loss_ce: 4.5695 (4.5695) loss_bbox: 0.0000 (0.0000) loss_giou: 0.0000 (0.0000) loss_ce_unscaled: 4.5695 (4.5695) loss_bbox_unscaled: 0.0000 (0.0000) loss_giou_unscaled: 0.0000 (0.0000) cardinality_error_unscaled: 90.0000 (90.0000) loss_ce_0_unscaled: 4.5695 (4.5695) loss_bbox_0_unscaled: 0.0000 (0.0000) loss_giou_0_unscaled: 0.0000 (0.0000) cardinality_error_0_unscaled: 90.0000 (90.0000) time: 1.3128 data: 0.8734 max mem: 7423Epoch: [0]: 当前是第0个epoch。[ 0/73815]: 当前epoch内已处理的批次数/总批次数。eta: 预计剩余训练时间(初期估计不准)。lr: 当前学习率。loss:总损失,这是需要关注的核心指标,它会随着训练逐渐下降。loss_ce: 分类损失(交叉熵)。loss_bbox: 边界框L1损失。loss_giou: 广义IoU损失,用于衡量框的重合度。cardinality_error_unscaled: 基数误差,衡量预测的“有物体”查询数量与真实物体数量的差异。初期这个值会很大(接近num_queries),随着训练进行,模型学会将大部分查询预测为“背景”,此误差会下降。time: 处理当前批次的时间。max mem: 当前最大显存占用(MB)。
训练初期正常现象:
loss值很高(>10),cardinality_error接近100(num_queries值)。这是因为模型尚未学会区分物体和背景。- 几十个epoch后,
loss应开始显著下降,cardinality_error也会快速减小。 - 训练约50-100个epoch后,模型开始能预测出一些合理的框。
在output_dir中会生成:
checkpoint.pth: 最新的检查点。checkpointXX.pth: 每隔一定epoch保存的检查点(如每50个epoch)。log.txt: 完整的训练日志。args.txt: 训练时使用的所有参数。
3.4 使用预训练权重进行微调
从头开始训练300个epoch非常耗时(在单卡V100上可能需要约6天)。为了快速验证和实验,强烈建议使用官方提供的在COCO上预训练好的权重进行微调(Fine-tuning)或直接评估。
- 下载预训练模型: 从DETR的 官方Model Zoo 下载
detr-r50的权重文件(例如detr-r50-e632da11.pth)。 - 恢复训练或评估:
- 恢复训练:如果你想在预训练基础上继续训练(例如,用更小的学习率在自己的数据集上微调),可以使用
--resume参数。
python main.py \ --coco_path /path/to/your/coco \ --batch_size 2 \ --epochs 350 \ # 假设你想再训练50个epoch --lr 1e-5 \ # 微调时学习率通常更小 --lr_backbone 1e-6 \ --resume /path/to/detr-r50-e632da11.pth \ --output_dir outputs/detr_r50_finetune- 仅评估:如果你只想测试预训练模型的性能,使用
--eval和--resume参数。
python main.py \ --coco_path /path/to/your/coco \ --batch_size 1 \ --resume /path/to/detr-r50-e632da11.pth \ --eval \ --output_dir eval_output - 恢复训练:如果你想在预训练基础上继续训练(例如,用更小的学习率在自己的数据集上微调),可以使用
4. 模型评估与结果可视化
训练完成后,我们需要定量和定性地评估模型性能。
4.1 在COCO验证集上进行定量评估
使用上面提到的--eval命令,模型会在COCO val2017数据集上运行,并计算标准的COCO评估指标:AP(平均精度)、AP50(IoU阈值为0.5时的AP)、AP75以及AP_S,AP_M,AP_L(小、中、大物体的AP)。
评估结束后,终端会输出类似以下结果:
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.421 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.621 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.441 ...对于DETR-R50训练300个epoch,AP大约在0.42左右。这是衡量模型检测精度的核心指标,可以与其他模型(如YOLOv5, Faster R-CNN)进行对比。
4.2 预测与可视化单张图片
理解模型预测结果的最佳方式是可视化。DETR仓库提供了demo.py脚本。我们需要准备一张图片和一个训练好的模型。
- 准备图片和模型: 将你想测试的图片(如
test.jpg)放在项目根目录,并确保有模型权重文件(如预训练的detr-r50-e632da11.pth)。 - 运行可视化脚本:
python demo.py \ --image_path ./test.jpg \ --resume /path/to/detr-r50-e632da11.pth \ --output_dir ./visualization \ --device cuda # 或 cpu - 解读输出:
- 脚本会在
--output_dir目录下生成一张名为test.jpg(或带后缀)的新图片,上面绘制了预测的边界框和类别标签。 - 同时,终端会打印每个预测框的置信度、类别和坐标。
- 注意观察DETR的特点: 预测框的数量是固定的(100个),但其中大部分置信度极低(背景)。模型通常只输出少数几个高置信度的预测。没有NMS后处理,你几乎看不到高度重叠的冗余框。
- 脚本会在
4.3 理解预测输出结构
如果你想在自己的代码中调用训练好的DETR模型,需要理解其输出格式。以下是一个示例:
import torch from detr import build_model from PIL import Image import torchvision.transforms as T # 1. 加载模型 model, criterion, postprocessors = build_model(args) # args需要包含num_classes等参数 checkpoint = torch.load('detr-r50-e632da11.pth', map_location='cpu') model.load_state_dict(checkpoint['model']) model.eval() # 2. 预处理图像 transform = T.Compose([ T.Resize(800), # 将短边缩放到800像素 T.ToTensor(), T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) image = Image.open('test.jpg').convert('RGB') img_tensor = transform(image).unsqueeze(0) # 增加batch维度 # 3. 前向传播 with torch.no_grad(): outputs = model(img_tensor) # 4. 后处理(将模型输出转换为可读的框、分数、标签) # outputs 是一个字典,包含 'pred_logits' 和 'pred_boxes' probas = outputs['pred_logits'].softmax(-1)[0, :, :-1] # 去掉背景类,形状 [100, num_classes] keep = probas.max(-1).values > 0.7 # 设置一个置信度阈值,例如0.7 # 转换框格式为 [x_center, y_center, width, height] (归一化坐标) 到 [x0, y0, x1, y1] (像素坐标) bboxes_scaled = outputs['pred_boxes'][0, keep] # 根据阈值过滤 # ... 需要根据原图尺寸进行缩放 ... print(f"预测了 {keep.sum().item()} 个物体") print(f"类别概率: {probas[keep]}") print(f"边界框: {bboxes_scaled}")5. 常见问题、排查与调优指南
在训练和使用DETR过程中,你可能会遇到以下典型问题。
5.1 训练过程中的常见问题
| 问题现象 | 可能原因 | 检查与解决方案 |
|---|---|---|
| Loss不下降,Cardinality Error始终很高 | 学习率设置不当;数据路径错误导致模型只看到背景或无效数据;Batch Size太小。 | 1. 检查--coco_path是否正确,确保annotations和images子目录存在且有权访问。2. 尝试使用预训练权重微调,确认模型架构正确。 3. 适当增大 batch_size(在显存允许范围内),如从2调到4。 |
| 训练中途出现NaN损失 | 梯度爆炸;数据中存在损坏的标注(如坐标超出图像范围)。 | 1. 使用梯度裁剪(--clip_max_norm参数,默认值为0.1)。2. 检查数据集的标注文件,可以使用COCO API验证标注的合法性。 |
| 显存不足(CUDA out of memory) | batch_size太大;图像分辨率太高(DETR默认短边缩放到800像素)。 | 1. 减小--batch_size。2. 减小输入图像尺寸(修改 main.py中transform的Resize参数,但可能影响性能,尤其是小物体)。3. 使用梯度累积:通过多次前向传播累积梯度再更新,模拟大batch效果。这需要修改训练循环代码。 |
| 训练速度非常慢 | 没有使用GPU;数据加载是瓶颈;Transformer计算开销大。 | 1. 确认torch.cuda.is_available()为True。2. 增加数据加载的worker数量( --num_workers参数)。3. 这是DETR的特性,考虑使用后续改进模型如Deformable DETR。 |
5.2 模型性能调优建议
- 学习率与优化器: DETR使用AdamW优化器,对学习率比较敏感。如果从头训练,
1e-4是一个安全的起点。如果微调,建议使用更小的学习率(如5e-5)。可以使用学习率预热(Warmup)和余弦退火(Cosine Annealing)策略,原代码已内置。 - 数据增强: 默认的数据增强包括随机裁剪、缩放、水平翻转等。可以尝试更强或更适合你数据集的增强策略,但要注意COCO数据集本身已足够多样。
- 骨干网络: 将ResNet-50替换为更深的ResNet-101或ResNet-152,通常能提升性能,但会增加计算量和训练时间。也可以尝试更高效的骨干如Swin Transformer。
- 对象查询数量: 默认100个查询对于COCO数据集是足够的。如果你的数据集中单张图片物体数量极少(<10)或极多(>100),可以适当减少或增加
--num_queries。 - 训练周期: DETR需要长时间训练。不要因为前50个epoch loss下降慢而提前停止。至少观察150个epoch后的验证集指标趋势。
5.3 在自己的数据集上训练DETR
这是将DETR应用于实际研究或项目的关键一步。你需要将自己的数据集转换为COCO格式。
- 标注格式转换: 确保你的标注文件为JSON格式,并遵循COCO标注的结构。主要包含
images,annotations,categories三个数组。网上有大量工具可以将VOC、Labelme等格式转换为COCO格式。 - 修改类别数: DETR模型的分类头输出维度是
num_classes + 1(加1是背景类)。你需要修改代码中的num_classes参数。在main.py中,它通过args.num_classes传递。在构建数据集时,也需要传入正确的类别数。 - 调整训练配置: 对于较小的自定义数据集,需要大幅减少训练epoch,并可能使用更强的数据增强和更小的学习率来防止过拟合。
一个简化的自定义数据集训练命令框架如下:
python main.py \ --dataset_file \"custom\" \ # 指定自定义数据集 --coco_path /path/to/your/custom_coco_format_dataset \ --num_classes 10 \ # 你的实际类别数,例如10 --epochs 100 \ --lr 5e-5 \ --lr_backbone 5e-6 \ --batch_size 4 \ --output_dir outputs/detr_custom你需要根据datasets目录下的代码结构,实现一个支持custom数据集的类。
6. DETR vs. YOLO:选型思考与最佳实践
回到最初的问题:2024年,目标检测“水论文”或做项目,选YOLO还是DETR?答案取决于你的具体目标。
6.1 学术研究(“水论文”或前沿探索)
选择DETR(或其变体)的理由:
- 新颖性: Transformer-based检测器仍是顶会(CVPR, ICCV, ECCV)的热点。基于DETR进行改进(如设计新的查询、注意力机制、损失函数)更容易产生创新点。
- 端到端魅力: 去除手工组件(NMS, Anchor)本身就是一个干净、优雅的卖点,理论上有研究价值。
- 扩展性: DETR的框架更容易扩展到视频检测、全景分割、指代分割等多模态、多任务场景。
- 强大的基线: 许多SOTA模型(如Deformable DETR, DINO, Mask2Former)都以DETR为基线,理解它是深入该领域的前提。
注意事项:
- 计算成本: 需要更强大的GPU和更长的训练时间,对实验周期有要求。
- 收敛性: 需要精心调参,否则可能收敛缓慢或性能不佳。
- 小物体: 原始DETR对小物体检测较差,需结合多尺度特征或可变形注意力等改进。
6.2 工业部署与实时应用
选择YOLO(尤其是YOLOv5/v8/v10)的理由:
- 极致速度: YOLO系列在速度和精度平衡上做到了极致,非常适合实时视频流处理、嵌入式设备等场景。
- 工程成熟度: 生态完善,部署工具链(TensorRT, OpenVINO, ONNX等)支持好,社区资源丰富,踩坑解决方案多。
- 易于使用: 提供简洁的API和大量预训练模型,快速上手和验证概念(POC)成本极低。
- 资源友好: 相比DETR,在同等精度下通常需要更少的计算资源和内存。
注意事项:
- 创新天花板: 基于Anchor和NMS的范式相对成熟,做出根本性创新的难度较大。
- 后处理依赖: NMS是一个不可微的后处理步骤,在端到端优化中存在理论上的局限。
6.3 最佳实践与混合策略
在实际项目中,不必非此即彼:
- 研究起步: 从YOLO开始,快速建立基线,理解目标检测的基本流程和评估指标。然后深入研究DETR,理解其原理和实现,尝试复现并改进。
- 项目选型:
- 需求为速度: 毫秒级响应、终端设备 ->YOLO。
- 需求为精度: 复杂场景、遮挡严重、对NMS敏感的任务 -> 考虑DETR或其改进版(如Deformable DETR)。
- 需求为新颖性: 学术论文、需要架构创新 ->DETR系列。
- 技术融合: 关注最新的研究趋势。例如,YOLO系列也在吸收Transformer的优点(如YOLOS),而DETR的改进版(如RT-DETR)也在追求实时性。最终界限可能变得模糊。
无论选择哪条路径,扎实的数据准备、严谨的实验设计、深入的结果分析,都比单纯选择某个模型更重要。通过本教程,你不仅应该能跑通DETR的训练和评估流程,更应理解其设计思想、优势与局限,从而做出更明智的技术决策。下一步,可以探索Deformable DETR如何解决原始DETR收敛慢和小物体检测差的问题,这是深入该领域最自然的延伸。
🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度