本文记录了一些博主在部署Jetson Xavier NX和配置CSI摄像头过程中遇到的一些坑,希望能够帮助到大家避开这些坑或是踩到同样坑的小伙伴们能够知道怎么解决。
首先介绍一下我的环境(均基于Jetpack4.6)
比较简单的查看方式是通过jtop查看,jtop类似nvidia-smi的功能(Jetson系列没有nvidia-smi)
(1)安装jtop
NX预装的python版本为2.7.17以及python3.6.9,直接终端输入:
sudo apt-get install python3-pip python3-dev
//接着将pip升级为最新版
python3 -m pip install --upgrade pip #升级pip
(2)Jtop进行内存/CPU/GPU监视
sudo pip install jetson-stats
sudo systemctl restart jetson_stats.service
sudo jtop
我的环境如下图所示:
主要关注jetpack、CUDA、cuDNN、OpenCV、TensorRT的版本
以下环境配置最好是在root用户下进行,因为YOLOv5在推理或者测试的时候都会在runs/val(或是detect)/下新建一个exp的文件夹(或者别的名字,可以修改)用来存放结果,而非root用户的话,会出现权限不够的问题。不过问题也不大,可以给runs文件夹增加权限就可以。(博主自己也是配置完了才发现这个问题)。
#给文件夹添加权限
chmod 777 runs
我的Jetson Xavier NX是通过Jetpack 4.6烧录的(烧录教程会在后续文档更新),因此默认cuda版本是:10.2,对应的pytorch版本为1.8.0,如果cuda版本和我的不一样,可以去pytorch官网看一下:
https://pytorch.org/get-started/previous-versions/。
由于Jetson Xavier NX是arm架构,需要下载相对应的torch,然后编译安装。附上一个我安装的torch:torch-1.8.0-cp36-cp36m-linux_aarch64.whl
百度网盘:
链接:https://pan.baidu.com/s/1UuTqBxg2uViguP_ruFod7Q
提取码:f9sz
(1) 安装pytorch
sudo apt-get install python3-pip libopenblas-base libopenmpi-dev
pip3 install Cython
pip3 install numpy torch-1.8.0-cp36-cp36m-linux_aarch64.whl
如果安装cython的时候有问题,可以试试:
apt-get install cython3
(2) 安装torchvision
torchvision与刚刚安装好的torch一定要一一对应,我整理了一份对照表供大家参考,我安装的是1.8.0的torch,因此对应的torchvision版本为0.9.0
torch | torchvision | python |
---|---|---|
1.9.0 | 0.10.0 | >=3.6 |
1.8.1 | 0.9.1 | >=3.6 |
1.8.0 | 0.9.0 | >=3.6 |
1.7.1 | 0.8.2 | >=3.6 |
1.7.0 | 0.8.1 | >=3.6 |
1.7.0 | 0.8.0 | >=3.6 |
1.6.0 | 0.7.0 | >=3.6 |
1.5.1 | 0.6.1 | >=3.5 |
1.5.0 | 0.6.0 | >=3.5 |
1.4.0 | 0.5.0 | ==2.7, >=3.5, <=3.8 |
1.3.1 | 0.4.2 | ==2.7, >=3.5, <=3.7 |
1.3.0 | 0.4.1 | ==2.7, >=3.5, <=3.7 |
1.2.0 | 0.4.0 | ==2.7, >=3.5, <=3.7 |
1.1.0 | 0.3.0 | ==2.7, >=3.5, <=3.7 |
<=1.0.1 | 0.2.2 | ==2.7, >=3.5, <=3 |
百度网盘:链接:https://pan.baidu.com/s/1dnXpIkXFRmm15-YAn1kVnA
提取码:auvg
cd torchvision
export BUILD_VERSION=0.9.0
sudo python setup.py install
(3) 测试torch和torchvision是否安装正确
python3
import torch
print(torch.cuda.is_available())
#返回值若为True,说明cuda和torch版本适配
#如果为False,则需要重新再检查一下版本对应问题
#同理,如果训练的时候,发现没有调用到GPU,也可以试试看返回值是不是True
import torchvision
print(torchvision.__version__)
#返回torchvision的版本
如果你直接 pip3 install matplotlib
你将会在一个非常漫长的等待之后,迎来一个报错,大致意思是缺少Freetype,
因此我们先安装Freetype,附上Freetype链接
链接:https://pan.baidu.com/s/1-Yws6RxOTPYK2iSp2LyEXQ
提取码:jhnf
cd freetype-2.9.1
./configure --without-zlib
make
sudo make install
#安装zlib1g-dev和libpng-dev,否则matplotlib还是会报错
sudo apt-get install zlib1g-dev
sudo apt-get install libpng-dev
# 重新安装matplotlib
pip3 install matplotlib
#漫长的等待....中间有报错也不要管,等到它完成了就好了
numpy的坑很有欺骗性,pip3 install很容易就装好了numpy,然而在实际运行时会报一种错误"非法指令 (核心已转储)"。
此类报错是因为装了2个numpy,引起版本冲突!!!
有小伙伴就会好奇,怎么会同时安装了2个numpy?
原因就是:
Jetson Xavier自带一个numpy且安装位置在/usr/lib/python3/dist-packages/,而通过pip3 安装的numpy安装在/home/username(这里指本机的名字)/.local/lib/python3.6/site-packages/里面,因此会同时存在两个版本的numpy。
而在python导入包的时候即import的时候,import的机制就是搜索sys设置的路径下是否存在相关包,而这时候sys.path显示出两个路径下都有numpy而且还是不同版本因此产生了冲突,显示import的路径的方法是python3 ;import sys ;print(sys.path)即可显示。
通过pip3只能卸载后安装的numpy(就是pip安装的,而删不掉自带的)
问题来了:自带的numpy版本太低,再装一个高版本的numpy又会引起冲突,该怎么办?
两种方式安装numpy,升级老的或者干掉老的
方式一:在原有的numpy基础上升级
优点:能用!且对老版本无影响,pip卸载后还是老版本。
缺点:在装Pillow、OpenCV的时候都有可能会对numpy有"干扰",动不动就覆盖安装了一个最新的numpy,导致又出现冲突。因此,需要先装其他包,最后升级numpy,避免影响。
(我选的就是这个方法)
注意:若选择此方法,先配置YOLOv5的环境,numpy最后再装!!
注意:若选择此方法,先配置YOLOv5的环境,numpy最后再装!!
注意:若选择此方法,先配置YOLOv5的环境,numpy最后再装!!
pip install numpy --upgrade
方式二:卸载原有numpy
优点:省心!直接干掉老版本,安装新版本无所顾虑
缺点:担心其他库对numpy的版本的限制
解决步骤: 要删除掉位于/usr/lib/python3/dist-packages/的版本为1.13.3的numpy, 并将/home/username(这里指本机的名字)/.local/lib/python3.6/site-packages/版本号为1.19.5的numpy替换成1.19.3版本
(此方式来源于网络,我也没试过)
在上述环境配置的基础上继续搭建YOLOv5的环境。
git clone -b v6.0 https://github.com/ultralytics/yolov5.git
pip3 install -r requirements -i https://mirror.baidu.com/pypi/sample
这里有个小坑,请大家看一下requirements.txt中torch版本,还有matplotlib。如果torch要求的版本比1.8.0更高,就注释掉,别覆盖安装了。matplotlib也要注释掉,以免有影响。剩下的就是numpy,选择第一种方式的小伙伴,记得在requirements.txt装完之后卸载numpy,以免引起冲突。(因为Opencv会默认下载最新的numpy)
等环境配置好后
python3 detect.py
python3 detect.py 第一次运行会下载yolov5s.pt的权重和字体,速度很慢
权重均可以在官网下载:https://github.com/ultralytics/yolov5/releases
可以试试–source=0,SCI摄像头是调用不到的,于是有了下面的步骤
git clone https://github.com/wang-xinyu/tensorrtx.git
TensorRT的版本要与YOLOv5要一致
转TRT主要参考https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5
这里不做赘述了,基本按着步骤来都能成功,没有坑
cd tensorrtx
cp yolov5/gen_wts.py ~/yolov5
cd ~/yolov5
python3 gen_wts.py yolov5s.pt
cd ~/tensorrtx/yolov5
mkdir build && cd build
mv ~/yolov5/yolov5s.wts ./
/yolov5 -s yolov5s.wts yolov5s.engine s #生成engine文件需要一段时间,请耐心等待
# 测试
./yolov5 -d yolov5s.engine ../samples
测试结果如下,这两张图片在文件夹里可以找到,终端可能不显示
终端显示fps,是有提升的
DeepStream将深度神经网络和其他复杂的处理任务引入到流处理管道中,以实现对视频和其他传感器数据的近实时分析。更具体地说,DeepStream是一组模块化插件,这些插件相连接以形成处理管道。每个插件代表一个功能块,例如,使用TensorRT进行推理或多流解码。
正常情况下,deepstream是随着Jetpack一起安装了的
可以先检查一下是不是已经有了
#检查一下有没有
cd /opt/nvidia/deepstream
如果没有,则按如下方式安装:
https /developer.nvidia.com/deepstream_sdk_v6.0.0_jetsontbz2
注意版本对应,Jetpack和deepstream对应
Jetpack | Deepstream |
---|---|
4.6 | 6.0 |
4.5.1 | 5.1 |
4.4.1 | 5.0 |
安装完成进入官方例程文件夹
cd /opt/nvidia/deepstream/deepstream-6.0/samples/configs/deepstream-app/
#测试一下
deepstream-app -c source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt
打开速度很慢,退出也很慢
等不及的话可以 ALT + F1强制退出
下载包,这个是5.0的,6.0也可以兼容
git clone https://github.com/DanaHan/Yolov5-in-Deepstream-5.0.git
或者也可以试试6.0:
https://github.com/marcoslucianops/DeepStream-Yolo
这个链接下有labels.txt,可以下载
cd Yolov5-in-Deepstream-5.0/Deepstream 5.0
把labels.txt放到这个文件夹下
进入config_infer_primary_yolovV5.txt 进行修改(最好先备份一下)
如果没有vim,可以通过apt-get install 安装
vim config_infer_primary_yoloV5.txt
#复制之前生成的引擎文件到当前目录
cp ~/tensorrtx/yolov5/build/yolov5s.engine ./
坑点:如果直接make会报错
#编译
CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo
生成libnvdsinfer_custom_impl_Yolo.so文件
修改deepstream_app_config_yoloV5.txt 这个文件(也是建议先备份)
主要是相机的色调、尺寸以及fps之类的参数
然后测试
LD_PRELOAD=./libmyplugins.so deepstream-app -c deepstream_app_config_yoloV5.txt