目录
1. 概述
2.环境配置
2.1 Jetson边缘部署设备
2.1.1 Jetson 设备配置及其版本
2.1.2 Jetson设备软件配置
2.2 x86训练环境
3.Deepstream部署yolov5模型
4.问题再探
Deepstream 是NVIDIA公司开发的AI视频处理框架,该框架是基于GStreamer视频框架上开发的。
Yolov5框架是目标检测的AI训练,推理框架。
本文主要讲述如何使用Deepstream SDK和yolov5模型推理快速构建AI应用,且支持四种模型:s,m,l,x
部署环境:
Jetson 边缘设备,ARM cpu架构,本文采用的是Jetson AGX Xavier。
jetson设备上可使用命令查看版本
cat /etc/nv_tegra_release
本次采用Ubuntu18.04系统,Pytorch框架,conda隔离环境。
//1.创建conda环境, 说明:new_env是自定义的环境名称
conda create -n new_env python=3.6
//2.激活新建环境
source activate new_env
或
conda activate new_env
//3.进入新建环境后,安装yolov5所需的环境
//终端执行yolov5目录下安装文件requirements.txt
pip3 install -r requirements.txt
//或使用临时源地址
pip3 install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
至此,完成了 ubuntu18.04-x86 yolov5 训练环境搭建。
本教程重点于yolov5模型在deepstream应用上的部署,所以不讲模型训练.
测试以pre-model yolov5l.pt(github下载地址)为测试模型。
部署流程:
1.在训练环境中进入到conda yolov5环境
2.在训练环境中使用gen_wts.py将yolov5l.pt文件转换为yolov5l.wts文件。
a) 将xxx/Yolov5-in-Deepstream-5.0-tensorrt7/gen_wts.py文件拷贝到yolov5代码根目录下,原因在于此模块依赖于yolov5的utils模块,见文件代码第3行。
b) 修改gen_wts.py文件,将源文件内容更改如下(改成可传参数):
import torch
import struct
from utils.torch_utils import select_device
import sys
# Initialize
device = select_device('cpu')
# Load model
#model = torch.load('yolov5l.pt', map_location=device)['model'].float() # load to FP32
pt_file = sys.argv[1]
model = torch.load(pt_file, map_location=device)['model'].float() # load to FP32
model.to(device).eval()
#f = open('yolov5l.wts', 'w')
with open(pt_file.split('.pt')[0] + '.wts', 'w') as f:
f.write('{}\n'.format(len(model.state_dict().keys())))
for k, v in model.state_dict().items():
vr = v.reshape(-1).cpu().numpy()
f.write('{} {} '.format(k, len(vr)))
for vv in vr:
f.write(' ')
f.write(struct.pack('>f',float(vv)).hex())
f.write('\n')
c) 生成.wts文件
模型3.1版本文件请自行去官网下载到yolov5/weights目录中。在conda环境yolov5目录下终端执行命令:
python3 gen_wts.py ./weights/yolov5l.pt
此时会在weights目录下产生yolov5l.wts文件
3. 在jetson设备上生成tensorrt模型引擎文件yolov5l.engine
a) 设备上修改Yolov5-in-Deepstream-5.0-tensorrt7/yolov5.cpp文件,使代码中的网络类型与2中的网络类型相同(目前只支持s m l x 四种类型):
b) 将2中生成的.wts文件拷贝到设备中Yolov5-in-Deepstream-5.0-tensorrt7目录中。
c) 在Yolov5-in-Deepstream-5.0-tensorrt7目录终端中执行下列命令生成yolov5l.engine和libmyplugin.so:
mkdir build
cd build
cmake ..
make
sudo ./yolov5 -s // serialize model to plan file i.e. 'yolov5l.engine'
4. 设备上Yolov5-in-Deepstream-5.0-tensorrt7/Deepstream 5.0/nvdsinfer_custom_impl_Yolo目录make编译生成libnvdsinfer_custom_impl_Yolo.so文件。
5.将3、4中生成的yolov5l.engine、libmyplugin.so、libnvdsinfer_custom_impl_Yolo.so和Yolov5-in-Deepstream-5.0-tensorrt7/Deepstream 5.0/config_infer_primary_yoloV5.txt,Yolov5-in-Deepstream-5.0-tensorrt7/labels.txt 拷贝到deepstream应用程序目录下。并修改deeptream应用的配置文件推理部分:
[primary-gie]
batch-size=1
config-file=config_infer_primary_yoloV5.txt
enable=1
gie-unique-id=1
gpu-id=0
interval=2
labelfile-path=labels.txt
model-engine-file=yolov5l.engine
nvbuf-memory-type=0
修改deepstream应用目录下的config_infer_primary_yoloV5.txt如下,指向当前目录下的engine文件:
6. deepstream应用运行:
在deepstream应用目录下执行(DMVVideo是重写的deepstream应用):
LD_PRELOAD=./libmyplugins.so ./DMVVideo
1) libmyplugins.so本质上是什么,解决什么问题?[PS:欢迎大神评论区帮忙解答]