Jetson部署实践

Jetson部署实践


本文实践部署主要的思路是将,我之前在yolo上开发的模型部署在我现在的开发版(这里用的是jetson nano 2gb版,简称丐版),并实现多模型、多路并发推理功能,推理结果回传(至可视化大屏,也就是图像传回,检测结果数据传回功能)。

一、模型开发

1.1 Yolov5图像检测模型开发

在主机上训练自己的Yolov5模型,转为TensorRT模型并部署到Jetson Nano上,用DeepStream运行。

硬件环境:

RTX 1660TI主机

Jetson Nano 2G

软件环境:

Jetson Nano:

Ubuntu 18.04

Jetpack 4.5.1

DeepStream 5.1

主机:

Ubuntu 18.04

CUDA 10.2

yolov5 5.0

二、模型部署

2.1 DeepStream框架介绍

DeepStream应用程序将深度神经网络和其他复杂的处理任务引入到流处理管道中,以实现对视频和其他传感器数据的近实时分析。从这些传感器中提取有意义的见解为提高运营效率和安全性创造了机会。例如,摄像头是当前使用最多的物联网传感器。在我们的家中,街道上,停车场,大型购物中心,仓库,工厂中都可以找到相机–无处不在。视频分析的潜在用途是巨大的:访问控制,防止丢失,自动结帐,监视,安全,自动检查(QA),包裹分类(智能物流),交通控制/工程,工业自动化等。

在这里插入图片描述
NVIDIA DeepStream SDK是基于开源GStreamer多媒体框架的流分析工具包。DeepStream SDK加快了可伸缩IVA应用程序的开发速度,使开发人员更容易构建核心深度学习网络,而不必从头开始设计端到端应用程序。包含NVIDIA Jetson模块或NVIDIA dGPU适配器的系统均支持该SDK。它由可扩展的硬件加速插件集合组成,这些插件与低级库进行交互以优化性能,并定义了标准化的元数据结构,可实现自定义/用户特定的添加。

有关DeepStream SDK的更多详细信息和说明,请参考以下材料:
NVIDIA DeepStream SDK开发指南
NVIDIA DeepStream插件手册
NVIDIA DeepStream SDK API参考文档

2.2 TensorRT 加速算子、模型转换

使用tensorrtx项目进行转换:https://github.com/wang-xinyu/tensorrtx

克隆tensorrtx项目

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

官方教程详见:https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5

tensorrtx/yolov5/gen_wts.py复制到yolov5项目根目录下

执行命令生成.wts文件

// 这里用的是之前训练的口罩模型

python gen_wts.py yolov5/runs/train/exp4/weights/mask.pt

执行完在.pt权重路径下会生成一个.wts文件

环境转到Jetson Nano

在nano上也克隆一个tensorrtx项目

将生成的.wts放到tensorrtx/yolov5/

修改tensorrtx/yolov5/yololayer.h

static constexpr int CLASS_NUM = 2;

修改类型数量,原来是80

tensorrtx/yolov5/目录下

编译代码

mkdir build
cd build
cmake ..
make

cmake:
在这里插入图片描述
make:
在这里插入图片描述
.wts文件转为.engine文件

// -s是操作指令 l是指yolo算法中的预训练模型
sudo ./yolov5 -s ../mask.wts ../mask.engine l

将验证图片放在tensorrtx/yolov5/samples/下,执行命令验证转换是否成功

sudo ./yolov5 -d ../mask.engine ../samples

执行完会在当前目录生成一张相应的图片:
在这里插入图片描述
在这里插入图片描述

2.3 安装DeepStream

Step1:首先换源(一般是不需要做这一步,需要跟自己的板子的jetpack版本一致)

删除之前的:

cd /usr/bin
sudo rm deepstream-*

