Flutter结合ML Kit如何实现离线模式下的人脸活体检测功能
Flutter端纯离线人脸活体检测实现方案(兼容现有ML Kit技术栈)
核心实现逻辑完全基于端侧计算,所有资源打包进App安装包,全程不需要网络连接,适配考勤场景的无网运行要求,不需要替换你已经接入的ML Kit能力。
第一层:零额外依赖的交互式动作活体(直接复用ML Kit能力)
这部分不需要引入任何新的模型或SDK,直接调用ML Kit人脸检测已经输出的参数即可实现,可以拦截80%以上的静态照片、静态屏幕翻拍类攻击:
- 随机下发1-2个动作指令,比如眨眼、张嘴、左右转头30度、抬头/低头,要求用户在3-5秒内完成
- 直接读取ML Kit人脸检测返回的参数做判断:
- 用
leftEyeOpenProbability、rightEyeOpenProbability判断眨眼:连续2-3帧检测到眼睛开合概率从0.8以上降到0.2以下再回升,即可判定完成眨眼动作,避免单帧误判 - 用
headEulerAngleY(左右偏转角)、headEulerAngleX(俯仰角)判断转头、抬头动作,设置角度阈值在25-35度区间即可 - 张嘴判断可以通过ML Kit返回的上下嘴唇轮廓点坐标计算嘴唇开合比例,超过阈值即判定张嘴
- 用
- 注意动作序列要随机生成,不要固定顺序,避免被提前录好的固定动作视频绕过
第二层:轻量化端侧静默活体(拦截视频翻拍、3D面具类高阶攻击)
动作活体无法拦截提前录制好对应动作的视频攻击,需要叠加一个轻量的端侧静默活体分类模型,全程本地推理,不需要联网:
- 模型选型选INT8量化后的TFLite格式轻量化二分类模型即可,backbone选MobileNetV2、MobileOne这类端侧友好的结构,模型体积控制在1-3M,直接打包进App的
assets目录,不需要运行时下载 - 部署直接复用ML Kit的自定义模型推理能力,不需要额外引入其他端侧推理框架:运行时从本地资产目录加载活体模型,把ML Kit检测到的人脸区域裁剪出来,做归一化处理后送入模型推理,单帧推理耗时在中端设备上可以控制在20ms以内,不会阻塞考勤流程
- 模型输出真人/欺诈两个类别的置信度,阈值设置在0.7-0.8区间即可,平衡通过率和拦截率
第三层:零成本辅助校验(进一步提升拦截率,无额外依赖)
不需要加模型,直接通过设备和相机现有能力补充校验:
- 频闪检测:通过帧间亮度变化的频域分析,识别相机对着其他电子屏幕拍摄时产生的固定频率刷新条纹,拦截屏幕翻拍类攻击
- 平面检测:通过ML Kit返回的人脸3D关键点比例变化,判断检测对象是否为平面打印物——平面照片不管怎么移动旋转,关键点的相对深度比例不会发生自然变化
- 纹理校验:提示用户前后移动脸部,检测人脸区域的皮肤纹理细节变化,打印照片的印刷网点纹理和真人皮肤纹理存在明显差异,可以直接通过帧间纹理差判断
落地注意事项
- 所有模型、配置文件全部打包进安装包,不要设置运行时联网拉取资源的逻辑,确保完全断网环境下功能正常
- 不要选择参数量过大的模型,端侧离线场景优先保证推理速度和低功耗,考勤场景下1-3M的轻量化模型准确率完全够用
- 推理时仅对ML Kit检测输出的人脸ROI区域做处理,不要传入整帧画面,能大幅降低推理耗时,减少设备耗电
- 针对光线暗、用户戴眼镜、戴普通医用口罩的场景做少量样本适配,避免正常用户被误拦截
内容的提问来源于stack exchange,提问作者Hassan Gujjar
相关产品推荐
相关产品推荐

