TensorFlow Lite 生产落地案例:Android 门禁人脸识别与树莓派虫情识别
生产落地案例:Android 门禁人脸识别与树莓派虫情识别
案例一:Android 门禁机上的离线人脸比对
背景:一批园区门禁机是 Android 系统的嵌入式板卡,CPU 一般、没有 NPU,网络时通时断,并且人脸图片不允许上传云端。
做法:人脸检测用轻量检测模型,人脸特征提取用移动级主干网络,两个模型都转成 TFLite;检测模型保留 FP32 以保证召回率,特征模型做全整数量化以压体积、提速度;端上比对用余弦相似度,阈值按现场图片分布回归得到。
关键配置:特征模型设 target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8],输入输出类型为 uint8;校准集用现场采集的上千张人脸,特意包含逆光与戴口罩样本;推理线程数按板卡大核数量设置。检测模型不挂 GPU delegate,因为 GPU 初始化开销在门禁机这种反复冷启动的场景里不划算。
效果:模型体积与单帧耗时都进入可交互的范围,断网时功能不受影响;具体数字依板卡型号而异,以实测为准。
踩的坑:一是校准集全用白天正脸样本,逆光场景误拒率上升,补采难例后回落;二是把 INT8 特征模型的输出直接拿去做相似度,忘了按量化参数反算,导致阈值怎么调都不对;三是没在构建里关掉 assets 压缩,加载慢且内存翻倍。
案例二:树莓派上的虫情识别
背景:农田虫情监测站用树莓派加摄像头定时拍照,需要就地判断画面里的害虫类别与数量,现场只有太阳能供电,4G 信号弱。
做法:运行时用 tflite-runtime 而不是完整 TensorFlow;模型走全整数量化;推理线程数按树莓派核心数设置,但留一个核给图像采集,避免采集丢帧。
关键配置:Interpreter(model_path=..., num_threads=3);图像先缩放再归一化,输入类型与模型声明严格对齐;定时任务由系统计划任务触发,推理结束立刻释放解释器,不常驻。
效果:设备可以整月离线运行,只有汇总结果通过 4G 上报。
踩的坑:早期版本把解释器常驻内存,长时间运行后内存碎片累积,进程被系统杀掉;改成按需创建、用完释放后就稳定了。另一个坑是树莓派系统升级 Python 版本后没有对应 wheel,临时降回旧版本 Python 才装上 tflite-runtime。

