什么是活体检测,为什么需要它?

随着时代的发展,人脸识别系统的应用也正变得比以往任何时候都更加普遍。从智能手机上的人脸识别解锁、到人脸识别打卡、门禁系统等,人脸识别系统正在各行各业得到应用。然而,人脸识别系统很容易被“非真实”的面孔所欺骗。比如将人的照片放在人脸识别相机,就可以骗过人脸识别系统,让其识别为人脸。为了使人脸识别系统更安全,我们不仅要识别出人脸,还需要能够检测其是否为真实面部,这就要用到活体检测了。

图1:左边的是真实脸,右边是假脸

目前有许多活体检测方法,包括:

纹理分析(Texture analysis),包括计算面部区域上的局部二进制模式(LBP)并使用SVM将面部分类为真脸或假脸;频率分析(Frequency analysis),例如检查面部的傅里叶域;可变聚焦分析(ariable focusing analysis),例如检查两个连续帧之间的像素值的变化。基于启发式的算法(Heuristic-based algorithms),包括眼球运动、嘴唇运动和眨眼检测;光流算法(Optical Flow algorithms),即检查从3D对象和2D平面生成的光流的差异和属性;3D脸部形状,类似于Apple的iPhone脸部识别系统所使用的脸部形状,使脸部识别系统能够区分真人脸部和其他人的打印输出的照片图像;面部识别系统工程师可以组合上述方法挑选和选择适合于其特定应用的活体检测模型。但本教程将采用图像处理中常用方法——卷积神经网络(CNN)来构建一个能够区分真实面部和假面部的深度神经网络(称之为“LivenessNet”网络),将活体检测视为二元分类问题。首先检查一下数据集。

活动检测视频

图2:收集真实与虚假/欺骗面孔的示例

为了让例子更加简单明了,本文构建的活体检测器将侧重于区分真实面孔与屏幕上的欺骗面孔。且该算法可以很容易地扩展到其他类型的欺骗面孔,包括打印输出、高分辨率打印等。活体检测数据集来源:

iPhone纵向/自拍;录制了一段约25秒在办公室里走来走去的视频;重播了相同的25秒视频,iPhone重录视频;获得两个示例视频,一个用于“真实”面部,另一个用于“假/欺骗”面部。最后,将面部检测应用于两组视频,以提取两个类的单个面部区域。项目结构

项目中主要有四个目录:*

dataset /

:数据集目录,包含两类图像:在播放脸部视频时,手机录屏得到的假脸;

手机自拍视频中真脸;face_detector /:由预训练Caffe面部检测器组成,用于定位面部区域;pyimagesearch /:模块包含LivenessNet类函数;video/:提供了两个用于训练了LivenessNet分类器的输入视频;另外还有三个Python脚本:

gather_examples.py:此脚本从输入视频文件中获取面部区域,并创建深度学习面部数据集;train_liveness.py:此脚本将训练LivenessNet分类器。训练会得到以下几个文件:1.le .pickle:类别标签编码器;2.liveness.model:训练好的Keras模型;3.plot.png:训练历史图显示准确度和损失曲线;liveness_demo.py:该演示脚本将启动网络摄像头以进行面部实时活体检测;从训练数据集中检测和提取面部区域

图3:构建活体检测数据集,检测视频中的面部区域;

数据目录:

1.dataset / fake /:包含假.mp4文件中的面部区域;2.dataset / real /:保存来自真实.mov文件的面部区域;打开

gather_examples.py

文件并插入以下代码:

首先导入所需的包:第8-19行解析命令行参数:

input:输入视频文件的路径;output:输出目录的路径;detector:人脸检测器的路径;confidence:人脸检测的最小概率。默认值为0.5;skip:检测时略过的帧数,默认值为16;之后加载面部检测器并初始化视频流:

此外还初始化了两个变量,用于读取的帧数以及循环执行时保存的帧数。创建一个循环来处理帧:

下面进行面部检测:

为了执行面部检测,需要从图像中创建一个区域,该区域有300×300的宽度和高度,以适应Caffe面部检测器。此外脚本假设视频的每一帧中只有一个面部,这有助于防止误报。获得最高概率的面部检测指数,并使用索引提取检测的置信度,之后将低概率的进行过滤,并将结果写入磁盘:

