大数跨境

CVPR2026 SOTA|FaceLive人脸活体检测实战!防照片/视频/面具攻击、端侧实时门禁、无感活体SOTA

CVPR2026 SOTA|FaceLive人脸活体检测实战!防照片/视频/面具攻击、端侧实时门禁、无感活体SOTA AI与计算机视觉
2026-10-24
4
导读:门禁刷脸的时候,有人拿一张打印的人脸照片对着摄像头一晃就开了;有人拿手机播放一段人脸视频就过了——这种"假脸攻

门禁刷脸的时候,有人拿一张打印的人脸照片对着摄像头一晃就开了;有人拿手机播放一段人脸视频就过了——这种"假脸攻击"是人脸识别系统最大的安全漏洞。

今天分享的这篇 CVPR2026 论文 FaceLive,提出了一个轻量人脸活体检测框架:不需要用户做任何配合动作(不用眨眼、不用摇头),一张图就能判断是真人还是假脸。在 CASIA-FASD 和 OULU-NPU 两个标准数据集上刷新了 SOTA,模型只有 3.5M 参数,门禁设备上实时跑毫无压力。

一、人脸活体检测为什么这么难

活体检测看起来就是"判断是不是真人",但攻击手段一直在升级,防守方永远在追着攻击跑。

1.1 攻击手段越来越多

最早的攻击就是拿一张打印照片,后来变成播放手机视频,再后来变成戴面具、用 3D 打印头模、甚至用 AI 生成的人脸视频。每出现一种新攻击方式,老的活体检测方法就可能被攻破。你不能假设攻击手段是固定的——模型得学会"泛化",能防住没见过的新攻击。

1.2 真人和假人差异太小

高质量的打印照片、高清屏幕播放的视频,肉眼都很难分辨真假。模型要找的是真人和假人之间那些非常细微的差异——皮肤纹理、光线反射模式、摩尔纹、屏幕边框痕迹——这些差异在普通摄像头画面里非常不明显。

1.3 不能影响用户体验

早期活体检测要用户配合——眨眨眼、摇摇头、张张嘴。但门禁场景里,大家都是走过去刷脸就走,没人愿意停下来做动作。最好的活体检测是"无感"的——用户什么都不用做,模型自己判断。

1.4 跨域泛化差

在 A 公司摄像头、A 数据集上训练的活体模型,换到 B 公司摄像头、B 场景下,准确率可能直接掉一半。因为不同摄像头的成像质量、角度、光线都不一样,模型很容易"过拟合"到训练数据的特定分布上。

二、FaceLive 的三个核心设计

FaceLive 的整体思路:不针对某一种攻击做检测,而是学习"真人脸的物理特性"——不管你用什么手段攻击,只要不符合真人脸的物理规律,就判为假。

2.1 伪影感知特征学习

假脸攻击不管用什么手段,都会留下一些"数字痕迹":

•屏幕攻击:手机/电脑屏幕播放的视频,会有摩尔纹、屏幕边框、反光。

•打印攻击:打印照片会有纸张纹理、油墨颗粒、边缘不自然。

•面具攻击:面具的边缘和真人皮肤交界处会有不自然的过渡。

FaceLive 专门设计了一个伪影感知模块,自动学习这些细微的痕迹特征。不是人工设计规则,而是让模型自己从数据里学出来——这样不管攻击手段怎么变,只要有伪影就能检测到。

2.2 多粒度特征融合

不同攻击留下的痕迹在不同尺度上:

•全局特征:判断整张脸的光照、色彩是否自然。

•局部特征:看眼睛、鼻子、嘴巴这些关键区域有没有异常。

•微纹理特征:皮肤表面的细微纹理——真人皮肤有毛孔、细纹,打印照片没有。

FaceLive 从 backbone 的不同层提取这三个粒度的特征,融合起来做判断。消融实验显示,只用全局特征的时候,对高质量打印照片的检测率只有 85%;加上微纹理特征后,检测率提升到 98%。

2.3 域自适应训练策略

跨域泛化差怎么办?FaceLive 在训练时做了大量"域随机化":

•随机摄像头模拟:训练时随机调整图像的分辨率、噪点、色彩偏差,模拟不同摄像头的成像效果。

•随机攻击类型混合:训练数据里混合各种攻击类型——打印、屏幕、面具、AI生成——让模型不偏向某一种攻击。

•域对抗训练:加一个域判别器,让特征提取器学会"不管什么摄像头拍的,真人特征都一样"。

这些训练策略加起来,FaceLive 在跨数据集测试时,等错误率(ACER)比传统方法低了 4.2 个点——这就是泛化能力的提升。

三、技术架构拆解

FaceLive 的整体 pipeline 分四个模块:

模块

做什么

关键设计

人脸对齐预处理

检测并对齐人脸

轻量人脸检测+关键点对齐,统一裁剪到 224×224

多粒度特征提取

提取全局/局部/微纹理特征

轻量 CNN backbone,取三层不同尺度输出

伪影感知融合

融合多粒度特征,学习攻击痕迹

注意力加权融合,重点关注可疑区域

活体分类头

输出真/假概率

二分类,输出活体置信度

几个工程上的亮点:

•参数量:3.5M,INT8 量化后在门禁设备上能跑 60fps 以上。

•无感检测:不需要用户做任何动作,单帧就能判断,体验很好。

