Jetson Nano 4GB版终极实战指南:从零部署YOLOv5到TensorRT加速全流程
当你第一次拿到这块信用卡大小的AI开发板时,可能会被它强大的边缘计算能力与复杂的配置过程所震撼。本文将带你完整走过从开箱到运行TensorRT加速的YOLOv5模型的每一个关键步骤,特别针对4GB内存版本进行优化配置。
1. 硬件准备与系统初始化
1.1 开发板供电方案选择
Jetson Nano提供三种供电方式,每种都有其适用场景:
| 供电类型 | 接口/位置 | 电流要求 | 适用场景 | 注意事项 |
|---|---|---|---|---|
| MicroUSB | 板载接口 | 2A以上 | 临时调试 | 必须移除J48跳线帽 |
| DC电源 | 圆孔接口 | 5V/4A | 长期运行 | 必须插入J48跳线帽 |
| GPIO供电 | 40pin接口 | 5V/3A | 扩展板集成 | 需确保电源质量稳定 |
推荐方案:使用官方认证的5V/4A DC电源,这是最稳定的供电方式。我曾尝试用移动电源通过MicroUSB供电,在运行YOLOv5时频繁出现电压不足导致的系统重启。
1.2 系统镜像烧录实战
使用Etcher工具烧录镜像时,常会遇到两个典型问题:
# 查看SD卡设备标识(重要!避免选错磁盘) diskutil list (Mac) lsblk -p (Linux)常见问题处理:
- 烧录失败:尝试更换读卡器或SD卡槽,某些USB3.0读卡器存在兼容性问题
- 验证错误:可忽略,实际仍可正常启动(这是Etcher已知问题)
烧录完成后,首次启动会经历约15分钟的系统初始化过程,建议选择:
- 语言:英文(避免后续终端乱码)
- 时区:Asia/Shanghai
- 用户名:避免使用特殊字符
2. 开发环境深度配置
2.1 国内源加速配置
针对bionic版本的完整清华源配置:
sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list更新后安装基础工具套件:
sudo apt-get update && sudo apt-get install -y \ curl \ git \ cmake \ libpython3-dev \ python3-pip2.2 CUDA环境精调
验证CUDA安装时,推荐使用更直观的deviceQuery示例:
cd /usr/local/cuda/samples/1_Utilities/deviceQuery sudo make ./deviceQuery正常输出应包含:
Detected 1 CUDA Capable device(s) Device 0: "NVIDIA Tegra X1" ... Result = PASS环境变量配置要点(针对CUDA 10.2):
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc3. 关键软件栈安装
3.1 TensorFlow GPU版特殊安装
由于架构差异,不能直接使用pip安装标准版:
pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v45 tensorflow-gpu验证安装:
import tensorflow as tf tf.test.gpu_device_name() # 应返回'/device:GPU:0'3.2 PyCUDA编译安装
从源码编译时需指定正确的CUDA路径:
wget https://pypi.python.org/packages/source/p/pycuda/pycuda-2021.1.tar.gz tar xzvf pycuda-2021.1.tar.gz cd pycuda-2021.1 python3 configure.py --cuda-root=/usr/local/cuda-10.2 make -j4 sudo python3 setup.py install常见编译错误解决:
- nvcc not found:确认CUDA环境变量配置正确
- 内存不足:添加swap空间(后续章节介绍)
4. YOLOv5模型转换与TensorRT加速
4.1 模型转换全流程
- 下载tensorrtx对应版本:
git clone -b yolov5-v5.0 https://github.com/wang-xinyu/tensorrtx.git- 权重转换关键步骤:
cd tensorrtx/yolov5 mkdir build && cd build cmake .. -DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc make -j$(nproc)- 生成TensorRT引擎:
./yolov5 -s ../yolov5s.wts yolov5s.engine s性能对比数据:
| 推理方式 | 分辨率 | FPS (Nano 4GB) | 内存占用 |
|---|---|---|---|
| PyTorch原生 | 640x640 | 2.1 | 3.2GB |
| TensorRT FP16 | 640x640 | 8.7 | 2.1GB |
| TensorRT INT8 | 640x640 | 12.3 | 1.8GB |
4.2 实时摄像头推理优化
使用OpenCV的GStreamer管道可提升采集效率:
def gstreamer_pipeline( capture_width=640, capture_height=480, display_width=640, display_height=480, framerate=30, flip_method=0, ): return ( "nvarguscamerasrc ! " "video/x-raw(memory:NVMM), " f"width=(int){capture_width}, height=(int){capture_height}, " f"format=(string)NV12, framerate=(fraction){framerate}/1 ! " f"nvvidconv flip-method={flip_method} ! " f"video/x-raw, width=(int){display_width}, height=(int){display_height}, format=(string)BGRx ! " "videoconvert ! " "video/x-raw, format=(string)BGR ! appsink" ) cap = cv2.VideoCapture(gstreamer_pipeline(), cv2.CAP_GSTREAMER)5. 性能调优实战技巧
5.1 内存管理策略
增加swap空间防止OOM:
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile free -h # 验证swap生效5.2 温度控制方案
安装jetson-stats监控工具:
sudo -H pip install jetson-stats jtop # 实时监控界面主动散热配置:
# 根据温度动态调整风扇转速 import os def set_fan_speed(temp): speed = min(255, max(0, (temp - 50) * 10)) os.system(f'echo {speed} | sudo tee /sys/devices/pwm-fan/target_pwm')6. 项目实战:智能监控系统
完整部署示例代码结构:
yolov5_trt/ ├── configs │ ├── camera.cfg │ └── model.cfg ├── engines │ └── yolov5s.engine ├── utils │ ├── trt_loader.py │ └── visualizer.py └── main.py核心推理逻辑优化:
class TrtYOLO: def __init__(self, engine_path): self.ctx = cuda.Device(0).make_context() self.stream = cuda.Stream() with open(engine_path, "rb") as f: self.engine = trt.Runtime(trt.Logger(trt.Logger.WARNING)).deserialize_cuda_engine(f.read()) def infer(self, img): # 异步推理实现 with self.engine.create_execution_context() as context: bindings = self._allocate_buffers(context) # 预处理和推理代码... yield result # 使用生成器减少内存占用 def __del__(self): self.ctx.pop()在完成整个部署流程后,最让我惊喜的是经过TensorRT优化的模型在保持95%以上精度的同时,推理速度提升了4-6倍。实际测试中发现,使用640x640分辨率时系统资源占用最为平衡,而将摄像头帧率控制在15-20FPS可以获得最佳能效比。