在NVIDIA Jetson Nano上部署YOLOv8

本全面指南提供了一个详细的步骤,用于在NVIDIA Jetson设备上使用DeepStream SDK和TensorRT部署UltralyticsYOLOv8。这里使用TensorRT来最大化Jetson平台上的推理性能。

测试环境

本指南已在以下设备上进行测试:

  • 基于NVIDIA JetsonOrin NX 16GB的Seeed Studio reComputer J4012,运行JetPack版本JP5.1.3。
  • 基于NVIDIA Jetson Nano 4GB的Seeed Studio reComputer J1020 v2,运行JetPack版本JP4.6.4。

预计它将适用于所有NVIDIA Jetson硬件系列,包括最新的和旧的设备。

什么是NVIDIA DeepStream?

NVIDIA的DeepStream SDK是一个基于GStreamer的完整流分析工具包,用于AI驱动的多传感器处理、视频、音频和图像理解。它非常适合构建IVA(智能视频分析)应用程序和服务的视觉AI开发者、软件合作伙伴、初创公司和OEM。现在,可以创建包含神经网络和其他复杂处理任务(如跟踪、视频编码/解码和视频渲染)的流处理管道。这些管道使得视频、图像和传感器数据的实时分析成为可能。DeepStream的多平台支持为提供了一种更快、更简单的方式,在本地、边缘和云端开发视觉AI应用程序和服务。

先决条件

在开始本指南之前,请访问文档《NVIDIA Jetson与UltralyticsYOLOv8快速入门指南》,设置NVIDIA Jetson设备以使用Ultralytics YOLOv8。

根据JetPack版本安装DeepStream SDK:

  • 对于JetPack 4.6.4,安装DeepStream 6.0.1。
  • 对于JetPack 5.1.3,安装DeepStream 6.3。

提示:本指南中使用了Debian软件包方法将DeepStream SDK安装到Jetson设备上。也可以访问DeepStream SDK on Jetson(存档)以获取DeepStream的旧版本。

DeepStream配置YOLOv8

在这里使用marcoslucianops/DeepStream-Yolo GitHub仓库,该仓库包括对YOLO模型的NVIDIA DeepStream SDK支持。感谢marcoslucianops的贡献!

安装依赖项:

pip install cmake pip install onnxsim

克隆以下仓库:

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

从YOLOv8发布版本中下载选择的Ultralytics YOLOv8检测模型(.pt)。这里使用yolov8s.pt。

wget https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s.pt

注意:也可以使用自定义训练的YOLOv8模型。

将模型转换为ONNX:

python3 utils/export_yoloV8.py -w yolov8s.pt

传递以下参数到上述命令:

  • 对于DeepStream 6.0.1,使用12或更低的opset。默认opset为16。
  • 要更改推理大小(默认:640):
  • -s SIZE 或 --size SIZE
  • -s HEIGHT WIDTH 或 --size HEIGHT WIDTH
  • 例如对于1280:
  • -s 1280 或 -s 1280 1280
  • 要简化ONNX模型(DeepStream >= 6.0):
  • --simplify
  • 要使用动态批处理大小(DeepStream >= 6.1):
  • --dynamic
  • 要使用静态批处理大小(例如批处理大小=4):
  • --batch 4

根据安装的JetPack版本设置CUDA版本:

  • 对于JetPack 4.6.4:
  • export CUDA_VER=10.2
  • 对于JetPack 5.1.3:
  • export CUDA_VER=11.4

编译库:

make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo

编辑config_infer_primary_yoloV8.txt文件以适应模型(对于具有80个类别的YOLOv8s):

[[property]] onnx-file=yolov8s.onnx num-detected-classes=80

编辑deepstream_app_config文件:

[primary-gie] config-file=config_infer_primary_yoloV8.txt

还可以在deepstream_app_config文件中更改视频源。这里加载了一个默认的视频文件:

[source0] uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4

运行推理:

deepstream-app -c deepstream_app_config.txt

注意:在开始推理之前,生成TensorRT引擎文件可能需要很长时间。因此请耐心等待。

提示:如果想将模型转换为FP16精度,只需在config_infer_primary_yoloV8.txt中设置model-engine-file=model_b1_gpu0_fp16.engine和network-mode=2。

INT8校准

如果想使用INT8精度进行推理,需要按照以下步骤操作:

设置OPENCV环境变量:

