超强目标检测器RT-DETR(超过yolov8)——保姆级部署教程
众所周知,在目标检测领域,YOLO 系列模型一直充当着老大哥的角色。虽然其检测性能表现优异,但一直被广为诟病的便是其后处理过于繁琐且耗时,不好优化且不够鲁棒。最近,基于的端到端检测器(DETR)取得了显著的性能。然而,DETR的高计算成本问题尚未得到有效解决,限制了它们的实际应用,并阻止它们充分利用无后处理的优点,例如非最大值抑制(NMS)。于是乎,百度近期又基于 DETR实现并开源了第一个实时的
以下文章来源于微信公众号:CVHub
作者:派派星
链接:https://mp.weixin.qq.com/s/W56LHZbZEqqoCPFVf612FA
本文仅用于学术分享,如有侵权,请联系后台作删文处理
导读
目标检测是CV领域常用的算法模型,本文对百度开源的目标检测器 RT-DETR
进行了介绍,并通过Python/C++
两种方式进行了部署,希望对大家有帮助!
Title: DETRs Beat YOLOs on Real-time Object Detection
Paper: https://arxiv.org/pdf/2304.08069.pdf
Code:https://github.com/PaddlePaddle/PaddleDetection/tree/develop/configs/rtdet
1. 介绍
众所周知,在目标检测领域,YOLO 系列
模型一直充当着老大哥的角色。虽然其检测性能表现优异,但一直被广为诟病的便是其后处理过于繁琐且耗时,不好优化且不够鲁棒
。
最近,基于Transformer
的端到端检测器(DETR)取得了显著的性能。然而,DETR的高计算成本
问题尚未得到有效解决,限制了它们的实际应用,并阻止它们充分利用无后处理的优点,例如非最大值抑制(NMS)。
于是乎,百度近期又基于 DETR
实现并开源了第一个实时的端到端物体检测器RT-DETR
,有效的避免 NMS 导致的推理延迟同时提升性能。
具体来说,作者设计了一个高效的混合编码器
,通过解耦内部尺度交互和跨尺度融合
来高效地处理多尺度特征,并提出了 IoU 感知的查询选择来改进目标查询的初始化。此外,RT-DETR 支持使用不同的解码器层来灵活调整推断速度,无需重新训练,从而方便实时物体检测器的实际应用。
最终 RTDETR-L 在COCO val2017上达到了53.0%的AP和114 FPS的速度,而RT-DETR-X达到了54.8%的AP和74 FPS,速度和准确性均优于相同规模的所有YOLO检测器
。此外,RTDETR-R50 在精度上比 DINO-Deformable-DETR-R50 高 2.2% 的 AP,在FPS上高出约21倍
,达到了 53.1% 的 AP 和 108 FPS!
关于理论部分我们简单介绍到这里,具体的解读可参考:https://mp.weixin.qq.com/s/o03QM2rZNjHVto36gcV0Yw。本文着中教大家如何从零到一完成 RT-DETR 模型的部署
安装依赖
- 新建一个虚拟环境【可选】
conda create -n paddlepaddle python=3.8 -y
conda activate paddlepaddle
- 下载相应的 paddle 版本【PaddlePaddle >= 2.4.1】
# 此处安装了适配 CUDA11.7 的 PaddleGPU 2.4.2 版本,请根据自己本地环境修改
python -m pip install paddlepaddle-gpu==2.4.2.post117 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
- 下载代码仓库
git clone https://github.com/PaddlePaddle/PaddleDetection.git
git checkout develop
# Install other dependencies
cd PaddleDetection
pip install -r requirements.txt
# Compile and install paddledet
python setup.py install
- 下载预训练权重并测试环境是否正常
# 下载权重
wget https://bj.bcebos.com/v1/paddledet/models/rtdetr_r50vd_6x_coco.pdparams && mkdir weights && mv rtdetr_r50vd_6x_coco.pdparams ./weights
# 测试看能否正常 infer,测试图片自行替换下
python tools/infer.py -c configs/rtdetr/rtdetr_r50vd_6x_coco.yml -o weights=https://bj.bcebos.com/v1/paddledet/models/rtdetr_r50vd_6x_coco.pdparams --infer_img=bus.jpg
- 修改配置文件
首先,进入文件路径 【PaddleDetection/configs/rtdetr/base/rtdetr_r50vd.yml】修改 DETR 的导出配置:
其次,进入文件路径【PaddleDetection/ppdet/modeling/architectures/detr.py】将后处理输出合并下,便于部署。
注意,此处输出的 score 默认是没有归一化的,如果想一步到位的可以直接加 sigmoid 处理下。不过问题不大,因为我们的部署代码已经植入了自动判断,可根据输出值动态适配,此处可加可不加。另外,默认的导出方式是静态的,如果想改成动态Shape,只需调用 【PaddleDetection/scripts/paddle_infer_shape.py】函数修改 --input_shape_dict=“{‘image’: [-1, 3, -1, -1]” 即可,这里 -1 代表动态输入。
最后,直接导出模型权重即可:
python tools/export_model.py -c configs/rtdetr/rtdetr_r50vd_6x_coco.yml
-o weights=https://bj.bcebos.com/v1/paddledet/models/rtdetr_r50vd_6x_coco.pdparams trt=True
–output_dir=output_inference
- 转换模型格式
pip install onnx==1.13.0
pip install paddle2onnx==1.0.5
paddle2onnx --model_dir=./output_inference/rtdetr_r50vd_6x_coco/ \
--model_filename model.pdmodel \
--params_filename model.pdiparams \
--opset_version 16 \
--save_file ./output_inference/rtdetr_r50vd_6x_coco/rtdetr_r50vd_6x_coco.onnx
此处我们仅以 ONNXRUNTIME 进行演示,对于想部署到 TensorRT 平台的可直接参考 PaddleDetection 官方提供的转换脚本,部署流程都差不多,只需要按照此工程写好预处理和后处理即可。
- 使用 onnxsim 简化输出并用 netron 打开检查下:
pip install netron
pip3 install -U pip && pip3 install onnxsim
onnxsim input_onnx_model output_onnx_model
左边是不做任何处理的原始导出模型,右边是经过适当调整后的导出模型。
Python 部署
这一块比较简单,经过上面的操作系统应该已经默认安装了onnxruntime
库了,接下来我们只需照着下面的代码运行下即可。
$ git clone https://github.com/CVHub520/rtdetr-onnxruntime-deploy.git
$ cd rtdetr-onnxruntime-deploy
$ mkdir weights && cd weights
$ wget https://github.com/CVHub520/rtdetr-onnxruntime-deploy/releases/download/v1.0.0/rtdetr_r50vd_6x_coco_cvhub.onnx
$ cd ../python
$ python3 main.py
C++ 部署
1. 安装编译 ONNXRUNTIME,以 Linux 环境为例。
- 首先,下载源码:
git clone https://github.com/Microsoft/onnxruntime
cd onnxruntime/
- 在安装之前,我们先进入到 onnxruntime 目录,其中 build.sh 文件为编译脚本,先打开看看:
#!/bin/bash
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
# Get directory this script is in
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
OS=$(uname -s)
if [ "$OS" = "Darwin" ]; then
DIR_OS="MacOS"
else
DIR_OS="Linux"
fi
if [[ "$*" == *"--ios"* ]]; then
DIR_OS="iOS"
elif [[ "$*" == *"--android"* ]]; then
DIR_OS="Android"
fi
#requires python3.6 or higher
python3 $DIR/tools/ci_build/build.py --build_dir $DIR/build/$DIR_OS "$@"
可以看出,这个处理逻辑只是先判断当前系统环境,针对不同运行平台进行编译,主要编译选项在 tools/ci_build/build.py
文件下,打开文件后,我们重点看下 parse_arguments() 函数的参数说明。具体地,我们挑几个比较常见的讲讲:
- –build_dir:用于指定编译后的库文件存放路径,不可缺省,此处指定在DIR_O 目录下;
- –config:有四种模式,即[“Debug”, “MinSizeRel”, “Release”, “RelWithDebInfo”],例如 MinSizeRel 顾名思义便是优化目标文件的大小,而 RelWithDebInfo 则表示带 Debug 信息的原始目标文件,Release 即发行版,其目标文件大小介于这两者之间。一般可直接按默认,或者根据自己需要选择即可,例如我们这里直接选用 Release 版本。
- –parallel:是否开启多核编译,建议开启,不然编译速度贼慢;
- –skip-tests:单元测试,建议开启,直接跳过;
- –use_cuda:如果需要使用 cuda 加速,就开启;注意,如果开启了此项,需要指定 --cuda_home 和 --cudnn_home 的路径,默认存放在 /usr/local 目录下;
- –build_shared_lib:是否编译成动态库,默认是编译静态库;
- Default behavior is --update --build --test for native architecture builds.
- Default behavior is --update --build for cross-compiled builds.
- –use_tensorrt:是否使用tensorrt加速,若开启,需要指定 --tensorrt_home 参数。
没问题的我们可以根据自己需要选择合适的编译参数,此处 cuda
和cudnn
路径需改为自己本地上的路径!:
./build.sh --skip_tests --use_cuda --config Release --build_shared_lib --parallel --cuda_home /usr/local/cuda-11.7 --cudnn_home /usr/local/cuda-11.7
注意,此过程会涉及到很多文件的下载,如果 git 访问很慢会导致多次中断,这时候可以多次重复运行下,若一直网络失败请参考问题汇总。运气不好的话,整个过程可能需要花费数个小时,请耐心等待。
2.安装编译 OpenCV 环境
安装步骤可参考此教程: https://zhuanlan.zhihu.com/p/392751819
3.下载工程
$ cd rtdetr-onnxruntime-deploy
$ mkdir weights && cd weights
$ wget https://github.com/CVHub520/rtdetr-onnxruntime-deploy/releases/download/v1.0.0/rtdetr_r50vd_6x_coco_cvhub.onnx
$ cd ../cplusplus
注意:要构建项目,请确保正确安装了
onnxruntime
和opencv
。然后,按照指示运行命令。不要忘记更新CMakeLists.txt
文件中的 ONNXRUNTIME_DIR 和 OpenCV_DIR cmake 选项以匹配您的自定义环境。
$ mkdir build && cd build
$ cmake ..
$ make
$ ./main
结果展示
边框坐标完全对齐,精度几乎没有损失。
总结
本文简单的为大家介绍了 RT-DETR 模型的一些基本概括,同时演示了如何基于 Python 和 C++ 在本地环境进行部署。完整的项目代码请访问 Github 地址。最后,也欢迎大家点个 star 鼓励支持一下,感谢各位小伙伴长久以来的支持!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)