Face⁺⁺ 产品博客
全部
通知

活体检测怎么实现?从原理到代码的全流程技术指南

一、活体检测是什么?为什么它比人脸识别更难?

活体检测(Liveness Detection),简单说就是让系统判断站在摄像头前的到底是个真人,还是一张照片、一段视频、一个3D面具,甚至是一个深度伪造的AI换脸视频。

人脸识别负责回答“你是谁”,而活体检测要回答的是“你是不是活人本人”。两者缺一不可:光能认对人不行,还得确保站在对面的确实是个有血有肉的真人

在实际落地中,活体检测面临的挑战远超常规人脸识别。常见的攻击手段包括:

  • 照片攻击:用打印照片或手机屏幕翻拍照片冒充真人
  • 视频攻击:播放录制好的真人视频
  • 3D面具攻击:用硅胶面具或3D打印头模冒充
  • 深度伪造攻击:用AI生成的换脸视频或实时滤镜

传统2D人脸识别面对这些攻击几乎毫无防御能力,这正是活体检测技术要解决的核心问题

二、活体检测主流技术方案

当前主流活体检测方案分为三大技术路线,各有优劣,适用场景不同。

2.1 动作指令活体检测(配合式)

要求用户按照系统提示完成指定动作,如眨眼、张嘴、缓慢转头、微笑等,系统通过分析连续帧中面部关键点的运动轨迹来判定是否为真人

技术原理

  • 用户完成动作时,系统追踪68个或106个面部特征点的位移变化
  • 通过光流法分析眼睑开合角度、唇部轮廓变形程度等生物特征
  • 检测头部姿态(Pitch/Yaw/Roll三个方向的旋转角度),误差需控制在1°以内

优点:实现简单、成本低、普通RGB摄像头即可
缺点:用户体验稍差(需要主动配合)、对动作完成度有要求

适用场景:金融开户、大额支付验证等对安全性要求高的场景,通常与静默活体配合使用形成多因子验证

2.2 静默活体检测(非配合式)

用户无需做任何动作,系统通过分析单张或连续多张图像的光学特征(如纹理、反射、肤色等)判断真假

技术原理

  • 纹理分析:采用LBP(局部二值模式)与HOG(方向梯度直方图)融合特征,在反光、阴影等复杂光照条件下检测精度可达98.7%
  • 3D深度感知:通过分析面部立体信息判断是否为平面打印品
  • 微表情捕捉:检测瞳孔收缩频率、皮肤表面0.1-0.3mm级的细微形变

优点:用户体验好、无需额外动作
缺点:受光照环境影响较大、纯软件方案对高仿真面具防御力有限

适用场景:门禁考勤、手机解锁、视频会议身份验证等对体验要求高的场景

2.3 红外/3D活体检测(硬件增强型)

通过专用红外摄像头或3D结构光传感器采集面部深度信息和红外光谱特征,从根本上区分真实人脸与攻击样本

技术原理

  • 红外成像:采用850nm或940nm波长的近红外光源,捕捉人脸的红外反射信号。活体皮肤与纸张、硅胶等材料在红外波段下的反射特性完全不同
  • 3D结构光:投射数万个红外点阵到面部,根据形变计算三维深度信息,照片和视频完全没有深度数据
  • 血管识别:通过红外光吸收率变化检测皮下血管搏动信号

优点:防攻击能力最强、不受可见光干扰、暗光环境下依然可用
缺点:需要专用硬件(红外摄像头或3D传感器)、成本较高

适用场景:ATM取款、银行柜台、高安全等级门禁、支付终端

三、基于Face++ API的活体检测实战

以下基于Face++(旷视)提供的API服务,演示如何在实际项目中接入活体检测功能。

3.1 环境准备

注册Face++账号获取API_KEY和API_SECRET后,安装官方SDK:

bash

pip install megvii-facepp-sdk

初始化客户端:

python

from facepp import API, File

api = API(api_key='YOUR_API_KEY', api_secret='YOUR_API_SECRET')

3.2 动作活体检测实现

Face++支持通过动作指令验证活体,随机要求用户完成眨眼(Blink)或张嘴(MouthMove)等动作

python

def verify_liveness(video_path, action_type):
    """
    动作活体检测
    :param video_path: 录制的用户动作视频路径
    :param action_type: 动作类型 'Blink' 或 'MouthMove'
    """
    result = api.liveness_record(
        video_file=File(video_path),
        action_type=action_type
    )
    
    # face_liveness: 1为通过活体检测,0为拒绝
    if result.get('face_liveness') != 1:
        raise ValueError("活体检测失败,疑似非真人操作")
    
    return True

