极智项目 | 实战TensorRT部署DETR

news2024/10/5 12:48:00

欢迎关注我的公众号 [极智视界],获取我的更多经验分享

大家好,我是极智视界,本文来介绍 实战TensorRT部署DETR。

本文介绍的实战 TensorRT 部署 DETR,提供完整的可以一键执行的项目工程源码,获取方式有两个:

(1) 本文工程项目资源下载,链接:https://download.csdn.net/download/weixin_42405819/87997220

(2) 【推荐】加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq

本文的部署方法主要借助 yolov7_d2 仓库中一些工具,整理了项目代码和一些一键执行的脚本,配合本文中的实战步骤进行介绍,尽可能让大家踩更加少的坑获得跟我一样的效果。

在部署开始之前,先把依赖装上:

conda create -n yolov7_detr_py38 python=3.8
conda activate yolov7_detr_py38

pip install -i https://pypi.douban.com/simple opencv-python rich timm scipy onnx onnxruntime nbnb onnx_graphsurgeon onnx-simplifier
pip install torch torchvision

在项目的 weights 目录里,已经下载好了原始的 detr-r50 的 pth 权重文件,但是这个权重不是基于 detection2 的,需要转换一下:

# run_convert_to_detr_r50.sh
python tools/convert_detr_to_d2.py --source_model weights/detr-r50-dc5-f0fb7ef5.pth --output_model weights/detr-r50.pth

这里直接执行 run_convert_to_detr_r50.sh 就行,输出的部分日志如下:

转换完了之后就会按脚本的输出指定获得一个名为 detr-r50.pth 的权重,但是现在你可能并不知道这个权重是否是有效的,可以用项目里的 demo.py 来验证一下,采用如下命令:

# run_detr_py_demo.sh
python demo.py --config-file configs/coco/detr/detrt_256_6_6_torchvision.yaml --input ./images -c 0.26 --opts MODEL.WEIGHTS weights/detr-r50.pth

在执行这个脚本的时候 run_detr_py_demo.sh 可能会报错:ModuleNotFoundError: No module named 'detectron2',意思是需要先安装 detectron2 模块,用下面的方式进行安装:

# git clone https://github.com/facebookresearch/detectron2.git  # 项目中已有
 
 python -m pip install -i https://pypi.douban.com/simple -e detectron2

然后还会继续报错 ModuleNotFoundError: No module named 'alfred',继续安装:

# git clone https://github.com/lucasjinreal/alfred.git     # 项目中已有
cd alfred
python setup.py install

继续执行验证脚本 run_detr_py_demo.sh,正确执行后输出如下:

可以看到输出是准确的。

话说回来,到这里好像咱们已经做了挺多,但是其实还是啥也没做,下面才是真正的开始。这里的 TensorRT 部署 DETR 的链路是:pytorch -> onnx -> tensorrt

首先要做的就是要导出 DETR 的 onnx 模型。

这里还要再安装一下依赖:

pip install TensorRT-8.6.1.6/onnx_graphsurgeon/onnx_graphsurgeon-0.2.6-py2.py3-none-any.whl

导出 onnx 模型:

# run_export_detr_onnx.sh
python export_onnx.py --config configs/coco/detr/detrt_256_6_6_torchvision.yaml --input ./images/COCO_val2014_000000002153.jpg --opts MODEL.WEIGHTS weights/detr-r50.pth 

直接执行 run_export_detr_onnx.sh,就会在 weights 目录下得到 detr-r50.onnx、detr-r50_sim.onnx、detr-r50_sim.onnx_changed.onnx 三个 onnx 模型,很明显转换过程中用到了大老师的 onnx-sim 工具进行了简化,用 netron 打开最终的 detr-r50_sim.onnx_changed.onnx 模型后会发现它长得十分美丽,下面可窥探一斑:

有了优化好了的 onnx 模型之后,咱们就可以采用 TensorRT 的 trtexec 工具转换为 TensorRT 的 plan 文件了。这里其实会有两个简单的方式进行模型转换,一个是直接采用 TensorRT tar 包里的 trtexec 工具,另外一个是采用 onnx2trt 工具,关于 onnx2trt 的编译可以查看我的文章:《极智开发 | ubuntu源码编译onnx2trt》。但是需要注意的是,不管采用哪个工具,这里会对对 TensorRT 的版本要求都比较严苛,都要求比较高,我尝试过 TensorRT7 和 TensorRT8.2,都是不行的,采用最新版的 TensorRT8.6 验证是可以的,所以在我提供的工程中也已经放了 TensorRT8.6 的 tar 包。这里的工程中,我采用了 trtexec 的方式进行模型转换,采用这个方式还会自动进行推理性能的测试。

# run_export_trt_plan.sh
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/TensorRT-8.6.1.6/lib
./TensorRT-8.6.1.6/bin/trtexec --onnx=./weights/detr-r50.onnx --saveEngine=weights/detr-r50.trt

