Skip to content

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:待补充

风险点?

  • 实际使用时识别率可能过低;
  • 技术难点上处理时间过长。