cd /opt/nvidia
sudo rm -r deepstream/*

换源:

sudo vim /etc/apt/sources.list

sudo vim /etc/apt/sources.list.d/nvidia-l4t-apt-source.list

这里贴出几类源:

下面贴出的是jetpack版本4.4的源
nano:

deb https://repo.download.nvidia.com/jetson/common r32.4 main

deb https://repo.download.nvidia.com/jetson/t210 r32.4 main

nx:

deb https://repo.download.nvidia.com/jetson/common r32.4 main

deb https://repo.download.nvidia.com/jetson/t194 r32.4 main

tx2:

deb https://repo.download.nvidia.com/jetson/common r32.4 main

deb https://repo.download.nvidia.com/jetson/t186 r32.4 main

Step2:安装 nvidia-l4t-gstreamer
更新:

sudo apt update

sudo apt install --reinstall nvidia-l4t-gstreamer

sudo apt install \
libssl1.0.0 \
libgstreamer1.0-0 \
gstreamer1.0-tools \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
libgstrtspserver-1.0-0 \
libjansson4=2.11-1 \
libgstrtspserver-1.0-dev \
libnvinfer7 \
libnvparsers7 \
libnvonnxparsers7 \
libnvinfer-plugin7
  1. deb安装:
sudo dpkg -i deepstream-5.0_5.0.1-1_arm64.deb
  1. tar安装(如果是4.0,解压完后里面还有一个压缩包(binaries.tbz2),binaries.tbz2 解压到根目录)
sudo tar -xvf deepstream_sdk_v5.0.1_jetson.tbz2 -C /
cd /opt/nvidia/deepstream/deepstream-5.0
sudo ./install.sh
sudo ldconfig
检查安装结果

deepstream-app --version-all

2021-11-30 00:07:22.617191: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.2
deepstream-app version 5.0.0
DeepStreamSDK 5.0.0
CUDA Driver Version: 10.2
CUDA Runtime Version: 10.2
TensorRT Version: 7.1
cuDNN Version: 8.2
libNVWarp360 Version: 2.0.1d3

2.4 推理测试

安装完后在/opt/nvidia/deepstream/deepstream-5.0/sources/objectDetector_Yolo会有一个部署yolo的官方实例代码,但只有yolov3的。

这里我们直接用已经改好的yolov5项目:https://github.com/DanaHan/Yolov5-in-Deepstream-5.0

可不用按照项目官方的说明,直接按以下步骤即可。

克隆项目

git clone https://github.com/DanaHan/Yolov5-in-Deepstream-5.0.git

进入Yolov5-in-Deepstream-5.0/Deepstream 5.0/nvdsinfer_custom_impl_Yolo/目录下

修改nvdsparsebbox_Yolo.cpp文件中的类型数量

static const int NUM_CLASSES_YOLO = 2;

原本为80,改为自己模型的类型数量

保存编译

make

返回上级目录,进入Yolov5-in-Deepstream-5.0/Deepstream 5.0/

将tensorrtx生成的.engine文件和libmyplugins.so放到目录下

这里是tensorrtx/yolov5/mask.enginetensorrtx/yolov5/builkd/libmyplugins.so

修改DeepStream处理流程配置文件deepstream_app_config_yoloV5.txt


...
 
[source0]
#Type - 1=CameraV4L2(usb摄像头) 2=URI(文件) 3=MultiURI
type=1
camera-width=2560
camera-height=720
camera-fps-n=30
camera-fps-d=1
 
...
 
 
[streammux]
...
width=1344
height=376
...
 
[primary-gie]
...
model-engine-file=best.engine
...
 
[tracker]
enable=0
tracker-width=512
tracker-height=320
ll-lib-file=/opt/nvidia/deepstream/deepstream-5.1/lib/libnvds_mot_klt.so
 
...
  • [source0],改为用摄像头实时跑识别,需要加上长宽和帧率设置。这里我用的是一个双目摄像头。

  • [streammux]显示窗口改为1344*376

  • [primary-gie]修改权重路径

  • [tracker]改为deepstream5.1的地址

修改config_infer_primary_yoloV5.txt文件

...
 
model-engine-file=best.engine
 
...
 
num-detected-classes=2
 
...
 
custom-lib-path=nvdsinfer_custom_impl_Yolo/libnvdsinfer_custom_impl_Yolo.so
 
...

labelfile-path=labels.txt

...

当然这里的labels.txt文件是原本没有的,需要按照我们设置的标签属性进行修改:

vim labels.txt

face
no mask
mask

最后运行DeepStream

LD_PRELOAD=./libmyplugins.so deepstream-app -c deepstream_app_config_yoloV5.txt

在这里插入图片描述
我这里因为内存不足所以溢出了,等更换一个更大的SD卡在进行测试,结果基本上如:
在这里插入图片描述

2.4.1 单路usb接口图像传入

2.4.2 多路接口图像传入

2.4.3 多模型并发推理

三、推理结果输出

四、ssh设置

因为我的板子是用无线网卡进行远端连接的,所以远程传输wtf文件需要用ssh进行远程传输,但是无线网卡连接后传输的ip地址一般情况是动态,并且传输文件的指令很麻烦,于是这里采用WinSCP+固定ip

>>> iwlist wlan3 scan

ubuntu@ubuntu:~$ iwlist wlan3 scan
wlan3     Scan completed :
          Cell 01 - Address: C8:D3:A3:50:8B:5A
                    ESSID:"dlink2"
                    Protocol:IEEE 802.11bgn
                    Mode:Master
                    Frequency:2.437 GHz (Channel 6)
                    Encryption key:on
                    Bit Rates:300 Mb/s
                  。。。。。。。
>>> sudo vim /etc/network/interfaces

auto wlan3
iface wlan3 inet static
address 192.168.1.88
netmask 255.255.255.0
gateway 192.168.1.1
wpa-ssid dlink2(要连接的wlan ssid)
wpa-passphrase wlan密码
wireless-channel 6(信道号)

WinSCP:https://winscp.net/download/WinSCP-5.19.4-Setup.exe

五、常见报错

5.1 fatal: unable to access ‘https://github.com/wang-xinyu/tensorrtx.git/’: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

git clone 遇到问题:

fatal: unable to access ‘https://github.comxxxxxxxxxxx’: Failed to connect to xxxxxxxxxxxxx

换一个克隆方案,将命令行里的http改为git重新执行。

5.2 github.com[0: 20.205.243.166]: errno=Connection timed out-bash: github.com[0:: command not found

vim /etc/hosts

192.30.255.112  github.com git 
185.31.16.184 github.global.ssl.fastly.net  

5.3 DeepStream-bash: /usr/bin/deepstream-test1-app: cannot execute binary file: Exec format error

如图,需要更换源
在这里插入图片描述
Step1:首先换源(一般是不需要做这一步,需要跟自己的板子的jetpack版本一致)

删除之前的:

cd /usr/bin
sudo rm deepstream-*

cd /opt/nvidia
sudo rm -r deepstream/*

换源:

sudo vim /etc/apt/sources.list

sudo vim /etc/apt/sources.list.d/nvidia-l4t-apt-source.list

这里贴出几类源:

下面贴出的是jetpack版本4.4的源
nano:

deb https://repo.download.nvidia.com/jetson/common r32.4 main

deb https://repo.download.nvidia.com/jetson/t210 r32.4 main

nx:

deb https://repo.download.nvidia.com/jetson/common r32.4 main

deb https://repo.download.nvidia.com/jetson/t194 r32.4 main

tx2:

deb https://repo.download.nvidia.com/jetson/common r32.4 main

deb https://repo.download.nvidia.com/jetson/t186 r32.4 main

Step2:安装 nvidia-l4t-gstreamer
更新:

sudo apt update

sudo apt install --reinstall nvidia-l4t-gstreamer

sudo apt install \
libssl1.0.0 \
libgstreamer1.0-0 \
gstreamer1.0-tools \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
libgstrtspserver-1.0-0 \
libjansson4=2.11-1 \
libgstrtspserver-1.0-dev \
libnvinfer7 \
libnvparsers7 \
libnvonnxparsers7 \
libnvinfer-plugin7
  1. deb安装:
sudo apt-get install ./deepstream-5.0_5.0.1-1_arm64.deb
  1. tar安装(如果是4.0,解压完后里面还有一个压缩包(binaries.tbz2),binaries.tbz2 解压到根目录)
sudo tar -xvf deepstream_sdk_v5.0.1_jetson.tbz2 -C /
cd /opt/nvidia/deepstream/deepstream-5.0
sudo ./install.sh
sudo ldconfig

5.4 CMake Error: The current CMakeCache.txt directory /workspace/tensorrtx/yolov5/build/CMakeCache.txt is different than the directory /home/zbsj2/projects/deploy/tensorrtx/yolov5/build where CMakeCache.txt was created. This may result in binaries being created in the wrong place. If you are not sure, reedit the CMakeCache.txt

CMakeCache.txt之前编译时留下的缓存,应该把build删掉重新mdir build 编译。

5.5 /workspace/tensorrtx/yolov5/yololayer.h:6:10: fatal error: NvInfer.h: No such file or directory

#include “NvInfer.h”

需要把tensorrt release版本下的include添加到系统环境变量

/workspace/tensorrt_release/include# cp -r NvInfer.h /usr/local/include/tensorrt/

5.6 Linking CXX shared library libmyplugins.so

/usr/bin/ld: cannot find -lnvinfer
collect2: error: ld returned 1 exit status

问题:系统环境变量缺少对应的lib

/workspace/tensorrt_release/lib# cp -r libnvinfer.so /usr/local/lib

得到生成的 libmyplugins.so yolov5

5.7 error while loading shared libraries: libmyelin.so.1: cannot open shared object file: No such file or directory

同样的道理,没有把对应的静态库添加到系统环境变量

解决:cp lib

得到产物yolov5s.engine

5.8 有未能满足的依赖关系。请尝试不指明软件包的名字来运行"apt --fix-broken install"

apt --fix-broken install

5.9 在转换.engine的时候 cannot execute binary file: Exec format error

yolov5的wts权重转成tensorrt的engine权重一定要注意的问题:版本匹配

5.10 执行tensorRT sudo: ./yolov5: command not found

重新编译build文件
tensorrtx/yolov5/目录下

编译代码

mkdir build
cd build
cmake ..
make

5.11 Segmentation Error

As team viewed communication, rm ~/Model//.cache and rm ~/.cache/gstreamer-1.0/ -rf resolved the segmentation issue.

rm ~/Model//.cache
rm ~/.cache/gstreamer-1.0/ -rf

参考来源:https://forums.developer.nvidia.com/t/segmentation-error/66166

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值