执行 run_export_trt_plan.sh,正确转换获得如下输出:

来看下推理耗时:

[07/04/2023-16:38:45] [I] GPU Compute Time: min = 28.2419 ms, max = 67.003 ms, mean = 29.9092 ms, median = 29.3754 ms, percentile(90%) = 30.8015 ms, percentile(95%) = 32.3316 ms, percentile(99%) = 33.2737 ms

可以看到平均耗时是 29.9092ms,我的显卡是 RTX2060,batch 是单图,这个速度你能接受吗。其实我们可以简单优化一下,让它采用 fp16 进行推理,脚本如下:

# run_export_trt_plan_fp16.sh
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/TensorRT-8.6.1.6/lib
./TensorRT-8.6.1.6/bin/trtexec --onnx=./weights/detr-r50.onnx --saveEngine=weights/detr-r50.trt --fp16

直接执行 run_export_trt_plan_fp16.sh,正确执行获得如下输出:

来看下 fp16 的推理耗时:

[07/04/2023-16:52:47] [I] GPU Compute Time: min = 8.14526 ms, max = 15.3946 ms, mean = 8.8663 ms, median = 8.57605 ms, percentile(90%) = 9.51196 ms, percentile(95%) = 9.71161 ms, percentile(99%) = 13.9633 ms

可以看到单图推理性能提升地十分明显,从 fp32 的 29ms 提升到了 fp16 的 8.8ms。这其实可以很明显看出,低比特对于推理加速的重要性。更进一步地,其实还可以进行 int8 的推理,性能应该还会进一步提升。

到这里其实已经到达了 pytorch -> onnx -> trt -> 性能测试 的目的了,但是要说是完整的部署 DETR,其实还需要写一个调用 trt 模型进行精度测试的工程,这个主要还涉及前处理后处理,还是稍微有点复杂,考虑到篇幅这篇就先到这了,后续会提供 DETR 精度测试的项目工程,敬请期待。

好了,以上分享了 实战TensorRT部署DETR。希望我的分享能对你的学习有一点帮助。


【极智视界】

《极智项目 | 实战TensorRT部署DETR​​​​​​​》

畅享人工智能的科技魅力,让好玩的AI项目不难玩。邀请您加入我的知识星球,星球内我精心整备了大量好玩的AI项目,皆以工程源码形式开放使用,涵盖人脸、检测、分割、多模态、AIGC、自动驾驶、工业等。不敢说会对你学习有所帮助,但一定非常好玩,并持续更新更加有趣的项目。https://t.zsxq.com/0aiNxERDq

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

淘宝APP商品详情接口(商品信息,价格销量,优惠券信息,详情图等)

淘宝APP商品详情接口(商品信息接口,价格销量接口,优惠券信息接口,详情图接口等)代码对接如下: 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)&#xff…

java jvm什么是记忆集,卡表?

记忆集 : 是一种用于记录 从非收集区域指向收集区域的指针集合的抽象数据结构 。如果我们不考虑 效率和成本的话,最简单的实现可以用非收集区域中所有含跨代引用的对象数组来实现这个数据结 构 记忆集作用 :解决对象跨代引用所带来的问题&a…

Rdkit|分子输出

