★★★ 本文源自AI Studio社区精品项目,【点击此处】查看更多精品内容 >>>
端到端目标检测DINO: COCO屠榜的正确姿势
论文传送门: DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection
一、项目简介
最近,DINO已在PaddleDetection的预览版本(develop分支)开源,其中 4scale-r50-1x 配置复现精度为 49.1 AP(COCO2017),配置文件路径为 PaddleDetection/configs/dino/dino_r50_4scale_1x_coco.yml
.根据示例配置文件,我们还可以自行修改配置参数来满足各类场景的需求。
本项目详细介绍DETR系列模型,重点讲解DINO的改进策略和设计思路,并演示利用PaddleDetection完成DINO训练推理的完整流程,最后演示DINO的检测效果。
1、端到端目标检测回顾
自从VIT横空出世以来,Transformer在CV界掀起了一场革新,各个上下游任务都得到了长足的进步,本项目首先带大家盘点一下基于Transformer的端到端目标检测算法(附论文链接)!
开山之作:DETR(ECCV2020),代码链接:https://github.com/facebookresearch/detr, PaddleDetection将核心代码逻辑实现在PaddleDetection/ppdet/modeling/transformers/detr_transformer.py
中,方便大家阅读学习!
该模型提出了一种将目标检测视为直接集预测问题的新方法。DETR简化了检测流程,有效地消除了对许多人工设计组件的需求,如NMS或anchor生成。新框架的主要组成部分,称为DEtection TRansformer或DETR,是一种基于集合的全局损失,通过二分匹配强制进行一对一预测,以及一种transformer encoder-decoder架构。给定一组固定的学习目标查询,DETR分析了目标和全局图像上下文之间的关系,以直接并行输出最后一组预测。与许多其他检测器不同,新模型概念简单,不需要专门的库。
然而,DETR存在一些弊病,例如,训练缓慢(500 epoch)和小目标检测性能差。
由于DETR大大简化了目标检测的流程,后续涌现出很多工作改进其缺点,这里根据大致的时间先后顺序列出一些有代表性的作品:
PnP-DETR(ICCV 2021) 改进了DETR计算量大的问题,利用提出的poll and pool(PnP)采样模块在图像特征上自适应的采样不同粒度的特征,从而实现计算量和性能的折衷。
Deformable DETR(ICLR 2021) 通过改变transformer中注意力机制的计算方式来减小计算量,其借助可变性卷积的思想,为每个token采样固定数量的其他token完成注意力的计算。同时,Deformable DETR引入了多尺度训练来提高小目标检测的性能。至此,对DETR存在的两个弊端都进行了探索并使其得到一定程度的缓解。
Sparse DETR(ICLR 2022) 在多尺度Deformable DETR的基础上进一步降低encoder中注意力机制的计算成本,在检测性能不会显著下降的基础上只更新encoder tokens的一部分,从而实现选择性地更新decoder预期引用的token。
Conditional DETR(ICCV 2021) 认为DETR收敛缓慢的原因在于其高度依赖高质量的content embedding去定位物体的边界,而边界部分恰恰是定位和识别物体的关键。由于短期训练提供的content embedding质量不高,Conditional DETR从解码器嵌入中学习条件空间query,并和content embedding做concat操作后输入cross-attention,使得外观特征和位置特征的解耦,降低训练难度,加快收敛。
Anchor DETR(AAAI 2022) 从另外一个角度加快DETR收敛,该文章提出了一种新的object query设计方式,使其作为位置编码的意义更加明确。原始的DETR使用全零初始化object query,导致模型优化困难,而Anchor DETR采用了anchor points来编码形成object query,保证每个query关注points附近的特征,相当于为querys提供了明确的优化方向。
DAB-DETR(ICLR 2022) 在Anchor DETR基础上拓展points,通过引入4D参考点来初始化object query,并根据宽高信息自适应改变注意力的分布范围,进一步加速了DETR的收敛。
DN-DETR(CVPR 2022) 从二分匹配角度出发来解决DETR收敛慢的问题,本文发现训练早期二分匹配结果不稳定导致训练缓慢,模型得不到持续有效的更新。因此,DN-DETR将添加噪声的GT和query一起输入decoder,利用GT重建任务来协助稳定训练。
总结来说,上述工作几乎都在解决DETR收敛慢的问题,出发点各不相同,并且COCO上的实验证明大部分手段都是卓有成效的。DINO广泛借鉴了这些成功经验,并且进行了一定的创新,将DETR模型推向了新高度。
2、DINO简介