提取到面部区域后,就可以得到面部的边界框坐标。然后为面部区域生成路径+文件名,并将其写入磁盘中。

构建活体检测图像数据集

图4:面部活体检测数据集

打开终端并执行以下命令来提取“假/欺骗”类别的面部图像:

同理也可以执行以下命令获得“真实”类别的面部图像:

注意,这里要确保数据分布均衡。执行脚本后,统计图像数量:

假:150张图片真:161张图片总计:311张图片实施“LivenessNet”深度学习活体检测模型

图5:LivenessNet的深度学习架构

LivenessNet实际上只是一个简单的卷积神经网络,尽量将这个网络设计的尽可能浅,参数尽可能少,原因有两个:

减少过拟合可能性;确保活体检测器能够实时运行;打开

livenessnet .py

并插入以下代码:

创建活体检测器训练脚本

图6:训练LivenessNet

打开

train_liveness .py

文件并插入以下代码:

此脚本接受四个命令行参数:

dataset:输入数据集的路径;model:输出模型文件保存路径;le:输出序列化标签编码器文件的路径;plot:训练脚本将生成一个图;下一个代码块将执行初始化并构建数据:

之后对标签进行独热编码并对将数据划分为训练数据(75%)和测试数据(25%):

之后对数据进行扩充并对模型进行编译和训练:

模型训练后,可以评估效果并生成仿真曲线图:

训练活体检测器

执行以下命令开始模型训练:

图6:使用OpenCV、Keras和深度学习训练面部活体模型

从上述结果来看,在测试集上获得99%的检测精度!

合并起来:使用OpenCV进行活体检测

图7:使用OpenCV和深度学习进行面部活体检测

最后一步是将所有部分组合在一起:

