Jetson Nano实战:CSI相机与YOLOv物体检测全流程指南

一、Jetson Nano套件与CSI相机概述

Jetson Nano是NVIDIA推出的边缘计算开发套件,专为AIoT场景设计,其GPU算力可达472 GFLOPS(FP16),支持4K视频编解码。CSI(Camera Serial Interface)相机通过MIPI CSI-2协议与Jetson Nano的15针接口直连,相比USB相机具有更低的延迟和更高的带宽。典型应用场景包括智能监控、机器人视觉、工业质检等需要实时处理的场景。

硬件准备要点

  1. 核心组件清单:Jetson Nano开发板(建议B01版本)、CSI相机模块(如Raspberry Pi Camera V2)、5V/4A电源适配器、MicroSD卡(≥32GB,Class 10)、散热片(可选)
  2. 接口兼容性验证:确认相机支持MIPI CSI-2协议,Jetson Nano的CSI接口位于板载J21连接器,需检查相机排线方向(通常红色标记对应引脚1)
  3. 电源管理建议:使用官方推荐的电源适配器,避免因供电不足导致系统崩溃。当连接多个外设时,建议通过DC接口供电而非MicroUSB

二、CSI相机配置全流程

1. 系统环境准备

  • 镜像烧录:下载NVIDIA官方JetPack 4.6.1镜像(L4T R32.6.1),使用balenaEtcher工具写入MicroSD卡
  • 基础配置:首次启动后执行sudo apt update && sudo apt upgrade -y更新软件包,安装必要工具:
    1. sudo apt install -y python3-pip cmake git
    2. pip3 install --upgrade pip setuptools

2. 驱动与内核模块加载

Jetson Nano默认已集成CSI驱动,但需验证内核模块:

  1. lsmod | grep tegra_video # 应显示tegra_video_csi等模块
  2. sudo modprobe tegra_video_csi # 手动加载(通常自动加载)

3. 相机设备树配置

对于非标准CSI相机,需修改设备树:

  1. 定位设备树源文件:/boot/tegra194-p3448-0000-p3449-0000-b00.dtb
  2. 使用dtc工具反编译:
    1. sudo apt install device-tree-compiler
    2. dtc -I dtb -O dts -o decompiled.dts /boot/tegra194-p3448-0000-p3449-0000-b00.dtb
  3. 修改vi_camera节点参数,添加相机支持(需参考具体相机规格)

4. GStreamer管道测试

通过GStreamer验证相机流:

  1. gst-launch-1.0 nvcamerasrc ! 'video/x-raw(memory:NVMM),width=1280,height=720,framerate=30/1' ! nvvideoconvert ! autovideosink

正常应显示相机画面,若出现花屏需检查:

  • 分辨率/帧率是否超出相机支持范围
  • 是否启用NVMM内存(非NVMM模式可能导致性能问题)

三、YOLOv物体检测部署

1. 环境搭建

  • PyTorch安装(推荐1.8.0+CUDA 10.2):

    1. wget https://nvidia.box.com/shared/static/fjtbno0vpoiq7x7j82c3sj17grjqr739.whl -O torch-1.8.0-cp36-cp36m-linux_aarch64.whl
    2. pip3 install torch-1.8.0-cp36-cp36m-linux_aarch64.whl
    3. pip3 install torchvision numpy opencv-python
  • YOLOv代码准备

    1. git clone https://github.com/ultralytics/yolov5
    2. cd yolov5
    3. pip3 install -r requirements.txt

2. 模型优化策略

量化感知训练(QAT)

  1. 修改models/yolov5s.yaml,在卷积层后添加QuantStubDeQuantStub
  2. 使用动态量化训练:
    1. from torch.quantization import quantize_dynamic
    2. model = torch.load('yolov5s.pt')
    3. quantized_model = quantize_dynamic(model, {torch.nn.Conv2d}, dtype=torch.qint8)

TensorRT加速

  1. 导出ONNX模型:
    1. python export.py --weights yolov5s.pt --include onnx
  2. 使用TensorRT转换:
    1. /usr/src/tensorrt/bin/trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s.trt --fp16

3. 实时检测实现

  1. import cv2
  2. import torch
  3. from models.experimental import attempt_load
  4. # 加载模型
  5. model = attempt_load('yolov5s.trt', map_location='cuda:0')
  6. model.eval()
  7. # 初始化CSI相机
  8. cap = cv2.VideoCapture('nvarguscamerasrc ! video/x-raw(memory:NVMM),width=640,height=480 ! nvvidconv ! appsink', cv2.CAP_GSTREAMER)
  9. while True:
  10. ret, frame = cap.read()
  11. if not ret: break
  12. # 预处理
  13. img = cv2.resize(frame, (640, 640))
  14. img = img.transpose(2, 0, 1).astype('float32') / 255.0
  15. img = torch.from_numpy(img).unsqueeze(0).to('cuda:0')
  16. # 推理
  17. with torch.no_grad():
  18. pred = model(img)[0]
  19. # 后处理(需实现NMS和可视化)
  20. # ...
  21. cv2.imshow('Detection', frame)
  22. if cv2.waitKey(1) == 27: break

四、性能优化技巧

1. 内存管理

  • 使用nvidia-smi -l 1监控GPU内存占用
  • 启用共享内存:export CUDA_LAUNCH_BLOCKING=1
  • 对于多模型场景,采用模型并行技术

2. 功耗控制

  • 动态调整CPU频率:
    1. echo performance | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
  • 限制GPU时钟:
    1. sudo nvpmodel -m 0 # MODE_0_WATT (最大性能)
    2. # 或自定义模式:
    3. sudo nvpmodel -q --query-freqs

3. 实时性保障

  • 优先级调整:
    1. sudo chrt -f 99 python3 detect.py # 设置实时优先级
  • 线程绑定:
    1. import os
    2. os.sched_setaffinity(0, {0}) # 绑定到CPU0

五、故障排查指南

常见问题处理

  1. 相机无输出

    • 检查dmesg | grep csi是否有硬件错误
    • 验证/dev/video0是否存在
    • 尝试不同分辨率(如640x480)
  2. 模型推理错误

    • 检查CUDA版本是否匹配
    • 验证输入张量形状是否为[1,3,640,640]
    • 使用torch.cuda.is_available()确认GPU可用
  3. 系统崩溃

    • 监控温度:cat /sys/class/thermal/thermal_zone0/temp(单位毫摄氏度)
    • 检查电源稳定性(万用表测量5V引脚)

日志分析技巧

  • 启用详细日志:
    1. export GSTREAMER_DEBUG=3
    2. gst-launch-1.0 nvcamerasrc ! ...
  • 收集系统日志:
    1. journalctl -b > system_log.txt

六、进阶应用建议

  1. 多相机同步:使用nvcamerasrcsync属性实现帧同步
  2. 模型蒸馏:将YOLOv5大模型知识蒸馏到轻量级模型
  3. 边缘-云端协同:通过MQTT协议上传检测结果
  4. 硬件加速:探索使用Jetson Nano的DLA(深度学习加速器)

本指南覆盖了从硬件连接到算法部署的全流程,开发者可根据实际需求调整参数。建议首次实现时先验证单个模块功能,再逐步集成。对于生产环境部署,需重点考虑异常处理机制和系统稳定性设计。