原文地址:https://docs.ultralytics.com/yolov5/tutorials/running_on_jetson_nano/
使用 TensorRT 和 DeepStream SDK 在 NVIDIA Jetson 上部署
📚 本指南介绍了如何将经过训练的模型部署到 NVIDIA Jetson 平台中并使用 TensorRT 和 DeepStream SDK 执行推理。这里我们使用 TensorRT 来最大化 Jetson 平台上的推理性能。
硬件验证
我们已在以下 Jetson 设备上测试并验证了本指南
使用 Jetson Nano 模块构建的 Seeed reComputer J1010
Seeed reComputer J2021 使用 Jetson Xavier NX 模块构建
1.在你开始之前
确保您已在 Jetson 设备上正确安装JetPack SDK以及所有SDK 组件和DeepStream SDK,因为这包括本指南所需的 CUDA、TensorRT 和 DeepStream SDK。
JetPack SDK 为硬件加速的边缘人工智能开发提供了完整的开发环境。JetPack SDK 支持所有 Jetson 模块和开发套件。
有两种主要的安装方法,包括:
- SD卡镜像方式
- NVIDIA SDK管理器方法
你可以从NVIDIA官方网站找到非常详细的安装指南。您还可以找到与上述reComputer J1010和reComputer J2021对应的指南。
2.安装必要的软件包
- 步骤1.访问Jetson设备的终端,安装pip并升级
sudo apt update
sudo apt install -y python3-pip
pip3 install --upgrade pip
- 步骤 2.克隆以下存储库
git clone https://github.com/ultralytics/yolov5
- 步骤3.打开requirements.txt
cd yolov5
vi requirements.txt
- 步骤 4.编辑以下行。这里需要先按i进入编辑模式。按ESC,然后输入:wq保存并退出
# torch>=1.8.0
# torchvision>=0.9.0
注意:目前不包括 torch 和 torchvision,因为它们将在稍后安装。
- 步骤5.安装以下依赖项
sudo apt install -y libfreetype6-dev
- 步骤 6.安装必要的软件包
pip3 install -r requirements.txt
3.安装 PyTorch 和 Torchvision
我们无法从 pip 安装 PyTorch 和 Torchvision,因为它们不兼容在基于ARM aarch64 架构的 Jetson 平台上运行。因此,我们需要手动安装预构建的 PyTorch pip Wheel 并从源代码编译/安装 Torchvision。
访问此页面可访问所有 PyTorch 和 Torchvision 链接。
以下是 JetPack 4.6 及更高版本支持的一些版本。
PyTorch v1.10.0
由 JetPack 4.4 (L4T R32.4.3) / JetPack 4.4.1 (L4T R32.4.4) / JetPack 4.5 (L4T R32.5.0) / JetPack 4.5.1 (L4T R32.5.1) / JetPack 4.6 (L4T R32.6.1) 支持使用Python 3.6
文件名: torch-1.10.0-cp36-cp36m-linux_aarch64.whl
URL: https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl
PyTorch v1.12.0
由带有 Python 3.8 的 JetPack 5.0 (L4T R34.1.0) / JetPack 5.0.1 (L4T R34.1.1) / JetPack 5.0.2 (L4T R35.1.0) 支持
文件名: torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl
URL: https://developer.download.nvidia.com/compute/redist/jp/v50/pytorch/torch-1.12.0a0 +2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl
- 步骤1.根据您的JetPack版本按以下格式安装torch
wget <URL> -O <file_name>
pip3 install <file_name>
例如,这里我们运行的是JP4.6.1,因此我们选择PyTorch v1.10.0
cd ~
sudo apt-get install -y libopenblas-base libopenmpi-dev
wget https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl
pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl
- 步骤 2.根据您安装的 PyTorch 版本安装 torchvision。例如,我们选择PyTorch
v1.10.0,这意味着我们需要选择Torchvision v0.11.1
sudo apt install -y libjpeg-dev zlib1g-dev
git clone --branch v0.11.1 https://github.com/pytorch/vision torchvision
cd torchvision
sudo python3 setup.py install
这里列出了根据PyTorch版本需要安装的对应torchvision版本:
PyTorch v1.10 - torchvision v0.11.1
PyTorch v1.12 - torchvision v0.13.0
4.YOLOv5 的 DeepStream 配置
- 步骤 1.克隆以下存储库
cd ~
git clone https://github.com/marcoslucianops/DeepStream-Yolo
- 步骤 2.将gen_wts_yoloV5.py从DeepStream-Yolo/utils复制到yolov5目录
cp DeepStream-Yolo/utils/gen_wts_yoloV5.py yolov5
- 步骤 3.在 yolov5 存储库中,从 YOLOv5 版本下载pt 文件(YOLOv5s 6.1 的示例)
cd yolov5
wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt
- 步骤 4.生成cfg和wts文件
python3 gen_wts_yoloV5.py -w yolov5s.pt
注意:更改推理大小(默认值:640)
-s SIZE
--size SIZE
-s HEIGHT WIDTH
--size HEIGHT WIDTH
例如: 1280:
-s 1280
or
-s 1280 1280
- 步骤5.将生成的cfg和wts文件复制到DeepStream-Yolo文件夹中
cp yolov5s.cfg ~/DeepStream-Yolo
cp yolov5s.wts ~/DeepStream-Yolo
- 步骤6.打开DeepStream-Yolo文件夹并编译库
cd ~/DeepStream-Yolo
CUDA_VER=11.4 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.1
CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.0.1 / 6.0
- 步骤 7.根据您的模型编辑config_infer_primary_yoloV5.txt文件
[property]
...
custom-network-config=yolov5s.cfg
model-file=yolov5s.wts
...
- 步骤 8.编辑deepstream_app_config文件
...
[primary-gie]
...
config-file=config_infer_primary_yoloV5.txt
- 步骤 9.更改deepstream_app_config文件中的视频源。这里加载了默认视频文件,如下所示
...
[source0]
...
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
运行推理
deepstream-app -c deepstream_app_config.txt
5.INT8 校准
如果想使用INT8精度进行推理,需要按照以下步骤操作
步骤1.安装OpenCV
sudo apt-get install libopencv-dev
步骤 2.编译/重新编译支持 OpenCV 的nvdsinfer_custom_impl_Yolo库
cd ~/DeepStream-Yolo
CUDA_VER=11.4 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.1
CUDA_VER=10.2 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.0.1 / 6.0
步骤 3.对于 COCO 数据集,下载val2017,解压并移动到DeepStream-Yolo文件夹
步骤 4.为校准图像创建一个新目录
mkdir calibration
步骤 5.运行以下命令从 COCO 数据集中选择 1000 个随机图像来运行校准
for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
cp ${jpg} calibration/; \
done
注意: NVIDIA 建议至少使用 500 张图像才能获得良好的准确性。在此示例中,选择 1000 个图像以获得更好的准确度(更多图像 = 更高的准确度)。较高的 INT8_CALIB_BATCH_SIZE 值将带来更高的精度和更快的校准速度。根据你的GPU显存来设置。您可以从head -1000开始设置。例如,对于 2000 个图像,head -2000。这个过程可能需要很长时间。
步骤 6.使用所有选定的图像创建calibration.txt文件
realpath calibration/*jpg > calibration.txt
步骤 7.设置环境变量
export INT8_CALIB_IMG_PATH=calibration.txt
export INT8_CALIB_BATCH_SIZE=1
步骤 8.更新config_infer_primary_yoloV5.txt文件
从
...
model-engine-file=model_b1_gpu0_fp32.engine
#int8-calib-file=calib.table
...
network-mode=0
...
到
...
model-engine-file=model_b1_gpu0_int8.engine
int8-calib-file=calib.table
...
network-mode=1
...
步骤 9.运行推理
deepstream-app -c deepstream_app_config.txt
6.基准测试结果
下表总结了不同模型在Jetson Xavier NX上的表现。
型号名称 精确 推理大小 推理时间(毫秒) FPS
YOLOv5s FP32 320x320 16.66 60
FP32 640x640 33.33 30
INT8 640x640 16.66 60
YOLOv5n FP32 640x640 16.66 60