【jetson】yolo8+DeepStream测试

📅 2026/7/17 19:56:28 👁️ 阅读次数 📝 编程学习
【jetson】yolo8+DeepStream测试

本文档记录了在 Jetson Orin Nano(JetPack 6.0 + DeepStream 7.x)平台,基于 DeepStream-Yolo 开源仓库完成 YOLOv8n 模型从 PyTorch 到 ONNX 再到 TensorRT FP16 引擎的转换、自定义推理插件编译与配置调优的全流程

一、基础环境

  • 硬件:Jetson Orin Nano
  • 系统:JetPack 6.0 (CUDA 12.6)+DeepStream 7.1.0
  • 运行环境:Jetson 设备连接显示器,在本地执行

二、获取 DeepStream-Yolo 官方仓库

操作

mkdir~/yolo_testcd~/yolo_test# 克隆官方开源仓库(GitHub)gitclone https://github.com/marcoslucianops/DeepStream-Yolo.gitcdDeepStream-Yolo

三、模型转换(YOLOv8n.pt → ONNX → TensorRT 引擎)

3.1 准备 YOLOv8 模型

yolov8n.pt放到~/yolo_test/下(可从 Ultralytics 下载)。

3.2 安装依赖

# 检查已安装的包pip3 list|grep-iE"onnx|torch|ultralytics"# 缺失则安装pip3installonnx ultralytics

遇到的问题:安装 ultralytics 后 numpy 被升级到 2.x,导致 PyTorch 2.8 无法运行。
解决

pip3install"numpy<2"--force-reinstall

3.3 运行转换脚本

cd~/yolo_test/DeepStream-Yolo/utils python3 export_yoloV8.py-w../../yolov8n.pt

在 yolov8n.pt 同级目录下生成文件:

  • yolov8n.onnx— ONNX 模型
  • labels.txt— 类别标签(COCO 80 类)

将上面两个文件到项目目录中

mv../../yolov8n.onnx../mv../../labels.txt../

四、编译自定义 YOLO 插件

4.1 确认 CUDA 版本并修改 Makefile

nvcc--version# 显示 12.6cd~/yolo_test/DeepStream-Yolo/nvdsinfer_custom_impl_YoloCUDA_VER=12.6make-j4

4.2 编译

makecleanmake-j4

编译成功后在nvdsinfer_custom_impl_Yolo/下生成libnvdsinfer_custom_impl_Yolo.so


五、配置文件修改

5.1 推理配置文件(YOLOv8 专用)

原始模板config_infer_primary_yoloV8.txt已存在。
只需修改 3 个关键项(其他保持原样):

[property] onnx-file=yolov8n.onnx network-mode=2 num-detected-classes=80
  • network-mode=2→ FP16 加速
  • 引擎文件名可改为model_b1_gpu0_fp16.engine(与 FP16 匹配,非必须但推荐)

5.2 主应用配置文件

先备份原文件:

cd~/yolo_test/DeepStream-Yolocpdeepstream_app_config.txt deepstream_app_config.txt.bak

编辑deepstream_app_config.txt,关键修改:

① 推理部分

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

② 视频源(先用视频文件测试)

[source0] enable=1 type=2 uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4 num-sources=1 gpu-id=0 cudadec-memtype=0 [tests] file-loop=1 # 循环播放,避免窗口闪退

③ 显示 sink(根据环境选择)

[sink0] enable=1 type=2 # xvimagesink,X11 环境 sync=0 gpu-id=0 qos=0

若遇到 Wayland 或显示问题可改用:

  • type=5→ fakesink(无画面测试,实际运行报错,原因未知)

六、运行测试

6.1 确保 X11 显示可用

exportDISPLAY=:1# 根据实际环境gst-launch-1.0 videotestsrc!xvimagesink# 验证

6.2 首次运行(构建引擎)

cd~/yolo_test/DeepStream-Yolo deepstream-app-cdeepstream_app_config.txt

过程

  • 若引擎文件model_b1_gpu0_fp16.engine不存在,会自动构建 TensorRT 引擎,耗时约 6 分钟(仅一次)。
  • 构建成功后引擎文件保存于项目根目录。
  • 引擎文件名不匹配会导致每次重建 → 把config_infer_primary_yoloV8.txt中的model-engine-file改为model_b1_gpu0_fp16.engine

6.3 验证推理效果

  • 日志输出:
    serialize cuda engine to file: .../model_b1_gpu0_fp16.engine successfully Load new model:...config_infer_primary_yoloV8.txt sucessfully PERF: 60.10 (58.77)
  • 画面:视频窗口带检测框循环播放。


七、切换到 USB 摄像头实时检测

7.1 查看摄像头设备

ls/dev/video* v4l2-ctl --list-devices v4l2-ctl-d/dev/video0 --list-formats-ext

本例为 USB 摄像头,设备节点/dev/video0,支持 MJPG 1280x720@30fps。

7.2 修改主配置文件

[source0] enable=1 type=1 device=/dev/video0 camera-width=640 camera-height=480 camera-fps-n=30 camera-fps-d=1 num-sources=1 gpu-id=0 [streammux] live-source=1 width=640 height=480 [tests] file-loop=1 #可改为 0(实时摄像头不需要循环)

7.3 运行实时检测

deepstream-app-cdeepstream_app_config.txt

预期:窗口显示摄像头实时画面,带 YOLOv8 检测框,帧率约 30 fps(受摄像头帧率限制)。

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4de0791ec0d442c388805076914a6388.png#pic_center)

八、最终文件结构(关键文件)

~/yolo_test/ ├── yolov8n.pt ├── DeepStream-Yolo/ │ ├── yolov8n.onnx │ ├── labels.txt │ ├── model_b1_gpu0_fp16.engine (自动生成) │ ├── config_infer_primary_yoloV8.txt │ ├── deepstream_app_config.txt │ ├── nvdsinfer_custom_impl_Yolo/ │ │ └── libnvdsinfer_custom_impl_Yolo.so │ └── ...

九、总结

  • 核心步骤:模型转换 → 编译插件 → 修改配置 → 运行。
  • 引擎首次构建需数分钟,后续启动仅加载(约 5-10 秒)。
  • 通过v4l2-ctl -d /dev/video0 --list-formats-ext可查询摄像头原生支持分辨率、帧率、编码格式,保证配置参数与硬件能力匹配。