jetson设备上部署Yolov5 v3.1 -- Deepstream5.0应用

目录

1. 概述

2.环境配置

2.1 Jetson边缘部署设备

2.1.1 Jetson 设备配置及其版本

2.1.2 Jetson设备软件配置

2.2 x86训练环境

3.Deepstream部署yolov5模型

4.问题再探


1. 概述

Deepstream 是NVIDIA公司开发的AI视频处理框架,该框架是基于GStreamer视频框架上开发的。

Yolov5框架是目标检测的AI训练,推理框架。

本文主要讲述如何使用Deepstream SDK和yolov5模型推理快速构建AI应用,且支持四种模型:s,m,l,x

部署环境:

Jetson 边缘设备,ARM cpu架构,本文采用的是Jetson AGX Xavier。

2.环境配置

2.1 Jetson边缘部署设备

2.1.1 Jetson 设备配置及其版本

  • Jetson 4.4

   jetson设备上可使用命令查看版本

cat /etc/nv_tegra_release
  • deepstream 5.0
  • cuda 10.2
  • tensorrt-7.1.3.0

2.1.2 Jetson设备软件配置

  •  deepstream-yolov5-tensorrt7, github下载地址。注意:deepstream-yolov5过高版本会存在不兼容tensorrt7的编译问题。

2.2 x86训练环境

本次采用Ubuntu18.04系统,Pytorch框架,conda隔离环境。

  • pytorch1.7
  • yolov5 v3.1 github下载地址. 注意:过高的版本已经支持tensorrt8,对tensorrt7不兼容。
  • conda 4.5.4
  • deepstream-yolov5-tensorrt7
  • 创建yolov5环境
//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 训练环境搭建。

3.Deepstream部署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文件

jetson设备上部署Yolov5 v3.1 -- Deepstream5.0应用_第1张图片

        3. 在jetson设备上生成tensorrt模型引擎文件yolov5l.engine

        a) 设备上修改Yolov5-in-Deepstream-5.0-tensorrt7/yolov5.cpp文件,使代码中的网络类型与2中的网络类型相同(目前只支持s m l x 四种类型):

jetson设备上部署Yolov5 v3.1 -- Deepstream5.0应用_第2张图片

         b) 将2中生成的.wts文件拷贝到设备中Yolov5-in-Deepstream-5.0-tensorrt7目录中。

         c) 在Yolov5-in-Deepstream-5.0-tensorrt7目录终端中执行下列命令生成yolov5l.enginelibmyplugin.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文件:

jetson设备上部署Yolov5 v3.1 -- Deepstream5.0应用_第3张图片

        6. deepstream应用运行:

在deepstream应用目录下执行(DMVVideo是重写的deepstream应用):

LD_PRELOAD=./libmyplugins.so ./DMVVideo

4.问题再探

1)   libmyplugins.so本质上是什么,解决什么问题?[PS:欢迎大神评论区帮忙解答]         

你可能感兴趣的:(Yolov5,深度学习,目标检测)