▲项目目的:识别真实人脸和照片,实现“识真”而不止“识脸”。
▲使用工具:opencv,python,matlab
首先
1. 构建图像数据集
2. 实现一个能够进行活体检测的卷积神经网络(我们称之为「LivenessNet」)
3. 训练活体检测网络
4. 创建一个能够使用我们训练好的活体检测模型并将其应用于实时视频的 Python+OpenCV 的脚本
(效果图)
活体检测的方法有很多,包括:
纹理分析,包括在人脸区域上计算局部二值模式(LBP,)和使用支持向量机(SVM)将人脸分类为真实的或伪造的。
频率分析,如查看人脸图片的傅里叶域(对其进行傅里叶变换)。
变量聚焦分析,例如查看两个连续帧之间像素值的变化。
基于启发式的算法,包括眼球运动、嘴唇运动和眨眼检测。这类算法试图跟踪眼球运动和眨眼,以确保用户展示的并非另一个人的照片(因为照片不会眨眼或移动嘴唇)。
光流算法,即查看由三维物体和二维平面产生的光流的差异和特性。
三维人脸形状,类似于苹果 iPhone 所使用的人脸识别系统,使人脸识别系统能够区分真实的人脸和打印出来 / 照片中的 / 图像中的另一个人的人脸。
将上述方法结合起来,使人脸识别系统工程师能够选择适合其特定应用程序的活体检测模型。
活体检测最终的效果取决于训练样本的数量,如果训练样本是谁的脸,那监测出此人的脸准确率更高。
将活体检测看作二分类问题
1.两组视频,一组真实的人,一组手机上的视频录播。
代码段
/* gather_examples.py */
1 #import the necessary packages
2 importnumpy as np3 importargparse4 importcv25 importos6 #construct the argument parse and parse the arguments
7 ap =argparse.ArgumentParser8 ap.add_argument("-i", "--input", type=str, required=True,9 help="path to input video")10 ap.add_argument("-o", "--output", type=str, required=True,11 help="path to output directory of cropped faces")12 ap.add_argument("-d", "--detector", type=str, required=True,13 help="path to OpenCV's deep learning face detector")14 ap.add_argument("-c", "--confidence", type=float, default=0.5,15 help="minimum probability to filter weak detections")16 ap.add_argument("-s", "--skip", type=int, default=16,17 help="# of frames to skip before applying face detection")18 args = vars(ap.parse_args)
第 2-5 行引入了我们需要的安装包。除了内置的 Python 模块,该脚本仅仅需要用到 OpenCV 和 NumPy 。
第 8-19 行代码将解析我们的命令行参数:
「--input」:我们的输入视频文件的路径。
「--output」:储存每个裁剪出来的人脸图像的输出目录的路径。
「--detector」:人脸检测器的路径。我们将使用 OpenCV 的深度学习人脸检测器(https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/)。为了方便读者使用,Caffe 模型可在本文的「下载」部分获得。
「--confidence」:过滤弱人脸检测结果的最小概率。默认情况下,该值为 50%。
「--skip」:我们不需要检测并存储每个图像,因为相邻的帧是相似的。相反我们会在两次人脸检测任务之间跳过 N 个帧。你可以使用此参数修改默认的 N 值(16)。
---未完待续---