18

NVIDIA英伟达嵌入式系统 · 2022年09月20日 · 北京市

NVIDIA Jetson 系列文章(12):创建各种YOLO-l4t容器

YOLO(You Only Look Once)算法是近些年非常知名的深度神经网络结构,由于创始人在 v3 版本之后便宣布退出领域,于是从 v4 版之后便出现较多的分支,到 2022 年 8 月已经有 v5、v6 与 v7 与三大分支争奇斗艳,其中 v7 版是 v4 版的增强,由同一个团队进行开发与维护。

这个顶尖算法如果能再搭配 NVIDIA TensorRT 的辅助,就是名副其实的如虎添翼效果,因此也有非常多技术人员提供基于不同版本 YOLO 算法搭配 TensorRT 的推理项目,目前在 GitHub 上的相关开源项目数量已经达到三位数。

想利用 YOLO 算法开发自主项目的工程师,首要的工具就是要在几个不同版本之中挑选合适的神经网络,在这里并不对不同版本去做任何横向的比较,因为性能虽然很重要,但是这些优秀团队所提供的算法在精度 vs 性能之间的取舍效果是各有所长,并且依旧在不断改善之中,因此做对比是没有意义的。

至于哪种算法比较合适?最直接的方式就是搭建开发环境,实际操作过之后才能有所体会与理解。下面列出三个版本各自提供的 requirements.txt 文件,是配置环境所需要安装的 Python 相关库列表:

image.png

可以看到 YOLO v5 与 v7 的库内容几乎一致,甚至注解内容都一样,很明显感受到 v7 是基于 v5 的应用架构上修改算法内容。而 v6 虽然有些不同之处,但是核心库的内容也几乎与 v5 雷同,同样也应该是在 v5 的基础上进行修改。

传统的思路会在设备上使用 conda 或 virtualenv 等 Python 的虚拟环境去配置,透过复杂的环境变量设置,将不同应用进行隔离,来解决这些版本上的些微差异问题。

但是虚拟环境方法的严谨度不够,不仅出错率较高,并且移植性并不好,比较推荐的方式,就是利用合适的 Docker 镜像,为不同版本 YOLO 创建独立的开发或使用的容器环境,这样就能很轻松地在一台设备上同时启动操作多个 YOLO 版本,并且未来要将某个版本容器迁移或部署到其他设备上,操作过程也是非常简单的。

接下来的重点就是要挑选合适 Jetson 设备的 Docker 镜像,来作为搭建不同版本 YOLO 应用环境。经过简单整理分析之后,发现三种 YOLO 版本中有以下三个最主要共性,对环境的影响最为关键:

(1)以 PyTorch 作为训练模型与推理预测的框架:

在 NGC 里可以找到 l4t-pytorch 与 l4t-ml 两大系列镜像,是基于 Jetson 平台,并且预先安装好 Pytorch 训练框架,都可以列入选择。

(2)需要调用 OpenCV 视觉库:

在三个项目里的 requirements.txt 都有 “opencv-python>=4.x.y” 的内容,表示都会使用 “pip3 install” 安装 Python 版的 OpenCV 库,但是经过验证之后,发现这种安装 OpenCV 方式在 x86 平台是可行,但是在 Jetson 平台不能被正常调用。

(3)Python 必须 ≥ 3.7 版本:

熟悉 Jetson 设备的读者应该都知道,在 JetPack 4.x 版本都是配置 Ubuntu 18.04 操作系统,而 Python 版本最高到 3.6.9;目前 JetPack 5.0 版本则配置 Ubuntu 20.04 操作系统,Python 版本则为 3.8.x。

一种方式是选择基于 JetPack 4.x 环境创建的 r32.x.y 版本镜像,然后进入容器后升级 Python 版本至 3.7 以上,但是镜像内原本是以 Python 3.6 安装的库,升级之后就得全部在新版本重新安装,因此这种方式并不合适。

另一种方式是选择基于 JetPack 5.x 环境创建的 r34.x.y 版本镜像,里面已经安装好 Python 3.8 版本,剩下需要确认的,就是这个版本镜像在 JetPack 4.x 环境上是否能够正常操作?如果可以的话,这是目前最理想的选择!

