UniFace活体检测实战:MiniFASNet如何识破照片、屏幕与面具攻击
【免费下载链接】unifaceUniFace: A Unified Face Analysis Library for Python | Detection, alignment, landmarks, face-mesh, recognition, parsing, gaze, attributes and anti-spoofing under one API.项目地址: https://gitcode.com/gh_mirrors/un/uniface
UniFace是一款 Python 统一人脸分析库,其中的MiniFASNet 活体检测(人脸反欺骗攻击)模块可以用 1.2MB 的轻量模型,快速判断摄像头前的是真人,还是打印照片、屏幕重放或面具伪装。本文将从零讲透:如何安装、三步跑通第一次活体检测、如何设置置信度阈值,以及它能防御哪些攻击。
上图是 UniFace 反欺骗模块的实测效果:同一套现场,真人被标记为 Real(置信度 1.00),而打印照片和平板屏幕重放分别被识破为 Fake(0.66 / 0.99)。
什么是人脸活体检测?
活体检测(Liveness Detection / Face Anti-Spoofing)回答的问题只有一个:摄像头拍到的是"一张脸",还是"一张脸的照片"?
常见的攻击手段包括:
| 攻击方式 | 说明 |
|---|---|
| 📷 打印照片 | 把真人照片打印出来举到摄像头前 |
| 📱 屏幕重放 | 用平板/手机播放人脸照片或视频 |
| 🎬 视频回放 | 播放录制的活体视频 |
| 🎭 纸面具 / 3D面具 | 用纸质或高精度 3D 面具伪装 |
UniFace 的 MiniFASNet 实现 基于 ONNX Runtime 推理,模型判断的是呈现方式(presentation)而非身份——它不关心脸是谁,只关心这张脸是"活的"还是被"再现"的。
快速安装与第一次活体检测
安装只需一条命令(首次运行时会自动下载 MiniFASNet 权重并校验 SHA256):
pip install "uniface[cpu]" # NVIDIA 显卡可改装 uniface[gpu]跑通第一次活体检测只需三步:人脸检测 → 活体判断 → 读取结果 👇
import cv2 from uniface.detection import RetinaFace from uniface.spoofing import MiniFASNet detector = RetinaFace() # 第1步:检测人脸位置 spoofer = MiniFASNet() # 第2步:初始化活体检测模型(默认 V2) image = cv2.imread("photo.jpg") faces = detector.detect(image) for face in faces: # 第3步:逐个判断真人还是伪造 result = spoofer.predict(image, face.bbox) label = "Real" if result.is_real else "Fake" print(f"{label}: {result.confidence:.1%}")返回值是 SpoofingResult 数据类,只有两个字段:
result.is_real:True表示真人,False表示伪造result.confidence:0.0 ~ 1.0 的置信度
💡 注意:MiniFASNet 需要人脸检测框作为输入(
face.bbox),所以实践中总是和检测器组合使用,这也正是 UniFace "统一 API" 的价值所在——检测、对齐、活体、识别全部一个库搞定。
MiniFASNet 如何识破屏幕与照片攻击?
模型的核心逻辑藏在 preprocess 阶段:它不是直接用检测框裁脸,而是以人脸为中心向外扩展裁剪(V2 版本 scale=2.7,V1SE 版本 scale=4.0),把脸部周围的皮肤纹理、纸张边缘、屏幕反光等上下文信息一起送进网络——这些正是照片和屏幕重放"露馅"的地方。
模型提供两个变体(均约 1.2 MB,权重信息见 constants.py):
| 变体 | 裁剪缩放 | 说明 |
|---|---|---|
| V1SE | 4.0 | 带挤压-激励模块的早期版本 |
| V2(默认推荐) | 2.7 | 改进版,开箱即用 |
from uniface.spoofing import MiniFASNet from uniface.constants import MiniFASNetWeights spoofer = MiniFASNet(model_name=MiniFASNetWeights.V1SE) # 切换变体上面三张分别对应真人、打印照片和屏幕重放场景,正是 demo 对比图 中三个画面的原始素材。
实战技巧:如何设置置信度阈值?
默认情况下is_real由模型 argmax 决定。安全要求更高时,建议叠加置信度阈值,把"拿不准"的情况单独拦下来:
HIGH_THRESHOLD = 0.7 if result.is_real and result.confidence > HIGH_THRESHOLD: print("Real (high confidence)") else: print("Suspicious") # 可疑人脸,建议拒绝或二次验证更进一步,多帧验证能显著提升安全性:连续采集 5 帧,其中至少 3 帧判定为真人,才放行(完整示例见 docs/modules/spoofing.md)。
它能防御哪些攻击?
| 攻击类型 | 防御效果 |
|---|---|
| 打印照片 | ✅ 可检测 |
| 屏幕重放 | ✅ 可检测 |
| 视频回放 | ✅ 可检测 |
| 纸面具 | ✅ 可检测 |
| 高精度 3D 面具 | ⚠️ 效果有限 |
⚠️使用限制:高性能 3D 面具可能无法被检出;光照和图像质量会影响准确率;高安全场景(银行、门禁)请务必结合多帧验证或其他活体手段。
CLI 一行命令:图片、视频、摄像头全支持
不想写代码?仓库自带的命令行工具 tools/spoofing.py 支持三种输入源,结果直接画框输出:
python tools/spoofing.py --source photo.jpg # 单张图片 python tools/spoofing.py --source video.mp4 # 视频文件 python tools/spoofing.py --source 0 # 实时摄像头绿色框 = Real,红色框 = Fake,旁边附带置信度,输出自动保存到outputs/目录。
小结
UniFace 的活体检测把"人脸真伪"这件高安全级问题压缩成了极简体验:
- 轻量:1.2 MB 的 ONNX 模型,CPU 即可实时运行
- 统一:与 RetinaFace 等检测器共用同一 API,几行代码打通"检测 + 活体"流水线
- 实战:照片、屏幕、视频回放、纸面具均能识别,配合阈值与多帧验证可支撑门禁级应用
源码与接口细节可进一步阅读 uniface/spoofing/ 与官方文档 docs/modules/spoofing.md,更多模块(识别、属性、质量评估)都能在同一库中组合使用。
【免费下载链接】unifaceUniFace: A Unified Face Analysis Library for Python | Detection, alignment, landmarks, face-mesh, recognition, parsing, gaze, attributes and anti-spoofing under one API.项目地址: https://gitcode.com/gh_mirrors/un/uniface
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考