目录

活体检测业务实战

基于TensorFlow的人脸识别智能小程序的设计与实现 活体检测业务实战

1 活体检测业务介绍

1.1 什么是活体检测

  • 为防止恶意者伪造和窃取他人的生物特征用于身份认证
  • 判断提交的生物特征是否来自有生命的个体

1.2 常见判断方式

  • 人脸左转、右转、张嘴、眨眼等

/face11/1.jpg

  • 前端:通过“动作+指令”采集数据
  • 后端:对采集到的连续多帧数据进行分析
  • 结果:判断是否完成相应动作

2 活体检测方法介绍

2.1 传统方法

  • 基于脸部视觉特征的方法:
    • 颜色纹理分析
    • 材料(皮肤、纸面、镜面)
    • 帧差信息
    • 光流算法
    • 脸部形状变化

2.2 深度学习方法

  • 多帧序列分析(CNN+LSTM)
  • 人脸深度图(差异性分析)
  • 3D landmark
  • 多任务网络:人脸检测+人脸分类(真假人脸)

2.3 基于Landmark的方法(将用到的)

/face11/2.jpg

笔记
  • 输入连续多帧人脸:摄像头不停向后端输送人脸
  • 关键点定位:先进行人脸检测 -> 关键点定位
  • 动作检测:根据指定的动作指令来判定当前的多帧人脸关键点位置坐标的差异,根据坐标的差异判断人脸目前的动作,需要对坐标进行归一化,规避掉大小人脸。
  • 张嘴检测

    • |嘴巴上部关键点 - 嘴巴下部关键点| > 阈值
  • 眨眼检测

    • |左眼眼睛上部关键点 - 左眼眼睛下部关键点| > 阈值
    • |右眼眼睛上部关键点 - 右眼眼睛下部关键点| > 阈值

3 活体检测问题挑战及解决思路

  • 作弊问题(镜面、视频)
  • 约束场景下的活体检测
  • 3D Landmark
  • End2end的活体检测算法
  • tracking

4 Dlib 68点人脸检测

/face11/3.jpg

5 实例代码

人脸关键点及活体检测页面相框会根据识别状态进行静态或动态的变化,用户点击开始后,小程序每1000ms采集一张图片并上传至服务端,根据服务端返回的68个人脸坐标信息,使用canvas将这68个人脸关键点绘制到对应的人脸图片中。

微信小程序利用服务端返回的68个人脸关键点的坐标信息,实现用户的张闭嘴检测和睁闭眼检测。

  • 张闭嘴检测:|嘴巴上部关键点 - 嘴巴下部关键点| > 阈值
  • 睁闭眼检测:|左眼眼睛上部关键点 - 左眼眼睛下部关键点| > 阈值
  • |右眼眼睛上部关键点 - 右眼眼睛下部关键点| > 阈值

系统经过多次实际测试后,选取第67和第63个点用于张闭嘴检测,并设定阈值为0.03选取图6.7中的第41、第37、第46和第44个点用于睁闭眼状态的检测,并设定阈值为0.03,将识别的结果以emoji图片和文字两种形式,实时显示在页面中,核心代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
var diff1 = pos[67 * 4 + 1 ] - pos[63 * 4 + 1];
var diff2 = pos[41 * 4 + 1 ] - pos[37 * 4 + 1];
var diff3 = pos[46 * 4 + 1 ] - pos[44 * 4 + 1];
if(diff1 > 0.03){
if( diff2 < 0.03 && diff3 < 0.03){
that.setData({
          landmark_img:"ecmo"})
     }else{
        that.setData({
          landmark_img:"eomo"})
      }
} 
if(diff1 <= 0.03){
if( diff2 < 0.03 && diff3 < 0.03){
that.setData({
landmark_img:"ecmc"})
}else{
that.setData({
landmark_img:"eomc"})
}
}