1. Jetson Orin NANO 8G与YOLOv5的黄金组合
拿到Jetson Orin NANO 8G开发板的第一天,我就被它小巧身材下的强大算力震惊了。这款搭载了NVIDIA最新Orin架构的嵌入式设备,虽然只有信用卡大小,却拥有高达40 TOPS的AI算力,特别适合部署像YOLOv5这样的实时目标检测模型。相比前代Jetson Nano,Orin NANO的性能提升了近10倍,而功耗控制依然出色。
YOLOv5作为当前最流行的目标检测框架之一,以其轻量高效的特性成为边缘设备的首选。我实测在Orin NANO上运行YOLOv5s模型,1080P视频的检测速度能达到30FPS以上,完全满足实时性要求。这个组合特别适合智能零售、工业质检、安防监控等需要本地化实时分析的场景。
在开始配置前,建议准备以下硬件:
- Jetson Orin NANO 8G开发套件(含散热风扇)
- 支持MIPI CSI-2的摄像头(如Raspberry Pi Camera V2)
- 至少32GB的microSD卡或NVMe SSD
- 5V4A的电源适配器(实测低功率电源会导致性能下降)
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 python=3.8 conda activate yolov5安装PyTorch时要注意架构匹配:
pip3 install torch-1.12.0a0+git67ece03-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', type=str, default='yolov5s.engine', help='TensorRT cache file') parser.add_argument('--torchscript', action='store_true', help='use TorchScript')特别提醒:首次运行TensorRT引擎时会进行优化编译,可能需要2-3分钟,后续运行就会直接加载缓存。我在测试时发现,连续运行10次后,推理速度会比第一次提升约30%,这是TensorRT的运行时优化在起作用。
4. 多类型摄像头接入实战
4.1 CSI摄像头配置
对于Raspberry Pi Camera等CSI接口摄像头:
import cv2 def open_csi_camera(sensor_id=0): return cv2.VideoCapture(f'nvarguscamerasrc sensor-id={sensor_id} ! video/x-raw(memory:NVMM),width=1280,height=720,framerate=30/1 ! nvvidconv ! video/x-raw,format=BGRx ! videoconvert ! video/x-raw,format=BGR ! appsink', cv2.CAP_GSTREAMER)实测延迟可以控制在50ms以内,是最推荐的方式。如果出现花屏,尝试调整sensor-mode参数:
nvarguscamerasrc sensor-id=0 sensor-mode=3 ! ...4.2 USB摄像头优化
普通USB摄像头建议使用V4L2后端:
def open_usb_camera(dev=0): 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_size=10): self.url = url self.cap = cv2.VideoCapture(url) self.buffer = deque(maxlen=buffer_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(target=self.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模型的表现:
| 模型类型 | 输入尺寸 | mAP@0.5 | 显存占用 | FPS (FP16) |
|---|---|---|---|---|
| yolov5n | 640 | 28.0 | 500MB | 62 |
| yolov5s | 640 | 37.4 | 800MB | 38 |
| yolov5m | 640 | 45.4 | 1.5GB | 22 |
如果检测小物体,可以尝试增大输入尺寸:
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(maxsize=1) output_queue = Queue(maxsize=1) detector_process = Process(target=detector, 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以下稳定运行。