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

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

一、引言

Jetson Nano作为NVIDIA推出的嵌入式AI开发套件,凭借其低功耗、高性能和丰富的接口,成为边缘计算和计算机视觉项目的理想选择。本文将详细介绍如何使用Jetson Nano套件完成CSI相机配置,并部署YOLOv模型进行实时物体检测。通过本文,读者将掌握从硬件连接到模型部署的全流程操作,为后续的AI视觉项目打下坚实基础。

二、硬件准备与连接

2.1 硬件清单

  • Jetson Nano开发者套件(B01版本推荐)
  • CSI接口摄像头(如Raspberry Pi Camera V2)
  • Micro-SD卡(至少32GB,Class 10以上)
  • 5V/4A电源适配器(确保稳定供电)
  • 显示器、键盘、鼠标(可选,用于初始设置)

2.2 CSI相机连接

  1. 接口识别:Jetson Nano提供两个CSI接口(CAM0和CAM1),通常使用CAM0。
  2. 物理连接:将CSI相机的排线插入CAM0接口,注意排线方向(金属触点朝向板内)。
  3. 固定排线:轻轻压下接口两侧的固定扣,确保排线稳固连接。

常见问题:若相机无法识别,检查排线是否完全插入,或尝试更换CSI接口。

三、系统与环境配置

3.1 操作系统安装

  1. 下载镜像:从NVIDIA官网下载Jetson Nano的官方镜像(如JetPack 4.6)。
  2. 烧录镜像:使用Etcher等工具将镜像烧录至Micro-SD卡。
  3. 首次启动:插入SD卡,接通电源,完成初始设置(语言、时区、用户密码等)。

3.2 驱动与依赖安装

  1. 更新系统
    1. sudo apt-get update
    2. sudo apt-get upgrade
  2. 安装CSI驱动:Jetson Nano默认支持CSI相机,但需确认内核模块已加载:
    1. lsmod | grep gst_v4l2

    若无输出,手动加载模块:

    1. sudo modprobe gst_v4l2
  3. 安装OpenCV(可选,用于图像处理):
    1. sudo apt-get install python3-opencv

四、CSI相机测试与配置

4.1 相机测试

  1. 使用GStreamer测试

    1. gst-launch-1.0 nvcamerasrc ! 'video/x-raw(memory:NVMM), width=640, height=480, framerate=30/1' ! nvvidconv ! xvimagesink

    若成功,将显示相机画面。

  2. 使用OpenCV测试

    1. import cv2
    2. cap = cv2.VideoCapture(0) # 0表示默认摄像头
    3. while True:
    4. ret, frame = cap.read()
    5. if ret:
    6. cv2.imshow('CSI Camera', frame)
    7. if cv2.waitKey(1) == 27: # ESC键退出
    8. break
    9. cap.release()
    10. cv2.destroyAllWindows()

4.2 分辨率与帧率调整

修改GStreamer管道中的widthheightframerate参数,例如:

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

五、YOLOv模型部署

5.1 环境准备

  1. 安装PyTorch(Jetson Nano专用版本):
    1. wget https://nvidia.box.com/shared/static/fjtbno0vzoqi06kk4e5e7l3jwjqnvtd3.whl -O torch-1.8.0-cp36-cp36m-linux_aarch64.whl
    2. sudo apt-get install python3-pip libopenblas-base libopenmpi-dev
    3. pip3 install torch-1.8.0-cp36-cp36m-linux_aarch64.whl
  2. 安装TorchVision
    1. git clone --branch v0.9.1 https://github.com/pytorch/vision
    2. cd vision
    3. sudo apt-get install libjpeg-dev zlib1g-dev
    4. python3 setup.py install

