全文:体外检验在各个领域应用领域比较广泛,如何同时实现一个体外检验控制系统呢?早期同时实现很困难,现在仅采用opencv方可同时实现,快来试著一下吧。

自动草稿

什么是体外检验,为什么须要它?

随着时代的发展,人脸辨识控制系统的应用领域也正变得比过往任何时候都更为普遍。从智能机上的人脸辨识弹出、到人脸辨识签到、门禁控制系统等,人脸辨识控制系统正在各个领域得到应用领域。然而,人脸辨识控制系统很难被非真实世界的脸孔所蒙骗。比如将人的相片放在人脸辨识照相机,就能挡下人脸辨识控制系统,让其辨识为人脸辨识。

为的是使人脸辨识控制系统更安全,我们不仅要辨识出人脸辨识,还须要能检验其是否为真实世界面部,这就要加进体外检验了。

自动草稿

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

目前有许多体外检验方式,主要包括:

着色预测(Texture analysis),主要包括计算面部区域上的局部性十进制模式(LBP)并采用SVM将面部进行分类为真脸或假脸;振幅预测(Frequency analysis),比如检查和面部的傅立叶域;气门著眼预测(ariable focusing analysis),比如检查和两个连续帧之间的画素值的变化。如前所述分析方法的演算法(Heuristic-based algorithms),主要包括兴奋点体育运动、舌头体育运动和闭眼检验;teaumeillant演算法(Optical Flow algorithms),即检查和从3D对象和2D正方形聚合的teaumeillant的差异和特性;3D面部花纹,近似于Apple的iPhone面部电脑控制系统所采用的面部花纹,使面部电脑控制系统能界定布偶面部和他们的INS13ZD的相片影像;

面部电脑控制系统技师能组合上述方式挑选出和选择适合于其某一应用领域的体外检验数学模型。但本讲义将采用绘图中常用方式——传递函数数学数学模型(CNN)来构筑一个能界定真实世界面部和假面部的广度数学数学模型(称作LivenessNet网络),将体外检验视作相互依赖进行分类问题。

首先检查和一下数据集。

活动检验音频

自动草稿

图2:搜集真实世界与不实/蒙骗脸孔的实例

为的是让范例更为非常简单,责任编辑构筑的体外检验器将着重于界定真实世界脸孔与萤幕上的蒙骗脸孔。且该演算法能很难地扩展到其他类型的蒙骗脸孔,主要包括INS13ZD、高清晰度列印等。

体外检验数据集来源:

iPhone纵向/自拍;录制了一段约25秒在办公室里走来走去的音频;重播了相同的25秒音频,iPhone重录音频;获得两个实例音频,一个用于真实世界面部,另一个用于假/蒙骗面部。最后,将面部检验应用领域于两组音频,以提取两个类的单个面部区域。

项目结构

$ tree –dirsfirst –filelimit 10
.
├── dataset
│ ├── fake [150 entries]
│ └── real [161 entries]
├── face_detector
│ ├── deploy.prototxt
│ └── res10_300x300_ssd_iter_140000.caffemodel
├── pyimagesearch
│ ├── __init__.py
│ └── livenessnet.py
├── videos
│ ├── fake.mp4
│ └── real.mov
├── gather_examples.py
├── train_liveness.py
├── liveness_demo.py
├── le.pickle
├── liveness.model
└── plot.png

6 directories, 12 files

项目中主要有四个目录:

*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文件并插入以下代码:

import the necessary packages
import numpy as np
import argparse
import cv2
import os

construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument(“-i”, “–input”, type=str, required=True,
help=”path to input video”)
ap.add_argument(“-o”, “–output”, type=str, required=True,
help=”path to output directory of cropped faces”)
ap.add_argument(“-d”, “–detector”, type=str, required=True,
help=”path to OpenCVs deep learning face detector”)
ap.add_argument(“-c”, “–confidence”, type=float, default=0.5,
help=”minimum probability to filter weak detections”)
ap.add_argument(“-s”, “–skip”, type=int, default=16,
help=” of frames to skip before applying face detection”)
args = vars(ap.parse_args())

首先导入所需的包:

第8-19行解析命令行参数:

input:输入音频文件的路径;output:输出目录的路径;detector:人脸辨识检验器的路径;confidence:人脸辨识检验的最小概率。默认值为0.5;skip:检验时略过的帧数,默认值为16;

之后加载面部检验器并初始化音频流:

load our serialized face detector from disk
print(“[INFO] loading face detector…”)
protoPath = os.path.sep.join([args[“detector”], “deploy.prototxt”])
modelPath = os.path.sep.join([args[“detector”],
“res10_300x300_ssd_iter_140000.caffemodel”])
net = cv2.dnn.readNetFromCaffe(protoPath, modelPath)

open a pointer to the video file stream and initialize the total
number of frames read and saved thus far
vs = cv2.VideoCapture(args[“input”])
read = 0
saved = 0

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

创建一个循环来处理帧:

loop over frames from the video file stream
while True:
grab the frame from the file
(grabbed, frame) = vs.read()

if the frame was not grabbed, then we have reached the end
of the stream
if not grabbed:
break

increment the total number of frames read thus far
read = 1

check to see if we should process this frame
if read % args[“skip”] != 0:
continue

下面进行面部检验:

grab the frame dimensions and construct a blob from the frame
(h, w) = frame.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0,
(300, 300), (104.0, 177.0, 123.0))

pass the blob through the network and obtain the detections and
predictions
net.setInput(blob)
detections = net.forward()

ensure at least one face was found
if len(detections)

1.本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!