yolov5模型部署落地|基于TensorRT

作者丨梁彦哲@知乎

来源丨https://zhuanlan.zhihu.com/p/386881025

编辑丨3D视觉工坊

前言

在前两篇教程中,我们主要讲解了TX2环境配置与yolov5s模型训练这两项内容,而本篇教程将主要讨论如何利用TensorRT来在TX2端实际部署模型并在前向推理阶段进行加速,也是系列教程中最为重要、最少资料的模型落地部分。

一、TensorRT是什么?

TensorRT 是由 Nvidia 推出的 GPU 推理引擎(GIE: GPU Inference Engine)。和通用的深度学习框架不同,TensorRT 只提供前向传播,即推理的功能,而没有训练的功能。实际上,训练的场景下,资源通常不会特别紧张,因为是离线的操作(不要求实时反馈),即使出现了一时的资源不足也可以通过增加计算时长来弥补,所以训练框架的资源消耗一般不会有很强的优化。而网络的部署通常对资源更加敏感,算力与内存都是需要考虑的因素。TensorRT 是一个旨在极致优化 GPU 资源使用的深度学习推理计算框架。其工作主要分为两个阶段:建造阶段(build phase)和执行阶段(compile phase)。

在建造阶段,TensorRT 接收外部提供的网络定义(也可包含权值 weights)和超参数,根据当前编译的设备进行网络运行的优化(optimization), 并生成推理引擎 inference engine(可以以 PLAN 形式存在在硬盘上);

在执行阶段,通过运行推理引擎调用 GPU 计算资源——整个流程如下所示:

二、为什么要使用TensorRT

1.满足实时性要求

使用TensorRT加速推理是嵌入式AI非常重要的一环。具体来说以我自己1660Ti笔记本跑模型尚且不能达到满足要求的帧率,更别指望TX2有多好的效果。经实际测试,TX2端TensorRT加速后可至40帧左右,满足实时性要求。

2.TX2环境限制(关键!)

以最新的TX2刷机包Jetpack4.5.1为例,其封装好的CUDA版本为10.0,而我使用的yolov5 4.0版本需CUDA11.0,且yolov5所依赖的某些依赖尚无支持arm架构的版本,在TX2上直接跑yolov5是根本不可能的!必须使用TensorRT API对网络进行“复现”。

三、如何使用TensorRT

1.前期准备与说明

使用TensorRT的过程,实际就是在其API下复现yolov5的过程。对于任意一个已训练好的神经网络,我们需要得知其网络结构(backbone, neck等)与训练权重。训练权重已由系列教程的第二篇中得到,网络结构的获取方法主要有以下几种:1.使用TF-TRT,将TensorRT集成在TensorFlow中 2.使用ONNX2TensorRT,即ONNX转换trt的工具 3.手动构造模型结构,然后手动将权重信息挪过去,非常灵活但是时间成本略高,有大佬已经尝试过了:tensorrtx 其中前两种常常会有遇到不支持的结构/层的情况,解决该问题非常费时。而使用TensorRT API手动构造模型结构是最为稳妥、对模型还原度最高、精度损失最少的一种方法。万幸有dalao已将此开源,在此列出项目链接并表示感谢!

https://github.com/wang-xinyu/tensorrtx

可以看到该项目除支持yolov5外,resnet, yolov3, yolov4等均支持,如果使用其他网络结构的同学也可以加以利用。

2. 使用流程

下载好该项目的项目的源码后,我们仅需要用到其中yolov5的子文件夹,其他为无关项。下载过程中要注意所下载的tensorrtx版本应与所选用的yolov5版本相匹配。

2.1 权重转换

打开gen_wts.py文件,修改对应权重路径

此步将会得到wts格式的yolov5权重,以供下一步生成engine文件

2.2 生成TensorRT Engine

// put yolov5s.wts into tensorrtx/yolov5
// go to tensorrtx/yolov5
// update CLASS_NUM in yololayer.h if your model is trained on custom dataset
//注意在yololayer.h中改类别数!!

mkdir build
cd build
cmake ..
make //编译完成

//由wts生成engine文件
sudo ./yolov5 -s [.wts] [.engine] [s/m/l/x or c gd gw]  // serialize model to plan file

//利用engine文件进行推理,此处输入图片所在文件夹,即可得到预测输出
sudo ./yolov5 -d [.engine] [image folder]  // deserialize and run inference, the images in [image folder] will be processed.

// For example yolov5s
sudo ./yolov5 -s yolov5s.wts yolov5s.engine s
sudo ./yolov5 -d yolov5s.engine ../samples
// For example Custom model with depth_multiple=0.17, width_multiple=0.25 in yolov5.yaml
sudo ./yolov5 -s yolov5_custom.wts yolov5.engine c 0.17 0.25
sudo ./yolov5 -d yolov5.engine ../samples

四、后续说明

1.得到engine文件后即可进行推理,但默认输入是图片文件夹,而一般来说实时性项目多用摄像头做输入源,故在yolov5.cpp中魔改一下再重新编译就行。此外IRuntime, ICudaEngine, IExecutionContext等核心类源码中每次有图片输入都会创建一次,严重拖慢速度,改成仅初始化阶段创建,后续再有图片输入时保持可以提高推理速度。

2.以后可能会融合deepsort做一下目标跟踪,敬请期待~

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

下载2

在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

下载3

在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定orb-slam3等视频课程)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

 圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值