上篇把采集链路讲清楚了:相机取帧 → NPU 出框 → 框烧进照片。这一篇专门解决一个问题------这套 AI 能力怎么真正落到 RK3576 板子上。
AI 怎么部署到板子上(三条路,一次说清)
前面讲的是"怎么用 AI",这一节专门讲"AI 怎么上板 "------模型放哪、运行时从哪来、怎么编进固件、怎么快速验证、怎么换成自己的模型。
6.1 先决条件:板子得先有NPU算力
RK3576自带 NPU(6 TOPS),但要在系统里能用,需要两样东西到位,上板先自检:
adb shell ls /dev/dri/ # 期望看到 renderD129(NPU 的 DRM 渲染节点)
adb shell dmesg | grep -i rknpu # 需 adb root;期望 "RKNPU driver v0.9.8" 之类日志
adb shell zcat /proc/config.gz | grep RKNPU # 期望 CONFIG_ROCKCHIP_RKNPU=y
我们这块板实测:驱动 v0.9.8 已随固件就位,/dev/dri/renderD129 权限 666。 NPU 驱动属于固件/kernel 层,App 侧只负责"带 runtime + 带模型",碰不到驱动。
6.2 路径 A(正式):随固件内置,烧录即带
这是产品发布路径,一次编译,整机自带 AI 能力:
(1)放模型:把 .rknn 与类别清单放进 assets/assets/yolov5s-640-640.rknn 、assets/coco_80_labels_list.txt
(2)引运行时:native模块链接树内runtime,并把两个.so 一起打进APK
cc_library_shared {
name: "librkdt_yolo", // 我们的 JNI(Detector.cpp + postprocess.cc)
stl: "c++_static", // 静态 libc++,App 命名空间没有动态版
shared_libs: ["librknnrt", "liblog"],
}
android_app {
name: "RkDataTerminal",
asset_dirs: ["assets"], // 模型随包
jni_libs: ["librkdt_yolo", "librknnrt"], // 两个 so 内嵌
}
librknnrt 直接引用树内 hardware/rockchip/rknpu2/runtime/Android.bp 的同名模块,不用改固件 。
挂进产品: device/rockchip/rk3576/rk3576_u/rk3576_u.mk 里
PRODUCT_PACKAGES += RkDataTerminal
编译烧录:./build.sh(或 make)→烧录system镜像→开机App即带AI能力。
6.3 路径 B(调试):不重编固件,装机即验
只想快速验证、不想等整包烧录时:
# ① 只编这个 App
mmm vendor/rockchip/common/apps/RkDataTerminal
# ② 把两个 .so 注入 APK 的 lib/arm64-v8a/(zip 重打包)
# ③ 用 AOSP apksigner + testkey 重签
# ④ 装机
adb install -r RkDataTerminal_signed.apk
adb shell pm grant com.rockchip.rkdataterminal android.permission.CAMERA
为什么必须注入 .so :系统 App 的 native 库由 Soong 装在 /system/lib64,APK 里并不含; 而用 adb install 装成数据包 时没有 system 权限,App 的 native 命名空间不允许 从 /system/lib64 dlopen 任意库 (会报 library ... is not accessible for the namespace)。所以调试期把so内嵌进APK最省事------正式发布仍走路径 A。
6.4 上板验证(三条命令 + 一次实拍)
adb shell ls -l /system/lib64/librknnrt.so # runtime 在位(路径 A 编出来的固件)adb shell ls /dev/dri/ # renderD129 在adb logcat -s RkTermYolo # 首次检测时会打印: init ok model=640x640 out=3
再注入一张测试图,看是否出框 (最直接的验收):
adb push bus.jpg /sdcard/Android/data/com.rockchip.rkdataterminal/files/bus.jpg
adb shell am start -n com.rockchip.rkdataterminal/.MainActivity \
--es testjpg /sdcard/Android/data/com.rockchip.rkdataterminal/files/bus.jpg
adb logcat -d -s RkTermMain # 期望打印 person 0.88 / bus 0.69 等 5 个框
6.5 换成你们自己的模型(部署的关键一步)
(1)训练/导出:用你们的数据集训一个 YOLOv5 系模型,导出 ONNX(保持三头输出结构);
(2)转换:PC 上用
RKNN-Toolkit2 (树内hardware/rockchip/rknn-toolkit2)把 ONNX 转成 .rknn,目标平台选 rk3576;
> 转换在PC上做,板子不参与训练/转换 ,板子只负责推理。
(3)替换:把新的.rknn与类别清单放进assets/,覆盖原文件即可;
(4)注意类别数:当前后处理里类别数按80写死(jni/postprocess.h的 OBJ_CLASS_NUM)。若你的模型类别数不同,需要把这个宏改成对应值(同时确认 anchors 与模型匹配);
(5)重编装机,按6.4验证出框。

