端到端目标检测DINO: COCO屠榜的正确姿势

DINO是DETR系列的一个改进模型,通过引入CDN对比去噪训练、mixedqueryselection和lookforwardtwice等策略,解决了DETR的收敛速度问题并在COCO2017测试集上达到了63.3AP。PaddleDetection提供了DINO的复现和训练推理流程,便于研究和应用。
摘要由CSDN通过智能技术生成

★★★ 本文源自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模型可以方便的输入各种后端推理引擎,比如onnxruntimeTensorRTMNN等(附文档,点击查看),极大方便了模型的部署!

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具有以下特性:

  1. SOTA性能:在大模型上以相对较小的数据和模型(~1/10相比之前Swin-v2)取得了最好的检测结果。在ResNet-50的标准设置下取得了51.3 AP。
  2. End2end:DINO是端到端可学习的,避免了传统检测器许多需要手工设计的模块,例如NMS。
  3. 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-DETRCo-DETRSQR等,这些策略应用到DINO中或许会带来更加令人振奋的结果!

作者

赵祎安 飞桨开发者技术专家(PPDE) 大连理工大学飞桨领航团团长

我在AI Studio上获得至尊等级,点亮7个徽章,来互关呀~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/137909

请点击此处查看本环境基本用法.

Please click here for more detailed instructions.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值