
1. 为什么选择RDK X5这条技术路线1.1 从一堆开发板的对比说起我第一次拿到RDK X5的时候手头已经堆了树莓派5、Jetson Nano、RK3588开发板好几块板子。说实话每次有新板子出来第一反应不是兴奋而是又要重新踩一遍环境的坑。但RDK X5这块板子有点不一样它把地平线自家的BPUBrain Processing Unit算力做到了10 TOPS这个数字放在边缘计算场景里相当能打关键是功耗控制得不错不需要主动散热风扇就能跑推理。为什么我最终决定用它来做YOLOv5部署核心原因有三个。第一是算力与功耗的平衡10 TOPS的INT8算力跑YOLOv5s这种轻量模型帧率能稳定在30FPS以上而整板功耗也就5W左右这意味着你可以把它塞进一个很小的外壳里做产品原型。第二是工具链的完整度地平线提供了从模型转换到板端推理的全套工具虽然文档有些地方写得让人想骂人但至少路子是通的。第三是价格相比动辄上千的Jetson Orin系列RDK X5的性价比对个人开发者和小团队非常友好。这里要提醒一句如果你之前只玩过树莓派那RDK X5的软件生态会让你有点不适应。树莓派的Raspberry Pi OS是开箱即用的而RDK X5的Ubuntu系统需要你自己配置不少东西。但反过来说这也意味着你对系统的掌控力更强不会遇到系统里预装了一堆用不上的东西还删不掉的尴尬。1.2 目标读者与前置知识这篇内容适合什么人看如果你满足以下任意一条那接下来的内容会对你有直接帮助手里已经有一块RDK X5但不知道从哪开始折腾想在边缘设备上部署自己训练的YOLOv5模型但被环境配置卡住了有Python和Linux基础但对嵌入式部署流程不熟悉做过树莓派项目想升级到算力更强的平台前置知识方面你需要会基本的Linux命令操作知道什么是SSH、什么是IP地址Python能看懂代码就行不需要你手写CUDA内核。如果你连ls和cd都没用过建议先花半天时间补一下Linux基础否则后面的操作会非常痛苦。注意RDK X5的官方系统是基于Ubuntu 22.04的如果你之前用的是CentOS或者别的发行版命令会有差异别照搬网上的教程。2. 硬件搭建与系统烧录的实操细节2.1 开箱清单与配件选择RDK X5的包装里通常只有一块板子其他东西都得自己配。我列一下我实际用到的配件清单以及哪些地方容易买错配件推荐规格避坑提示电源5V/3A Type-C别用手机快充头电压不稳会随机重启存储卡32GB以上 Class10 A2杂牌卡写入速度慢烧录能急死人散热片铝制被动散热官方那个小散热片够用但夏天建议加个风扇网线千兆用WiFi传模型文件会让你怀疑人生串口模块CH340 USB转TTL调试必备板子起不来的时候全靠它电源这块我要多说一句。我一开始图省事用了一个65W的氮化镓充电头结果板子跑推理的时候会偶发性重启。后来换了一个标称5V/3A的电源适配器才稳定下来。原因是快充头会跟板子的电源管理芯片协商电压协商过程中可能出现瞬时掉压。所以别在这上面省钱一个靠谱的电源也就二三十块。存储卡的选择同样重要。我试过用一张老旧的16GB卡烧录系统花了将近40分钟而换用A2级别的卡之后烧录时间缩短到8分钟左右。这个差距在反复烧录调试阶段会被放大很多倍。2.2 系统镜像烧录的完整流程RDK X5的官方镜像可以从地瓜开发者社区下载文件通常是一个.img格式的压缩包。烧录工具我推荐用balenaEtcher跨平台且操作简单比dd命令安全得多。具体步骤下载镜像后先解压得到.img文件打开balenaEtcher选择镜像文件选择目标存储卡千万看仔细别选成你的移动硬盘点击Flash等待写入完成写入完成后把存储卡插入RDK X5底部的卡槽这里有个细节烧录完成后Windows会提示是否格式化磁盘千万别点格式化。那个提示是因为Windows不认识Linux的分区格式点格式化就把系统毁了。首次上电的时候板子上的绿色LED会闪烁表示系统正在启动。第一次启动会比较慢因为系统要做分区扩展和初始化大概需要2-3分钟。如果你等了5分钟还没反应那就得用串口模块看启动日志了。2.3 首次登录与网络配置RDK X5默认的系统镜像通常已经配置好了SSH服务默认用户名和密码在官方文档里有写。我拿到板子后的第一件事就是通过网线把它连到路由器上然后在路由器的管理界面找到它的IP地址。为什么优先用网线而不是WiFi因为后续你要传模型文件、传数据集WiFi的传输速度会让你崩溃。一个几百MB的模型文件WiFi可能要传好几分钟网线几秒钟就搞定了。找到IP之后在你的电脑上打开终端Windows用PowerShell或者CMD输入ssh username192.168.1.xxx第一次连接会提示确认指纹输入yes然后输入密码。登录成功后你就能在终端里操作板子了。如果你需要配置WiFi可以用nmcli命令sudo nmcli dev wifi connect 你的WiFi名称 password 你的密码提示配置完WiFi后建议把网线也留着双网络冗余万一WiFi断了你还能通过网线连上去。3. 远程开发环境搭建SSH与VNC的配合使用3.1 SSH密钥配置与免密登录每次SSH都要输密码太麻烦了而且有些自动化脚本没法交互式输入密码。配置SSH密钥是必须做的第一步。在你的电脑上生成密钥对如果还没有的话ssh-keygen -t ed25519 -C rdk-x5一路回车就行默认保存在~/.ssh/id_ed25519。然后把公钥传到板子上ssh-copy-id username192.168.1.xxx输入一次密码后以后SSH就不用再输了。这里有个Windows用户常踩的坑bad owner or permissions on c:\users\thinkpad/.ssh/config这个报错。原因是Windows的权限系统跟Linux不一样SSH对配置文件的权限检查很严格。解决办法是右键点击.ssh文件夹属性→安全→高级把所有者改成你自己然后禁用继承只保留你自己的完全控制权限。如果你用的是VS Code装一个Remote-SSH插件配置好之后可以直接在VS Code里打开板子上的文件夹编辑代码的体验比在终端里用vim好太多了。配置方法是在VS Code左下角点击绿色图标选择Connect to Host输入username192.168.1.xxx即可。3.2 VNC远程桌面的安装与调优SSH只能操作命令行但有些操作比如查看图片、调试GUI程序需要桌面环境。VNC就是干这个的。在板子上安装VNC Serversudo apt update sudo apt install tightvncserver启动VNC服务vncserver :1 -geometry 1920x1080 -depth 24第一次启动会让你设置一个VNC密码这个密码跟系统登录密码是分开的记牢。然后在你的电脑上下载VNC Viewer新建连接地址填192.168.1.xxx:1输入刚才设置的密码就能看到桌面了。但这里有个常见问题VNC桌面默认是灰底黑叉的没有菜单栏和任务栏。这是因为VNC启动的是一个独立的X会话没有加载桌面环境。解决办法是修改~/.vnc/xstartup文件把里面的内容替换成#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec startxfce4然后重启VNC服务vncserver -kill :1 vncserver :1 -geometry 1920x1080 -depth 24这样你就能看到一个完整的XFCE桌面了。注意VNC传输的是图像数据网络带宽不够的时候会非常卡。如果你只是偶尔需要看个图用scp把文件传到本地看更高效。VNC适合需要交互式操作GUI程序的场景。3.3 文件传输的几种方式对比部署过程中需要在电脑和板子之间来回传文件我试过几种方式各有适用场景方式命令示例适用场景速度scpscp model.pt userip:~/单文件快速传输快rsyncrsync -avz dataset/ userip:~/dataset/大量文件同步快支持断点续传Samba挂载网络共享频繁读写中等U盘手动拷贝无网络环境取决于U盘我平时用得最多的是rsync因为它支持断点续传传大文件的时候万一网络断了不用从头再来。命令里的-avz参数分别是归档模式、显示详情、压缩传输压缩对文本文件效果明显对已经压缩过的模型文件效果不大。4. YOLOv5环境配置与模型训练要点4.1 Python环境与依赖安装RDK X5的系统里通常预装了Python 3.8或3.10但YOLOv5对版本有要求建议用Python 3.8以上。先确认版本python3 --version然后安装pip和虚拟环境工具sudo apt install python3-pip python3-venv我强烈建议用虚拟环境别在系统Python里直接装包。原因很简单YOLOv5的依赖跟系统里其他工具的依赖可能冲突一旦把系统Python搞坏了恢复起来很麻烦。创建虚拟环境python3 -m venv yolov5-env source yolov5-env/bin/activate激活后命令行前面会出现(yolov5-env)的标识。然后克隆YOLOv5仓库git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt这里有个坑requirements.txt里的torch版本默认是GPU版本但RDK X5上没有NVIDIA GPU装了也用不了。你需要装CPU版本的torchpip install torch torchvision --index-url https://download.pytorch.org/whl/cpu装完之后验证一下python3 -c import torch; print(torch.__version__)能打印出版本号就说明装好了。4.2 训练自己的数据集从标注到超参数YOLOv5训练自己的数据集流程分四步标注、转换格式、配置yaml、启动训练。标注工具我用的是LabelImg在电脑上装好之后打开图片文件夹框选目标保存为YOLO格式的txt文件。每张图片对应一个txt里面每行是类别 x_center y_center width height坐标都是归一化到0-1之间的。标注完成后目录结构应该是这样的dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/然后创建一个data.yaml文件path: /home/user/dataset train: images/train val: images/val nc: 3 names: [person, helmet, vest]nc是类别数量names是类别名称列表。这里要注意类别名称的顺序必须跟标注时的类别索引一致否则训练出来的模型会张冠李戴。超参数方面YOLOv5的默认配置在data/hyp.scratch.yaml里。对于小数据集几千张图我建议把lr0从0.01降到0.001epochs设100-300batch-size根据显存调整。RDK X5上训练是不现实的算力不够训练要在你的PC或者服务器上做训练完再把模型转到板子上推理。训练命令python train.py --img 640 --batch 16 --epochs 200 --data data.yaml --weights yolov5s.pt--weights指定预训练权重用yolov5s.pt做迁移学习收敛快很多。训练过程中可以用TensorBoard看loss曲线tensorboard --logdir runs/train4.3 模型导出与格式转换训练完成后最好的权重保存在runs/train/exp/weights/best.pt。这个.pt文件不能直接在RDK X5上跑需要转换成地平线BPU支持的格式。转换流程大致是.pt→ ONNX → 地平线工具链 →.bin。具体步骤导出ONNXpython export.py --weights best.pt --include onnx --img 640用地平线的hb_mapper工具做模型转换。这一步需要安装地平线的Docker环境因为工具链只支持在特定版本的Ubuntu上运行。转换过程中需要提供校准数据集用来做INT8量化。校准集从你的训练集里随机抽100-200张图就行。这里有个经验量化后的模型精度通常会掉1-3个百分点。如果你的应用对精度要求高可以在转换时选择--calibration_type max用最大最小值校准比默认的kl校准精度略好但速度稍慢。提示模型转换是整个流程里最容易出问题的环节。常见错误包括算子不支持、输入尺寸不匹配、校准集格式不对。遇到报错先看日志里的具体算子名称然后去地平线开发者社区搜大概率有人踩过同样的坑。5. 板端部署与推理性能调优5.1 部署环境准备与依赖安装模型转换完成后你会得到一个.bin文件和一个hb_model相关的配置文件。在板子上部署需要安装地平线的推理库sudo apt install hobot-dnn然后把.bin文件和配置文件传到板子上。地平线提供了Python和C两种推理接口Python接口上手快C接口性能好。我建议先用Python接口验证功能再用C做性能优化。Python推理的核心代码大概长这样from hobot_dnn import pyeasy_dnn as dnn import numpy as np import cv2 models dnn.load(model.bin) model models[0] img cv2.imread(test.jpg) img cv2.resize(img, (640, 640)) img img.transpose(2, 0, 1) img np.expand_dims(img, axis0).astype(np.float32) outputs model.forward(img)输出的格式跟YOLOv5的原始输出略有不同需要做后处理包括解码边界框、NMS抑制等。地平线的示例代码里有完整的后处理实现可以直接参考。5.2 推理性能实测与优化手段我在RDK X5上实测了YOLOv5s模型在不同输入尺寸下的帧率输入尺寸帧率FPS功耗W备注640x640325.2默认配置512x512484.8精度略降416x416654.5适合远距离小目标少的场景这个数据是在板子只跑推理、没有其他负载的情况下测的。如果你同时跑其他程序帧率会下降。优化手段有几个方向。第一是降低输入分辨率从640降到416帧率能翻倍但小目标的检测精度会下降。第二是使用多线程流水线把图像采集、预处理、推理、后处理分到不同线程能提升整体吞吐量。第三是模型剪枝把YOLOv5s里冗余的通道剪掉模型变小推理更快但需要重新训练微调。我实际项目里用的是512x512输入加多线程流水线稳定在45FPS左右满足实时检测需求。5.3 常见部署问题排查部署过程中我遇到过的典型问题问题一模型加载失败报invalid model原因通常是模型转换时用的工具链版本跟板端推理库版本不匹配。解决办法是确认两边版本一致地平线每个版本的工具链和推理库是配套的。问题二推理结果全是乱框检查预处理是否跟训练时一致。YOLOv5训练时用的是RGB通道如果你用OpenCV读图默认是BGR需要转换。另外归一化参数也要一致通常是除以255。问题三帧率远低于预期先确认板子没有降频。用cat /sys/class/thermal/thermal_zone0/temp看温度超过80度会触发降频。加个散热风扇能解决。另外检查是不是在跑其他占用CPU的程序。问题四SSH连接不稳定频繁断开可能是电源供电不足导致的网络模块重启。换一个电流更大的电源试试。也可能是WiFi信号弱改用网线。6. 从原型到产品的扩展思路6.1 模型迭代与数据闭环部署上线只是开始真正让模型越用越准的关键是数据闭环。我的做法是在推理程序里加一个难例保存逻辑当检测置信度在0.3到0.6之间时把这张图保存下来定期人工标注后加入训练集重新训练。这个策略的效果非常明显。我做一个安全帽检测的项目第一版模型mAP只有0.72经过三轮数据闭环迭代后mAP提升到了0.89。关键是这些难例数据是模型自己挑出来的比随机采样效率高得多。6.2 多模型协同与业务逻辑编排RDK X5的算力跑一个YOLOv5s绰绰有余但实际项目里往往需要多个模型协同。比如先跑一个人体检测再对检测到的人跑姿态估计最后根据姿态判断是否违规。这种场景下你需要设计一个任务调度逻辑。我的做法是用一个主循环按优先级依次调用不同模型高优先级的模型每帧都跑低优先级的隔帧跑。这样能在有限算力下平衡多个任务的需求。6.3 长期运行的稳定性保障产品原型和实际部署最大的区别是运行时长。原型跑几个小时就关了实际部署可能要7x24小时运行。长期运行要关注几个点内存泄漏Python程序长时间运行容易内存增长定期重启进程能缓解日志轮转日志文件不清理会占满存储卡看门狗加一个硬件看门狗或者软件心跳检测程序卡死时自动重启温度监控夏天高温环境下要确保散热我在实际项目里加了一个简单的shell脚本每小时检查一次程序是否在运行不在就拉起来。同时用logrotate配置日志轮转保留最近7天的日志。最后分享一个我在调试阶段常用的小技巧在板子上开一个tmux会话跑推理程序这样即使SSH断了程序也不会停。重新连上后tmux attach就能回到之前的会话。这个习惯帮我省了很多次重新启动程序的时间。