Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

项目介绍:在 Jetson 平台上利用 DeepStream 处理多路视频源,并实现自己训练的 YoloV5 模型的部署。

文章目录

前言

之前在 dGPU 平台的 DeepStream-5.1 上部署过 YoloV5 模型,本以为在 Jetson 平台上使用 DeepStream-6.0.1 也可以复刻之前的过程,但是没想到是步步都踩坑,而且坑坑不一样!因此,记录下来最终成功的方法以及在部署过程中踩到的一些坑。

项目中各模块版本:

平台dGPUJetsonCUDA10.210.2Pytorch11.1.01.8.0torchvison0.12.00.9.0YoloV56.06.0JetPack-4.6.1DeepStream-6.0.1

  1. YoloV5 模型训练自己的数据集

YoloV5 在工程的应用上确实很方便,具体的使用方法在项目中也写的很清楚,在目前的不同平台上的多次使用中均未碰到问题。其中,YoloV5 的 6.0 和 6.1 版本都可以通过其 export.py 文件直接生成 TensorRT 的引擎文件 .engine,但是 dGPU 平台生成的 .engine 文件不能在 Jetson 平台上使用,而我在 Jetson 平台上生成的 .engine 文件也不能部署成功,还有待进一步研究。

YoloV5 在不断地更新中,目前已经更新至 6.1 版本,之前出现过权重文件的兼容问题。所以,建议基于对应 Release 版本的预训练权重文件训练自己的数据集,并且对训练出来的权重文件标明版本号。

YoloV5 项目地址:https://github.com/ultralytics/yolov5

训练自己的数据集可以在 dGPU 平台上完成,本节的内容全部在 dGPU 平台上完成。

1.1 建立自己的数据集

YoloV5 官方的实现方式是基于 Pytorch 架构,可以使用 roboflow 建立自己的数据集。

1.1.1 开始之前

Anaconda 创建新的虚拟环境

dGPU 平台的操作都将会在 Anaconda 创建的虚拟环境中进行。

conda create -n yolo.v5 python=3.9
conda activate -n yolo.v5

dGPU 平台安装 Pytorch

检查 YoloV5 的版本,并且根据版本需求安装 Pytorch 平台的版本。

Pytorch 官网提供简单明了的安装方法,dGPU 平台推荐使用 Anaconda 安装,并且在 Anaconda 建立虚拟环境训练自己的数据集。
其中 torchvision 和 pytorch 之间有严格的版本对应关系,可以在 Pypi 官网的 torchvison 中查看两者的对应关系。


conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch

conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch-lts

dGPU 平台安装 YoloV5 基础环境

从 GitHub 克隆 repo 并且使用 pip 安装所需要的包,本次使用的 YoloV5 是 6.0 版本。

git clone -b v6.0 https://github.com/ultralytics/yolov5.git
cd yolov5
python -m pip install -r requirements.txt

1.1.2 roboflow 建立数据集

RoboFlow 的官方地址:https://roboflow.com/

创建 Project

在 roboflow 创建账户之后就可以建立公共 Project(免费用户只能建立公共项目和数据库),可以上传图片和标注、在线标注、生成数据集和在线训练。

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

; 采集图片

收集图片作为自己的数据库,并上传到 roboflow 建立数据库。
在边栏中选择 Upload 界面,直接选取图片文件夹和对应标注的文件夹,系统会根据文件名自动匹配图片和对应的标注。
同时,也可以上传未标注图片,并使用 roboflow 进行标注。

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

标注图片

上传图片成功后,边栏中进入 Dataset 界面,单击任意图片可以进入图片标注。

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

; 生成数据集

进入边栏的 Version 界面,单击 Create New Vision 开始生成数据库,进行四项设置便可以生成可以直接进行训练的数据集。

  1. Source Images,可以查看数据库中的所有图片、类别数量和标注情况。
    Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测
  2. Train/Test Split,可以按照需求对数据库中的图片划分 train、val 和 test 集,实现 Data Balance。
    Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测
  3. Preprocessing,对数据库的图片进行一些预处理,这里只进行 Auto-Orient 和 Resize。
    Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测
  4. Augmentation,按要求对图片进行处理,如旋转、裁切和风格变化等等,按需使用。
    Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测
  5. Generate,生成数据集。
    Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

导出数据集

