社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

超强目标检测器 RT-DETR | Python/C++ 保姆级部署教程,从入门到精通

CVHub • 3 年前 • 1003 次点击  

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/rtdetr

导读

众所周知,在目标检测领域,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 模型的部署。具体的代码可直接在文末点击阅读原文直接跳转到 Github,欢迎点个 star!

安装依赖

  • 新建一个虚拟环境【可选】
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
OriginModify

左边是不做任何处理的原始导出模型,右边是经过适当调整后的导出模型。

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 访问很慢会导致多次中断,这时候可以多次重复运行下,若一直网络失败请参考问题汇总。运气不好的话,整个过程可能需要花费数个小时,请耐心等待。

  1. 安装编译 OpenCV 环境。

安装步骤可参考此教程: https://zhuanlan.zhihu.com/p/392751819

  1. 下载工程
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
# ./main --use_cuda

结果展示

PythonC++

边框坐标完全对齐,精度几乎没有损失。

总结

本文简单的为大家介绍了 RT-DETR 模型的一些基本概括,同时演示了如何基于 Python 和 C++ 在本地环境进行部署。完整的项目代码请访问 Github 地址,有任何疑问请加微信: cv_huber,备注“RTDETR”进入交流群讨论。最后,也欢迎大家点个 star 鼓励支持一下,感谢各位小伙伴长久以来的支持!

写在最后

CVHub 是一家专注于计算机视觉领域的高质量知识分享平台,全站技术文章原创率常年高达99%,每日为您呈献全方位、多领域、有深度的前沿AI论文解决及配套的行业级应用解决方案,提供科研 | 技术 | 就业一站式服务,涵盖有监督/半监督/无监督/自监督的各类2D/3D的检测/分类/分割/跟踪/姿态/超分/重建等全栈领域以及最新的AIGC等生成式模型。欢迎关注微信公众号CVHub或添加小编好友:cv_huber,参与实时的学术&技术互动交流,领取CV学习大礼包,及时订阅最新的国内外大厂校招&社招资讯!


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/154559