Rdkit|分子输出 Github: 地址 输出SMILES/SMARTS 输出SMILES:MolToSmiles(mol, isomericSmiles, kekuleSmiles, canonical, …) kekuleSmiles:默认False,不使用kekule时:脂肪族碳用"C"表示(大…

分布式运用——rsync远程同步

一、rsync的背景和原理 rsync(Remote Sync,远程同步)是由Andrew Tridgell于1996年开发的一款开源软件。 是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限&a…

笔试强训第33天

目录 剪花布条 客似云来 剪花布条 #include <iostream> #include <string>using namespace std;int main() {string s,t;while(cin>>s>>t){int ans 0;while(s.find(t) ! string::npos){s.erase(s.find(t), t.size());ans;}cout<<ans<<en…

Codeforces Round 877 (Div. 2) A-E

题目链接&#xff1a;Dashboard - Codeforces Round 877 (Div. 2) - Codeforces A - Blackboard List 解题思路&#xff1a;因为取的是绝对值&#xff0c;所以有负数肯定取负数&#xff0c;没负数就取最大值。 #include <bits/stdc.h> using namespace std; const int…

基于PyQt5的桌面图像调试仿真平台开发(7)伽马矫正

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

小程序的剪贴板 实现复制文本功能

小程序的剪贴板 实现复制文本功能 wx.setClipboardData wx.setClipboardData() 设置系统剪贴板的内容。调用成功后&#xff0c;会弹出 toast 提示"内容已复制"&#xff0c;持续 1.5s Promise 风格 调用&#xff1a;支持微信 Windows 版&#xff1a;支持微信 Mac 版&…

Mac电脑如何与 Windows 用户共享文件?

在 Mac 上设置文件共享 选取苹果菜单 >“系统偏好设置”&#xff0c;然后点按“共享”。 选择“文件共享”复选框&#xff0c;然后点按“选项”。 选择“使用 SMB 来共享文件和文件夹”复选框。 在“Windows 文件共享”列表中&#xff0c;选择要与 Windows 用户共享文件的…

python语法

1、单行注释&#xff1a;# &#xff0c;多行注释&#xff1a; 2、python采用代码缩进和冒号来区别代码之间的层次 3、每个变量在使用前必须赋值&#xff0c;才会创建内存空间。python是基于值的内存管理&#xff0c;相同值指向同一空间。具有内存自动管理功能。不需要声明类…

亚马逊云科技生成式AI产品入围2023SAIL奖TOP30榜单项目

以“智联世界&#xff0c;生成未来”为主题的2023世界人工智能大会&#xff08;WAIC 2023&#xff09;将于7月6日至8日在上海举行。本次大会将聚焦通用人工智能发展&#xff0c;紧抓生成式人工智能引发的行业热潮&#xff0c;探索未来产业新业态&#xff0c;超前谋划赋能数字经…

安装使用最新Photoshop beta(OpenAI模型)及基本Photoshop beta使用技巧

安装使用最新Photoshop beta 1. 注册Adobe美国地区账号2.下载安装Adobe Creative Cloud工具3.下载Photoshop beta4. 基本Photoshop beta使用技巧 1. 注册Adobe美国地区账号 adobe美国官网&#xff1a;https://www.adobe.com/ 首先我们进入官网注册账号 下面我们输入注册邮箱…

【网络编程】自定义协议+Json序列化与反序列化

文章目录 一、序列化与反序列化概念二、自定义协议设计网络计算机2.1 服务端2.1.1 服务端业务处理流程2.1.2 TCP的发送与接收缓冲区2.1.3 保证读取完整报文2.1.4 自定义协议——序列化与反序列化2.1.4.1 请求2.4.1.2 响应 2.1.5 计算流程2.1.6 在有效载荷前添加长度报头2.1.7 发…

解决vmWare ESXI 7.3报错,客户机操作系统已禁用 CPU。请关闭或重置虚拟机(ESXI使用遇到问题解决记录文持续使用持续更新)

一&#xff1a;分析客户机操作系统已禁用 CPU" 这个错误通常是由以下原因之一引起的&#xff1a; 1. 虚拟机配置不正确&#xff1a;可能是您在虚拟机配置中选择了不受支持的 CPU 类型或功能。某些操作系统可能需要特定的 CPU 功能才能正常运行。如果您的虚拟机配置与操作…

下载【T0】指令微调数据集

T0 benchmark&#xff08;或者叫P3&#xff09;是一个大规模的人工标注instruction tuning数据集&#xff0c;在ICLR 2021 T0一文中提出&#xff0c;其收集了来自huggingface hub上的多任务数据&#xff0c;并为每一个task都装备了来自prompt source的人工撰写指令。 P3数据集…

9、DataX安装部署

1、 DataX简介 1.1 DataX概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 源码地址&#xff1a;https://github.com/alibaba/…

基于高校图书馆的用户画像、可视化、模型预测、推荐算法项目实现

需要本项目的可以私信博主获取源码及项目&#xff01;&#xff01;&#xff01; 本研究基于高校图书馆的借阅信息、馆藏图书信息、读者入馆信息、用户信息等多维度的数据表&#xff0c;首先将不同年份的数据拼接在一起&#xff0c;按照时间维度进行整合&#xff0c;并保证数据…

快慢指针专题

总体思想&#xff1a;详解为什么用一步两步快慢指针&#xff1f;三步四步可以吗 - 预言2018 - 博客园 (cnblogs.com) 1. 为什么快慢指针一定会相遇&#xff1a; 2. 为什么 quick 指针每次走两步&#xff0c;而不是3、4步骤&#xff0c;是因为 如上图所示&#xff0c;若走2步&a…

TDsql增量merge导入load_data

TDsql增量merge导入load_data 项目组最近用了腾讯的TencentDB分布式数据库作为传统关系型数据库来保存少量应用数据。因此需要开发相对应的ETL功能代码&#xff0c;根据新数据库特性&#xff0c;使用自带的工具load_data作为导入的工具 准备表 使用load_data导入的表&#xf…

Python运维自动化Paramiko模块

paramiko学习笔记 为什么要用到paramiko模块安装paramiko模块paramiko介绍SSHClient---连接服务器exec_command---执行命令SFTPClient---传输文件下载和上传文件其它方法 为什么要用到paramiko模块 工作中常用到Linux服务器需要更新开发的代码&#xff0c;之前一直是使用xshell…