当数据库成功生成后,可以导出数据集,单击 Export 并选择对应模型所需要的数据类型就可以生成最终的可训练数据库。数据集下载到本地后解压到数据库文件夹中,其中 data.yaml 一般作为访问数据库的入口,建议确定数据库的保存位置后,将 data.yaml 中训练集和验证集的路径改为绝对路径。

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

; 1.2 训练自己的数据集

1.2.1 选择模型

YoloV5 有多个大小不同的模型,根据项目需求和硬件平台条件选择不同的模型,本文以 YoloV5s 作为范例。

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

; 1.2.2 训练模型

YoloV5 的训练方法很简单,但是在开始训练前,需要先修改 yolov5/models/yolov5s.yaml,将参数 nc(Number of Classes)修改为个人模型要检测的类别数目,然后从 YoloV5 项目下载对应的预训练参数(需要下载 YoloV5 对应版本的预训练模型),开始训练。

cd yolov5

gedit models/yolov5s.yaml

wget https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.pt
mkdir weights
mv ./yolov5s.pt weights/

python3 train.py --data /path/to/your/dataset/data.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt

训练结果会保存在 /runs/train/exp/weights 中,将其移动到 YoloV5 的根目录下,并且重新命名。

cd yolov5
mv ./runs/train/exp/weights/best.pt ./yolov5s.pt
  1. 模型转换(重点)

之前踩了很多坑,这部分是重点,直接生成 .engine 文件的方法我尝试了很多种都不能成功,此方法不生成 .engine 文件,而是只需要生成 .cfg 和 .wts 文件即可,.engine 文件的生成交给 Jetson 平台的 Deepstream 自动完成。

模型转换可以在 dGPU 或者 Jetson 平台上完成,但是都必须使用相应平台的相关依赖,dGPU 平台的依赖在第一部分已经详细说明了,Jetson 平台的依赖在后文中会详细说明!建议在 dGPU 平台完成模型转换,只需要将转换的模型直接拷贝到 Jetson 平台就能运行,避免在 Jetson 平台上重复工作。

2.1 下载 DeepStream-Yolo 并提取模型转换程序

DeepStream-Yolo 是部署成功的重点,DeepStream 所需要的设置文件和相关的模型转换程序都可以提供。

git clone https://github.com/marcoslucianops/DeepStream-Yolo.git
cp ./DeepStream-Yolo/utils/gen_wts_yoloV5.py ./yolov5/

DeepStream-Yolo 项目地址:https://github.com/marcoslucianops/DeepStream-Yolo

2.2 模型转换

利用 gen_wts_yoloV5.py 程序将 .pt 权重文件转化为.cfg 和 .wts 文件,注意该程序有个 bug, 如果第一节最后训练生成的权重文件没有重命名成 yolov5s.pt 这样的通用名称,程序可能会因为名字报错,更改一下即可,可以在模型转换完成后更改为自定义名称。

cd yolov5
python gen_wts_yoloV5.py -c ./models/yolov5s.yaml -w yolov5s.pt
mv ./yolov5s.pt ./my_yolov5s.pt
mv ./yolov5s.cfg ./my_yolov5s.cfg
mv ./yolov5s.wts ./my_yolov5s.wts

至此,我们就可以得到最终的模型文件 my_yolov5s.cfg 和 my_yolov5s.wts,这两个文件可以在 dGPU 平台和 Jetson 平台通用。

  1. Jetson 平台的环境搭建(Jetson AGX Xavier)

本人使用的是 Jetson AGX Xavier 开发者套件作为边缘端部署平台。

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

; 3.1 烧录系统的准备

3.1.1 进入 Recovery 模式

  1. 将 Xavier 关机,确保 Xavier 处在关机状态
  2. 按住机身案件中间的 Recovery 键 3 ~ 4 秒
  3. 不松开 Recovery 键,同时按下 Power 键开机,两个键同时按住 2秒以上后再松开
  4. Xavier 进入 Recovery 模式
  5. 通过按键旁边的 type-c 接口连接 Jetson AGX Xavier 和 Host 主机

3.1.2 Host 主机

Host 主机必须使用 Ubuntu 18.04,下载并安装 JetPack SDK Manager,下载需要 NVIDIA 账户,JDK Manager 可以安装不同版本的 JetPack,本文使用的是 JetPack-4.6.1。

sudo dpkg -i sdkmanager_x.x.x-xxxx_amd64.deb

3.2 烧录系统

