DETR: 使用Transformer的端到端目标检测
支持乌克兰
DETR(Detection Transformer)的PyTorch训练代码和预训练模型。我们用Transformer替代了完整的手工设计的目标检测流水线,并且在使用ResNet-50的情况下达到了与Faster R-CNN相匹配的性能,在COCO数据集上获得了42%的平均精度(AP),并且只用了后者一半的计算量(FLOPs),参数数量相同。推理过程仅需50行PyTorch代码。
DETR是什么?
与传统的计算机视觉技术不同,DETR将目标检测视为直接的集合预测问题。它包含了一个基于集合的全局损失函数,通过二分匹配强制产生唯一的预测结果,以及一个Transformer编码-解码架构。给定一组固定的小规模学习到的对象查询,DETR能够并行地推理对象间的关系和全局图像上下文,直接输出最终的预测集合。由于其并行性质,DETR非常快速且高效。
关于代码
我们认为目标检测不应该比分类更难,也不应该需要复杂的库来进行训练和推理。DETR非常易于实现和实验,我们提供了一个独立的Colab笔记本,展示了如何仅用几行PyTorch代码完成DETR的推理。训练代码也遵循这一理念——它不是一个库,而只是一个主程序main.py
,其中导入了模型和标准训练循环的定义。
此外,我们在d2/
文件夹中提供了Detectron2的包装器。更多信息请参阅那里的README文件。
详情请参见Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov和Sergey Zagoruyko的论文《End-to-End Object Detection with Transformers》。
阅读我们的博客文章,了解更多关于使用Transformer进行端到端目标检测的信息。
模型库
我们提供了基线DETR和DETR-DC5模型,并计划在未来增加更多模型。AP是在COCO 2017 val5k数据集上计算的,推理时间是基于前100张val5k COCO图像,使用torchscript转换器。
名称 | 主干网络 | 计划 | 推理时间 | 边界框AP | 链接 | 大小 |
---|---|---|---|---|---|---|
0 | DETR | R50 | 500 | 0.036s | 42.0% | [模型 |
1 | DETR-DC5 | R50 | 500 | 0.083s | 43.3% | [模型 |
2 | DETR | R101 | 500 | 0.050s | 43.5% | [模型 |
3 | DETR-DC5 | R101 | 500 | 0.097s | 44.9% | [模型 |
COCO val5k评估结果可以在这个gist中找到。
这些模型也可通过torch hub获得。要加载带有预训练权重的DETR R50模型,只需执行:
model = torch.hub.load('facebookresearch/detr:main', 'detr_resnet50', pretrained=True)
COCO panoptic val5k模型:
名称 | 主干网络 | 边界框AP | 分割AP | PQ | 链接 | 大小 |
---|---|---|---|---|---|---|
0 | DETR | R50 | 38.8% | 31.1% | 43.4% | [下载] |
1 | DETR-DC5 | R50 | ¾ | 1 | DETR-DC5 | R50 |
2 | DETR | R101 | 40.1% | 33.0% | 45.1% | [下载] |
您可以查看我们的全景分割Colab笔记本,了解如何使用和可视化DETR的全景分割预测。
笔记本
我们提供了一些Colab笔记本,以帮助您掌握DETR:
- DETR动手实践Colab笔记本:展示了如何从hub加载模型,生成预测,然后可视化模型的注意力(类似于论文中的图示)。
- 独立Colab笔记本:在这个笔记本中,我们演示了如何用50行Python代码从零开始实现简化的DETR版本,然后可视化预测结果。如果您想更好地理解架构并在深入代码库之前做一些探索,这是一个很好的起点。
- 全景分割Colab笔记本:演示了如何使用DETR进行全景分割并绘制预测结果。
使用 - 目标检测
DETR没有额外编译的组件,包依赖也非常少,因此代码非常简单易用。我们提供了如何通过conda安装依赖项的说明。首先,克隆仓库到本地:
然后,安装PyTorch 1.5+ 和 torchvision 0.6+:
conda install -c pytorch pytorch torchvision
安装pycocotools(用于COCO评估)和scipy(用于训练):
conda install cython scipy
pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
这样就完成了安装,可以开始训练和评估检测模型了。
(可选)如果要处理全景分割,安装panopticapi:
pip install git+https://github.com/cocodataset/panopticapi.git
数据准备
从http://cocodataset.org下载并解压COCO 2017训练和验证图像及其注释。我们期望目录结构如下:
/path/to/coco/
annotations/ # 注释JSON文件
train2017/ # 训练图像
val2017/ # 验证图像
训练
要在单节点上使用8个GPU训练基准DETR共300个epoch,请运行:
python -m torch.distributed.launch --nproc_per_node=8 --use_env main.py --coco_path /path/to/coco
一个epoch大约需要28分钟,因此300个epoch的训练大约需要6天的时间,使用一台配备8张V100卡的机器。为了便于复现我们的结果,我们提供了150个epoch的训练结果和日志(在单台机器上约需3天),达到39.5/60.3 AP/AP50。
我们使用AdamW优化器训练DETR,将Transformer的学习率设为1e-4,主干网络的学习率设为1e-5。使用水平翻转、缩放和裁剪进行数据增强。图像被缩放到最小尺寸800和最大尺寸1333。Transformer的训练使用了0.1的dropout率,并且整个模型使用了0.1的梯度裁剪。
评估
要使用单个GPU在COCO val5k上评估DETR R50,请运行:
python main.py --batch_size 2 --no_aux_loss --eval --resume https://dl.fbaipublicfiles.com/detr/detr-r50-e632da11.pth --coco_path /path/to/coco
我们在这个gist中提供了所有DETR检测模型的结果。请注意,数字会根据每个GPU的批处理大小(图像数量)而有所不同。非DC5模型使用批处理大小2进行训练,而DC5使用批处理大小1,因此如果在每个GPU上评估超过1张图像时,DC5模型的AP会有显著下降。
多节点训练
通过Slurm和submitit可以进行分布式训练:
pip install submitit
在4个节点上训练基准DETR-6-6模型共300个epoch:
python run_with_submitit.py --timeout 3000 --coco_path /path/to/coco
使用 - 分割
我们展示了将DETR扩展到预测分割掩码是相对直接的。我们主要展示了强大的全景分割结果。
数据准备
对于全景分割,除了COCO数据集外,您还需要全景注释(请参见上面的COCO数据集)。您需要下载并解压这些注释。我们期望目录结构如下:
/path/to/coco_panoptic/
annotations/ # 注释JSON文件
panoptic_train2017/ # 训练全景注释
panoptic_val2017/ # 验证全景注释
训练
我们建议分两阶段训练分割:首先训练DETR检测所有边界框,然后训练分割头。对于全景分割,DETR必须学会检测东西类和事物类的边界框。您可以在单个节点上使用8个GPU训练300个epoch:
python -m torch.distributed.launch --nproc_per_node=8 --use_env main.py --coco_path /path/to/coco --coco_panoptic_path /path/to/coco_panoptic --dataset_file coco_panoptic --output_dir /output/path/box_model
对于实例分割,您可以简单地训练一个正常的边界框模型(或者使用我们提供的预训练模型)。
一旦有了边界框模型的检查点,您需要冻结它,并单独训练分割头。对于全景分割,您可以在单个节点上使用8个GPU训练25个epoch:
python -m torch.distributed.launch --nproc_per_node=8 --use_env main.py --masks --epochs 25 --lr_drop 15 --coco_path /path/to/coco --coco_panoptic_path /path/to/coco_panoptic --dataset_file coco_panoptic --frozen_weights /output/path/box_model/checkpoint.pth --output_dir /output/path/segm_model
对于仅实例分割的情况,只需从上述命令行中删除dataset_file
和coco_panoptic_path
参数。
通过这些步骤,您可以充分利用DETR的端到端目标检测和分割能力,实现高效的计算机视觉任务。DETR不仅简化了传统目标检测流水线,还通过Transformer架构提高了模型的性能和效率,为自动驾驶和其他需要精确视觉感知的应用提供了强有力的支持。
标签:transformer,训练,--,检测,模型,yolo,coco,path,DETR From: https://blog.csdn.net/QQ_1309399183/article/details/143636732