1. Jetson Nano跑YOLOv5的挑战与机遇
作为边缘计算领域的经典组合,Jetson Nano与YOLOv5的搭配一直备受开发者关注。但实际部署过程中,从环境配置到模型优化,每个环节都可能成为拦路虎。我花了三周时间反复试验,最终整理出这套经过实战验证的完整方案。
Jetson Nano虽然搭载了128核Maxwell架构GPU,但仅4GB的内存和有限的算力(472 GFLOPS)对运行YOLOv5这样的现代检测模型确实构成挑战。特别是在处理高分辨率输入时,帧率可能直接跌到个位数。不过通过合理的模型裁剪和优化,完全可以在保持可用精度的前提下实现实时检测。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境配置:避开那些坑
2.1 系统基础环境搭建
推荐使用JetPack 4.6.1作为基础系统,这是目前对YOLOv5支持最稳定的版本。安装后首先执行:
bash复制sudo apt-get update
sudo apt-get install -y python3-pip python3-dev
特别注意:千万不要直接使用pip安装torch!Jetson Nano需要特定版本的PyTorch,官方提供的wheel才是正确选择:
bash复制wget https://nvidia.box.com/shared/static/p57jwntv436lfrd78inwl7iml6p13fzh.whl -O torch-1.8.0-cp36-cp36m-linux_aarch64.whl
pip3 install torch-1.8.0-cp36-cp36m-linux_aarch64.whl
2.2 关键依赖项安装
YOLOv5需要opencv-python,但在Jetson上编译安装可能耗时数小时。更聪明的做法是使用预编译版本:
bash复制sudo apt-get install -y libopencv-dev python3-opencv
pip3 install numpy --upgrade
验证安装时如果遇到"ImportError: libGL.so.1"错误,需要补装:
bash复制sudo apt install -y libgl1-mesa-glx
3. YOLOv5的定制化部署
3.1 模型选择与下载
YOLOv5有多个预训练模型尺寸,对于Jetson Nano建议从nano或small版本开始:
bash复制git clone https://github.com/ultralytics/yolov5
cd yolov5
pip3 install -r requirements.txt
重要提示:国内用户可以使用Gitee镜像加速克隆:
git clone https://gitee.com/mirrors/YOLOv5.git
3.2 模型量化与优化
直接运行原版YOLOv5s在640x640输入下只有约8FPS。通过以下技巧可提升至15+FPS:
- 启用TensorRT加速:
python复制model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True).cuda()
model = model.half() # 转为FP16
- 修改models/yolo.py中的Detect类,添加:
python复制def forward(self, x):
# 原有代码...
if torch.onnx.is_in_onnx_export():
output = torch.cat(z, 1)
return output
return x if self.training else (torch.cat(z, 1), x)
- 使用torch2trt进行转换:
python复制from torch2trt import torch2trt
model_trt = torch2trt(model, [data], fp16_mode=True)
4. 性能调优实战记录
4.1 内存管理技巧
Jetson Nano的4GB内存是主要瓶颈。通过以下配置可显著改善:
bash复制sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
在/etc/fstab末尾添加:
code复制/swapfile none swap sw 0 0
同时调整GPU内存分配:
bash复制sudo nvpmodel -m 0 # 最大性能模式
sudo jetson_clocks
4.2 视频流处理优化
对于USB摄像头输入,使用GStreamer管道比OpenCV直接读取效率提升30%:
python复制import cv2
pipeline = "v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480 ! videoconvert ! appsink"
cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)
对于RTSP流,建议使用:
python复制pipeline = "rtspsrc location=rtsp://192.168.1.100:554/stream latency=0 ! rtph264depay ! h264parse ! omxh264dec ! nvvidconv ! video/x-raw,format=BGRx ! videoconvert ! appsink"
5. 常见问题排坑指南
5.1 模型加载失败问题
如果遇到"Unable to load model"错误,通常是PyTorch版本不匹配导致。解决方法:
- 检查torch版本:
python3 -c "import torch; print(torch.__version__)" - 确保是1.8.0及以上版本
- 清理缓存:
rm -rf ~/.cache/torch
5.2 推理速度异常慢
当发现FPS远低于预期时,按以下步骤排查:
- 确认GPU模式:
sudo nvpmodel -q - 检查温度是否导致降频:
tegrastats - 验证TensorRT是否生效:在代码中添加
print(model.type())应显示"torch.HalfTensor"
5.3 内存不足崩溃
出现"CUDA out of memory"时的应急方案:
- 减小输入分辨率:修改detect.py中的imgsz参数
- 使用更小模型:换用yolov5n版本
- 启用--agnostic-nms减少后处理内存占用
6. 进阶优化策略
对于需要更高性能的场景,可以考虑:
- 模型剪枝:使用TorchPruner对YOLOv5进行通道剪枝
python复制from torchpruner import SparsePruner
pruner = SparsePruner(model, sparsity=0.3)
pruner.step()
- 知识蒸馏:用大模型指导小模型训练
python复制# 教师模型
model_teacher = torch.hub.load('ultralytics/yolov5', 'yolov5m')
# 学生模型
model_student = torch.hub.load('ultralytics/yolov5', 'yolov5n')
# 蒸馏损失
loss = F.kl_div(
F.log_softmax(student_output/T, dim=1),
F.softmax(teacher_output/T, dim=1),
reduction='batchmean') * T * T
- 量化感知训练:
python复制model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm')
torch.quantization.prepare_qat(model, inplace=True)
# ...训练过程...
torch.quantization.convert(model, inplace=True)
经过这些优化,在我的测试环境中,YOLOv5n模型在320x320输入下可以达到28FPS,同时保持约0.5的mAP精度,完全满足大多数实时检测场景的需求。