打开 SDK Manager 后,需要登录NVIDIA 账户,登录成功后可以看到连接到 Host 主机的 Jetson AGX Xavier,如果没有看到,重复3.1.1 中的过程,一切就绪后开始基本设置。

3.2.1 选项设置

建议不要勾选 Host Machine 选项(可以节省时间),选择 JetPack 版本,选择是否安装对应 JetPack 版本的 DeepStream,本文的基本设置如下:

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测
点击 CONTINUE 进入第二步后,可以配置安装的组件,主要为两部分:
  1. Jetson OS:生成系统镜像,并向 Jetson AGX Xavier 烧录系统,该系统为 Ubuntu 18.04(NVIDIA 定制),架构为 aarch64。
  2. Jetson SDK Components:各种推理部署组件,主要会安装 CUDA、CUDNN、TensorRT、OpenCV 和 DeepStream,可以展开后查看详细内容。

同意协议后开始,点击 CONTINUE 开始安装,此时会要求输入 Host 主机的用户密码,如果之前未下载过相关组件,会自动开始下载组件,下载完成后自动开始安装,如果 Host 主机下载过 JetPack,可以直接开始安装。

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测
Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

; 3.2.2 配置 Jetson AGX Xavier 的基本信息

弹出该页面后开始安装设置,并配置 Jetson AGX Xavier 的用户名和用户密码,本文选择设置方式为 Manual Setup,用户名为 nvidia,密码为 nvidia(实验使用,工程部署请勿使用弱密码)。

点击 Flash,开始烧录系统。

如果报错,显示设备没有进入 Recovery 模式,请直接重复 3.1.1 过程,然后点击 Retry 即可。

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测
系统烧录完成后,当弹出该页面后,暂时不要开始安装 SDK 组件,停止主机操作,为 Jetson AGX Xavier 连接显示器、键盘和鼠标,进入 Jetson AGX Xavier 的系统中,用户名为 nvidia,密码为 nvidia,这两项是在烧录系统时设置的。
Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

3.3 进入系统

在进一步安装 Nvidia 提供的各项 SDK 之前,需要先进入系统,对系统进行更新,并按照个人的需求对系统进行设置。

3.3.1 配置软件源

将系统的软件源更换为国内的镜像源,使用的镜像为 ubuntu-ports。
清华大学开源软件镜像站:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu-ports/

cd /etc/apt/
sudo cp sources.list sources.list.save
sudo gedit sources.list

将 sources.list 中的内容全部替换为以下内容:


deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse

对系统的组件进行更新:


sudo apt-get update && sudo apt-get upgrade -y

sudo apt-get autoremove
sudo apt-get autoclean

3.3.2 安装 PIP

安装 PIP,并且更改 PIP 的软件源为国内镜像源。

sudo apt-get install python3-pip

python3 -m pip install --upgrade pip
python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

3.4 通过 JetPack SDK Manager 安装 SDK

当 Jetson AGX Xavier 的系统设置完成后,重新回到 Host 主机,开始 SDK 中组件的安装,输入用户名和密码,开始安装。
如果显示无法连接,进入 Jetson AGX Xavier 系统中查看 SSH 服务是否安装并开启,如果没有,请安装 SSH 服务器端!

sudo apt-get install openssh-server

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测
安装完成!
Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测
  1. 在 Jetson AGX Xavier 平台上使用 YoloV5

原文地址:https://cognitivexr.at/blog/2021/03/11/installing-pytorch-and-yolov5-on-an-nvidia-jetson-xavier-nx.html
从这一步开始,所有操作均在 Jetson AGX Xavier 上完成!

4.1 安装库和依赖

基于 Pytorch 的 YoloV5 需要以下库和依赖:

  • numpy
  • pandas
  • scipy
  • scikit-image
  • matplotlib
  • seaborn
  • opencv-python

其中,Opencv 在安装 JetPack 时就已经安装在了系统中,无需再次安装。

除此之外,还有一些依赖需要更新到最新版本:

  • numpy: 1.13 (current 1.19.5)
  • matplotlib: (latest usable with Python 3.6 is 3.3.4)
  • pandas: 0.22.0 (current 1.1.5)
  • scipy: 0.19.1 (current 1.5.4)

4.1.1 安装基本的依赖库

sudo apt install -y python3-pip python3-venv python3-dev libpython3-dev
sudo apt install -y libopenblas-base
sudo apt install -y gfortran libopenmpi-dev liblapack-dev libatlas-base-dev

