尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Jetson Nano边缘AI开发实战:从系统部署到YOLOv5模型推理

Jetson Nano边缘AI开发实战:从系统部署到YOLOv5模型推理 1. 从开箱到点亮Jetson Nano Developer Kit 初体验如果你对边缘AI计算感兴趣或者想找一个能跑点正经模型的嵌入式开发板Jetson Nano Developer Kit开发者套件大概率已经出现在你的视野里了。它不是什么新玩意儿但在入门级边缘AI硬件里依然是个绕不开的经典选择。简单来说这就是一块自带GPU的微型电脑能让你在巴掌大的地方跑起像YOLO这样的目标检测模型处理实时视频流或者搞点机器人视觉项目。我手头这块板子已经陪我折腾过好几个项目了从最初的兴奋开箱到后来的各种踩坑今天我就以一个过来人的身份带你走一遍完整的“上手”流程不止是点亮屏幕更重要的是帮你理清后续开发的环境脉络避开那些我当初浪费了无数时间的坑。很多人拿到板子第一步就卡在了系统安装上网上教程五花八门用SD卡还是用硬盘刷哪个镜像为什么我的板子不启动这一系列问题其实都有清晰的路径。更关键的是系统跑起来之后你马上要面对的就是Python环境、CUDA、cuDNN这些深度学习依赖的配置以及如何安装PyTorch、TensorFlow这些框架。别担心我会把每一步的操作意图和背后的逻辑都讲清楚让你不仅能把环境搭起来还能明白为什么这么搭。我们最终的目标是搭建一个稳定、可复现的基础开发环境为后续部署YOLOv5、YOLOv8乃至更新的模型做好准备。无论你是学生、创客还是工程师只要想低成本地入门边缘AI这篇内容应该能给你省下不少摸索的时间。2. 硬件概览与启动介质选择不只是插电开机Jetson Nano Developer Kit 的板子设计得很紧凑接口却给得相当大方。拿到手第一件事我建议你先别急着通电花几分钟认识一下这些接口这对后续连接外设至关重要。板子中央那个带散热风扇的芯片就是它的核心——128核Maxwell架构的GPU和四核ARM Cortex-A57 CPU。旁边有两个关键跳线帽一个是J48用于选择供电模式Micro-USB或DC桶形接口另一个是J50用于强制进入恢复模式刷机时用。背面有一个M.2 Key E的插槽可以接Wi-Fi/蓝牙模块但大多数套件已经预装了。启动介质的选择是你面临的第一个决策点。官方提供了两种方式MicroSD卡和eMMC通过USB口连接。对于绝大多数初学者我强烈推荐使用MicroSD卡。原因很简单成本低、易于备份和更换。如果你把系统玩坏了只需要重新烧录一张SD卡几分钟就能恢复。而eMMC方式虽然速度可能更快但一旦系统出问题恢复起来更麻烦。选择SD卡时速度是关键。请务必使用Class 10或UHS-I及以上速度等级的卡容量建议至少32GB。我吃过亏用过一张低速卡系统安装慢如蜗牛日常操作也卡顿频繁极大影响开发体验。品牌方面SanDisk Extreme或Samsung EVO Plus系列是经过大量社区验证的可靠选择。供电是另一个容易出问题的地方。板子有两种供电方式通过Micro-USB接口5V/2A或通过DC桶形接口5V/4A。这里有个非常重要的原则如果你要连接任何高功耗外设比如USB摄像头、键盘鼠标或者打算让GPU高负荷运行跑模型训练或推理必须使用DC 5V/4A的电源适配器。Micro-USB供电仅适用于最低功耗的调试场景。供电不足会导致板子运行不稳定随机重启这种问题排查起来非常痛苦。跳线帽J48就是用来切换这两种供电模式的使用DC供电时需要将跳线帽连接到靠外侧DC侧的两个针脚上。3. 系统镜像烧录与首次启动避开那些“玄学”问题系统烧录本身不复杂但细节决定成败。你需要一台x86的电脑Windows、macOS或Linux均可来完成烧录。首先去NVIDIA官方开发者网站下载最新的Jetson Nano Developer Kit SD Card Image。注意不要下错成给其他Jetson设备如Jetson Orin Nano的镜像。截至我写这篇文章时稳定的版本是基于Ubuntu 18.04的但后续可能会有更新。下载下来是一个.zip压缩包解压后得到一个.img文件。接下来是烧录工具。在Windows上我推荐使用BalenaEtcher它开源、免费且界面友好几乎不会出错。在macOS或Linux上除了BalenaEtcher也可以用命令行工具dd但需要格外小心别选错磁盘设备。将SD卡插入电脑读卡器打开Etcher选择下载好的.img镜像文件选择对应的SD卡驱动器然后点击“Flash”即可。这个过程大概需要10-20分钟取决于你的SD卡和电脑速度。烧录完成后Etcher可能会提示需要格式化千万不要点格式化直接关闭窗口或弹出SD卡即可。因为烧录过程已经将镜像完整写入包含了多个分区格式化会破坏这一切。将烧录好的SD卡插入Jetson Nano的卡槽连接好显示器通过HDMI或DP接口、键盘鼠标最后接上电源。第一次启动会进行一系列系统初始化配置包括创建用户、设置密码、选择时区等。这里有几个关键点连接网络建议在初始化时就连接Wi-Fi或有线网络方便后续安装更新和软件包。如果使用预装的Wi-Fi模块通常能直接搜索到网络。磁盘空间扩展初始化过程中系统会询问是否要扩展文件系统以使用SD卡的全部容量。务必选择“是”。否则系统只会使用镜像预设的较小分区你的SD卡大部分空间就浪费了。耐心等待首次启动和初始化可能比较慢特别是使用低速SD卡时请保持耐心不要中途断电。如果板子通电后没有任何显示黑屏可以按以下顺序排查检查供电确认电源适配器是5V/4A并且跳线帽J48设置正确DC供电模式。检查显示输出确认HDMI线连接牢固显示器输入源选择正确。可以尝试另一个显示器或另一条线。检查SD卡重新烧录一次镜像确保烧录过程没有报错。可以换一张SD卡试试。查看状态灯板子上有多个状态LED。正常情况下通电后电源灯常亮系统启动过程中状态灯会闪烁。如果电源灯都不亮肯定是供电问题。4. 基础系统配置与深度学习环境搭建系统启动进入桌面后别急着写代码我们先做几件让后续开发更顺畅的事。首先打开终端更新软件包列表并升级现有软件这是一个好习惯sudo apt update sudo apt upgrade -y这个过程可能需要一些时间取决于网络速度。接下来是配置Python环境。Jetson Nano的镜像默认已经安装了Python 3.6。对于深度学习来说我们强烈建议使用虚拟环境来管理项目依赖避免系统Python环境被污染。安装pip和虚拟环境工具sudo apt install python3-pip python3-dev python3-venv -y然后为你当前的项目创建一个虚拟环境比如叫nanopython3 -m venv ~/venv/nano source ~/venv/nano/bin/activate激活后你的命令行提示符前会出现(nano)字样。记住以后每次新开终端进行开发都需要先source激活这个环境。现在来到核心部分安装深度学习框架。Jetson平台是ARM架构并且有特定的CUDA版本因此绝对不能直接用pip install torch torchvision这样的命令这会尝试安装x86版本的PyTorch必然失败。NVIDIA为Jetson系列提供了预编译好的PyTorch wheel包。你需要根据你的JetPack版本可以通过nvcc --version和cat /etc/nv_tegra_release查看去NVIDIA的官方论坛或资源页面找到对应版本的PyTorch下载链接。例如对于某个特定JetPack版本安装命令可能类似于wget https://developer.download.nvidia.com/compute/redist/jp/v44/pytorch/torch-1.10.0-cp36-cp36m-linux_aarch64.whl pip install torch-1.10.0-cp36-cp36m-linux_aarch64.whl安装完PyTorch后同样需要安装对应版本的TorchVision通常也需要从源码编译或找到预编译的wheel包。这个过程比较繁琐但一劳永逸。TensorFlow的安装同理NVIDIA也提供了针对Jetson的TensorFlow版本。注意安装这些大型框架时务必确保虚拟环境是激活状态并且使用pip而不是pip3在虚拟环境中它们通常指向同一个。编译或安装过程可能耗时很长甚至超过一小时并且需要大量的交换空间Swap。如果内存不足可能会导致编译失败。建议提前扩展交换空间可以通过创建交换文件来实现。5. 性能优化与散热管理让Nano跑得更稳Jetson Nano的默认运行模式是节能的5W模式2核CPUGPU频率较低。要发挥其全部性能我们需要将其切换到10W模式4核CPU全开GPU频率提升。有两种方式软件模式推荐在终端运行sudo nvpmodel -m 0即可切换到10W模式模式0。运行sudo nvpmodel -q可以查看当前模式。硬件模式通过跳线帽J48旁边的J50跳线可以强制锁定在10W模式。但对于大多数情况软件模式动态切换更灵活。切换后性能提升是明显的但发热量也会大增。原装的散热片和小风扇在10W模式高负载下可能压不住导致热节流Thermal ThrottlingCPU/GPU频率会自动降低以避免过热性能反而会下降。因此良好的散热是稳定运行的前提。你可以确保风道畅通不要将板子放在柔软或密闭的表面。加装主动散热市面上有很多为Jetson Nano设计的散热风扇套件效果比原装好很多。监控温度安装jetson-stats工具包它可以方便地监控CPU/GPU温度、频率和功耗。sudo pip install jetson-stats # 安装后重启然后在终端使用 jtop 命令查看监控信息另一个重要的优化是启用交换空间Swap。Nano只有4GB内存跑稍大一点的模型就可能内存不足OOM。系统默认的交换空间可能不够。我们可以创建一个4GB的交换文件sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile为了让系统启动时自动挂载需要将这一行添加到/etc/fstab文件末尾/swapfile swap swap defaults 0 0增加交换空间后在内存吃紧时系统可以将部分数据交换到磁盘上避免程序崩溃但代价是速度变慢因为SD卡速度远慢于内存。这只是一种补救措施根本解决之道是优化模型和代码减少内存占用。6. 实战部署YOLOv5模型进行目标检测环境准备好了我们来跑一个实际的例子比如用YOLOv5做实时目标检测。这是检验你环境是否真正可用的好方法。首先确保你的虚拟环境已激活然后克隆YOLOv5的官方仓库cd ~ git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt安装requirements.txt里的依赖时可能会遇到一些包需要编译耐心等待即可。注意PyTorch已经在之前安装好了这里不会重复安装。YOLOv5提供了预训练的模型权重我们可以直接用一个小脚本进行测试。但这里有个关键点Jetson Nano的GPU是Maxwell架构而PyTorch默认的CUDA算码CUDA Arch可能不支持或者没有为这个架构预编译某些算子。这可能导致运行时报错。一个常见的解决方法是在运行前设置环境变量强制PyTorch使用兼容模式或者从源码重新编译PyTorch时包含对Maxwell架构的支持。不过对于直接使用Ultralytics提供的代码通常兼容性做得不错。我们使用一个简单的Python脚本进行摄像头实时检测假设你连接了USB摄像头设备号为/dev/video0import torch import cv2 # 加载模型使用最小的 yolov5s 模型以在Nano上获得可接受的帧率 model torch.hub.load(ultralytics/yolov5, yolov5s, pretrainedTrue) model.conf 0.25 # 置信度阈值 model.iou 0.45 # NMS IoU阈值 # 打开摄像头 cap cv2.VideoCapture(0) if not cap.isOpened(): print(无法打开摄像头) exit() while True: ret, frame cap.read() if not ret: break # 进行推理 results model(frame) # 渲染结果到图像上 rendered_frame results.render()[0] # 显示结果 cv2.imshow(YOLOv5 on Jetson Nano, rendered_frame) # 按 q 键退出 if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()第一次运行torch.hub.load时会下载模型权重需要一点时间。运行这个脚本你应该能看到摄像头画面并且画面中的物体如人、椅子、杯子被检测框标注出来。在Jetson Nano上使用yolov5s模型处理640x480分辨率的图像帧率大概能达到几FPS到十几FPS取决于场景复杂度。这已经可以满足很多实时性要求不极高的演示或应用场景。实操心得如果帧率过低除了尝试更小的模型如yolov5n还可以尝试以下优化1) 将输入图像分辨率从默认的640降低到320修改模型加载后的model.img_size2) 使用half()进行半精度FP16推理这能显著提升速度并减少内存占用但需要确保你的PyTorch版本支持FP16。命令是model model.half()同时记得将输入图像数据也转换为半精度。7. 常见问题排查与社区资源利用在折腾Jetson Nano的过程中你肯定会遇到各种问题。我总结几个最常见的问题和解决思路问题一ImportError: libxxx.so.x: cannot open shared object file这通常是动态链接库找不到。首先用find命令在系统里搜索这个文件是否存在例如find / -name libxxx.so* 2/dev/null。如果存在将其所在路径添加到LD_LIBRARY_PATH环境变量中export LD_LIBRARY_PATH/path/to/library:$LD_LIBRARY_PATH。可以将这行命令添加到你的~/.bashrc文件中使其永久生效。如果文件不存在则需要安装对应的开发包通常包名是libxxx-dev。问题二运行深度学习模型时内存不足OOM这是4GB内存的硬伤。除了前面提到的增加交换空间更有效的方法是降低批次大小Batch Size在加载数据或推理时将batch_size设为1。使用更小的模型用yolov5n代替s或m。优化数据加载确保没有内存泄漏及时释放不再需要的张量使用del和torch.cuda.empty_cache()。监控内存使用使用jtop或tegrastats工具实时查看内存占用。问题三USB设备如摄像头无法识别或工作不稳定这很可能是因为供电不足。Jetson Nano的USB端口供电能力有限。解决方案使用带外部供电的USB集线器将摄像头等设备接到集线器上由集线器独立供电。确保主板本身使用5V/4A的DC电源而不是Micro-USB。尝试不同的USB端口。问题四如何更新JetPack或CUDA版本这是一个需要谨慎操作的过程。通常不建议在已有的SD卡系统上直接进行大版本升级很容易出现依赖冲突导致系统崩溃。最干净、最推荐的方法是备份好你的代码和数据然后从NVIDIA官网下载最新版本的SD卡镜像重新烧录到SD卡上从头开始配置环境。虽然麻烦但能避免无数诡异的问题。当遇到无法解决的问题时善用社区资源至关重要NVIDIA官方开发者论坛这是最权威的渠道搜索你的错误信息很大概率已经有人问过并得到了解答。GitHub Issues如果你在使用某个开源库如YOLOv5去其GitHub仓库的Issues里搜索Jetson Nano相关的讨论。中文社区如CSDN、博客园等也有大量关于Jetson Nano的实践分享可以作为参考但要注意信息的时效性。最后保持耐心和探索精神。嵌入式AI开发本身就是软硬件结合的工作遇到问题、解决问题的过程正是积累经验的途径。每次成功部署一个模型看到它在小小的板子上实时运行起来那种成就感就是最好的回报。
返回列表