
1. Jetson Nano与YOLOv5的完美邂逅第一次接触Jetson Nano和YOLOv5是在去年的一个计算机视觉比赛上。当时需要在边缘设备上部署目标检测模型经过多方比较最终选择了这个组合。说实话刚开始踩了不少坑网上的资料要么过于零散要么版本不兼容。经过一周的折腾终于摸清了从系统烧录到模型推理的完整流程现在把这些经验分享给大家。Jetson Nano作为NVIDIA推出的边缘计算设备搭载了128核Maxwell架构GPU和四核ARM Cortex-A57 CPU虽然性能比不上桌面级显卡但在功耗和价格上优势明显。而YOLOv5作为当前最流行的目标检测算法之一以其速度快、精度高、易于部署的特点成为边缘设备上的首选。这个教程适合以下几类开发者需要在嵌入式设备上部署目标检测模型的工程师对AI边缘计算感兴趣的学生和研究者希望将深度学习模型落地到实际项目中的实践者2. 系统镜像烧录全攻略2.1 准备工作在开始之前你需要准备以下硬件Jetson Nano开发板建议4GB版本至少32GB的microSD卡推荐使用U3速度等级的卡5V4A的电源适配器官方推荐避免供电不足读卡器用于烧录系统镜像我最初用的是16GB的SD卡结果发现空间根本不够用。后来换了64GB的卡整个过程就顺利多了。这里特别提醒不要贪图便宜买低速卡否则后续模型加载和推理时会明显卡顿。2.2 下载系统镜像官方提供了两个版本的镜像Jetson Nano Developer Kit SD Card Image完整版JetPack SDK需要手动安装对于新手我强烈推荐直接使用SD卡镜像省去了很多配置麻烦。下载地址在NVIDIA开发者网站搜索Jetson Nano SD Card Image就能找到最新版本。我使用的是4.6.1版本自带Ubuntu 18.04和Python 3.6环境。2.3 烧录步骤详解使用SD Card Formatter工具格式化SD卡注意这会清除卡上所有数据下载balenaEtcher烧录工具跨平台支持Win/Mac/Linux选择下载好的.img镜像文件和目标SD卡点击Flash!开始烧录这个过程大约需要10-15分钟我第一次烧录时遇到了一个坑直接使用Win32DiskImager导致系统无法启动。后来改用Etcher就再没出过问题。烧录完成后系统会提示你拔出SD卡——千万别急着拔等待所有写入操作完成安全弹出后再物理拔出。3. 系统配置与优化3.1 首次启动设置插入SD卡连接显示器、键盘鼠标后开机你会看到标准的Ubuntu初始化界面。这里有几个关键步骤选择语言和时区建议选英文上海时区创建用户名和密码记住这个密码后续sudo命令需要配置磁盘空间默认即可完成安装后重启第一次启动可能会比较慢耐心等待。进入桌面后建议先打开终端运行以下命令开启root账户sudo passwd root然后设置root密码。这在后续安装某些需要高权限的软件时会很方便。3.2 更换软件源默认的软件源速度很慢我们需要换成国内镜像。这里以清华源为例先备份原始源列表sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak编辑源列表sudo nano /etc/apt/sources.list删除所有内容替换为deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe更新软件包列表sudo apt-get update sudo apt-get upgrade -y3.3 CUDA环境配置Jetson Nano已经预装了CUDA但需要手动配置环境变量才能使用编辑.bashrc文件nano ~/.bashrc在文件末尾添加export PATH/usr/local/cuda-10.2/bin${PATH::${PATH}} export LD_LIBRARY_PATH/usr/local/cuda-10.2/lib64${LD_LIBRARY_PATH::${LD_LIBRARY_PATH}} export CUDA_ROOT/usr/local/cuda使配置生效source ~/.bashrc验证安装nvcc -V如果看到CUDA版本信息说明配置成功。4. PyTorch与依赖安装4.1 安装系统依赖在安装PyTorch前需要先安装一些基础依赖sudo apt-get install python3-pip python3-dev -y sudo apt-get install build-essential make cmake cmake-curses-gui -y sudo apt-get install git g pkg-config curl -y sudo apt-get install libatlas-base-dev gfortran -y sudo apt-get install libhdf5-serial-dev hdf5-tools -y4.2 安装PyTorch for Jetson由于Jetson Nano采用ARM架构不能直接使用PyTorch官方提供的x86版本。需要安装NVIDIA专门为Jetson系列编译的版本。下载PyTorch 1.8的whl文件适用于JetPack 4.6使用pip安装sudo pip3 install torch-1.8.0-cp36-cp36m-linux_aarch64.whl这个过程会比较慢耐心等待。安装完成后可以验证import torch print(torch.__version__) print(torch.cuda.is_available())如果输出True说明PyTorch可以正常使用CUDA加速。4.3 安装torchvisiontorchvision版本需要与PyTorch匹配。对于PyTorch 1.8我们安装torchvision 0.9.0先安装依赖sudo apt-get install libopenmpi2 sudo apt-get install libopenblas-dev sudo apt-get install libjpeg-dev zlib1g-dev从源码编译安装git clone --branch v0.9.0 https://github.com/pytorch/vision torchvision cd torchvision export BUILD_VERSION0.9.0 sudo python3 setup.py install5. YOLOv5部署实战5.1 下载YOLOv5源码推荐使用v5.0版本这个版本在Jetson Nano上兼容性最好git clone -b v5.0 https://github.com/ultralytics/yolov5.git cd yolov55.2 安装Python依赖YOLOv5需要一些额外的Python包sudo pip3 install matplotlib3.2.2 sudo pip3 install numpy1.19.4 sudo pip3 install scipy1.4.1 sudo pip3 install opencv-python4.5.3.56 sudo pip3 install tqdm4.61.2 sudo pip3 install seaborn0.11.1 sudo pip3 install tensorboard2.5.0 sudo pip3 install PyYAML5.4.15.3 下载预训练模型YOLOv5提供了多个规模的预训练模型yolov5s小型速度最快yolov5m中型yolov5l大型yolov5x超大型精度最高对于Jetson Nano建议使用yolov5swget https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt5.4 运行推理测试使用摄像头实时检测python3 detect.py --source 0 --weights yolov5s.pt或者检测图片python3 detect.py --source test.jpg --weights yolov5s.pt第一次运行时会自动下载一些额外资源可能会比较慢。在我的测试中yolov5s在640x640分辨率下能达到约8FPS的性能。6. 性能优化技巧6.1 使用TensorRT加速NVIDIA的TensorRT可以显著提升模型推理速度。具体步骤安装pycudasudo pip3 install pycuda将YOLOv5模型转换为TensorRT格式from torch2trt import torch2trt model torch.load(yolov5s.pt).float() model.eval() x torch.ones((1,3,640,640)).cuda() model_trt torch2trt(model, [x]) torch.save(model_trt.state_dict(), yolov5s_trt.pt)使用TensorRT模型推理model_trt torch.load(yolov5s_trt.pt) results model_trt(x)经过TensorRT优化后推理速度可以提升2-3倍。6.2 内存优化Jetson Nano只有4GB内存运行YOLOv5时经常遇到内存不足的问题。解决方法增加交换空间sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile在/etc/fstab中添加/swapfile swap swap defaults 0 0运行模型时关闭不必要的服务sudo systemctl stop lightdm6.3 模型量化将模型从FP32转换为INT8可以大幅减少内存占用和计算量model model.half() # 转换为FP16注意量化可能会导致精度轻微下降需要根据实际需求权衡。7. 常见问题解决7.1 无法调用GPU如果torch.cuda.is_available()返回False可能是CUDA环境变量未正确设置PyTorch版本不兼容JetPack版本太旧解决方法检查CUDA环境变量确认安装的是Jetson专用PyTorch考虑升级JetPack7.2 内存不足表现程序突然崩溃或报CUDA out of memory错误。解决方法减小输入图像尺寸如从640降到320使用更小的模型如yolov5s增加交换空间关闭桌面环境sudo systemctl stop lightdm7.3 依赖冲突多个Python包可能要求不同版本的依赖项。建议使用virtualenv创建隔离环境严格按照YOLOv5要求的版本安装依赖遇到冲突时先卸载冲突包再重新安装指定版本8. 实际应用建议经过几个月的实际使用我发现Jetson Nano运行YOLOv5最适合以下场景对实时性要求不高的监控系统3-5FPS可接受需要低功耗运行的边缘设备教育和小型项目原型开发如果需要更高性能可以考虑Jetson Xavier NX或Orin系列。另外在正式部署时建议使用散热风扇Jetson Nano长时间高负载会降频考虑使用Docker容器化部署实现看门狗机制防止程序异常退出最后提醒一点所有安装包和模型最好保存在外部存储设备上因为SD卡损坏的风险较高。我现在的做法是将系统镜像备份到电脑上重要数据定期同步到NAS。