5.2 YOLOv代码实现

  1. 下载预训练模型
    1. wget https://pjreddie.com/media/files/yolov3.weights
  2. 加载模型与推理

    1. import cv2
    2. import numpy as np
    3. import torch
    4. from torchvision import transforms
    5. # 加载YOLOv3模型(需提前转换权重为Torch格式)
    6. model = torch.hub.load('ultralytics/yolov5', 'yolov3') # 或使用自定义模型
    7. model.eval()
    8. # 相机捕获
    9. cap = cv2.VideoCapture(0)
    10. while True:
    11. ret, frame = cap.read()
    12. if not ret:
    13. break
    14. # 预处理
    15. img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    16. img_tensor = transforms.ToTensor()(img).unsqueeze(0)
    17. # 推理
    18. with torch.no_grad():
    19. predictions = model(img_tensor)
    20. # 解析结果(需根据模型输出格式调整)
    21. # ...
    22. cv2.imshow('YOLOv Detection', frame)
    23. if cv2.waitKey(1) == 27:
    24. break
    25. cap.release()
    26. cv2.destroyAllWindows()

优化建议

  • 使用TensorRT加速推理:通过trtexec工具将模型转换为TensorRT引擎。
  • 量化模型:使用torch.quantization减少计算量。

六、性能优化与调试

6.1 性能瓶颈分析

  1. 使用tegrastats监控资源

    1. sudo /home/nvidia/tegrastats

    关注GPU利用率、内存占用和CPU负载。

  2. 调整模型输入尺寸:减小输入分辨率(如从416x416降至320x320)以提升帧率。

6.2 调试技巧

  1. 日志记录:在代码中添加printlogging模块,跟踪推理时间。
  2. 模型可视化:使用Netron查看模型结构,确认输入输出格式。

七、完整项目示例

7.1 项目结构

  1. yolov_jetson/
  2. ├── models/ # 存放YOLOv模型文件
  3. ├── utils/ # 辅助函数(如NMS、画框)
  4. ├── main.py # 主程序
  5. └── requirements.txt # 依赖列表

7.2 主程序示例

  1. # main.py
  2. import cv2
  3. import torch
  4. from models.experimental import attempt_load
  5. from utils.general import non_max_suppression, scale_boxes
  6. from utils.datasets import letterbox
  7. from utils.plots import plot_one_box
  8. # 加载模型
  9. weights = 'yolov3.pt'
  10. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
  11. model = attempt_load(weights, map_location=device)
  12. # 相机初始化
  13. cap = cv2.VideoCapture(0)
  14. while True:
  15. ret, img0 = cap.read()
  16. if not ret:
  17. break
  18. # 预处理
  19. img = letterbox(img0, new_shape=640)[0]
  20. img = img[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB, HWC to CHW
  21. img = torch.from_numpy(img).to(device).float() / 255.0
  22. if img.ndimension() == 3:
  23. img = img.unsqueeze(0)
  24. # 推理
  25. pred = model(img)[0]
  26. # NMS
  27. pred = non_max_suppression(pred, conf_thres=0.25, iou_thres=0.45)
  28. # 解析结果
  29. for det in pred:
  30. if len(det):
  31. det[:, :4] = scale_boxes(img.shape[2:], det[:, :4], img0.shape).round()
  32. for *xyxy, conf, cls in reversed(det):
  33. label = f'{model.names[int(cls)]}: {conf:.2f}'
  34. plot_one_box(xyxy, img0, label=label, color=(0, 255, 0), line_thickness=2)
  35. cv2.imshow('YOLOv Detection', img0)
  36. if cv2.waitKey(1) == 27:
  37. break
  38. cap.release()
  39. cv2.destroyAllWindows()

八、总结与展望

通过本文,读者已掌握Jetson Nano上CSI相机的配置方法,以及YOLOv模型的部署流程。实际项目中,可进一步探索:

  • 多相机同步检测
  • 模型压缩与量化
  • 与ROS等机器人框架集成

Jetson Nano的低功耗与高性能使其成为边缘AI的理想平台,结合YOLOv的实时检测能力,可广泛应用于智能安防、工业检测等领域。