在宠物身份识别这个垂直场景中,"快"和"小"是刚需。宠物店、宠物医院、社区门禁这些场景要求实时响应,无法依赖云端推理。本文将分享我在RK3588边缘设备上部署宠物面部识别模型的完整实践——从模型选型到推理优化,最终实现48fps的实时推理性能。
为什么选 MobileNet-V3
在边缘端部署视觉模型,候选方案看似很多:MobileNet 系列、ShuffleNet、EfficientNet-Lite,甚至轻量 ViT。但经过实测对比,MobileNet-V3 有三个关键优势:
- 硬件感知的 NAS 设计:V3 的架构搜索直接以移动端延迟为优化目标,不是事后补救的剪枝——SE 模块和 h-swish 激活函数都在芯片层面友好。
- NPU 算子兼容性:RK3588 的 NPU(6 TOPS)对 MobileNet 系列支持最成熟,conv+bn 融合、深度可分离卷积等算子都有原生加速。
- 社区生态:ONNX→RKNN 的转换链对 MobileNet 路径经过了充分打磨,坑最少。
相比之下,ShuffleNet 的 channel shuffle 操作在 NPU 上映射效率不理想,EfficientNet-Lite 的 SE 模块变体也存在兼容性问题。
模型量化到 5.74MB 的全流程
从 PyTorch 训练好的 MobileNet-V3 到最终跑在 RK3588 上的量化模型,经过了四个关键步骤:
- PyTorch → ONNX:导出 FP32 模型,约 21.8MB。
- ONNX 图优化:使用 onnx-simplifier 做常量折叠和算子融合,减少冗余节点。
- INT8 量化校准:用 500 张宠物面部样本做校准集,将权重和激活量化到 INT8,精度损失控制在 1.8% 以内。
- RKNN 转换:最终模型文件 5.74MB,其中权重约 4.2MB,其余为图结构和量化参数。
RK3588 实测性能
在 RK3588 开发板上,使用单核 NPU 推理,输入 224×224 的宠物面部图像:
- 纯推理时间:20.64ms/帧,约 48fps
- 端到端(含前后处理):26.8ms/帧,约 37fps
- NPU 利用率:稳定 85% 以上
横向对比:同一模型在 Jetson Nano(TensorRT FP16)上约 32fps,RPi 4(ncnn FP16)上仅 8fps。RK3588 的 NPU 在单位功耗下的推理吞吐明显优于同价位竞品。
内存 0.08MB 的秘密
很多人好奇为什么运行时的额外内存占用只有 0.08MB。核心在于两点:共享权重和零拷贝推理。RKNN runtime 将模型权重直接映射到 NPU 的专用内存空间,CPU 侧不保留副本;输入输出的 DMA 缓冲区通过物理地址共享,避免了一次额外的 memcpy。这种设计在批量推理场景下尤其有价值——内存增长几乎为零。
边缘部署不是把模型"塞进去"就完事了。从模型选型、量化策略、到 runtime 的内存管理,每一步都影响最终的用户体验。RK3588 + MobileNet-V3 的组合在宠物面部识别这个场景下,目前是我验证过性价比最高的方案。下一步计划探索多路视频流并发推理,让一台设备同时处理 4-8 路摄像头。