4.1.2 安装 Cython

python3 -m pip install Cython

4.1.3 升级 PIP 和 Protobuf

python3 -m pip install --upgrade pip
python3 -m pip install --upgrade protobuf

4.1.4 升级科学计算库

python3 -m pip install --upgrade numpy
python3 -m pip install --upgrade pandas

4.1.5 更新 matplotlib 到 3.3.4 (matplotlib 3.4 需要 python>=3.7)

这里之前尝试过多次 pip3 install matplotlib,都出现无法安装和编译的情况,但是按照本文的写法,一次成功。

python3 -m pip install "matplotlib==3.3.4"

4.1.6 更新 scipy (安装时间较长)

python3 -m pip install --upgrade scipy

4.1.7 更新 scikit-image (安装时间较长)

python3 -m pip install sklearn scikit-image

4.2 安装 Pytorch 以及 torchvison(重点)

部署的难点之一在于 torch 和 torchvision 的安装,Pytorch 为 Jetson 平台提供了专门的版本,在 Jetson ZooNvidia Forums 中都可以找到,安装其他非 Jetson 版本的 Pytorch 也可以成功安装不报错,但是后续部署均不成功。而且,目前安装包只提供 Python 3.6 的版本,其他版本 Python 暂时无法使用。

Jetson Zoo 官方地址:https://www.elinux.org/Jetson_Zoo
Nvidia Forums官方地址:https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-10-now-available/72048

4.2.1 安装 Pytorch

建议通过上方提供的地址直接下载 pytorch 的安装包,两者提供的包是同一个地址来源,没有任何差别。使用 wget 命令的过程中存在无法下载的问题,但是通过浏览器下载则可以成功。本文安装的版本是 Pytorch-1.8.0。


python3 -m pip install -U future psutil dataclasses typing-extensions pyyaml tqdm seaborn

wget https://nvidia.box.com/shared/static/p57jwntv436lfrd78inwl7iml6p13fzh.whl -O torch-1.8.0-cp36-cp36m-linux_aarch64.whl

python3 -m pip install torch-1.8.0-cp36-cp36m-linux_aarch64.whl

安装完成后,查看 pytorch 是否检测到系统中的 CUDA。

python3 -c 'import torch; print(torch.cuda.is_available())'

如果返回结果为 True,则 pytorch 已经检测到了系统中的 CUDA。

注意:这里会报错 Illegal instruction (core dumped),其他不走也有可能报这个错误,解决方法是编辑用户根目录下的 .bashrc 文件,在最后一行添加 export OPENBLAS_CORETYPE=ARMV8。

gedit .bashrc

export OPENBLAS_CORETYPE=ARMV8
source .bashrc

4.2.2 安装 torchvison

torchvision 和 pytorch 之间有严格的版本对应关系,可以在 Pypi 官网的 torchvison 中查看两者的对应关系,目前的对应关系如下:

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测
本文使用的是 Pytorch-1.8.0,对应的 torchvison 版本为 torchvison-0.9.0,请按照以下方法编译安装,直接通过 PIP 安装存在 YoloV5 报错无法使用的情况。

sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev
python3 -m pip install --upgrade pillow

git clone --branch v0.9.0 https://github.com/pytorch/vision torchvision

cd torchvision
export BUILD_VERSION=0.9.0
python3 setup.py install --user

cd ..

4.3 测试 YoloV5

wget -q https://github.com/pjreddie/darknet/raw/master/data/dog.jpg
python3 -c "import torch
import cv2
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
model = model.cuda()
img = cv2.cvtColor(cv2.imread('dog.jpg'), cv2.COLOR_BGR2RGB)
pred = model(img, 320 + 32 * 4)
for obj in pred.xyxy[0].cpu().numpy():
    xyxy, conf, label = obj[:4], obj[4], pred.names[int(obj[5])]
    print(xyxy, '%s (conf=%.2f%%)' % (label, conf*100))"

结果为:

[ 130.96 220.09 311.58 538.49] dog (conf=87.70%)
[ 126.34 133.22 565.66 423.71] bicycle (conf=82.05%)
[ 467.74 76.326 692.75 171.35] car (conf=56.09%)
[ 466.57 77.787 692.83 175.51] truck (conf=52.34%)

