ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零部署YOLOv5到Jetson Nano:边缘AI开发实战指南

从零部署YOLOv5到Jetson Nano:边缘AI开发实战指南 1. 从零上手NVIDIA Jetson Nano不只是开箱更是项目起点如果你对边缘AI、机器人或者嵌入式视觉项目感兴趣那么NVIDIA Jetson Nano这个名字你一定不陌生。它被很多人称为“树莓派的AI加强版”但在我看来这个定位有点委屈它了。Jetson Nano是一块真正为AI计算而生的开发板它集成了NVIDIA的Maxwell架构GPU拥有128个CUDA核心能让你在功耗仅5-10瓦的设备上流畅运行像YOLO这样的现代神经网络模型。这不仅仅是“能跑”而是“能实用”。我最初接触它是为了做一个室内的实时物品识别项目从树莓派换到Jetson Nano后帧率从个位数直接跃升到20FPS那种体验的提升是颠覆性的。这篇文章我会以一个过来人的身份带你从拆箱到跑通第一个AI Demo避开我踩过的所有坑让你手里的这块绿色小板子真正成为你创意项目的强力引擎。2. 开箱与核心认知理解你的硬件伙伴在你兴奋地撕开静电袋之前我们需要先建立对Jetson Nano的正确认知。这不是一块普通的单片机开发板它是一个完整的、运行着Linux系统的微型计算机核心是AI计算。2.1 硬件规格与选型考量Jetson Nano主要有两种形态开发套件Developer Kit和模块Module。对于绝大多数个人开发者和爱好者我们接触的都是开发套件。它长这样一块比信用卡略大的绿色PCB核心是一颗四核ARM Cortex-A57 CPU和一颗128核NVIDIA Maxwell GPU搭配4GB LPDDR4内存。这里有一个至关重要的细节Jetson Nano开发板有两个版本的默认功耗模式。通过一个跳线帽J48可以选择5W或10W模式。5W模式仅使用USB Type-C供电即可10W模式则需要使用桶形电源接口供电以获得更稳定的性能和更高的CPU/GPU运行频率。我的建议是除非你只是点亮玩玩否则一律使用桶形电源适配器并设置为10W模式。很多人在跑模型时遇到莫名其妙的卡顿或系统重启八成是供电不足导致的。那个小小的跳线帽决定了你后续所有体验的稳定性。另一个关键点是存储。板载的16GB eMMC 5.1闪存对于安装系统和一些基础软件够用但如果你打算玩转多个AI模型、安装大型数据集比如COCO这点空间捉襟见肘。务必准备一张高速的MicroSD卡建议64GB或以上Class 10或UHS-I标准作为系统盘。系统的运行、软件的安装都将基于这张卡。我吃过亏用了一张低速卡导致系统响应极慢编译安装OpenCV花了将近一整天。2.2 系统镜像刷写一切的基础Jetson Nano没有内置存储系统完全运行在MicroSD卡上。因此第一步就是为你的SD卡制作一个系统镜像。NVIDIA官方为Jetson Nano提供了两个主要的系统镜像一个基于Ubuntu 18.04的另一个是较新的基于Ubuntu 20.04的。我强烈推荐直接使用JetPack 4.6及以上版本提供的Ubuntu 20.04镜像。JetPack是NVIDIA为Jetson系列打造的SDK它打包了适配好的Linux系统、CUDA、cuDNN、TensorRT、OpenCV等一整套工具链。用这个可以避免后续无数驱动和库版本不匹配的“玄学”问题。刷写工具在Windows下可以用BalenaEtcher在Linux或macOS下可以用dd命令。过程很简单下载官方的.img镜像文件用Etcher选择镜像和SD卡一键刷入。但这里有个坑刷写完成后Windows系统可能会提示你需要格式化SD卡千万要点“取消”因为刷写过程创建了多个分区Windows只能识别其中一个格式化会导致系统损坏。刷写完成后安全弹出SD卡插入Jetson Nano的卡槽连接显示器、键盘鼠标和电源就可以开机了。第一次开机时间会比较长系统需要进行初始化设置包括创建用户、选择时区、配置键盘布局等。这个过程和安装一台新的Ubuntu电脑没什么区别。3. 初始配置与环境调优让开发板“跑”起来第一次进入系统桌面你可能觉得它和普通的Ubuntu没什么两样。但为了让其AI算力充分发挥并进行高效的开发我们需要进行一系列关键配置。3.1 系统更新与基础工具安装首先打开终端更新软件源并升级所有包。虽然镜像已经比较新但这一步可以修复一些初始的潜在漏洞。sudo apt update sudo apt upgrade -y升级过程可能需要一段时间取决于网络速度。接下来安装一些开发必备的工具。Vim和Nano是命令行下的文本编辑器git用于代码版本管理curl和wget用于下载文件hwinfo可以查看更详细的硬件信息。sudo apt install -y vim nano git curl wget hwinfo3.2 功率模式与交换空间Swap配置这是影响性能的两个核心设置。1. 设置高性能模式10W如果你使用桶形电源务必确保J48跳线帽连接了靠外的两个针脚即“10W模式”。然后我们可以通过软件命令开启最大性能。NVIDIA提供了一个叫nvpmodel的工具来管理功耗模式。# 查看当前模式 sudo nvpmodel -q # 切换到最大性能模式模式0 10W sudo nvpmodel -m 0同时我们还需要设置风扇控制如果使用带风扇的散热套件。Jetson Nano默认的风控策略比较保守在高负载下容易过热降频。可以安装jetson-stats工具包它包含了强大的jtop系统监控工具来动态控制风扇。# 安装jetson-stats sudo -H pip install -U jetson-stats # 安装后重启然后在终端输入 jtop 即可查看详尽的系统状态CPU/GPU频率、温度、内存、功耗等。在jtop的界面里你可以将风扇设置为手动模式并调整转速确保核心温度维持在70摄氏度以下。2. 扩展交换空间SwapJetson Nano只有4GB内存在编译大型软件如OpenCV from source或运行稍大一点的模型时很容易内存耗尽OOM导致进程被杀掉。增加交换空间相当于Windows的虚拟内存是成本最低的解决方案。# 禁用默认的2GB交换文件 sudo swapoff /swapfile # 创建一个8GB的交换文件大小可根据你的SD卡容量调整一般4-8GB足够 sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 为了永久生效需要编辑 /etc/fstab 文件 echo /swapfile swap swap defaults 0 0 | sudo tee -a /etc/fstab注意交换文件在SD卡上频繁读写会影响SD卡寿命且速度远慢于真实内存。这只是编译和应急之需长期高负载应用应考虑优化模型或使用带更多内存的Jetson设备如Jetson Orin Nano。3.3 配置远程访问告别外接显示器开发过程中每次都连接显示器、键盘鼠标非常不便。配置SSH和VNC远程访问是提升效率的关键。SSH配置Jetson Nano开机后默认开启了SSH服务。你只需要在路由器里找到它的IP地址或者直接在Jetson Nano的终端里用ifconfig或ip addr show命令查看。然后就可以从你的主力电脑Windows用PuTTY或PowerShell macOS/Linux用终端通过ssh usernameip_address连接了。VNC配置可选用于远程桌面如果你需要图形化界面可以安装tightvncserver。sudo apt install -y tightvncserver vncserver # 第一次运行会设置密码然后你可以在VNC客户端如RealVNC, TigerVNC中输入IP地址:1例如192.168.1.100:1进行连接。为了获得更好的体验你还可以配置开机自启和设置固定的分辨率。4. AI软件栈部署解锁CUDA与深度学习能力系统基础打好后接下来就是安装AI开发的“三驾马车”CUDA、cuDNN和TensorRT。幸运的是如果你使用的是JetPack镜像这些通常已经预装好了。我们需要做的是验证和配置。4.1 验证CUDA与cuDNN打开终端输入以下命令# 查看CUDA编译器版本 nvcc --version # 查看CUDA运行时版本更常用 cat /usr/local/cuda/version.txt # 查看cuDNN版本 cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2如果这些命令都能正确输出版本号例如CUDA 10.2 cuDNN 8.x说明基础环境已就绪。一个更直观的方法是运行NVIDIA系统管理接口命令nvidia-smi这个命令会显示一个监控界面列出GPU的型号Jetson Nano、驱动版本、CUDA版本以及当前GPU的利用率、内存使用情况和运行中的进程。如果你遇到“NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver”这个经典错误不要慌。这几乎总是因为系统内核更新后NVIDIA内核模块没有正确编译或加载。解决方法通常是重新安装内核头文件并重新配置NVIDIA驱动sudo apt install --reinstall linux-headers-$(uname -r) sudo apt install --reinstall nvidia-jetpack然后重启系统。4.2 安装PyTorch和TorchVision这是深度学习模型开发和测试最常用的框架之一。由于Jetson是ARM架构不能直接用pip install torch来安装官方预编译的x86版本。NVIDIA为每个JetPack版本提供了适配好的PyTorch wheel包。你需要根据你的JetPack版本运行cat /etc/nv_tegra_release查看去NVIDIA的官方论坛或PyTorch for Jetson的发布页面找到对应的wheel文件下载链接。例如对于JetPack 4.6 (CUDA 10.2)安装命令可能如下# 安装依赖 sudo apt-get install -y python3-pip libopenblas-base libopenmpi-dev # 下载对应的wheel文件这里URL需要替换为实际找到的地址 wget https://nvidia.box.com/shared/static/xxxxxxxxxx.whl -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl安装完成后进入Python交互环境验证import torch print(torch.__version__) # 应输出版本号 print(torch.cuda.is_available()) # 应输出 True print(torch.cuda.get_device_name(0)) # 应输出 ‘NVIDIA Tegra X1‘ 或类似TorchVision的安装类似也需要找到对应版本的wheel文件。务必保持PyTorch和TorchVision版本的匹配。4.3 安装TensorRT并验证性能TensorRT是NVIDIA推出的高性能深度学习推理SDK。它能对训练好的模型进行优化如层融合、精度校准、内核自动调优并在Jetson上实现极致的推理速度。JetPack已经预装了TensorRT我们可以验证一下。# 检查TensorRT版本 dpkg -l | grep tensorrt通常还会预装一个trtexec命令行工具可以用来快速基准测试一个模型。但更常用的方式是通过PyTorch或TensorFlow模型转换。一个简单的验证方法是使用NVIDIA提供的示例。例如进入/usr/src/tensorrt/samples/python目录运行一个分类示例看看它是否能正确调用TensorRT加速。5. 实战部署并运行你的第一个AI模型——YOLOv5理论准备就绪让我们用最流行的目标检测模型YOLOv5来点燃你的Jetson Nano。这里我们选择PyTorch Hub的方式这是最快上手的路径。5.1 准备Python环境与依赖建议为你的AI项目创建一个独立的Python虚拟环境避免污染系统环境。sudo apt install -y python3-venv python3-dev cd ~ python3 -m venv yolov5_env source yolov5_env/bin/activate激活虚拟环境后命令行提示符前会出现(yolov5_env)字样。安装YOLOv5所需的基础依赖pip install --upgrade pip # 安装PyTorch和TorchVision如果上一步没在虚拟环境装这里需要重装对应版本 # 安装YOLOv5核心依赖 pip install matplotlib3.3 opencv-python4.5.5 pillow8.0.0 PyYAML5.4.1 requests2.25.1 scipy1.4.1 tqdm4.64.05.2 下载并运行YOLOv5直接从Ultralytics的GitHub仓库下载代码并使用PyTorch Hub加载预训练模型是最简单的。import torch import cv2 # 加载模型 (会自动下载yolov5s.pt权重文件) model torch.hub.load(ultralytics/yolov5, yolov5s, pretrainedTrue) # 将模型设置为评估模式并转移到GPUJetson Nano model.eval() model.cuda() # 准备输入这里用一张示例图片你可以替换为‘0‘使用摄像头 img https://ultralytics.com/images/zidane.jpg # 或者使用本地路径 ‘path/to/your/image.jpg‘ # 或者使用OpenCV从摄像头捕获 # cap cv2.VideoCapture(0) # ret, frame cap.read() # 执行推理 results model(img) # 显示结果 results.print() # 在终端打印检测到的对象信息 results.show() # 会尝试打开一个窗口显示图片需要图形界面或配置好GUI转发第一次运行torch.hub.load时会下载yolov5s.pt模型文件约14MB下载可能较慢。yolov5s是YOLOv5系列中最小的模型最适合在Jetson Nano上实时运行。5.3 实现实时摄像头检测将上面的代码片段组合成一个简单的实时检测脚本import torch import cv2 import numpy as np # 加载模型 model torch.hub.load(ultralytics/yolov5, yolov5s, pretrainedTrue) model.eval().cuda() # 打开摄像头0代表默认摄像头 cap cv2.VideoCapture(0) if not cap.isOpened(): print(无法打开摄像头) exit() print(开始实时检测按 ‘q‘ 键退出...) while True: ret, frame cap.read() if not ret: break # YOLOv5期望的输入是RGB格式OpenCV读取的是BGR rgb_frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 推理 results model(rgb_frame) # 将结果渲染到BGR图像上用于显示 rendered_frame np.squeeze(results.render()) # render()返回一个列表里面是带标注的RGB图像 bgr_frame cv2.cvtColor(rendered_frame, cv2.COLOR_RGB2BGR) # 显示帧率近似 cv2.putText(bgr_frame, fFPS: {results.t:.2f}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow(YOLOv5 on Jetson Nano, bgr_frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()保存为detect_camera.py并运行。你应该能看到摄像头画面以及YOLOv5实时画出的检测框和标签。在10W模式下对于640x480的输入分辨率帧率FPS达到15-20是完全可以期待的。实操心得第一次运行可能会比较慢因为模型需要“热身”包括初始化和GPU内核的编译。运行十几秒后速度会稳定下来。如果感觉卡顿可以尝试在model调用时传入imgsz320参数将输入图像缩放到更小的尺寸如320x320这会显著提升速度当然精度会略有下降。6. 性能监控与深度优化技巧让模型跑起来只是第一步让它跑得又快又稳才是工程化的开始。6.1 使用jtop进行全方位监控之前安装的jetson-stats工具包中的jtop是Jetson平台的“任务管理器”。在终端输入jtop你会看到一个彩色的、信息丰富的监控界面。第一页INFO概览可以看到JetPack版本、CUDA版本、所有硬件模块的状态。第二页GPU实时显示GPU的频率、利用率、渲染、编解码器负载。第三页CPU显示四个CPU核心的频率、利用率和温度。第四页MEM详细的内存和交换空间使用情况。第五页CTRL控制中心可以在这里实时切换功耗模式0MAXN15W手动控制风扇转速开启或关闭CPU核心。在跑模型时打开这个页面你能清晰地看到GPU利用率是否吃满CPU是否成为瓶颈温度是否安全。6.2 模型优化从PyTorch到TensorRT用PyTorch直接推理如上一步方便但并非最优性能。要榨干Jetson Nano的算力必须祭出TensorRT。流程通常是将PyTorch模型.pt先导出为ONNX格式一种开放的模型交换格式再用TensorRT的解析器构建一个针对Jetson硬件高度优化的引擎.engine文件。这个过程有些复杂但YOLOv5社区提供了相对方便的脚本。大致步骤如下在安装了ONNX和TensorRT的PC或Jetson本机上将yolov5s.pt导出为yolov5s.onnx。使用TensorRT的trtexec工具或Python API将ONNX模型转换为TensorRT引擎。这里需要选择精度FP32 FP16 INT8。在Jetson Nano上强烈推荐使用FP16半精度它能几乎在不损失精度的情况下将推理速度提升一倍并减少内存占用。INT8量化能更快但需要校准数据集且精度损失可能更明显。编写代码加载.engine文件进行推理。由于步骤较多你可以先使用PyTorch版本进行开发和原型验证待流程稳定后再将性能关键部分用TensorRT重写。网上有许多关于“YOLOv5 TensorRT Jetson”的详细教程可以参考。6.3 内存与功耗管理实战关闭图形桌面释放内存如果你的应用是纯“无头模式”headless即不需要显示器可以通过关闭桌面环境来节省出几百MB内存。将系统设置为默认启动到命令行sudo systemctl set-default multi-user.target重启后就是纯命令行界面了。需要图形界面时可以临时输入startx启动。想改回来则运行sudo systemctl set-default graphical.target。使用性能调控器Linux的CPU调控器governor可以设置CPU的运行策略。performance模式让CPU一直以最高频率运行响应最快但耗电powersave模式则相反。对于持续推理任务设为performance可能更稳定。# 查看所有CPU核心的当前调控器 cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor # 临时设置为performance重启失效 echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor7. 常见问题排查与解决实录开发过程中你一定会遇到各种问题。这里记录几个最典型的。7.1 问题一运行AI模型时系统卡死或自动重启现象在运行YOLO或其他模型几分钟后屏幕冻结或系统直接重启。排查这几乎可以肯定是供电不足或过热。解决确认电源必须使用5V/4A20W以上的桶形电源适配器并且J48跳线帽设置在10W模式。劣质或功率不足的USB-C电源线/适配器是罪魁祸首。加强散热触摸芯片背面如果烫手就是过热了。Jetson Nano被动散热只能应付轻负载。必须加装主动散热风扇。确保风扇正确接到板上的风扇接口Jetson Nano开发套件上有标注。监控温度运行jtop在GPU或CPU页面查看温度。持续超过80°C就有降频或宕机风险。在jtop的控制页面手动提高风扇转速。7.2 问题二pip install或编译时内存不足OOM Killer现象在安装大型Python包如torch的某些依赖或编译OpenCV时编译进程突然被终止终端显示Killed。排查运行dmesg | tail -20通常能看到内核日志显示“Out of memory”并杀死了某个进程。解决增加交换空间如前文所述将交换文件扩大到6GB或8GB。临时清理内存在开始编译前运行sudo sync echo 3 | sudo tee /proc/sys/vm/drop_caches清理页面缓存。限制并行编译任务对于make编译使用make -j2而不是make -j4减少同时进行的编译任务数降低内存峰值。7.3 问题三摄像头无法打开OpenCV错误现象使用cv2.VideoCapture(0)时返回False或者报错“V4L2: can‘t open camera”。排查检查摄像头权限用户可能没有访问视频设备的权限。ls -l /dev/video* # 查看设备权限确认摄像头型号并非所有USB摄像头都兼容Linux下的V4L2驱动。解决添加用户到video组sudo usermod -aG video $USER然后注销并重新登录或重启使组生效。尝试其他设备索引有时摄像头设备号不是0。尝试cv2.VideoCapture(1)。使用GStreamer后端对于CSI摄像头如Raspberry Pi Camera ModuleOpenCV的V4L2后端可能不工作。需要使用GStreamer管道。例如对于树莓派CSI摄像头# 在Jetson Nano上打开CSI摄像头的典型GStreamer管道 pipeline ‘nvarguscamerasrc ! video/x-raw(memory:NVMM), width1280, height720, framerate30/1, formatNV12 ! nvvidconv flip-method0 ! video/x-raw, width640, height480, formatBGRx ! videoconvert ! video/x-raw, formatBGR ! appsink‘ cap cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)7.4 问题四import torch时报错 “Illegal instruction (core dumped)”现象成功安装PyTorch wheel包后导入时程序崩溃。排查这通常是因为安装的PyTorch wheel包与你的JetPack版本特别是CUDA版本不匹配。或者该wheel包是为不同架构的CPU比如使用了当前CPU不支持的指令集编译的。解决确认你的JetPack版本cat /etc/nv_tegra_release。去NVIDIA官方论坛或PyTorch for Jetson的GitHub页面找到完全对应你JetPack版本的PyTorch和TorchVision wheel文件链接。一个字都不能差。卸载当前版本重新下载和安装正确的版本。从一块裸板到一个能实时运行YOLOv5的AI边缘设备我们完成了Jetson Nano的入门之旅。这个过程里正确的系统配置、稳定的供电散热、针对性的软件安装和持续的监控优化每一个环节都影响着最终的体验。Jetson Nano的魅力在于它用一个极低的门槛给了你一个完整的、可触摸的AI计算平台。当你看到自己编写的代码让这块小板子“看懂”周围世界时那种成就感是纯粹的。接下来你可以尝试更复杂的模型将它集成到机器人小车里或者结合传感器做更有趣的交互项目。记住遇到问题多查社区NVIDIA Developer Forum和GitHub相关项目非常活跃善用jtop这个神器你踩过的坑绝大多数前人都已经给出了答案。
返回列表