在宠物身份识别这个垂直场景中,"快"和"小"是刚需。宠物店、宠物医院、社区门禁这些场景要求实时响应,无法依赖云端推理。本文将分享我在RK3588边缘设备上部署宠物面部识别模型的完整实践——从模型选型到推理优化,最终实现48fps的实时推理性能。

为什么选 MobileNet-V3

在边缘端部署视觉模型,候选方案看似很多:MobileNet 系列、ShuffleNet、EfficientNet-Lite,甚至轻量 ViT。但经过实测对比,MobileNet-V3 有三个关键优势:

相比之下,ShuffleNet 的 channel shuffle 操作在 NPU 上映射效率不理想,EfficientNet-Lite 的 SE 模块变体也存在兼容性问题。

模型量化到 5.74MB 的全流程

从 PyTorch 训练好的 MobileNet-V3 到最终跑在 RK3588 上的量化模型,经过了四个关键步骤:

  1. PyTorch → ONNX:导出 FP32 模型,约 21.8MB。
  2. ONNX 图优化:使用 onnx-simplifier 做常量折叠和算子融合,减少冗余节点。
  3. INT8 量化校准:用 500 张宠物面部样本做校准集,将权重和激活量化到 INT8,精度损失控制在 1.8% 以内。
  4. RKNN 转换:最终模型文件 5.74MB,其中权重约 4.2MB,其余为图结构和量化参数。

RK3588 实测性能

在 RK3588 开发板上,使用单核 NPU 推理,输入 224×224 的宠物面部图像:

横向对比:同一模型在 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 路摄像头。