经过上述三个条件的综合筛选,目前最佳方案是 NGC 上 r34.1.0 以上版本的 l4t-ml 系列镜像,也就是 l4t-ml:r34.1.x-py3 镜像。当然您也可以参考本系列前两篇 “从头创建 Jetson 的容器(1)(2)” 的操作步骤,自行从头创建合适的镜像。

1、准备工作:

接下来以 l4t-ml:r34.1.1-py3 镜像为基础,来执行这三个版本 YOLO 的环境配置任务,为了要更方便操作,请使用以下指令下载个别开源项目,以及创建个别的容器:

mkdir ~/yolo && cd ~/yolo
git clone https://github.com/ultralytics/yolov5 
git clone https://github.com/meituan/YOLOv6 
git clone https://github.com/WongKinYiu/yolov7 

现在就会在 ~/yolo 目录下生成 yolov5、yolov6 与 yolov7 三个目录,接下来可以使用变量方式来创建各自的容器:

export YOLO_VER=yolov5(yolov6、yolov7)
docker  run  -id  --name=$YOLO_VER --network host  --runtime nvidia  -w /home/yolo 
-v  /home/nvidia/yolo/$YOLO_VER:/home/yolo  nvcr.io/nvidia/l4t-ml:r34.1.1-py3
docker  exec  -it  $YOLO_VER  bash

这样就能为每个 YOLO 版本创建各自的独立容器,进行环境配置工作。为了节省国内用户安装 Python 相关库的时间,建议进入容器之后先执行以下步骤,使用国内 Python 源来提升下载速度:

pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/

此外,前面提过关于 OpenCV 部分的问题,由于 l4t-ml 镜像内已经好 OpenCV 环境,因此我们必须先把 3 个开源项目的 requirements.txt 里的 “opencv-python” 用 “#” 号进行关闭,否则会造成调用失败的问题。

2、调试 YOLOv5:

进入相关容器之后,只要执行以下指令就可以:

pip3  install  -r  requirements.txt

安装完毕之后,执行以下指令测试:

python3  detect.py  --source  <自行提供的图片>

如果在 run/detect/expN 目录下生成推理的结果,就表示环境已经配置正常。

3、调试 YOLOv6:

这个版本需要将 cmake 从系统提供的 3.16.3 版本升级到 3.22 以上,在宿主机上可以使用 snap 方式去安装,但是在 Docker 容器里面无法使用,因此最直接的方式就是用源码进行编译,执行指令如下:

wget https://github.com/Kitware/CMake/releases/download/v3.24.0/cmake-3.24.0-linux-aarch64.sh 
chmod +x cmake-3.24.0-linux-aarch64.sh  &&  ./cmake-3.24.0-linux-aarch64.sh 
cp  cmake-3.24.0-linux-aarch64/bin/cmake  /usr/bin
ln -s  $PWD/cmake-3.24.0-linux-aarch64/share/cmake-3.24/  /usr/share/cmake-3.24 

完成 cmake 版本升级之后,同样执行以下指令进行安装:

pip3  install  -r  requirements.txt

安装完毕之后,执行以下指令测试:

python3  tools/infer.py  --weights  yolov6s.pt  --source  <自行提供的图片>

如果在 run/inference/exp 目录下生成推理的结果,就表示环境已经配置正常。

4、调试 YOLOv7:

这个版本比 v5 多了几个元素,

apt  update  &&  apt  install  -y  zip  htop  screen  libgl1-mesa-glx
pip3  install  seaborn  thop
pip3  install  -r  requirements.txt

安装完毕之后,执行以下指令测试:

ython3 detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source <自行提供的图片>

如果在 run/inference/expN 目录下生成推理的结果,就表示环境已经配置正常。

以上使用 l4t-ml:r34.1.1-py3 镜像去创建 YOLO v5 / v6 / v7 应用环境的方式,目前在 JetPack 4.6.x 与 JetPack 5.0 版本上都能正常执行,这是个最轻松的方式。

至于未来要再配合 TensorRT 加速引擎的使用,也推荐使用 l4t-ml:r34.x.y-py3 镜像,为个别项目创建独立的容器,这样可以在 Jetson 设备上同时创建更多的独立开发环境,对于 Jetson Orin 与 Jetson AGX Xavier 这类计算资源较充沛的设备来说,就可以作为一个开发服务器使用,非常方便。

推荐阅读
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息