DINO立足于DN-DETR、DAB-DETR和Deformable-DETR三个模型,融合并改进了三者的一些设计,并且提出了三点改进:CDN对比去噪训练、mixed query selection和look forward twice.
CDN对比去噪训练:
CDN对比去噪训练是在DN-DETR基础上,通过引入一大一小两个超参数,在GT上添加小噪声的属于正样本,添加较大噪声的属于负样本,正样本通过decoder需要重建GT box,而负样本需要预测no object,从而更好的稳定二分图匹配。另外,DN-DETR种一个DN group种GT denoising query的数量是一个batch中所有图像包含最多GT的个数,其他的图像需要padding,作者认为这样是低效的,因此CDN采用固定数量(每个group100对,也就是200个)。对于positional query,则是使用300x3个querys(同Anchor DETR)
mixed query selection 如下图所示:

对于positional query的初始化是利用encoder的top-k个输出初始化的,而第一层的content query则是常量初始化并且在每一层中去学习的。作者认为encoder的输出是初级特征,可能只包含某个object的一部分或者多个objects,所以进去初始化位置部分,内容部分不做约束。
look forward twice是指在decoder之间做逐层迭代细化的时候,通过增加梯度路径,让后一层的预测结果来优化前一层的输出,如下图所示:

注意:DINO的encoder和decoder的cross-attn中使用的是Deformable attn模块,因此,encoder的topk输出中的位置坐标也会用于decoder参考点的初始化。
基于以上改进,DINO实现了强悍的性能,并且DINO大模型在COCO2017测试集上AP达到63.3!如下图所示:

二、PaddleDetection
https://github.com/PaddlePaddle/PaddleDetection

1、简介
PaddleDetection是一个基于PaddlePaddle的目标检测端到端开发套件,在提供丰富的模型组件和测试基准的同时,注重端到端的产业落地应用,通过打造产业级特色模型|工具、建设产业应用范例等手段,帮助开发者实现数据准备、模型选型、模型训练、模型部署的全流程打通,快速进行落地应用。
✨主要特性
🧩模块化设计
PaddleDetection将检测模型解耦成不同的模块组件,通过自定义模块组件组合,用户可以便捷高效地完成检测模型的搭建。
📱丰富的模型库
PaddleDetection支持大量的最新主流的算法基准以及预训练模型,涵盖2D/3D目标检测、实例分割、人脸检测、关键点检测、多目标跟踪、半监督学习等方向。
🎗️产业特色模型|产业工具
PaddleDetection打造产业级特色模型以及分析工具:PP-YOLOE+、PP-PicoDet、PP-TinyPose、PP-HumanV2、PP-Vehicle等,针对通用、高频垂类应用场景提供深度优化解决方案以及高度集成的分析工具,降低开发者的试错、选择成本,针对业务场景快速应用落地。
💡🏆产业级部署实践
PaddleDetection整理工业、农业、林业、交通、医疗、金融、能源电力等AI应用范例,打通数据标注-模型训练-模型调优-预测部署全流程,持续降低目标检测技术产业落地门槛。
2、涵盖领域