前端交互逻辑

  1. 系统随机生成动作指令(如“请眨一下眼睛”)
  2. 调用摄像头录制用户完成动作的过程(建议3-5秒)
  3. 将视频上传到服务端调用活体检测API
  4. 解析返回结果,face_liveness=1即为通过

3.3 静默活体检测

对于无需用户配合的场景,可以直接调用静默活体检测接口,传入单张人脸图片即可

python

def silent_liveness_detect(image_path):
    """
    静默活体检测:用户无需做任何动作
    """
    result = api.detect(
        image_file=File(image_path),
        return_attributes="liveness"
    )
    
    # 返回活体分数,通常阈值设为0.8以上
    liveness_score = result.get('faces', [{}])[0].get('attributes', {}).get('liveness', {}).get('score', 0)
    
    if liveness_score < 0.8:
        raise ValueError(f"静默活体检测未通过,得分:{liveness_score}")
    
    return liveness_score

3.4 人脸比对 + 活体检测一体化流程

实际业务中,活体检测通常与人脸比对配合使用,形成完整的身份核验链路。

python

def identity_verification(face_image_path, stored_face_token):
    """
    完整的身份核验流程:活体检测 + 人脸比对
    """
    # Step 1: 静默活体检测
    liveness_score = silent_liveness_detect(face_image_path)
    if liveness_score < 0.8:
        return {"pass": False, "reason": "活体检测未通过"}
    
    # Step 2: 检测人脸并获取face_token
    detect_result = api.detect(
        image_file=File(face_image_path),
        return_landmark=1
    )
    face_token = detect_result['faces'][0]['face_token']
    
    # Step 3: 与数据库中预存的特征进行1:1比对
    compare_result = api.compare(
        face_token1=face_token,
        face_token2=stored_face_token
    )
    confidence = compare_result.get('confidence', 0)
    
    if confidence < 80:  # 阈值可根据业务场景调整
        return {"pass": False, "reason": f"人脸比对不匹配,置信度:{confidence}"}
    
    return {"pass": True, "confidence": confidence}

3.5 性能优化建议

实际生产环境中,建议采用以下优化策略

  1. 异步处理:将视频上传与活体检测并行化,缩短用户等待时间
  2. 质量过滤:调用检测接口前先检查图像质量(光照、清晰度、人脸大小),避免无效调用
  3. 多帧验证:要求用户连续完成多个动作(如眨眼后张嘴),增加攻击成本
  4. 环境光检测:分析背景亮度变化,防止屏幕翻拍攻击

四、服务端集成注意事项

4.1 API密钥安全

严禁将API_KEY/API_SECRET硬编码在客户端代码中。正确做法是通过自有后端服务统一管理密钥,客户端仅向后端申请临时Token,由后端代为调用Face++ API。否则密钥被逆向提取后,将面临API滥用和计费风险

4.2 数据合规

根据《个人信息保护法》及等保2.0要求:

  • 人脸图像等生物特征数据属于敏感个人信息
  • 建议在设备端完成人脸检测和特征提取,仅上传脱敏后的特征向量
  • 传输过程必须使用HTTPS加密

4.3 多级验证策略

高安全场景(如银行远程开户)建议采用分级验证方案

  1. 先进行动作指令初筛(响应时间<2s)
  2. 对可疑样本触发红外深度验证(总耗时<5s)
  3. 将通过率维持在95%的同时,将误拒率控制在0.3%以下

五、FAQ

Q1:静默活体和动作活体哪个更安全?

动作活体由于需要用户主动配合完成特定动作,防攻击能力更强。但静默活体用户体验更好。高安全场景建议两者结合使用,先用静默活体做初筛,对低分样本再触发动作验证

Q2:光照不好时活体检测准确率会下降吗?

会。光线过暗或过亮都会影响图像质量。红外活体检测方案在暗光环境下表现优于纯RGB方案,因为红外光不受可见光变化影响。部署时建议确保环境光照在300-800Lux之间

Q3:活体检测能防御Deepfake视频攻击吗?

部分可以。多帧时序分析可以有效识别视频回放攻击,因为播放的视频缺乏真实的面部微表情变化和自然的三维运动轨迹。但对抗实时Deepfake滤镜难度较大,通常需要结合红外检测或3D深度信息

Q4:活体检测的误拒率(FRR)一般是多少?

不同方案和场景差异较大。优化良好的静默活体方案FRR可控制在1%-3%之间,动作活体方案FRR约1%-5%。红外活体检测方案在实验室环境中FRR可低于1%

本文参考旷视FaceID官网官方产品资料整理,留言咨询产品,未经授权禁止转载