结果落地:水印、归档、上报、远程看
-
水印:半透明横幅(站点/SN/时间/8 路通道值)+ 检测框与类别置信度,直接烧进 JPEG;
-
归档:SQLite 一条记录 = 带框的图 + 全通道快照 JSON + detections\[\];
-
上报:multipart/form-data POSTA到服务器
(字段 site/device/time/kind/summary/data+附件图),服务器返回 2xx 才标记已上报,失败保留下轮重试; -
远程看:App内嵌Web服务:8080,浏览器输板子IP就能看实时画面(MJPEG)、值守状态、记录列表。

实测数据(RK3576/Android 14)
| 项 | 实测结果 |
|---|---|
| NPU 检测 | 标准测试图 → person 0.88/0.87/0.84/0.34 + bus 0.69(与官方 demo 一致) |
| 拍照留证 | 3840×2160 JPEG → 水印+框 → evidence_*_wm.jpg(约 2.5MB) |
| 值守触发 | 注入 person 0.88 → 自动留证,记录 值守 person 0.88 ... |
| 实时画面 | /cam 15 秒收到 30 帧真实 JPEG(约 3.6MB,~2fps) |
| 上报闭环 | 积压记录逐条 200 → 全部 reported=1 |
| 开销观测 | 开关相机时 dma-buf 对象 156→161→回落 156(正常释放) |

踩坑清单(照做省 半天)&如何 复现
| # | 坑 | 结论 |
|---|---|---|
| 1 | ImageReader 不排空 | 缓冲占满 → 相机停摆(~6s/帧);回调必须 acquire |
| 2 | 预览 4K | legacy HAL 崩(device error 3);预览 ≤1080P |
| 3 | 动态 libc++ | App 命名空间无 libc++.so;native 必须 c++_static |
| 4 | 数据包跑不了 so | 系统 App 的 so 在 /system/lib64;数据包需 jni_libs 内嵌 |
| 5 | 框位置不对 | 忘了 letterbox 逆映射;必须用 scale/pad 反算 |
| 6 | 触发刷屏 | 没有冷却;加了 15s 冷却 + 阈值 |
| 7 | 检测框画错位 | 检测要在原图 算、水印画在同一张图上 |
复现参考:
1) 拍照即判:把测试图放进 App 目录,注入一帧看检测结果
adb push bus.jpg /sdcard/Android/data/com.rockchip.rkdataterminal/files/bus.jpg
adb logcat -c
adb shell am start -n com.rockchip.rkdataterminal/.MainActivity \
--es testjpg /sdcard/Android/data/com.rockchip.rkdataterminal/files/bus.jpg
adb logcat -d -s RkTermMain # 打印 5 个框
# 2) 值守触发链:注入一帧走完整"判定→自动留证"
adb shell am start -n com.rockchip.rkdataterminal/.MainActivity \
--es watchtestjpg /sdcard/Android/data/com.rockchip.rkdataterminal/files/bus.jpg
# 记录里会出现 [值守 person 0.88] ... 的留证
# 3) 板载 Web:浏览器打开 http://<板子IP>:8080 看画面/状态/记录

结语:结合的本质是"三对齐"
回顾整条链路,"相机 + AI"能结合好,靠的是三件事对齐:
- 尺度对齐:相机的分辨率 ≠ 模型输入,letterbox+逆映射补齐;
- 时序对齐:检测时刻 = 拍照时刻,图与数据同一瞬间,证据才自证;
- 数据对齐:框、类别、通道快照、图,全部落在同一条记录里。
做到这三点,"拍照"就不再只是拍照,而是一次带判定的采集 。
Purple Pi OH2开发板,是触觉智能RK3576核心板SOM7609系列配套的评估开发板,搭载4核A72+4核A53+M0多核异构处理器,主频2.2GHz,集成6Tops算力 NPU,轻松应对AI推理、边缘计算与轻量级AI端侧学习。配套完善SDK、丰富资料与Demo,有助于项目前期快速开发验证。
,赞46
触觉智能SOM7609系列核心板尺寸仅40.5×40.5mm,专为空间受限场景打造。基于RK3576/RK3576J SoC,集成高性能GPU与VPU,支持4K视频编解码与多屏异显;提供PCIe、USB3.2、双路千兆以太网、MIPI-DSI/CSI、eDP、CAN、SPI、I2C等丰富接口,灵活扩展。支持Linux、Android、开源鸿蒙OpenHarmony等丰富系统,配套丰富软硬件资料与技术支持,助力产品快速落地。
深圳触觉智能
,赞111