ARTICLE DETAIL

资讯详情

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

Jetson Nano 4GB B01 部署实战:目标检测、手势识别与散热调优

Jetson Nano 4GB B01 部署实战:目标检测、手势识别与散热调优 1. 拿到 Jetson Nano 4GB B01 之后先把这几件事搞明白Jetson Nano 这块板子在边缘计算入门这一档里到现在依然是个绕不开的选择。我手上这台是 4GB B01 版本472 GFLOPS 的 FP16 算力、128 核 Maxwell GPU、4GB LPDDR4 内存跑 SSD-MobileNet 这类轻量目标检测模型完全够用用来做视觉入门、机器人小车、课堂实验都很合适。但它的入门门槛其实不在写代码而在前面那一堆看起来简单、实际上处处是坑的准备工作镜像版本选错、SD 卡槽找不到、供电不够导致随机重启、编译到一半内存爆掉——这些我都踩过。这篇东西我打算按自己实际操作的顺序捋一遍从开箱确认硬件、烧录系统、首次开机初始化到编译jetson-inference、跑通官方目标检测detectNet和手势识别gestureNet两个 Demo最后是性能调优和踩坑记录。内容偏向照着做就能复现适合第一次接触 Jetson Nano 的人也适合已经装过系统但 Demo 一直没跑起来的同学。整套流程在一台正常的 Nano 4GB 上大约 3 到 4 小时能走完其中大部分时间是在等下载和编译。1.1 B01 和 A02、2GB 版到底差在哪很多人拿到板子第一反应是我这个是什么版本因为网上教程五花八门镜像也分好几种。Jetson Nano 4GB 开发套件历史上出过 A02 和 B01 两个主要修订版现在市面上能买到的基本都是 B01。两个版本的核心差异是 MIPI CSI-2 摄像头接口数量A02 只有一个 CSI 接口B01 有两个载板上丝印 CAM0、CAM1所以 B01 可以同时接两路 CSI 摄像头做双目或者多视角。另外 B01 在电源部分做了些优化PCB 布局也有调整。核心 SoC、内存、GPU 规格完全一样所以性能上没有区别。真正需要区分清楚的是4GB 版和 2GB 版。2GB 版是后来推出的低成本版本内存砍半供电主要靠 micro-USBCSI 接口也只有一个而且它的系统镜像和 4GB 版不通用。如果你把 4GB 的镜像烧到 2GB 的卡上或者反过来最典型的症状就是卡在 NVIDIA logo 那里一动不动。所以下载镜像前先确认自己板子上印的型号。1.2 配件清单少一样都开不了机Nano 开发套件本身只有一块载板加一个核心 module其他都得自己配。我建议按下面这个清单准备缺任何一样都会让你卡在某个环节microSD 卡官方推荐 32GB UHS-1但 32GB 装完系统加模型基本就满了我建议直接上 64GB 或 128GB 的 A1/V30 卡。劣质卡的表现是烧录很慢、启动要两分钟以上、编译时随机报 I/O 错误别在这上面省几十块钱。电源5V 4A 的 DC 圆孔电源是首选配上 J48 跳线帽短接才能解锁 10W 模式。如果只用 micro-USB 供电官方限制是 5V 2A一旦插上 USB 摄像头加无线网卡很容易触发欠压保护直接重启。USB 摄像头或 CSI 摄像头USB 摄像头最省事插上就是/dev/video0CSI 摄像头延迟更低、占用 CPU 更少但需要单独买排线而且 B01 的排线方向和某些第三方摄像头模组可能相反插反了不烧但不出图。HDMI 显示器 USB 键鼠首次初始化必须有除非你走串口方案。散热片和风扇官方套件通常带一个 5V PWM 风扇如果没有务必自己加一个。Nano 满载跑目标检测时裸板温度十分钟就能上 70℃ 以上然后开始降频帧率会掉得很明显。网线或 USB 无线网卡初始化完成后建议直接接网线比无线网卡稳定速度也快得多。1.3 供电和散热是前期最容易翻车的两个环节先说供电。Nano 载板上有两个供电入口micro-USB 口和 DC 圆孔。圆孔旁边有两个针脚丝印是 J48用跳线帽短接之后系统才知道我应该从圆孔取电。如果不短接 J48 却插了 DC 电源板子依然会尝试从 micro-USB 取电结果就是供电不足、USB 设备识别不稳定。这个跳线帽在官方套件里是附带的很小容易丢丢了可以用杜邦线母头临时顶一下。再说散热。Jetson Nano 的温度监控点有好几个CPU、GPU、PLL、PMIC 各有一个。跑 detectNet 的时候GPU 温度会比 CPU 高通常也是它的温度先逼近阈值。我的经验是只要上了风扇把target_pwm开到 200 左右满载长时间跑也能稳在 60℃ 上下如果只有散热片没风扇五分钟之内就会看到帧率从 20 掉到 12 左右那就是在降频了。后面第 6 节我会给一个自动控温的脚本比手动写 PWM 值省心得多。2. 系统镜像烧录JetPack 版本选择与 SD 卡处理系统安装这一步看起来简单但选错版本是新手最常见的时间黑洞。我先说结论Jetson Nano 4GB含 B01只能用 JetPack 4.6.x 系列底层是 Ubuntu 18.04 LTS。下面解释为什么以及具体怎么烧。2.1 为什么只能说 Ubuntu 18.04 和 JetPack 4.6.xJetson Nano 用的是 Tegra X1 系列 SoCNVIDIA 对它的 L4TLinux for Tegra支持停在 32.x 版本而 L4T 32.x 对应的根文件系统就是 Ubuntu 18.04。JetPack 5.x 开始只支持 Xavier、Orin 这一代Nano 不在支持列表里。所以你在网上看到Jetson 装 Ubuntu 22.04的教程绝大多数讲的是 Orin Nano 或者 Xavier NX不要直接套到 Nano 上。那能不能自己动手把 Nano 升到 20.04 甚至 22.04技术上能需要自己编译内核、处理 GPU 驱动的依赖社区里有人做过但过程非常折腾而且大概率会遇到 CUDA 和 OpenCV 的兼容问题。对于我要跑通官方 Demo这个目标来说完全没有必要。接受 Ubuntu 18.04 这个事实后面能省掉一整天的debug时间。具体镜像我推荐找JetPack 4.6.1L4T 32.7.1或 4.6.4的 SD 卡镜像文件名形如jetson-nano-jp461-sd-card-image.zip。注意一定要看清楚是 4GB 版还是 2GB 版的镜像两者的文件名里会有区分。2.2 镜像下载与烧录完整流程镜像压缩包大概 6 到 7 GB解压出来的img文件接近 14 GB。下载完之后按下面步骤操作首先校验一下压缩包完整性如果下载过程中断了解压会报错白等半天sha256sum jetson-nano-jp461-sd-card-image.zip # 和官方页面给出的哈希值对比然后解压unzip jetson-nano-jp461-sd-card-image.zipWindows 用户直接用 BalenaEtcher 就行图形界面选镜像、选卡、点 Flash不需要额外操作。Linux 或 macOS 用户可以用dd但一定要确认目标设备名写错盘符会直接毁掉你的系统盘lsblk # 先确认 SD 卡是 /dev/sdX 还是 /dev/mmcblkX sudo dd ifsd-blob-b01.img of/dev/sdX bs4M statusprogress convfsync syncconvfsync这个参数很有用它保证数据真正落盘再返回不用手动再敲一次 sync。bs4M比默认的 512 字节快很多64GB 的卡大概 8 到 15 分钟能写完。注意dd的of后面必须是整块设备比如/dev/sdb不能带分区号不能写/dev/sdb1。写错了会把分区表搞乱虽然通常还能重新格式化救回来但没必要冒这个风险。2.3 拆 module 插 SD 卡新手最容易卡住的一步这是我觉得最反直觉的一个设计Jetson Nano 开发套件的 microSD 卡槽在核心 module 的背面也就是朝向载板的那一面。也就是说你必须先把 module 从载板上拆下来才能插卡。操作步骤是先把所有线缆电源、HDMI、USB、网线全部拔掉卸下 module 两端的两颗固定螺丝然后用双手拇指顶住 module 的边缘沿着 SODIMM 连接器的方向斜向上轻轻拔出。module 和载板之间是 260 pin 的 SODIMM 接口插拔手感类似笔记本内存条需要一点力但绝对不要用蛮力撬。拔下来翻面就能看到卡槽。把 microSD 卡金属触点朝下推进去听到咔的一声说明卡住了。然后把 module 装回去注意方向和金手指对齐斜着插到底再压平拧上螺丝。我见过不少人插好卡装回去之后上电没反应最后发现是 module 没插到底金手指只接触了一半。所以装回去之后用手轻轻按一下 module 的四个角确认没有翘起。3. 首次开机与基础系统配置卡插好了接下来就是初始化。这一步的分岔点是你有没有显示器。3.1 有显示器 / 没显示器两种初始化路线有显示器的情况推荐接上 HDMI 显示器、USB 键鼠、网线然后接 DC 电源。第一次开机大概需要 1 到 2 分钟屏幕上会出现 NVIDIA 的 logo然后进入 Ubuntu 的 OEM 配置向导。向导里几个关键选择语言建议选English虽然选中文也能用但部分命令行工具在中文 locale 下会输出乱码目录名变成桌面下载之后很多脚本的路径会找不到后面还得改回来。用户名不要用nvidia旧版镜像会拒绝创建因为系统里有同名用户密码自己设简单点无所谓这是局域网内网设备。最后一步会问你 APP partition size一定选max让它把整张卡的空间都用上。如果这里选小了后面还得用resize2fs手动扩多一道工序。没显示器的情况有两个办法。一是走串口Nano 载板上有一个 4 针的串口调试口丝印 J44用 USB-TTL 模块把 TXD 接 RXD、RXD 接 TXD、GND 接 GND波特率设 115200 8N1开机就能看到完整的启动日志和登录提示。二是把 SD 卡插到读卡器上在电脑上挂载 rootfs 分区用镜像自带的l4t_create_default_user.sh脚本预置默认账号sudo mount /dev/sdX1 /mnt sudo cp /usr/bin/qemu-aarch64-static /mnt/usr/bin/ sudo chroot /mnt /bin/bash # 进入 chroot 后 /l4t_create_default_user.sh -u nvidia -p nvidia -n jetson-nano -a exit sudo umount /mnt这样系统启动后会跳过 OEM 向导直接用nvidia/nvidia登录。第二种方法需要一定的 Linux 基础中间任何一步出错都可能让系统起不来我更推荐第一次装的时候老老实实接显示器。3.2 换源、扩容 swap、装 jtop进系统之后先别急着跑 Demo把基础环境理顺。第一件事是换 apt 源默认的ports.ubuntu.com在国内下载速度感人更新一次能等到睡着。Ubuntu 18.04 ARM64 的源列表在/etc/apt/sources.list注意一定要用ubuntu-ports路径不能用 x86 的ubuntu路径sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s|http://ports.ubuntu.com/ubuntu-ports|https://mirrors.ustc.edu.cn/ubuntu-ports|g /etc/apt/sources.list sudo apt-get update注意NVIDIA 自己的 L4T 源在/etc/apt/sources.list.d/nvidia-l4t-apt-source.list不要动它。那个源里的包版本和你的 L4T 版本是强绑定的换成第三方镜像很容易出现依赖冲突导致 CUDA 组件装不上。第二件事是扩容 swap。4GB 内存编译jetson-inference的时候非常容易 OOM因为make -j4会同时起四个编译进程每个进程峰值能吃到 1GB 以上。默认镜像的 swap 只有 2GB 左右不够用。扩到 8GBsudo swapoff /var/swapfile sudo dd if/dev/zero of/var/swapfile bs1M count8192 statusprogress sudo chmod 600 /var/swapfile sudo mkswap /var/swapfile sudo swapon /var/swapfile free -h # 确认 swap 那一行变成 8G这里用dd而不是fallocate是因为部分 SD 卡的控制器对 fallocate 预分配的空间处理有问题写进去的数据可能是坏的dd一个字节一个字节写最稳妥。顺便把 swappiness 调低一点让系统优先用物理内存echo vm.swappiness10 | sudo tee -a /etc/sysctl.conf第三件事是装jetson-stats也就是jtop这是个必装工具能实时看 CPU/GPU 占用、内存、各区域温度、风扇转速、当前电源模式比htop有用得多sudo apt-get install python3-pip sudo -H pip3 install -U jetson-stats sudo systemctl restart jetson_stats.service jtoppip 也可以换成国内源不然装包的时候会一直转圈mkdir -p ~/.pip cat ~/.pip/pip.conf EOF [global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn EOF3.3 Python 环境与依赖安装的取舍Jetson Nano 上的 Python 包选择有个原则能用 apt 装的就用 apt不要用 pip。原因是 aarch64 架构的预编译 wheel 很少pip install numpy在 Nano 上会现场编译运气好二十分钟运气不好直接 OOM。系统自带 Python 3.6python3-numpy、python3-opencv、python3-dev这些常用包直接用 apt 装sudo apt-get install -y python3-numpy python3-opencv python3-dev python3-pipCUDA 和 cuDNN 是 JetPack 镜像里预装的不用自己折腾。验证一下nvcc --version # 应该显示 CUDA 10.2 ls /usr/lib/aarch64-linux-gnu/ | grep cudnn如果nvcc找不到可能是环境变量没配加到~/.bashrc里export PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH4. 官方 Demo 一目标检测跑通全流程准备工作做完就可以进入正题了。NVIDIA 官方的jetson-inference项目是跑 Demo 最省事的路径它把 TensorRT 推理、摄像头采集、OpenGL 显示都封装好了编译完直接命令行就能用。4.1 编译 jetson-inference 的正确姿势先拉代码。用--recursive是因为它依赖几个 submodule漏了这个参数后面编译会报找不到头文件sudo apt-get install -y git cmake libpython3-dev cd ~ git clone --recursive --depth1 https://github.com/dusty-nv/jetson-inference cd jetson-inference mkdir build cd build接下来是cmake这一步有个坑要提前知道配置阶段会弹出一个基于 dialog 的模型下载界面。它会把所有可用的预训练模型列出来让你勾选如果全选总下载量有好几个 GB网速慢的话能等一小时。我的建议是第一次只勾需要的SSD-MobileNet-V2目标检测COCO 91 类必选ResNet-18图像分类顺手勾上GestureNet手势识别5.2 节要用用方向键移动、空格勾选、回车确认。如果勾错了想重来删掉build目录重新cmake一次就行。然后编译。这里一定要根据内存情况调整并行度make -j2 # 4GB 内存建议 -j2 sudo make install sudo ldconfigmake -j2比-j4慢一些但不会 OOM。如果你已经按 3.2 节把 swap 扩到了 8GB可以试试-j3但-j4我不推荐实测有概率在编译cuda相关文件时被 OOM killer 干掉。编译时间大概 40 到 90 分钟取决于 SD 卡速度。期间可以用jtop盯着温度和内存如果温度持续超过 75℃把风扇 PWM 调高。4.2 detectNet 命令详解与参数调优编译完成后可执行文件在build/aarch64/bin下。先跑一张静态图片看看能不能出结果cd ~/jetson-inference/build/aarch64/bin ./detectnet --networkssd-mobilenet-v2 /usr/share/backgrounds/gnome/*.jpg output.jpg会生成一张画了检测框的output.jpg。确认能跑通之后接摄像头./detectnet /dev/video0 # USB 摄像头 ./detectnet csi://0 # CSI 摄像头 ./detectnet csi://0 --networkssd-inception-v2常用参数我列一下这几个是实际调优时最常改的参数作用建议值--network选择模型ssd-mobilenet-v2速度优先/ssd-inception-v2精度优先--threshold置信度阈值0.4~0.6太低会满屏误检--overlay叠加显示内容box,labels,conf或只留box提速--alpha叠加层透明度180 左右比较好看清--stats打印帧率统计调优时开着调优思路上--threshold是最值得花时间的参数。默认 0.5在光线一般的室内场景下人、杯子、键盘这些常见物体的置信度会在 0.35 到 0.55 之间浮动。把它降到 0.35检出率上来了但误检也明显变多提到 0.7画面干净但经常漏掉远处的目标。我的经验是按场景定固定机位、光照稳定用 0.5移动场景用 0.4。另外--overlay里如果去掉labels渲染开销会小一些帧率能提 1 到 2 FPS在 Nano 这种 GPU 和显示共用资源的平台上这个提升不算小。Python 版本也有接口一样只是把可执行文件换成detectnet.py./detectnet.py /dev/video0 --networkssd-mobilenet-v24.3 实测帧率、功耗与温度数据我在自己的 B01 上做了一轮实测环境是10W 模式nvpmodel -m 0jetson_clocksUSB 摄像头 640x360 MJPEGSSD-MobileNet-v2输入 300x300jtop记录数据。结果大致如下场景平均帧率GPU 占用温度整板功耗关显示输出纯推理21~24 FPS85%~95%62℃约 7.5W开 HDMI 显示叠加15~18 FPS95%66℃约 8.2W5W 模式无风扇8~10 FPS99%降频72℃约 4.6W10W 模式无风扇12~15 FPS99%间歇降频75℃约 8W几个结论值得注意。第一显示输出会吃掉 5 FPS 左右因为 Nano 的 GPU 要同时做推理和 OpenGL 渲染如果只是做后台推理把结果通过网络推出去帧率会明显更高。第二风扇的有无对持续帧率的影响比想象中大短时间跑看不出差别超过三分钟就开始分化。第三5W 模式基本没有实用价值除非你在做电池供电的移动设备并且能接受 8 FPS。4.4 目标检测常见报错排查跑 detectNet 时遇到的错误我整理了几个高频的报segmentation fault或者直接退出八成是模型没下载完整。检查jetson-inference/data/networks/SSD-MobileNet-V2/目录应该有一个.onnx和一个.caffemodel之类的文件大小对不上就删掉重新跑cmake触发下载。报failed to open /dev/video0先用ls /dev/video*确认设备号有些摄像头枚举出来是video1或video2。再看v4l2-ctl --list-devices有没有识别到。如果插的是 CSI 摄像头确认排线方向和接口编号CAM0 对应csi://0。画面卡住不动、帧率突然掉到 1 FPS检查 SD 卡是不是写满了或者 swap 在疯狂读写。jtop里能看到 SD 卡占用率和 swap 使用量。如果 swap 一直在动说明物理内存不够考虑换个更小的模型或者关掉一些后台服务。检测框抖动严重这不是 bug是单帧检测的固有特性。SSD 系列不带跟踪每一帧独立推理物体稍微动一下框就跳。要平滑得靠后处理加跟踪算法或者换更稳定的模型。提示jetson-inference还自带了detectnet-snap.py之类的示例脚本可以把检测结果直接存成图片做数据集筛选或者效果对比的时候很省事。5. 官方 Demo 二手势识别实测目标检测跑通之后手势识别是另一个很有意思的官方 Demo。它和 detectNet 最大的区别是它不是对单张图做分类而是对一段视频序列做动作判断所以输入必须是连续的视频流静态图片喂进去没意义。5.1 gestureNet 的模型原理和它能识别什么gestureNet用的是 3D 卷积网络训练数据来自 20BN-Jester 数据集的一个子集。所谓 3D 卷积就是在普通卷积的高、宽两个维度之外多加了时间这一个维度卷积核同时在空间和时间上滑动因此它能捕捉手在往哪个方向移动这类动态信息而不是只看单帧的手势形状。它能识别的手势是固定的一组大致包括向上、向下、向左、向右滑动顺时针、逆时针转手大拇指向上、大拇指向下双手/单指放大、缩小手指敲击、把手拉近、把手推远无手势、其他动作注意无手势和其他动作是两个独立的类别模型会把画面里任何不符合上述动作的东西都归到这两类里。这也是实测时最容易困惑的地方——你随便挥挥手它可能一直输出no gesture。因为要做时间维度的卷积模型需要缓存一段帧序列才能出一次结果所以它的输出延迟明显高于目标检测而且帧率越低同一个动作被识别的概率越低因为采样点变少了。5.2 运行命令与输入流注意事项gestureNet是通过imagenet这个工具调用的因为它本质还是个分类网络cd ~/jetson-inference/build/aarch64/bin ./imagenet /dev/video0 --networkgesturenet ./imagenet csi://0 --networkgesturenet实际命令行参数可能会随版本略有差别跑之前先./imagenet --help看一眼以你本地版本为准。实测下来有几个要点必须注意第一手要在画面里待够时间。动作做完之后别急着放下保持一两秒模型才有足够的帧来判定。我一开始做向上滑动手划一下就放下来结果一直识别成no gesture后来把手停在画面上方等了两秒才正确输出 swiping up。第二背景要干净。3D 卷积对背景运动很敏感如果画面里有人在走动、风扇在转很容易干扰。找一面素色墙或者纯色桌面对着识别率会明显提升。第三光照要均匀。逆光或者单侧强光会让手的轮廓糊掉模型区分不了手指动作。室内正常顶灯就够。第四帧率要够。手势识别在 Nano 上实测大概 8 到 15 FPS比目标检测低一截因为 3D 卷积的计算量更大。如果用 USB 摄像头建议把摄像头分辨率降到 640x480 并把格式设成 MJPEG能减轻不少带宽和解码压力v4l2-ctl --device/dev/video0 --set-fmt-videowidth640,height480,pixelformatMJPG5.3 实测效果、延迟和适用边界我在正常室内光线下测了一轮把每个手势做十次大致的结果是向上、向下、向左、向右这四个滑动动作最稳十次里能对七八次放大缩小和转手这些动作识别率差一些大概五成到六成大拇指上下比较容易和其他动作混淆。延迟方面从动作结束到屏幕输出正确标签大概有 0.5 到 1 秒的滞后这是模型需要攒帧导致的属于原理层面的限制不是配置问题。所以它不适合做实时性要求高的交互比如用它控制小车转向什么的体验会很差。它适合的场景是做演示 Demo、课堂讲解 3D 卷积原理、验证摄像头和推理链路是否正常。真要拿手势做实际交互更靠谱的路线是用轻量关键点检测比如手部 21 点检测加自研的规则判断或者用 Edge Impulse 这类平台在 PC 上训一个小模型再部署过来延迟和准确率都会好很多。6. 让 Nano 跑得更稳性能与散热调优Demo 能跑起来只是第一步长时间稳定运行是另一回事。这一节讲几个实际调优手段。6.1 nvpmodel 与 jetson_clocks 的组合用法Jetson Nano 有两个预设的电源模式用nvpmodel切换sudo nvpmodel -q # 查询当前模式 sudo nvpmodel -m 0 # 10W 模式4 核全开 1.43GHz sudo nvpmodel -m 1 # 5W 模式2 核 918MHz10W 模式必须配合 DC 5V4A 供电和 J48 跳线短接才能启用否则切过去之后系统会因为供电不足直接挂掉。jetson_clocks是另一回事它不是超频而是把频率锁在最高档禁止 DVFS 动态调频sudo jetson_clocks # 锁定最高频 sudo jetson_clocks --show # 查看当前频率 sudo jetson_clocks --restore # 恢复默认这两个命令组合起来用效果最好nvpmodel -m 0解锁硬件上限jetson_clocks保证推理时频率不会因为短暂的负载波动掉下来。实测在目标检测场景下这个组合相比默认状态能提升 15% 到 20% 的稳定帧率。但要注意jetson_clocks锁频之后功耗和温度都会上升必须保证散热跟上。如果只有散热片不要开这个。6.2 风扇控制与温度监控脚本官方 PWM 风扇的转速是写在/sys/devices/pwm-fan/target_pwm里的取值范围 0 到 255sudo sh -c echo 255 /sys/devices/pwm-fan/target_pwm # 全速 sudo sh -c echo 0 /sys/devices/pwm-fan/target_pwm # 停转手动调太麻烦我一般直接挂一个后台脚本按温度自动调速。温度读数的位置在/sys/devices/virtual/thermal/thermal_zoneN/temp几个 zone 对应不同区域数值单位是毫摄氏度需要除以 1000#!/bin/bash # fan_ctl.sh - 按最高温度自动调节风扇转速 while true; do max_temp0 for zone in /sys/devices/virtual/thermal/thermal_zone*/temp; do t$(cat $zone) [ $t -gt $max_temp ] max_temp$t done temp$((max_temp / 1000)) if [ $temp -lt 45 ]; then pwm0 elif [ $temp -lt 55 ]; then pwm100 elif [ $temp -lt 65 ]; then pwm180 else pwm255 fi echo $pwm | sudo tee /sys/devices/pwm-fan/target_pwm /dev/null sleep 5 done这个脚本每 5 秒检查一次所有温区取最高值来决定转速。阈值我设的是 45℃ 以下停转、75℃ 以上全速实际跑下来温度基本稳在 55 到 65 之间风扇也不会一直狂转吵人。注意不同版本的 BSP 里pwm-fan的路径可能略有差异如果写入报No such file用find /sys -name target_pwm找一下实际路径。6.3 后续可扩展方向官方的这两个 Demo 跑通之后接下来的路线大致有三条。一是换更实用的检测模型。jetson-inference自带的 SSD 系列精度一般如果想做具体场景比如行人、车辆、安全帽可以自己用 YOLOv5 训练然后导出 ONNX在 Nano 上用 TensorRT 转成 engine 跑。YOLOv5s 在 Nano 4GB 上用 FP16输入 640实测大概 8 到 12 FPS能做到实用。关键是 PyTorch for Jetson 的 wheel 要从 NVIDIA 官方渠道装不要用 pip 默认源里的。二是上 DeepStream。如果你要做多路视频流的解码、推理、编码推流自己写 GStreamer 管道太累DeepStream 把这些封装好了。不过它在 Nano 上能跑的版本比较老多路并发能力有限适合做两路以内的场景。三是考虑升级硬件。如果项目真的卡在算力上Orin Nano 是个很自然的升级路径同样的软件栈、同样的开发方式算力提升是数量级的。Jetson Nano 的定位始终是学习和原型验证别难为它做工业级的多路实时推理。7. 踩坑记录与常见问题速查7.1 问题速查表把前面提到的和没提到但经常遇到的问题汇总一下方便对着排查现象大概率原因处理方式上电无任何输出module 没插到底 / SD 卡没插好重新拔插 module确认卡到位卡在 NVIDIA logo 不动镜像版本与板子不匹配重新烧录对应 4GB 版镜像开机反复重启供电不足换 DC 5V4A短接 J48首次开机进不了向导HDMI 分辨率不匹配换显示器或换线尝试 1080papt update大量 404源地址不对恢复ports.ubuntu.com或用正确的ubuntu-ports路径编译到一半进程被杀内存不足扩 swap 到 8GBmake -j2模型下载卡住网络问题删掉build目录重新cmake触发下载摄像头打不开设备号不对或供电不足ls /dev/video*接外供电 Hub帧率突然掉一半GPU 降频jtop看温度检查风扇风扇一直不转排线松动或 PWM 为 0检查排线手动写target_pwmpip 装包卡死正在现场编译 aarch64 包改用 apt 版本或换国内 pip 源系统时间不对无 RTC 电池接网后同步 NTP或手动date -s7.2 几条我实测有效的经验第一个经验是把整个系统的镜像备份下来。所有环境配好、Demo 跑通之后用dd把整张 SD 卡读出来存成.img以后不管怎么折腾坏了十几分钟就能恢复到可用状态比重新装一遍省太多时间。sudo dd if/dev/mmcblk0 of~/nano_backup.img bs4M statusprogress第二个经验是不要在 SD 卡上跑需要频繁读写磁盘的任务。SD 卡寿命有限日志狂写、数据集频繁读取都会加速磨损。如果项目要长期跑考虑用 USB 3.0 移动硬盘或者网络存储来放数据和日志。第三个经验是串口调试口是救命的。当系统因为配置错误起不来、SSH 也连不上时串口是唯一能看到内核日志的通道。花二十块钱买个 USB-TTL 模块备用不会亏。最后一个经验是先确认硬件再折腾软件。我见过太多人把时间花在改配置、换镜像上最后发现是电源不够或者散热不行。拿到板子第一件事拍照记录型号、确认电源规格、检查跳线帽、把风扇插好这十分钟能让后面少走很多弯路。
返回列表