export OPENCV=1

编译库:

make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo

对于COCO数据集,下载val2017,解压缩并移动到DeepStream-Yolo文件夹。

为校准图像创建一个新目录:

mkdir calibration

运行以下命令从COCO数据集中选择1000张随机图像进行校准:

for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do cp $jpg calibration/; done

注意:NVIDIA建议至少使用500张图像以获得良好的准确性。在这个示例中,选择了1000张图像以获得更好的准确性(更多图像=更高精度)。可以从head -1000中设置。例如,对于2000张图像,head -2000。这个过程可能需要很长时间。

创建一个包含所有选定图像的calibration.txt文件:

realpath calibration/*jpg > calibration.txt

设置环境变量:

export INT8_CALIB_IMG_PATH=calibration.txt export INT8_CALIB_BATCH_SIZE=1

注意:更高的INT8_CALIB_BATCH_SIZE值将导致更高的准确性和更快的校准速度。根据GPU的内存进行设置。

更新config_infer_primary_yoloV8.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

运行推理:

deepstream-app -c deepstream_app_config.txt

多流设置

要在单个deepstream应用程序下设置多个流,可以对deepstream_app_config.txt文件进行以下更改:

更改行和列以构建网格显示,根据流数量。例如,对于4个流,可以添加2行和2列。

[[tiled-display]] rows=2 columns=2

设置num-sources=4并添加所有4个流的uri:

[source0] enable=1 type=3 uri=<path_to_video> uri=<path_to_video> uri=<path_to_video> uri=<path_to_video> num-sources=4

运行推理:

deepstream-app -c deepstream_app_config.txt

基准测试结果

下表总结了YOLOv8s模型在NVIDIA Jetson Orin NX 16GB上不同TensorRT精度级别的性能,输入尺寸为640x640。

模型名称 精度 推理时间 (ms/im) FPS
YOLOv8s FP32 15.63 64
YOLOv8s FP16 7.94 126
YOLOv8s INT8 5.53 181

这些基准测试结果强调了在NVIDIA Jetson硬件上使用TensorRT优化的YOLOv8模型的效率和能力。有关更多详细信息,请参见基准测试结果部分。

致谢

本指南最初由朋友Seeed Studio的Lakshantha和Elaine创建。

常见问题解答

如何在NVIDIA Jetson设备上设置Ultralytics YOLOv8?

要在NVIDIA Jetson设备上设置Ultralytics YOLOv8,首先需要安装与JetPack版本兼容的DeepStream SDK。按照快速入门指南中的逐步指南配置NVIDIA Jetson以部署YOLOv8。

NVIDIA Jetson上使用TensorRT与YOLOv8有什么好处?

在NVIDIA Jetson上使用TensorRT与YOLOv8可以优化模型进行推理,显著降低延迟并提高吞吐量。TensorRT通过层融合、精度校准和内核自动调优提供高性能、低延迟的深度学习推理。这导致执行速度更快、效率更高,特别适用于视频分析和自主机器等实时应用程序。

可以在不同的NVIDIA Jetson硬件上运行DeepStream SDK与Ultralytics YOLOv8吗?

是的,部署Ultralytics YOLOv8与DeepStream SDK和TensorRT的指南与整个NVIDIA Jetson系列兼容。这包括像Jetson Orin NX 16GB这样的设备,运行JetPack 5.1.3,以及像Jetson Nano 4GB这样的设备,运行JetPack 4.6.4。请参阅DeepStream配置YOLOv8部分的详细步骤。

如何将YOLOv8模型转换为ONNX以用于DeepStream?

要将YOLOv8模型转换为ONNX格式以用于DeepStream部署,请使用DeepStream-Yolo仓库中的utils/export_yoloV8.py脚本。

这是一个示例命令:

python3 utils/export_yoloV8.py -w yolov8s.pt --opset 12 --simplify

有关模型转换的更多详细信息,请查看模型导出部分。

YOLO在NVIDIA Jetson Orin NX上的性能基准测试如何?

YOLOv8模型在NVIDIA Jetson Orin NX 16GB上的性能会根据TensorRT精度级别而有所不同。例如,YOLOv8s模型实现:

  • FP32精度:15.63 ms/im,64 FPS
  • FP16精度:7.94 ms/im,126 FPS
  • INT8精度:5.53 ms/im,181 FPS
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485