Faces
摘抄自本人内部主持的一次需求分析会议,隐去具体业务与敏感内容。流程设计依赖于具体需求。
Created: 2021/09/23
Update: 2022/02/07 迁移至 github.io, 增加实际踩坑问题
踩坑
- 已解决:PyTorch: Issue-66993
- Demo 中 .mm 调包调整,Lite 版有区别
- PyTorch-Lite 本质上要求 iOS 11.0+ ,即使自行编译 .a 也一样
原文
名词解释
列出词典以统一当前上下文语义。
ML:Machine Learning,机器学习
算法,ML 算法:一套特定的映射(A -> B)规则
特征,特征信息,特征向量:由算法生成的 Float[512],对应一个特定的 student_id
模型:一个特殊文件,描述了一套映射规则
框架:一套第三方代码,用于操作相应的模型
Tensorflow,TF,TFLite,Pytorch,PY,torch,coreML:一种框架
MLKit:Google 的 SDK,包含了某些框架和模型
流程图
后端需要做什么?
- 提供一个特征信息接口
- 提供业务接口
- 数据清洗
移动端的识别如何进行?
主工程
- 输入:视频流
- 视频流相关处理(抽帧?生成图片?)
ML 处理:姿态检测(Post Detection)- ML 处理:人脸识别(Face Detection)
- 技术选型:MLKit
- 判断当前输入是否存在人脸?
- 给出提示
- 输出人脸范围,
人脸特征点
-
根据人脸范围,截取并格式化输入图片
sampleBuffer = 3 * 112 * 112, Tensor = {1, 3, 112, 112}
-
ML 处理:人脸检测
- 技术选型:PyTorch
- 输入:buffer,.pt 模型文件
- 输出:特征向量
listA = Float[512]
- ML 算法:特征比对
- 技术选型:计算方法需和 PyTorch 使用的模型相对应
- 遍历从后台获取的所有特征信息列表,按规定的计算方法逐个和 listA 比对
- 每次比对会输出一个 0-1 的概率 p,p 越大则认为是同一个学生的概率越大
- 当 p 大于某个阈值时,直接给出检测结果
- 同时获取用户对应照片,上传至后台存档
移动端需要做什么?
Verify Demo
- 首先,需要设计一个流程,以确保本地代码所有用到的参数和框架设置正确;只有确保接入正确后,才能反向来验证模型输出概率的准确性。
- 因为主流程输入的是视频流而非照片,所以需要验证工程或输入照片的测试入口,不然没法测。
- 具体来说,理论上如果所有输入的变量,参数,模型,框架和算法工程师本地的设置完全一致,那么输入某个已录入的照片 A,最后输出的 p 必为 1。
- 不同的人脸检测框架会输出不同的图片,需要直接用算法工程师生成的 112*112 图片进行测试;
- 将图片转成 RGB 数组,该过程存在平台和框架差异,我 iOS 本地会先转成 RGBA 数组再转成 RGB 一维数组,python 输入的是一个三维数组,对下来部分值存在差别,误差大概在 1 左右;
- 将 buffer 引入 PyTorch 处理,观察输出值;
- 按算法工程师提供的方法计算,观察输出的概率 p;
- iOS 此流程目前已经走通,输出的 p > 0.999999,认为原因是 buffer 输出的差异导致。
- 接下来再接入
- 视频流
- 姿态检测
- 由于人脸识别算法修改为 MLKit,需要遍历存量图片以向算法工程师反馈整体准确率 @DIO
- 下载/解析/存储特征信息列表
- 识别成功后,业务流程处理
- 相机流
- 业务接口与图片存档
- 业务 UI 处理
重点在哪里?
- 速度与准确率的平衡
- 模型越大,精度越高,速度越慢。
- 本地判断速度 >> 远端,而精度 << 远端
- 性能
- 识别流程是随着视频流输入一直不断进行着的,所有环节都要考虑到性能问题
- 不断反馈
- 模型精度会根据实际情况调整,需要协助算法工程师进行快速验证
问题点在哪里?
- 特征信息列表
- 是否增量更新?
- 解析和遍历速度能否优化?
- 数据安全是否需要考虑?
- p 的阈值需要敲定
- 姿态检测的阈值需要调试
- 图片存档相关处理
- 看 MLKit 需要 buffer 还是图片
- 包体大小
- iOS 相关
- iOS 12.0 +
- arm64 模拟器包处理
测试相关?
- 监控
- 如何介入?
- 机型适配?
- iOS:低性能手机;iOS 12.0 +
- Android:待补充
风险点?
- 实际使用时识别率可能过低;
- 技术难点上处理时间过长。