Jetson Orin NANO 8G实战:YOLOv5环境配置与摄像头实时检测全流程解析
1. Jetson Orin NANO 8G与YOLOv5的黄金组合拿到Jetson Orin NANO 8G开发板的第一天我就被它小巧身材下的强大算力震惊了。这款搭载了NVIDIA最新Orin架构的嵌入式设备虽然只有信用卡大小却拥有高达40 TOPS的AI算力特别适合部署像YOLOv5这样的实时目标检测模型。相比前代Jetson NanoOrin NANO的性能提升了近10倍而功耗控制依然出色。YOLOv5作为当前最流行的目标检测框架之一以其轻量高效的特性成为边缘设备的首选。我实测在Orin NANO上运行YOLOv5s模型1080P视频的检测速度能达到30FPS以上完全满足实时性要求。这个组合特别适合智能零售、工业质检、安防监控等需要本地化实时分析的场景。在开始配置前建议准备以下硬件Jetson Orin NANO 8G开发套件含散热风扇支持MIPI CSI-2的摄像头如Raspberry Pi Camera V2至少32GB的microSD卡或NVMe SSD5V4A的电源适配器实测低功率电源会导致性能下降2. 从零搭建YOLOv5运行环境2.1 系统基础配置首次开机后建议先完成这些基础优化# 扩展存储空间如果是SD卡安装 sudo ./flash.sh -x 16777216 /dev/mmcblk0 # 关闭图形界面释放内存如需最大性能 sudo systemctl set-default multi-user.target然后是关键的CUDA环境配置。Orin NANO预装了JetPack 5.1.2但需要手动添加环境变量echo export CUDA_HOME/usr/local/cuda-11.4 ~/.bashrc echo export PATH${CUDA_HOME}/bin:${PATH} ~/.bashrc echo export LD_LIBRARY_PATH${CUDA_HOME}/lib64:${LD_LIBRARY_PATH} ~/.bashrc source ~/.bashrc验证安装时我遇到一个坑直接运行nvidia-smi会报错需要用sudo tegrastats | grep GPU这才是Orin系列查看GPU状态的正确姿势。2.2 Python环境搭建强烈建议使用conda管理Python环境wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh bash Miniconda3-latest-Linux-aarch64.sh conda create -n yolov5 python3.8 conda activate yolov5安装PyTorch时要注意架构匹配pip3 install torch-1.12.0a0git67ece03-cp38-cp38-linux_aarch64.whl这个预编译版本是我测试过最稳定的比直接从pip安装的版本性能提升约15%。3. YOLOv5的深度优化部署3.1 模型转换与量化直接从官方仓库克隆YOLOv5代码git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt将PyTorch模型转为TensorRT引擎是关键步骤。我的优化参数如下python export.py --weights yolov5s.pt --include engine --device 0 --half这里的--half启用FP16量化能减少50%显存占用而精度损失不到1%。对于需要极致性能的场景可以尝试INT8量化python export.py --weights yolov5s.pt --include engine --device 0 --int8不过需要准备约500张校准图片实测在Orin NANO上INT8比FP16还能快20%。3.2 TensorRT加速技巧在detect.py中添加这些参数可以进一步提升性能parser.add_argument(--trt-cache, typestr, defaultyolov5s.engine, helpTensorRT cache file) parser.add_argument(--torchscript, actionstore_true, helpuse TorchScript)特别提醒首次运行TensorRT引擎时会进行优化编译可能需要2-3分钟后续运行就会直接加载缓存。我在测试时发现连续运行10次后推理速度会比第一次提升约30%这是TensorRT的运行时优化在起作用。4. 多类型摄像头接入实战4.1 CSI摄像头配置对于Raspberry Pi Camera等CSI接口摄像头import cv2 def open_csi_camera(sensor_id0): return cv2.VideoCapture(fnvarguscamerasrc sensor-id{sensor_id} ! video/x-raw(memory:NVMM),width1280,height720,framerate30/1 ! nvvidconv ! video/x-raw,formatBGRx ! videoconvert ! video/x-raw,formatBGR ! appsink, cv2.CAP_GSTREAMER)实测延迟可以控制在50ms以内是最推荐的方式。如果出现花屏尝试调整sensor-mode参数nvarguscamerasrc sensor-id0 sensor-mode3 ! ...4.2 USB摄像头优化普通USB摄像头建议使用V4L2后端def open_usb_camera(dev0): cap cv2.VideoCapture(dev) cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*MJPG)) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) return cap遇到帧率上不去的问题时检查支持的格式v4l2-ctl --list-formats-ext -d /dev/video0优先选择MJPEG格式能大幅降低CPU负载。4.3 网络摄像头接入对于RTSP流我封装了一个带缓冲的解决方案class RTSPCapture: def __init__(self, url, buffer_size10): self.url url self.cap cv2.VideoCapture(url) self.buffer deque(maxlenbuffer_size) def read(self): while len(self.buffer) 3: # 预缓冲 ret, frame self.cap.read() if ret: self.buffer.append(frame) return True, self.buffer.popleft()配合YOLOv5使用时建议开启多线程采集from threading import Thread class VideoStream: def __init__(self, src): self.stream open_usb_camera(src) (self.grabbed, self.frame) self.stream.read() self.stopped False def start(self): Thread(targetself.update, args()).start() return self def update(self): while not self.stopped: (self.grabbed, self.frame) self.stream.read() def read(self): return self.frame def stop(self): self.stopped True5. 性能调优与实测对比5.1 模型精度与速度权衡在Orin NANO 8G上测试不同YOLOv5模型的表现模型类型输入尺寸mAP0.5显存占用FPS (FP16)yolov5n64028.0500MB62yolov5s64037.4800MB38yolov5m64045.41.5GB22如果检测小物体可以尝试增大输入尺寸python detect.py --imgsz 1280但要注意这会显著增加计算量yolov5s的FPS会降到约15。5.2 多进程并行处理为了充分利用Orin NANO的6核CPU我采用生产者-消费者模式from multiprocessing import Process, Queue def detector(input_q, output_q): model torch.hub.load(ultralytics/yolov5, yolov5s) while True: frame input_q.get() results model(frame) output_q.put(results) input_queue Queue(maxsize1) output_queue Queue(maxsize1) detector_process Process(targetdetector, args(input_queue, output_queue)) detector_process.daemon True detector_process.start()这种设计可以让摄像头采集和模型推理完全并行整体吞吐量提升40%以上。5.3 温度控制策略长时间运行需要注意散热我写了个动态频率调节脚本#!/bin/bash while true; do temp$(cat /sys/class/thermal/thermal_zone0/temp) if [ $temp -gt 75000 ]; then echo Thermal throttling activated! sudo nvpmodel -m 1 # 切换到低功耗模式 else sudo nvpmodel -m 0 # 高性能模式 fi sleep 10 done配合一个小风扇可以保持设备在60°C以下稳定运行。