一、活体检测是什么?为什么它比人脸识别更难?
活体检测(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传感器)、成本较高
三、基于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
前端交互逻辑:
- 系统随机生成动作指令(如“请眨一下眼睛”)
- 调用摄像头录制用户完成动作的过程(建议3-5秒)
- 将视频上传到服务端调用活体检测API
- 解析返回结果,
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 性能优化建议
- 异步处理:将视频上传与活体检测并行化,缩短用户等待时间
- 质量过滤:调用检测接口前先检查图像质量(光照、清晰度、人脸大小),避免无效调用
- 多帧验证:要求用户连续完成多个动作(如眨眼后张嘴),增加攻击成本
- 环境光检测:分析背景亮度变化,防止屏幕翻拍攻击
四、服务端集成注意事项
4.1 API密钥安全
严禁将API_KEY/API_SECRET硬编码在客户端代码中。正确做法是通过自有后端服务统一管理密钥,客户端仅向后端申请临时Token,由后端代为调用Face++ API。否则密钥被逆向提取后,将面临API滥用和计费风险。
4.2 数据合规
根据《个人信息保护法》及等保2.0要求:
4.3 多级验证策略
- 先进行动作指令初筛(响应时间<2s)
- 对可疑样本触发红外深度验证(总耗时<5s)
- 将通过率维持在95%的同时,将误拒率控制在0.3%以下
五、FAQ
Q1:静默活体和动作活体哪个更安全?
动作活体由于需要用户主动配合完成特定动作,防攻击能力更强。但静默活体用户体验更好。高安全场景建议两者结合使用,先用静默活体做初筛,对低分样本再触发动作验证。
Q2:光照不好时活体检测准确率会下降吗?
会。光线过暗或过亮都会影响图像质量。红外活体检测方案在暗光环境下表现优于纯RGB方案,因为红外光不受可见光变化影响。部署时建议确保环境光照在300-800Lux之间。
Q3:活体检测能防御Deepfake视频攻击吗?
部分可以。多帧时序分析可以有效识别视频回放攻击,因为播放的视频缺乏真实的面部微表情变化和自然的三维运动轨迹。但对抗实时Deepfake滤镜难度较大,通常需要结合红外检测或3D深度信息。
Q4:活体检测的误拒率(FRR)一般是多少?
不同方案和场景差异较大。优化良好的静默活体方案FRR可控制在1%-3%之间,动作活体方案FRR约1%-5%。红外活体检测方案在实验室环境中FRR可低于1%
本文参考旷视FaceID官网官方产品资料整理,留言咨询产品,未经授权禁止转载。

