Jetson部署实践
- 一、模型开发
- 二、模型部署
- 三、推理结果输出
- 四、ssh设置
- 五、常见报错
- 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
- 5.2 github.com[0: 20.205.243.166]: errno=Connection timed out-bash: github.com[0:: command not found
- 5.3 DeepStream-bash: /usr/bin/deepstream-test1-app: cannot execute binary file: Exec format error
- 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
- 5.5 /workspace/tensorrtx/yolov5/yololayer.h:6:10: fatal error: NvInfer.h: No such file or directory
- 5.6 Linking CXX shared library libmyplugins.so
- 5.7 error while loading shared libraries: libmyelin.so.1: cannot open shared object file: No such file or directory
- 5.8 有未能满足的依赖关系。请尝试不指明软件包的名字来运行"apt --fix-broken install"
- 5.9 在转换.engine的时候 cannot execute binary file: Exec format error
- 5.10 执行tensorRT sudo: ./yolov5: command not found
- 5.11 Segmentation Error
本文实践部署主要的思路是将,我之前在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
- deb安装:
sudo dpkg -i deepstream-5.0_5.0.1-1_arm64.deb
- 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.engine
和tensorrtx/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
- deb安装:
sudo apt-get install ./deepstream-5.0_5.0.1-1_arm64.deb
- 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