3、在线体验
PaddleDetection提供了模型的在线体验功能,用户可以选择自己的数据进行在线推理。
说明
:考虑到服务器负载压力,在线推理均为CPU推理,完整的模型开发实例以及产业部署实践代码示例请前往。
传送门
:模型在线体验
三、前期准备
# 拉取PaddleDetection的develop分支
!git clone https://ghproxy.com/https://github.com/PaddlePaddle/PaddleDetection.git -b develop
正克隆到 'PaddleDetection'...
remote: Enumerating objects: 254273, done.[K
remote: Counting objects: 100% (294/294), done.[K
remote: Compressing objects: 100% (235/235), done.[K
remote: Total 254273 (delta 126), reused 153 (delta 59), pack-reused 253979[K
接收对象中: 100% (254273/254273), 413.94 MiB | 1.71 MiB/s, 完成.
处理 delta 中: 100% (207507/207507), 完成.
检查连接... 完成。
准备数据集COCO 2017
需要将本项目挂载的数据集目录下的 annotations_trainval2017.zip
train2017.zip
val2017.zip
解压并移动到 PaddleDetection/dataset/coco
目录下,可通过如下命令实现:
unzip -oq ~/data/data103218/annotations_trainval2017.zip -d ~/PaddleDetection/dataset/coco
unzip -oq ~/data/data103218/train2017.zip -d ~/PaddleDetection/dataset/coco
unzip -oq ~/data/data103218/val2017.zip -d ~/PaddleDetection/dataset/coco
四、一键开启训练
使用PaddleDetection之前需要安装依赖库:
终端执行以下安装指令pip install -r PaddleDetection/requirements.txt
1、单卡训练
单卡需要选择32GB-V100环境运行本项目
python tools/train.py -c configs/dino/dino_r50_4scale_1x_coco.yml --eval
2、多卡训练
多卡训练需要选择四卡环境运行本项目
python -m paddle.distributed.launch --selected_gpus='0,1,2,3' --log_dir log_dino_hgnetv1_2x_coco tools/train.py -c configs/dino/dino_r50_4scale_1x_coco.yml --eval
- 在终端执行上述指令 或者 直接执行下面代码块
# 单卡训练
%cd ~/PaddleDetection
!python tools/train.py -c configs/dino/dino_r50_4scale_1x_coco.yml --eval
# 多卡训练
%cd ~/PaddleDetection
!python -m paddle.distributed.launch --selected_gpus='0,1,2,3' --log_dir log_dino_hgnetv1_2x_coco \
tools/train.py -c configs/dino/dino_r50_4scale_1x_coco.yml --eval
五、模型验证和推理
-
训练完成后,在output文件夹下存放了训练过程中保存的中间结果,其中,后缀为pdparams的文件为模型权重,可利用参数
weights
设置中间模型的文件路径来验证验证集精度 -
PaddleDetection支持将DINO导出为静态图,从而可以方便的转化为ONNX格式进行推理
# 模型验证
%cd ~/PaddleDetection
!python tools/eval.py -c configs/dino/dino_r50_4scale_1x_coco.yml \
-o weights=output/dino_r50_4scale_1x_coco/best_model.pdparams
# 动转静
%cd ~/PaddleDetection
!python tools/export_model.py -c configs/dino/dino_r50_4scale_1x_coco.yml \
-o weights=output/dino_r50_4scale_1x_coco/best_model.pdparams trt=True
转换完成后会在 PaddleDetection/output_inference/dino_r50_4scale_1x_coco/
文件夹下生成如下四个文件:
output_inference/dino_r50_4scale_1x_coco
|--infer_cfg.yml
|--model.pdmodel
|--model.pdiparams
|--model.pdiparams.info
可以利用PaddleDetection提供的推理脚本 infer.py
测试模型在不同硬件上的运行时间,以 在CPU上开启mkldnn加速为例:
python deploy/python/infer.py --model_dir=inference/picodet_xs_416_coco_lcnet \
--image_dir $image_dir \
--output_dir $output_dir \
--device=CPU --batch_size=1 \
--cpu_threads=4 \
--enable_mkldnn=True
另外,可以利用paddle2onnx工具将静态图转换为onnx格式模型:
1、首先需要安装paddle2onnx:
pip install paddle2onnx==1.0.3
2、然后导出为onnx格式
paddle2onnx --model_dir=output_inference/dino_r50_4scale_1x_coco --model_filename=model.pdmodel \ --params_filename=model.pdiparams --opset_version 16 --save_file dino_r50_4scale.onnx
onnx模型可以方便的输入各种后端推理引擎,比如onnxruntime、TensorRT、MNN等(附文档,点击查看),极大方便了模型的部署!
TensorRT推理示例:
onnxsim dino_r50_4scale.onnx dino_r50_4scale_new.onnx --overwrite-input-shape im_shape:1,2 image:1,3,640,640 scale_factor:1,2
software/TensorRT-8.5.1.7/bin/trtexec --onnx=dino_r50_4scale_new.onnx --workspace=4096 --avgRuns=100 --fp16
六、项目总结
作为端到端目标检测模型,DINO(DETR withImproved deNoising anchOr boxes)发布后霸榜COCO大半年时间,该模型第一次让DETR类型的检测器取得了目标检测的SOTA性能,在COCO上取得了63.3 AP的性能,相比之前的SOTA检测器将模型参数和训练数据减少了十倍以上!
DINO具有以下特性:
- SOTA性能:在大模型上以相对较小的数据和模型(~1/10相比之前Swin-v2)取得了最好的检测结果。在ResNet-50的标准设置下取得了51.3 AP。
- End2end:DINO是端到端可学习的,避免了传统检测器许多需要手工设计的模块,例如NMS。
- Fast converging: 在标准的ResNet-50设置下, 4scale-1x的 DINO 达到 49.0 AP,4scale-2x达到 50.4 AP; 5scale-1x的 DINO 达到 49.4 AP,5scale-2x达到 51.3 AP。
鉴于DINO强悍的性能和推理简单的特点,PaddleDetection积极复现并开源DINO,核心代码在 PaddleDetection/ppdet/modeling/transformers/dino_transformer.py
,经过对原版代码结构的重新设计,复现版本的DINO更加简单易读,并且实现各模块解耦,方便读者修改以快速验证想法。
目前,也有一些后续工作在DETR类型检测器的训练策略上有所改进,例如 GROUP-DETR、Co-DETR、SQR等,这些策略应用到DINO中或许会带来更加令人振奋的结果!
作者
赵祎安 飞桨开发者技术专家(PPDE) 大连理工大学飞桨领航团团长
我在AI Studio上获得至尊等级,点亮7个徽章,来互关呀~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/137909
请点击此处查看本环境基本用法.
Please click here for more detailed instructions.