人脸识别漏洞频出?这个开源静默活体检测算法,超低运算量工业可用
ztj100 2025-09-06 16:15 10 浏览 0 评论
机器之心发布
机器之心编辑部
小视科技团队开源的基于 RGB 图像的活体检测模型,是专门面向工业落地场景,兼容各种复杂场景下的模型。该自研的剪枝轻量级模型,运算量为 0.081G,在麒麟 990 5G 芯片上仅需 9ms。同时基于 PyTorch 训练的模型能够灵活地转化成 ONNX 格式,实现全平台部署。
如今,人脸识别已经进入我们生活中的方方面面:拿起手机扫脸付账、完成考勤、入住酒店等,极大地便利了我们的生活。
我们在享受技术带来方便的同时,也要应对其潜在的风险。一旦虚假人脸攻击成功,极有可能对用户造成重大损失。
如 2019 年,在拉斯维加斯举办的世界黑帽(Black Hat)安全大会上,腾讯公司的研究人员就曾演示用一副特制眼镜攻破苹果 Face ID。
更早之前,也有人曾使用 3D 打印「石膏」人脸攻击手机的人脸识别功能,成功破解多款人脸识别解锁功能。
图片来源:Forbes
为了抵御这种假脸攻击,小视科技团队开源了一个静默活体检测算法和可适用于安卓平台的部署源码,可兼容各种工业级复杂场景的活体检测。
静默活体检测算法项目地址:
https://github.com/minivision-ai/Silent-Face-Anti-Spoofing
安卓平台部署源码项目地址:
https://github.com/minivision-ai/Silent-Face-Anti-Spoofing-APK
活体检测技术主要是判别镜头前出现的人脸是真实的还是伪造的,其中借助其他媒介呈现的人脸都可以定义为虚假的人脸,包括打印的纸质照片、电子产品的显示屏幕、硅胶面具、立体的 3D 人像等。活体检测技术能够抵御各种假脸的攻击,为人脸识别保驾护航。
目前主流的活体解决方案分为配合式和非配合式活体,配合式活体需要用户根据提示做出相应的动作从而完成判别,而非配合式活体在用户无感的情况下直接进行活体检测,具有更好的用户体验。
非配合式活体根据成像源的不同一般分为红外图像、3D 结构光和 RGB 图像三种技术路线:红外图像滤除了特定波段的光线,天生抵御基于屏幕的假脸攻击;3D 结构光引入了深度信息,能够很容易地辨别纸质照片、屏幕等 2D 媒介的假脸攻击;RGB 图片主要通过屏幕拍摄出现的摩尔纹、纸质照片反光等一些细节信息进行判别。基于以上分析不难发现,基于 RGB 图片的活体检测与其他两种方法相比,仅能通过图像本身的信息进行判别,在实际的开放场景中面临着更大的挑战性。
小视科技团队开源的基于 RGB 图像的活体检测模型,是专门面向工业落地场景,兼容各种复杂场景下的模型。该自研的剪枝轻量级模型,运算量为 0.081G,在麒麟 990 5G 芯片上仅需 9ms。同时基于 PyTorch 训练的模型能够灵活地转化成 ONNX 格式,实现全平台部署。
活体任务的定义
基于 RGB 图像的活体检测是一个分类任务,目标是有效地区分真脸和假脸,但又有别于其他类似于物品分类的任务。其中的关键点在于攻击源分布过于广泛,如图 1 所示:不同的攻击媒介,不同设备的成像质量,不同的输入分辨率都对分类结果有着直接的影响。为了降低这些不确定因素带来的影响,小视科技团队对活体的输入进行了一系列限制:活体的输入限制在特定的分辨率区间;输入图片均为实时流中截取的视频帧。这些操作大大降低了活体模型在实际生产部署上失控的风险,提升了模型的场景鲁棒性。
图 1 现实场景中活体数据分布图
基于成像介质种类的不同,小视科技团队将样本分为真脸、2D 成像(打印照片,电子屏幕)以及 3D 人脸模具三类,根据上述的准则整理和收集训练数据。活体检测的主要流程如图 2 所示。
图 2 开源活体 Pipeline
开源模型技术路线
小视科技团队采用自研的剪枝轻量级网络作为 backbone 训练模型,使用 Softmax + CrossEntropy Loss 作为训练分类的监督。使用不同尺度的图片作为网络的输入训练数据,增加模型间的互补性,从而进行模型融合。考虑到用于真假脸判别的有效信息不一定完全分布在脸部区域,可能在取景画面的任何地方(如边框,摩尔纹等),小视科技团队在 backbone 中加入了 SE(Squeeze-and-Excitation)的注意力模块,动态适应分散的判别线索。同时小视科技团队也通过实验发现真假脸在频域中存在明显的差异,为此引入傅里叶频谱图作为模型训练的辅助监督,有效提升了模型精度。
自研的轻量级剪枝网络
小视科技团队使用自研的模型剪枝方法,将 MoboileFaceNet 的 flops 从 0.224G 降低到了 0.081G,剪枝的网络结构如图 3 所示。模型观测误检率在十万一对应的真脸通过率,在精度没有明显损失的情况下,模型前向运行的速度提升了 40%。
表 1 模型性能对比表
图 3 剪枝模型通道示意图
注意力机制
考虑到用于真假脸判别的有效信息不一定完全分布在脸部区域,也有可能在取景画面的任何地方(如边框,摩尔纹等)。小视科技团队在 backbone 中加入了 SE(Squeeze-and-Excitation)的注意力模块,动态适应分散的判别线索,热力图如图 4 所示。对于假脸,模型更关注于边框信息和屏幕的摩尔纹信息,对于真脸更加关注脸部以及周围的信息。
图 4 活体模型热力图
数据预处理
使用人脸检测器获取图像中的人脸框坐标,按照一定比例 (scale) 对人脸框进行扩边,图 5 展示了部分 patch 的区域,为了保证模型的输入尺寸的一致性,将 patch 区域 resize 到固定尺寸。
图 5 Patch 示例图
傅里叶频谱图
将假脸照片与真脸照片转化生成频域图,对比发现假脸的高频信息分布比较单一,仅沿着水平和垂直方向延伸,而真脸的高频信息从图像的中心向外呈发散状,如图 6 所示。根据以上的实验,小视科技团队发现真脸和假脸的傅里叶频谱存在差异,从而引入了傅里叶频谱对模型训练进行辅助监督。
图 6 傅里叶频谱图
基于傅里叶频谱图的辅助网络监督
基于对于真脸和假脸在频域的观察分析,小视科技团队提出了基于傅里叶频谱图进行辅助网络监督的训练方法,整理架构图如图 7 所示。网络的主分支采用 Softmax+ CrossEntropy 作为网络的监督,如公式(1)所示。其中, f_j表示输出类别的第 j 个置信度, y_i 表示样本的真实标签,N 为训练样本的个数。
小视科技团队采用在线的方式生成傅里叶频谱图,使用 L2 Loss 作为损失函数。输入图片的尺寸为 3x80x80,从主干网络中提取尺寸为 128x10x10 特征图,经过 FTGenerator 分支生成 1x10x10 的预测频谱图 F_P 。通过傅里叶变换,将输入图片转化成频谱图,再进行归一化,最后 resize 成 1x10x10 尺寸得到 F_G ,使用 L2 Loss 计算两特征图之间差异,如公式(2)所示。
为了控制 L_FT在训练过程中对梯度的贡献作用,分别引入了
平衡两个损失函数L_Softmax和L_FT,如公式(3)所示,其中
。在实验中设置
。
图 7 傅里叶频谱辅助监督训练架构图
其他模型策略
使用大体量网络 ResNet34 蒸馏剪枝网络 MiniFASNetV1 和 MiniFASNetV2,精度得到提升。
使用模型融合的机制,针对于不同输入尺度、不同网络结构以及不同迭代次数的模型进行融合,充分挖掘模型间对分类任务的互补性,提升模型精度。
实验结果
测试集建立
小视科技团队基于实际的生产场景建立了 100W 量级的测试集,从移动设备的视频流中实时获取图像。真脸数据包含了强光、暗光、背光、弱光以及阴阳脸等各种复杂场景。基于 2D 的假脸数据使用打印纸、铜版纸、照片纸以及电脑屏幕、平板 Pad 屏幕、手机屏幕,在不同的距离、角度和光线下进行采集。基于 3D 的假脸数据则采用头模、硅胶面具和纸质照片抠洞的人脸面具进行采集。
模型评价指标
小视科技团队采用 ROC 曲线作为模型的观测指标,控制十万一的误检率,保证模型在 97%+ 的通过率。与一般的分类任务不同,团队采用了 ROC 曲线而非分类精度作为度量指标,其原因是:生产落地场景对活体模型的误检控制具有很高的要求。
为了降低活体在应用场景发生误检的概率,小视科技团队控制模型误检率在十万一量级的同时,保证了较高的真脸通过率。团队将活体定义为三分类任务,为了适应 ROC 曲线的评价指标,将真脸以外的类别都定义成假脸,从而解决了使用 ROC 曲线适应多分类的问题。
最终的开源融合模型,包含了两个剪枝网络的单模型,在测试集上的观测指标如表 2 所示。开源模型误检控制在 1e-5 的情况下,真脸通过率能够达到 97.8%。未开源的高精度模型在相同的误检率下,真脸通过率达到 99.5%。
表 2 模型观测指标
速度指标
开源融合模型在不同芯片上速度指标如表 3 所示,在麒麟 990 5G 上仅需要 19ms。
表 3 模型测试速度
安卓端体验 APK DEMO 演示
为了方便开发者更好地体验该项静默活体检测技术,小视科技团队准备了用于测试的安卓端 APK,不仅可以直观地感受该项技术达到的效果,还可以实时观测速度、置信度等相关指标。
点击链接下载安卓端体验 APK:https://ai.minivision.cn/#
/coreability/livedetectionvideo
线上分享
7月23日20:00-21:00,小视科技副总裁、AI研究院院长胡建国将带来线上分享,为大家详解这一工业级静默活体检测算法,期待与广大业内开发者和爱好者共同交流。
添加机器之心小助手syncedai3,进群一起看直播。
相关推荐
- sharding-jdbc实现`分库分表`与`读写分离`
-
一、前言本文将基于以下环境整合...
- 三分钟了解mysql中主键、外键、非空、唯一、默认约束是什么
-
在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。...
- MySQL8行级锁_mysql如何加行级锁
-
MySQL8行级锁版本:8.0.34基本概念...
- mysql使用小技巧_mysql使用入门
-
1、MySQL中有许多很实用的函数,好好利用它们可以省去很多时间:group_concat()将取到的值用逗号连接,可以这么用:selectgroup_concat(distinctid)fr...
- MySQL/MariaDB中如何支持全部的Unicode?
-
永远不要在MySQL中使用utf8,并且始终使用utf8mb4。utf8mb4介绍MySQL/MariaDB中,utf8字符集并不是对Unicode的真正实现,即不是真正的UTF-8编码,因...
- 聊聊 MySQL Server 可执行注释,你懂了吗?
-
前言MySQLServer当前支持如下3种注释风格:...
- MySQL系列-源码编译安装(v5.7.34)
-
一、系统环境要求...
- MySQL的锁就锁住我啦!与腾讯大佬的技术交谈,是我小看它了
-
对酒当歌,人生几何!朝朝暮暮,唯有己脱。苦苦寻觅找工作之间,殊不知今日之事乃我心之痛,难道是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日,可惜在下京东上的小金库都要见低啦。每每想到不由心中一...
- MySQL字符问题_mysql中字符串的位置
-
中文写入乱码问题:我输入的中文编码是urf8的,建的库是urf8的,但是插入mysql总是乱码,一堆"???????????????????????"我用的是ibatis,终于找到原因了,我是这么解决...
- 深圳尚学堂:mysql基本sql语句大全(三)
-
数据开发-经典1.按姓氏笔画排序:Select*FromTableNameOrderByCustomerNameCollateChinese_PRC_Stroke_ci_as//从少...
- MySQL进行行级锁的?一会next-key锁,一会间隙锁,一会记录锁?
-
大家好,是不是很多人都对MySQL加行级锁的规则搞的迷迷糊糊,一会是next-key锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加...
- 一文讲清怎么利用Python Django实现Excel数据表的导入导出功能
-
摘要:Python作为一门简单易学且功能强大的编程语言,广受程序员、数据分析师和AI工程师的青睐。本文系统讲解了如何使用Python的Django框架结合openpyxl库实现Excel...
- 用DataX实现两个MySQL实例间的数据同步
-
DataXDataX使用Java实现。如果可以实现数据库实例之间准实时的...
- MySQL数据库知识_mysql数据库基础知识
-
MySQL是一种关系型数据库管理系统;那废话不多说,直接上自己以前学习整理文档:查看数据库命令:(1).查看存储过程状态:showprocedurestatus;(2).显示系统变量:show...
- 如何为MySQL中的JSON字段设置索引
-
背景MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型。自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,例如审计日志、配置信息、第三方数据包、用户自定...
你 发表评论:
欢迎- 一周热门
-
-
MySQL中这14个小玩意,让人眼前一亮!
-
旗舰机新标杆 OPPO Find X2系列正式发布 售价5499元起
-
【VueTorrent】一款吊炸天的qBittorrent主题,人人都可用
-
面试官:使用int类型做加减操作,是线程安全吗
-
C++编程知识:ToString()字符串转换你用正确了吗?
-
【Spring Boot】WebSocket 的 6 种集成方式
-
PyTorch 深度学习实战(26):多目标强化学习Multi-Objective RL
-
pytorch中的 scatter_()函数使用和详解
-
与 Java 17 相比,Java 21 究竟有多快?
-
基于TensorRT_LLM的大模型推理加速与OpenAI兼容服务优化
-
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)