•端到端:从人脸检测到活体判断,一个模型搞定,不需要多个模型串联。

四、和主流方法的横向对比

论文在 CASIA-FASD(跨数据集活体检测)和 OULU-NPU(多攻击类型)两个基准上做了对比:

方法

CASIA-FASD ACER↓

OULU-NPU ACER↓

参数量(M)

FPS(边缘设备)

Motion-based

12.5

15.3

0.5

200

CNN-based (STASN)

5.8

7.2

15

30

Vision Transformer

3.2

4.5

45

10

FaceLive

2.8

3.9

3.5

65

可以看到,FaceLive 的 ACER(越低越好)比 ViT 方法还低一点,但参数量只有后者的 1/13,速度快了 6 倍以上。和传统 CNN 方法比,ACER 低了一半还多——这就是伪影感知和多粒度融合的效果。这个 trade-off 非常适合门禁这种嵌入式场景。

五、快速上手:推理核心代码

下面是 FaceLive 的推理框架,帮大家理解整体流程:

python
FaceLive 人脸活体检测核心逻辑
import torch
import torch.nn as nn

class FaceLive(nn.Module):
    def __init__(self):
        super().__init__()
        self.face_detector = LightFaceDetector()    # 人脸检测
        self.backbone = MultiScaleBackbone()         # 多粒度特征提取
        self.fusion = ArtifactAwareFusion()          # 伪影感知融合
        self.classifier = LivelinessHead()            # 活体分类头

    def forward(self, frame):
        # 1. 检测人脸并对齐
        faces = self.face_detector(frame)
        if len(faces) == 0:
            return "未检测到人脸"

        results = []
        for face in faces:
            aligned_face = align_face(frame, face)  # 对齐裁剪到224x224

            # 2. 提取多粒度特征
            feat_global, feat_local, feat_texture = self.backbone(aligned_face)

            # 3. 伪影感知融合
            fused_feat = self.fusion(feat_global, feat_local, feat_texture)

            # 4. 预测活体概率
            live_prob = self.classifier(fused_feat)

            results.append({
                "bbox": face.bbox,
                "is_live": live_prob > 0.5,
                "confidence": live_prob.item()
            })

        return results

# 使用示例
model = FaceLive()
model.load_state_dict(torch.load("facelive_casia.pth"))
model.eval()

# 门禁场景:摄像头实时检测
cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    with torch.no_grad():
        results = model(frame)

        for r in results:
            if r["is_live"] and r["confidence"] > 0.9:
                print(f"真人,置信度: {r['confidence']:.2f},开门")
                open_door()
            else:
                print(f"假脸攻击,置信度: {r['confidence']:.2f},拒绝")
                alarm()

    cv2.imshow("门禁", frame)
    cv2.waitKey(1)

实际部署的时候,阈值可以根据场景调——金融级安全场景把阈值调高(比如 0.99),普通小区门禁可以调低一点(比如 0.8)。阈值越高越安全,但也越容易把真人误判为假人。

六、毕设/竞赛拓展方向

人脸活体检测这个方向做毕设有个好处——Demo 效果非常直观,拿一张照片对着摄像头,模型直接报警。分享几个有价值的拓展点:

6.1 AI生成人脸攻击检测

现在 AI 生成的人脸越来越逼真,DeepFake 视频也越来越多。专门研究"如何检测 AI 生成的假人脸"——这是一个很新的方向,和传统活体检测不一样,需要找 AI 生成的特有痕迹。

6.2 3D面具攻击检测

2D 的照片、视频攻击好防,3D 打印的面具、硅胶头模就难了——它们有真实的立体结构。专门研究如何检测 3D 面具攻击,结合深度信息或者红外信息,是一个很有深度的方向。

6.3 移动端活体检测 SDK

把 FaceLive 做成一个完整的移动端 SDK——人脸检测 + 对齐 + 活体判断,集成到门禁 App 里。工程完整性很强,从模型到端侧部署全链路打通。

6.4 多模态活体检测

只用 RGB 摄像头信息有限,如果加上红外、深度信息,检测率会高很多。研究 RGB+红外+深度的多模态融合活体检测,是一个很实用的方向。

七、写在最后

人脸活体检测这个方向,本质上是一场"猫鼠游戏"——攻击手段在升级,防守也得跟着升级。没有永远安全的活体检测方案,只有不断进化的防御体系。

FaceLive 给我的启发是:不要针对某一种攻击做检测,要学会"泛化"——不管攻击怎么变,真人脸的物理特性是不变的。抓住这个本质,模型才能应对没见过的新攻击。

做毕设的同学如果选这个方向,我建议先拿开源的活体检测数据集跑通 baseline,然后选一种具体攻击类型去深入——比如 DeepFake 检测、3D 面具检测。问题越具体,工作越扎实。

大家如果有复现上的问题或者想聊具体的门禁场景,欢迎评论区交流。

【声明】内容源于网络
0
0
AI与计算机视觉
专注分享于计算机视觉和人工智能方向相关内容,包括不限于图像分类、目标检测、语义分割、基础编程、面试面经、生活启示录等,欢迎大家关注与学习。
内容 136
粉丝 0
AI与计算机视觉 专注分享于计算机视觉和人工智能方向相关内容,包括不限于图像分类、目标检测、语义分割、基础编程、面试面经、生活启示录等,欢迎大家关注与学习。
总阅读2.6k
粉丝0
内容136