一、Jetson Nano套件与CSI相机概述
Jetson Nano是NVIDIA推出的边缘计算开发套件,专为AIoT场景设计,其GPU算力可达472 GFLOPS(FP16),支持4K视频编解码。CSI(Camera Serial Interface)相机通过MIPI CSI-2协议与Jetson Nano的15针接口直连,相比USB相机具有更低的延迟和更高的带宽。典型应用场景包括智能监控、机器人视觉、工业质检等需要实时处理的场景。
硬件准备要点
- 核心组件清单:Jetson Nano开发板(建议B01版本)、CSI相机模块(如Raspberry Pi Camera V2)、5V/4A电源适配器、MicroSD卡(≥32GB,Class 10)、散热片(可选)
- 接口兼容性验证:确认相机支持MIPI CSI-2协议,Jetson Nano的CSI接口位于板载J21连接器,需检查相机排线方向(通常红色标记对应引脚1)
- 电源管理建议:使用官方推荐的电源适配器,避免因供电不足导致系统崩溃。当连接多个外设时,建议通过DC接口供电而非MicroUSB
二、CSI相机配置全流程
1. 系统环境准备
- 镜像烧录:下载NVIDIA官方JetPack 4.6.1镜像(L4T R32.6.1),使用balenaEtcher工具写入MicroSD卡
- 基础配置:首次启动后执行
sudo apt update && sudo apt upgrade -y更新软件包,安装必要工具:sudo apt install -y python3-pip cmake gitpip3 install --upgrade pip setuptools
2. 驱动与内核模块加载
Jetson Nano默认已集成CSI驱动,但需验证内核模块:
lsmod | grep tegra_video # 应显示tegra_video_csi等模块sudo modprobe tegra_video_csi # 手动加载(通常自动加载)
3. 相机设备树配置
对于非标准CSI相机,需修改设备树:
- 定位设备树源文件:
/boot/tegra194-p3448-0000-p3449-0000-b00.dtb - 使用
dtc工具反编译:sudo apt install device-tree-compilerdtc -I dtb -O dts -o decompiled.dts /boot/tegra194-p3448-0000-p3449-0000-b00.dtb
- 修改
vi_camera节点参数,添加相机支持(需参考具体相机规格)
4. GStreamer管道测试
通过GStreamer验证相机流:
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):
wget https://nvidia.box.com/shared/static/fjtbno0vpoiq7x7j82c3sj17grjqr739.whl -O torch-1.8.0-cp36-cp36m-linux_aarch64.whlpip3 install torch-1.8.0-cp36-cp36m-linux_aarch64.whlpip3 install torchvision numpy opencv-python
-
YOLOv代码准备:
git clone https://github.com/ultralytics/yolov5cd yolov5pip3 install -r requirements.txt
2. 模型优化策略
量化感知训练(QAT)
- 修改
models/yolov5s.yaml,在卷积层后添加QuantStub和DeQuantStub - 使用动态量化训练:
from torch.quantization import quantize_dynamicmodel = torch.load('yolov5s.pt')quantized_model = quantize_dynamic(model, {torch.nn.Conv2d}, dtype=torch.qint8)
TensorRT加速
- 导出ONNX模型:
python export.py --weights yolov5s.pt --include onnx
- 使用TensorRT转换:
/usr/src/tensorrt/bin/trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s.trt --fp16
3. 实时检测实现
import cv2import torchfrom models.experimental import attempt_load# 加载模型model = attempt_load('yolov5s.trt', map_location='cuda:0')model.eval()# 初始化CSI相机cap = cv2.VideoCapture('nvarguscamerasrc ! video/x-raw(memory:NVMM),width=640,height=480 ! nvvidconv ! appsink', cv2.CAP_GSTREAMER)while True:ret, frame = cap.read()if not ret: break# 预处理img = cv2.resize(frame, (640, 640))img = img.transpose(2, 0, 1).astype('float32') / 255.0img = torch.from_numpy(img).unsqueeze(0).to('cuda:0')# 推理with torch.no_grad():pred = model(img)[0]# 后处理(需实现NMS和可视化)# ...cv2.imshow('Detection', frame)if cv2.waitKey(1) == 27: break
四、性能优化技巧
1. 内存管理
- 使用
nvidia-smi -l 1监控GPU内存占用 - 启用共享内存:
export CUDA_LAUNCH_BLOCKING=1 - 对于多模型场景,采用模型并行技术
2. 功耗控制
- 动态调整CPU频率:
echo performance | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
- 限制GPU时钟:
sudo nvpmodel -m 0 # MODE_0_WATT (最大性能)# 或自定义模式:sudo nvpmodel -q --query-freqs
3. 实时性保障
- 优先级调整:
sudo chrt -f 99 python3 detect.py # 设置实时优先级
- 线程绑定:
import osos.sched_setaffinity(0, {0}) # 绑定到CPU0
五、故障排查指南
常见问题处理
-
相机无输出:
- 检查
dmesg | grep csi是否有硬件错误 - 验证
/dev/video0是否存在 - 尝试不同分辨率(如640x480)
- 检查
-
模型推理错误:
- 检查CUDA版本是否匹配
- 验证输入张量形状是否为[1,3,640,640]
- 使用
torch.cuda.is_available()确认GPU可用
-
系统崩溃:
- 监控温度:
cat /sys/class/thermal/thermal_zone0/temp(单位毫摄氏度) - 检查电源稳定性(万用表测量5V引脚)
- 监控温度:
日志分析技巧
- 启用详细日志:
export GSTREAMER_DEBUG=3gst-launch-1.0 nvcamerasrc ! ...
- 收集系统日志:
journalctl -b > system_log.txt
六、进阶应用建议
- 多相机同步:使用
nvcamerasrc的sync属性实现帧同步 - 模型蒸馏:将YOLOv5大模型知识蒸馏到轻量级模型
- 边缘-云端协同:通过MQTT协议上传检测结果
- 硬件加速:探索使用Jetson Nano的DLA(深度学习加速器)
本指南覆盖了从硬件连接到算法部署的全流程,开发者可根据实际需求调整参数。建议首次实现时先验证单个模块功能,再逐步集成。对于生产环境部署,需重点考虑异常处理机制和系统稳定性设计。