配环境配不出来?别苦着脸嘛,过来喝一杯吧。
如果你是初学者,请务必保证所有版本号和本文的一致!
本文写于2023年8月,各部分版本号如下:
1.1 前言
前段时间做无人机集群目标跟踪的比赛,需要在5台英伟达的jetson NX上都配置yolov8环境。我们首先配好了CPU版本的torch环境,虽然配环境十分轻松,但CPU版本torch的yolov8运行帧率只有1~2帧。
而在配置GPU版本torch的yolov8环境的过程非常坎坷,但经过一番摸索,在5台NX上都非常顺畅地配置完成了yolov8环境的配置。故把踩过的坑在此记录,分享给大家以供交流。
另外,我之前对jetpack,torchvision,pycuda,tensorRT等理解不是很清晰,很多时候配好了都不知道这东西是用来干啥的。对此,本文每配一个东西我也会说明其概念和作用。
本篇教程不会把需要运行的命令一条一条全部列出来,取而代之的是更多的文字描述与原理解读。我自认为逻辑非常清晰,读者跟随逻辑完全可以完成安装,读者只需要带点脑子即可。也许很多读者配环境的时候不看任何文字说明,把作者给出的指令逐行复制了事(我之前就是这样)。这个习惯很不好。作者会在文字说明中陈述很多细节,请认真读。
注意:如果你需要在NX上安装ros或ros2,那么不要使用conda!!!ros与conda的兼容性十分糟糕,亲测ros2与conda兼容性更差,甚至连编译都过不去。请在NX原生python环境下安装yolov8环境。
观看本教程之前,最好满足以下条件:
1.2 安装Jetpack
Jetpack是专供英伟达的嵌入式计算平台使用的人工智能包。这个官方定义现在理解起来有点抽象,咱们安装好之后,大家就知道他是什么了。
首先,安装jtop,这是一个监控CPU,GPU等使用情况的工具。
sudo pip install jetson-stats
然后,安装JetPack:
sudo apt install nvidia-jetpack
安装完JetPack后,命令行输入jtop并运行,即可看到当前电脑的CPU运行状态,按数字键可以切换页面,切换到INFO页面,可看到已经安装好的包:
jtop运行后的INFO界面
可以发现,当前你的NX已经安装好了很多难装的底层库:Cuda,cuDNN, TensorRT, OpenCV。这下可能你大致明白了咱们的定义:
Jetpack是英伟达提供的专门供他自己的嵌入式计算平台使用的人工智能包。
这句话是什么意思了,意思就是Jetpack把人工智能开发常用的底层驱动和库一股脑给你打包好,你安装了Jetpack,就把这几样东西都安装上去了。
注意:上图opencv的版本后有“with CUDA NO”的字样,说明opencv也有支持GPU加速的版本,但是默认安装的opencv不支持GPU加速(pip也只能安装cpu版本的opencv)。由于作者的项目不涉及太多的opencv操作,配置GPU版本的opencv对整体性能影响不大,所以作者没有深入研究,如果需要安装支持GPU加速的opencv,需要将原opencv卸载,并通过源码编译安装,在cmake阶段指定相应cuda配置,即可编译出支持cuda加速的opencv。读者可自行百度解决。
后文不会再提及cuda,cudnn,opencv的安装。
1.3 安装torch
torch应该不需要介绍了,为了方便,一般大家都把pytorch直接叫做torch,初学者看见不要觉得奇怪就行。
安装torch,参考官方链接,所有命令均参考官网的即可。
Installing PyTorch for Jetson Platform - NVIDIA Docs
https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html
官网中需要运行的指令都在这个图片里,请自行前往官网复制。再往后的指令就不用管了。
注意中间的两个 “export TOUCH_INSTALL=.......” 只运行上面这个https:// 的就行,仔细看两眼英文叙述都能懂。
英伟达官网在NX上安装pytorch的步骤
大致流程解读:
1.4 安装torchvision
torchvision是torch的一部分,可以理解为用torch实现了一份常用的基础的网络框架和工具类,你拿来就能用,不用自己写了。每个版本的torch都会有自己对应版本的torchvision,一般装错版本就意味着不好使。torchvision 版本对应关系如下:
torch与torchvision的版本对应关系
通过pip安装的torchvision只是CPU版本的,版本只显示0.15.1。这个是无法调用jetson底层的cuda加速的。GPU版本的torchvision只能通过编译进行安装。编译安装的torch版本号显示为“0.15.1a0+42759b1”(“版本号+巴拉巴拉一堆数”),说明你安装的是支持jetson上的cuda加速的。
下载torchvision源码并构建安装的方法如下:
git clone --branch v0.15.1 https://github.com/pytorch/vision torchvision
cd torchvision
python3 setup.py install --user
亲测NX很可能编译了一半就内存爆了然后卡死,可重复运行安装脚本,卡死之前的安装进度会被保留,多运行几次就可以安装成功了。
最后在命令行进入python,检测是否安装成功:
import torch
import torchvision
torch.__version__
torchvision.__version__
torch.cuda.is_available()
torch.__version__和torchvision.__version__均会输出“版本号+巴拉巴拉一堆数”,如下图所示,这就说明你安装gpu版本的torch和torchvision成功了。如果你是初学者,请务必保证所有版本号和本文的一致。
在命令行中检测torch和torchvision安装情况(拍屏带师)
1.5 安装pyCUDA
pyCUDA是一个python库,让访问 NVIDIA 的 CUDA 并行计算API更容易。我的理解是:如果你是初学者,只是使用yolov8做基础的训练和预测,是不需要管python如何访问cuda的,这些东西torch都帮你做好了。而如果你使用torch实现自己的网络架构,或者需要使用到tensorRT做加速,可能需要用到pyCUDA库做一些底层的操作。总之,对于初学者,不太需要关心这个库。本文一并安装,有备无患。
pip3 install Cython
pip3 install pycuda --user
注:没梯子的加清华源:【】
说到tensorRT加速,其运行速度比GPU版本的torch又快了一个数量级,但是水很深,建议新手不要尝试。CSDN上的文章写的乱七八糟的,我研究两天连个demo都没跑通,对于新手来说,GPU版本的torch帧率一般已经够高了(20Hz左右)。
如果有想法,推荐跟着深蓝学院的这个教程学上一个月:
https://www.shenlanxueyuan.com/course/624?source=1
1.6 安装yolov8
onnx也是python的一个库,可以将torch的网络模型打包成一种通用的网络模型格式,方便其他神经网络框架直接调用网络模型和网络参数进行forward前向预测。
ultralytics库就是yolov8的库了,ultralytics是发布yolov8的公司的名字。
pip install onnx==1.4.1
pip install ultralytics
注:没梯子的加清华源:【】
1.7 巨坑,重点!!!
安装完 ultralytics 之后,pip 会报错:pandas 和 matplotlib 要求的 numpy 版本过高,如下图:
注意,这是个大坑,如果不处理好numpy版本问题,可能即使torch和torchvision的版本完全正确,yolo运行还是会报错。而解决这个问题之后,一般就好使了。 此时把他们都卸了即可:
pip uninstall pandas
pip uninstall matplotlib
当然,如果你有别的需求真的需要用到这两个库,你可以重新装一下这两个库的较低版本,具体版本要求可参考github上ultralytics官方仓库的pip依赖文件:
https://github.com/ultralytics/ultralytics/blob/main/requirements.txt
yolov8官方仓库的requirements.txt中对这两个库的版本要求
1.8 最终测试
随便写了个代码测试一下。
import cv2
from ultralytics import YOLO
# 导入 YOLOv8 模型
model = YOLO('【你自己的模型文件的路径】')
# 打开视频文件
video_path = "【你自己的测试视频的路径】"
cap = cv2.VideoCapture(video_path)
while cap.isOpened():
success, frame = cap.read()
if success:
results = model(frame)
annotated_frame = results[0].plot()
cv2.imshow("YOLOv8 Inference", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()
你需要准备一个yolov8的模型文件(.pt 文件),点击以下链接下载,下载后和代码放入同一文件夹下。
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt
还需要准备一个测试视频,这个自己夏姬八准备一下就行了,也和代码放入同一文件夹下。
最后这个文件夹下应该有这三个东西:
需要放在同一文件夹下的三个文件
Yolo,启动!
亲测在NX上运行,网络预测一帧只需要20~30ms左右,由于USB摄像头读取也需要一定的时间,最终帧率可以达到10~20Hz,满足要求,赢!
可惜最后比赛输了,输麻了。
——sytnocui 2023/8/3