成功后,YoloV5 的依赖环境就全部安装成功,克隆 YoloV5-6.0 就可以正常使用 YoloV5 了。

git clone -b v6.0 https://github.com/ultralytics/yolov5.git
cd yolov5

  1. 在 Jetson AGX Xavier 平台上使用 DeepStream 实现目标检测

原文地址:https://blog.csdn.net/djj199301111/article/details/123628292
尝试了很多个版本,最终是基于 DeepStream-Yolo 实现了部署,可以提供DeepStream 所需要的配置文件。2. 模型转换中的工作也可以此时在 Jetson AGX Xavier 上的 YoloV5 中完成,步骤同样,最终都需要生成 my_yolov5s.cfg 文件和 my_yolov5s.wts 文件。到这一步时,默认所有模型已经转换成功,得到了 my_yolov5s.cfg 文件和 my_yolov5s.wts 文件。

5.1 部署 DeepStream-Yolo

DeepStream-Yolo 项目地址:https://github.com/marcoslucianops/DeepStream-Yolo
需要从 GitHub 克隆 repo,并且移动到 DeepStream 的Source 文件夹下。

git clone https://github.com/marcoslucianops/DeepStream-Yolo.git

cp -r ./DeepStream-Yolo /opt/nvidia/deepstream/deepstream/source

编译 nvdsinfer_custom_impl_Yolo 文件夹下的文件,才能正常使用 DeepStream-Yolo,在编译前,修改部分参数:

  • Makefile:CUDA_VER?=10.2
cd /opt/nvidia/deepstream/deepstream-6.0/source/DeepStream-Yolo
make -C nvdsinfer_custom_impl_Yolo

将 my_yolov5s.cfg 文件和 my_yolov5s.wts 文件 拷贝到 DeepStream-Yolo 的根目录下,即可完成 DeepStream-Yolo 所有的部署。

5.2 修改配置文件

修改配置文件,DeepStream 就可以实现不同的功能。

5.2.1 deepstream_app_config.txt 文件

主配置文件为 deepstream_app_config.txt,主要负责 DeepStream 视频读取和显示的。

显示 UI 的控制

rows 和 columns 控制最终显示的布局,这里 1 × 1 就是最终显示 1 路,如果是 3 × 2 就是三行两列的布局显示 6 路视频。
其中,width 和 height 是分辨率。

[tiled-display]
enable=1
rows=1
columns=1
width=1920
height=1080
gpu-id=0
nvbuf-memory-type=0

输入视频控制

控制视频输入来源,可以设置多个 source 实现多路视频流的读取,通过 type 确定视频流的类型和读取方式,还可以通过 num-sources 对同一路视频进行复制扩展。

[source0]
enable=1
type=3
uri=rtsp://admin:admin123@192.168.1.64/Streaming/CHannels/101?transportmode=unicast
num-sources=1
gpu-id=0
cudadec-memtype=0

输出方式控制

DeepStream 可以控制输出的方式,可以不输出结果、窗口显示和 RTSP 推流等方式。
同样可以使用多个 sink,通过不同的方式同时输出结果。

[sink0]
enable=1
type=2
sync=0
gpu-id=0
nvbuf-memory-type=0

修改模型配置文件路径

在文件 config_infer_primary_yoloV5.txt 中对模型的相关参数进行了设置,需要从主配置文件中加载。

[primary-gie]
enable=1
gpu-id=0
gie-unique-id=1
nvbuf-memory-type=0
config-file=config_infer_primary_yoloV5.txt

5.2.2 config_infer_primary_yoloV5.txt 文件

修改模型配置文件的路径,指向 my_yolov5s.cfg 文件和 my_yolov5s.wts 文件,运行时可以生成 my_yolov5s.engine 文件。

custom-network-config=my_yolov5s.cfg
model-file=my_yolov5s.wts
model-engine-file=my_yolov5s.engine

修改文件精度类型,是有模型决定的,本文使用的 FP16,并且按照检测的类别数量修改 num-detected-classes。

network-mode=2
num-detected-classes=1

5.2.3 labels.txt 文件

修改 labels.txt 文件中的类目名称和数量,保证所有配置文件中检测类别数目是匹配的。

5.3 运行

可以成功运行了!

deepstream-app -c deepstream_app_config.txt

Original: https://blog.csdn.net/weixin_44182190/article/details/124165093
Author: 秦至皆木
Title: Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/649911/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球