访问网络摄像头/视频流;对每个帧应用面部检测;对于检测到的每个脸部,应用活体检测器模型;打开`liveness_demo.py并插入以下代码:

上述代码导入必要的包,并加载模型。下面初始化人脸检测器、LivenessNet模型以及视频流:

之后开始循环遍历视频的每一帧以检测面部是否真实:

使用OpenCV blobFromImage函数生成一个面部数据,然后将其传递到面部检测器网络继续进行推理。核心代码如下:

首先过滤掉弱检测结果,然后提取面部图像并对其进行预处理,之后送入到活动检测器模型来确定面部是“真实的”还是“假的/欺骗的”。最后,在原图上绘制标签和添加文本以及矩形框,最后进行展示和清理。

将活体检测器应用到实时视频上

打开终端并执行以下命令:

可以看到,活体检测器成功地区分了真实和伪造的面孔。下面的视频作为一个更长时间的演示:视频地址

进一步的工作

本文设计的系统还有一些限制和缺陷,主要限制实际上是数据集有限——总共只有311个图像。这项工作的第一个扩展之一是简单地收集额外的训练数据,比如其它人,其它肤色或种族的人。此外,活体检测器只是通过屏幕上的恶搞攻击进行训练,它并没有经过打印出来的图像或照片的训练。因此,建议添加不同类型的图像源。最后,我想提一下,活体检测没有最好的方法,只有最合适的方法。一些好的活体检测器包含多种活体检测方法。

总结

在本教程中,学习了如何使用OpenCV进行活动检测。使用此活体检测器就可以在自己的人脸识别系统中发现伪造的假脸并进行反面部欺骗。此外,创建活动检测器使用了OpenCV、Deep Learning和Python等领域的知识。整个过程如下:

第一步是收集真假数据集。数据来源有:智能手机录制自己的视频(即“真”面);手机录播(即“假”面);对两组视频应用面部检测以形成最终数据集。第二步,获得数据集之后,实现了“LivenessNet”网络,该网络设计的比较浅层,这是为了确保:减少了过拟合小数据集的可能性;该模型本身能够实时运行;总的来说,本文设计的活体检测器能够在验证集上获得99%的准确度。此外,活动检测器也能够应用于实时视频流。

来源:https://baijiahao.baidu.com/s?id=1628311480103833239&wfr=spider&for=pc

活体检测很复杂?仅使用opencv就能实现!(附源码)相关推荐

  1. 超简单的pyTorch训练-onnx模型-C++ OpenCV DNN推理(附源码地址)

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为1974字,预计阅读5分钟 前言 很早就想学习深度学习了,因为平时都是自学,业余时间也有限,看过几个pyTorch的入门,都是一 ...

  2. yolov3检测和平精英视频中人物及物体【附源码+数据】

    目录 一.实现效果与数据下载链接 二.相应代码 三.yolo原理讲解 一.实现效果与数据下载链接 视频识别效果,链接如下: https://www.bilibili.com/video/BV1fa4y ...

  3. 实战 | 计算器/数码管数字识别 基于OpenCV和EasyOCR/PaddleOCR(附源码)

    点击下方卡片,关注"OpenCV与AI深度学习"公众号! 视觉/图像重磅干货,第一时间送达! 导读 本文主要介绍一个计算器显示数字识别的OCR实例,基于OpenCV和EasyOCR ...

  4. OpenCvSharp (C# OpenCV) DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别、骰子识别、菜品识别)(附源码)

    本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别.骰子识别.菜品识别)! 前言: 下 ...

  5. opencv判断 线夹角_python opencv实现直线检测并测出倾斜角度(附源码+注释)

    由于学习需要,我想要检测出图片中的直线,并且得到这些直线的角度.于是我在网上搜了好多直线检测的代码,但是没有搜到附有计算直线倾斜角度的代码,所以我花了一点时间,自己写了一份直线检测并测出倾斜角度的代码 ...

  6. yolov5检测小目标(附源码)

    yolov5小目标检测(图像切割法附源码) 6.30 更新切割后的小图片的label数据处理 前言 yolov5大家都熟悉,通用性很强,但针对一些小目标检测的效果很差. YOLOv5算法在训练模型的过 ...

  7. Halcon转OpenCV实例--去除纸张中的颜色笔迹/墨迹(附源码)

    导读 本文主要介绍一个去除纸张中颜色笔迹/墨迹的实例,并将Halcon实现转为OpenCV. 实例来源 实例来源于51Halcon论坛的讨论贴: https://www.51halcon.com/fo ...

  8. Android实现手部检测和手势识别(可实时运行,含Android源码)

    Android实现手部检测和手势识别(可实时运行,含Android源码) 目录 Android实现手部检测和手势识别(可实时运行,含Android源码) 1. 前言 2. 手势识别的方法 (1)基于多 ...

  9. C#使用Xamarin开发可移植移动应用(2.Xamarin.Forms布局,本篇很长,注意)附源码

    前言 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 一点感想 很意外的,第一篇博文被博客园的编辑大哥置顶了.感谢. 评论也很多,褒贬 ...

最新文章

  1. GIS输出PDF为什么标注有问题
  2. update-alternatives使用方法
  3. LeetCode 螺旋矩阵(Spiral Matrix)
  4. Java基础—8大数据类型
  5. 图像处理前沿技术_深入浅出人工智能前沿技术—机器视觉检测,看清人类智慧工业...
  6. Java ArrayList的实现原理详解
  7. 企业级整站集群数据备份项目方案详解
  8. SAP License:SAP中的报表查询
  9. phpstorm使用技巧
  10. 如约而至!第二期 Flink 极客训练营上线啦
  11. 用户体验五要素_用户体验五要素—结构性思考
  12. 10个妙招 在线视频下载方法大全
  13. 北京亚控笔试题目(2014年10月9日)
  14. 使用Python获取股市北向资金和南向资金信息
  15. 计算机技术生活应用论文,计算机网络技术生活应用论文
  16. (PTA)6-9 字符串压缩
  17. LDA主题模型学习心得
  18. python制作课程表提醒_10行Python代码制作群聊提醒小助手,再也不怕漏掉消息了...
  19. ajax如何实现表单验证码,Ajax实现提交表单时验证码自动验证(原创自Zjmainstay)...
  20. 指针从入门到熟练掌握

热门文章

  1. 商场促销——策略模式
  2. SDUT 2401 最大矩形面积
  3. 如何去重一个SQL Server表
  4. 华为云+AI,视频分析全面进入智能时代
  5. C++ Primer plus 第12章类和动态内存分配复习题参考答案
  6. linux修改系统时间为北京时间(CentOS)
  7. 配置maven nenux仓库
  8. Scrapy爬虫(6)爬取银行理财产品并存入MongoDB(共12w+数据)
  9. Windows下使用Dev-C++开发基于pthread.h的多线程程序
  10. 建立广域网时使用的拓扑结构是什么?