Jetson搭载的Ubuntu是英伟达定制的,在官方Ubuntu的基础上已经安装好了CUDA和tensorrt等。如果使用虚拟机Ubuntu或者官方的Ubuntu,需要自己安装CUDA等配置。
一、换源
每个Linux的发行版,比如Ubuntu,都会维护一个自己的软件仓库,我们常用的几乎所有软件都在这里面。这里面的软件都能使用apt或者apt-get命令安装。这个仓库就是源,源列表里面都是一些网址信息,这每一条网址就是一个源,这个地址指向的数据标识着这台源服务器上有哪些软件可以安装使用。Ubuntu系统自带的源都是国外的网址,国内用户在使用的时候网速比较慢。一个软件的下载是十分痛苦的,所以需要把源换为国内的源,如清华源、阿里源。
参考链接:Ubuntu换源https://blog.csdn.net/qq_35451572/article/details/79516563?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166134771416781432934259%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166134771416781432934259&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-79516563-null-null.142^v42^pc_rank_34_queryrelevant25,185^v2^control&utm_term=Ubuntu%E6%8D%A2%E6%BA%90&spm=1018.2226.3001.4187
二、apt-get指令
使用apt-get指令可以直接从软件仓库里直接下载(需联网)。如果不换源,下载的过程非常慢,如果换成国内源网速就飞快了。apt-get不仅可以下载安装软件,还有很多其他的功能。
apt-get命令大全:
sudo apt-get update //更新仓库
sudo apt-get upgrade //更新升级所有软件
sudo apt-get upgrade 软件名// 更新某个软件
sudo apt list --upgradable //列出可更新的软件
sudo apt-get dist-upgrade//升级系统版本(Ubuntu的升级)
sudo apt-get install 软件包名 //安装一个软件包
sudo apt-get remove package //删除一个软件包
三、 dpkg指令
有时不方便使用apt-get指令安装, 需要自己去软件官网下载安装包,安装包大多是deb格式文件,在安装包所在的目录打开终端,使用dpkg命令就可以安装。dpkg指令大全:(package是具体的文件名)
dpkg -i package.deb:安装一个 Debian 软件包,如手动下载的文件。
dpkg -c package.deb:列出 package.deb 的内容。
dpkg -I package.deb:从 package.deb 中提取包信息。
dpkg -r package:移除一个已安装的包。
dpkg -P package:完全清除一个已安装的包。和 remove 不同的是,remove 只是删掉数据和可执行文件,purge 另外还删除所有的配制文件。
dpkg -L package:列出 package 安装的所有文件清单。
dpkg -s package:显示已安装包的信息。
dpkg-reconfigure package:重新配制一个已经安装的包,如果它使用的是 debconf (debconf 为包安装提供了一个统一的配置界面)。
dpkg -S package:查看软件在哪个包里
四、依赖关系
大部分软件直接安装就好,但有些软件需要依赖其他一些软件来运行,这就是依赖关系,而你的电脑里没有相关的支持软件,Ubuntu就会提示缺少依赖关系。比如你要安装A软件,Ubuntu提示缺少依赖包B,于是你再安装B,然后又提示缺少依赖包C,于是你再安装C,又提示你缺少依赖包D……这就是依赖循环问题,这时就需要dpkg指令来处理这些依赖关系。
dpkg安装deb包时缺少依赖关系解决办法:
使用或者sudo apt-get -f install来修复,-f参数用来解决包依赖的问题,修复完之后再使用dpkg安装:sudo dpkg -i XXX.deb,-i参数的意思是安装软件包
五、pip强制安装
使用pip install指令时,系统会提示已经存在该软件,但不是你需要的版本,这就要用到--force-reinstall,具体方法如下,以PyYAML为例,
sudo pip3 install PyYAML==5.4.1
强制安装5.4.1版本的PyYAML,如果不指定版本,默认安装最新版本。
六、搭建yolo环境
与windows搭建conda环境类似,Linux平台的conda叫archiconda。使用conda创建一个python3.6或3.7的环境。搭建yolov5环境主要参考:yolov5 部署jetson nano(通用) 保姆级教学https://blog.csdn.net/weixin_44312422/article/details/122256752
问题1 在虚拟环境中安装好torch和torchvision后,测试torch是否能用,在虚拟环境中打开python,输入
import torch
提示非法指令,核心已转储。这是因为jetson自带python环境,这个环境里自带numpy-1.13.3,安装的torch里面也带一个numpy,版本是1.19.1,调用torch时产生冲突(具体原因参考)链接https://blog.csdn.net/qq_43711697/article/details/119081630?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166135060916782248548873%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166135060916782248548873&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-119081630-null-null.142^v42^pc_rank_34_queryrelevant25,185^v2^control&utm_term=%E9%9D%9E%E6%B3%95%E6%8C%87%E4%BB%A4%20%28%E6%A0%B8%E5%BF%83%E5%B7%B2%E8%BD%AC%E5%82%A8%29&spm=1018.2226.3001.4187
解决办法:卸载torch中的高版本numpy,重装一个低版本的(如1.13.3)。具体步骤:进入我们的conda环境,输入pip list,会显示这个环境里所有软件包及其版本,我们发现numpy版本是1.19.5,然后卸载掉它:
pip uninstall numpy
然后安装指定版本
pip install numpy==1.13.3
完美解决非法指令问题。无论执行什么指令,只要出现非法指令问题,大概率就是环境中的numpy版本太高,降版本就OK了。
问题2 继续跟着博客的教程走,到这一步:pip install -r requirements.txt 。requirements.txt是一个软件列表,上面列出了yolov5所需要的所有软件包及其版本要求,执行这条命令后,会依次自动安装。其中安装matplotlib时,飘一大片红,主要的错误是Command errored out with exit status -4。网上只有Command errored out with exit status -1的解决办法,不适用。这个错误可能只出现在jetson上。经过摸索,仍然是numpy版本问题,可能在安装requirements.txt里面某一条软件时自动安装了最新版numpy。于是我又重装了numpy1.19.4。在执行pip install -r requirements.txt时,matplotlib安装失败就会被跳过,重装numpy后,可以单独pip安装matplotlib,不必再执行pip install -r requirements.txt了。
七、TensorRT部署
如果能成功运行detect.py,说明yolov5环境已经搭建好了。可以进行tensorrt部署了。jetson自带tensorrt,如果使用的官方ubuntu,需要单独安装tensorrt,最好安装tensorrt7甚至更低版本,如果安装tensorrt8后面onnx转trt会出问题。部署主要参考在Jetson设备Xavier上使用TensorRT加速yolov5问题https://blog.csdn.net/weixin_46716951/article/details/123742902
问题1 tensorrtx/yolov5/yololayer.h中19行要改为自己的类别数和图像尺寸,否则wts文件转engine文件时会报 yolov5: /home/nvidia/tensorrtx/yolov5/yolov5.cpp:243: void APIToModel(unsigned int, nvinfer1::IHostMemory**, bool&, float&, float&, std::__cxx11::string&): Assertion `engine != nullptr' failed.
问题2 Cmake需要自己安装,具体指令
sudo apt-get install cmake
问题3 make指令可以尝试换成make -j4,后者使用多核处理,速度更快,可能与处理器有关。