点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

我们先来看一个网络留言

 来自虾米妈咪

小朋友用妈妈的一寸照片通过了人脸识别,打击了小度音箱的家长监督机制。

活体检测没做好。

公交车身广告上的董明珠头像,被宁波交警系统拍了照,判定成“违法闯红灯”。

活体检测没做好。

所以,活体检测要怎么做?

名叫Adrian Rosebrock的程序猿,写了份事无巨细的教程,从构建数据集开始,一步步教大家用AI分辨真人和照片,精细到每行代码的用途。

 川川是假的,光头是真的

这个识别方法,用到了OpenCVKeras,打开摄像头就可以实时检测

重要的是,有源码提供,受到了推特用户的踊跃比心。

活体检测,可以检测些什么?

AI可以用哪些技巧,来区分真人和照片?

一是纹理分析 (Texture Analysis) 。皮肤的纹理特征是重要的依据,给2D照片拍照,比起给3D真人拍照,会损失一些纹理。

二是频率分析 (Frequency Analysis) 。照片脸部的频率组成,也不像真人那样丰富。

三是可变聚焦分析 (Variable focusing Analysis) 。连拍两张照片,聚焦在不同位置,查看像素值 (Pixel Value) 的变化。

四是启发式算法 (Heuristic-Based Algorithms) 。眼动、唇动、眨眼这些动作,照片是不会有的。

五是光流算法 (Optical Flow Algorithms) 。在相邻两帧之间,检测物体运动的方向和幅度,查出2D和3D物体之间的差别。

……

不过这里,就把活体检测看成一个粗暴的二分类问题,这些复杂的分析先抛到一边。

自制数据集

程序猿把问题又简化了一下:这里说的“假脸”,只是“屏幕里的人脸”而已。

现在,可以开始造数据集了。

他用手机的前摄像头拍了一段25秒的视频;又举着手机、对着电脑摄像头,把视频播了一遍。

这样,一段真人视频,和一段“假脸”视频,就准备好了。

程序猿拍下的这两条视频,都提供下载。不过,他还是建议大家多收集一些数据,不同的人脸,甚至不同的人种,帮助算法茁壮成长。

下一步,要用OpenCV的人脸检测算法处理两段视频,把有用的区域 (ROI) ,就是人脸部分框出来。

这步用了80多行代码,每一行在做些什么,教程里都写清了。

最后,按照真假两个类别,把框好的脸部提取出来,就有了数据集。

温馨提示,需要平衡一下真图和假图的数量。比如,程序猿发现真实视频比假视频长,就用更大的间隔来提取。于是,他收获了真图161张,假图150张。

这数据集还是显得有些贫乏,所以后面需要扩增:旋转、翻转之类的操作,可以增加图片数量。

活体检测模型

数据集做好了,就要喂给做活体检测的神经网络。

程序猿给网络起名LivenessNet,大体长这样:

他说,这其实只是一个简单的CNN。而且,已经努力让网络保持在最浅参数最少的状态。

这样做有两个原因:一是为避免模型在小数据集上发生过拟合,二是为保证模型快到可以实时推理,就算在树莓派上也能运行。

搭个网络

现在,就来实现一下这个网络。打开livenessnet.py,再写这一段代码:

1# import the necessary packages2from keras.models import Sequential3from keras.layers.normalization import BatchNormalization4from keras.layers.convolutional import Conv2D5from keras.layers.convolutional import MaxPooling2D6from keras.layers.core import Activation7from keras.layers.core import Flatten8from keras.layers.core import Dropout9from keras.layers.core import Dense
10from keras import backend as K
11
12class LivenessNet:
13    @staticmethod
14    def build(width, height, depth, classes):
15        # initialize the model along with the input shape to be
16        # "channels last" and the channels dimension itself
17        model = Sequential()
18        inputShape = (height, width, depth)
19        chanDim = -1
20
21        # if we are using "channels first", update the input shape
22        # and channels dimension
23        if K.image_data_format() == "channels_first":
24            inputShape = (depth, height, width)
25            chanDim = 1

然后,一层一层加上去:

1        # first CONV => RELU => CONV => RELU => POOL layer set2        model.add(Conv2D(16, (3, 3), padding="same",3            input_shape=inputShape))4        model.add(Activation("relu"))5        model.add(BatchNormalization(axis=chanDim))6        model.add(Conv2D(16, (3, 3), padding="same"))7        model.add(Activation("relu"))8        model.add(BatchNormalization(axis=chanDim))9        model.add(MaxPooling2D(pool_size=(2, 2)))
10        model.add(Dropout(0.25))
11
12        # second CONV => RELU => CONV => RELU => POOL layer set
13        model.add(Conv2D(32, (3, 3), padding="same"))
14        model.add(Activation("relu"))
15        model.add(BatchNormalization(axis=chanDim))
16        model.add(Conv2D(32, (3, 3), padding="same"))
17        model.add(Activation("relu"))
18        model.add(BatchNormalization(axis=chanDim))
19        model.add(MaxPooling2D(pool_size=(2, 2)))
20        model.add(Dropout(0.25))

程序猿说,这个网络有点像VGGNet,很浅,过滤器 (Filter) 很少。只是判断真假,不用深度网络。

最后,再加一个FC层→RELU层的组合。

1        # first (and only) set of FC => RELU layers2        model.add(Flatten())3        model.add(Dense(64))4        model.add(Activation("relu"))5        model.add(BatchNormalization())6        model.add(Dropout(0.5))78        # softmax classifier9        model.add(Dense(classes))
10        model.add(Activation("softmax"))
11
12        # return the constructed network architecture
13        return model

CNN搭好了,该训练了。

训练脚本长这样

大致的训练过程,就像这张图:

打开train_liveness.py,写下这段代码:

1# set the matplotlib backend so figures can be saved in the background2import matplotlib3matplotlib.use("Agg")45# import the necessary packages6from pyimagesearch.livenessnet import LivenessNet7from sklearn.preprocessing import LabelEncoder8from sklearn.model_selection import train_test_split9from sklearn.metrics import classification_report
10from keras.preprocessing.image import ImageDataGenerator
11from keras.optimizers import Adam
12from keras.utils import np_utils
13from imutils import paths
14import matplotlib.pyplot as plt
15import numpy as np
16import argparse
17import pickle
18import cv2
19import os
20
21# construct the argument parser and parse the arguments
22ap = argparse.ArgumentParser()
23ap.add_argument("-d", "--dataset", required=True,
24    help="path to input dataset")
25ap.add_argument("-m", "--model", type=str, required=True,
26    help="path to trained model")
27ap.add_argument("-l", "--le", type=str, required=True,
28    help="path to label encoder")
29ap.add_argument("-p", "--plot", type=str, default="plot.png",
30    help="path to output loss/accuracy plot")
31args = vars(ap.parse_args())

 导入,不停地导入

里面包含了许多的导入

有matplotlib,是可视化工具;

有LivenessNet,就是刚才搭好的CNN;

有train_test_split,这是scikit-learn里的函数,把数据集拆成训练集和测试集;

有classification_report,也是scikit-learn里面的工具,用来生成简短统计报告的;

有ImageDataGenerator,做数据扩增用的;

有Adam,适合这个任务的优化器,当然也可以用SGD、RMSprop等等代替;

有paths,这个模块是用来收集图片路径的;

有pyplot,也是美丽的可视化工具;

有numpy,是Python数学库,也是OpenCV必需品;

有argparse,用来处理命令行参数;

有pickle,可以把标签编码器序列化到盘上;

有cv2,这是一组OpenCV Binding;

还有os,这个模块用处很多,但这里只用到了它的操作系统路径分隔符而已。

梳理好这些,再看余下的代码,就会清晰很多了。

后面,是一系列的初始化,以及训练前的各种准备活动。此处略去,详见教程原文。

训练正式启动

准备就绪,运行这段命令,就可以训练了:

1$ python train.py --dataset dataset --model liveness.model --le le.pickle2[INFO] loading images...3[INFO] compiling model...4[INFO] training network for 50 epochs...5Epoch 1/50629/29 [==============================] - 2s 58ms/step - loss: 1.0113 - acc: 0.5862 - val_loss: 0.4749 - val_acc: 0.74367Epoch 2/50829/29 [==============================] - 1s 21ms/step - loss: 0.9418 - acc: 0.6127 - val_loss: 0.4436 - val_acc: 0.79499Epoch 3/50
1029/29 [==============================] - 1s 21ms/step - loss: 0.8926 - acc: 0.6472 - val_loss: 0.3837 - val_acc: 0.8077
11...
12Epoch 48/50
1329/29 [==============================] - 1s 21ms/step - loss: 0.2796 - acc: 0.9094 - val_loss: 0.0299 - val_acc: 1.0000
14Epoch 49/50
1529/29 [==============================] - 1s 21ms/step - loss: 0.3733 - acc: 0.8792 - val_loss: 0.0346 - val_acc: 0.9872
16Epoch 50/50
1729/29 [==============================] - 1s 21ms/step - loss: 0.2660 - acc: 0.9008 - val_loss: 0.0322 - val_acc: 0.9872
18[INFO] evaluating network...
19              precision    recall  f1-score   support
20
21        fake       0.97      1.00      0.99        35
22        real       1.00      0.98      0.99        43
23
24   micro avg       0.99      0.99      0.99        78
25   macro avg       0.99      0.99      0.99        78
26weighted avg       0.99      0.99      0.99        78
27
28[INFO] serializing network to 'liveness.model'...

成果斐然

训练完结,LivenessNet在验证集上拿到了99%的准确度。

当然,验证集只是热身,后面还要打开摄像头,让AI去看更多没见过的人,和没见过的“假人”。

(这一部分代码,也有详尽的解读,参见教程原文。)

就像开头展示的那样,AI能清楚地判断,它眼前的川川不是真人,而程序猿是真人。

那么,你也可以训练一只这样的AI了。

不过,不用局限于简单的二分类,可以用上前面讲到的那些复杂的分析方法,比如频率分析,比如光流法,大有可为。

教程原文传送门:
https://www.pyimagesearch.com/2019/03/11/liveness-detection-with-opencv/

源码下载入口,和无微不至的代码解析,都在里面了。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

仅使用OpenCV实现活体检测!(附源码)相关推荐

  1. ART-PI 嵌入式人形检测 附源码(RT-AK Demo)

    Person detection 文章目录 1 模型 1.1 参考项目 1.2 模型文件 1.3 自己训练模型 2 RT-AK 使用 3 应用代码 4. 参考链接 让 AI 在你的板子上尽情舞蹈~ 本 ...

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

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

  3. 安卓活体检测的源码支持(摇头点头微笑眨眼检测)

    1.安卓手机通过软件打开前置摄像头设置人脸识别样本(45) 2.通过软件进行人脸识别是否是同一个人(87) 3.识别动作,如眨眼.微笑.抬头.低头等(暂时可以放入二期开发)(76) 4.尽量使用开源的 ...

  4. 基于Pytorch的从零开始的目标检测 | 附源码

    01. 引言 目标检测是计算机视觉中一个非常流行的任务,在这个任务中,给定一个图像,你预测图像中物体的包围盒(通常是矩形的) ,并且识别物体的类型.在这个图像中可能有多个对象,而且现在有各种先进的技术 ...

  5. 基于matlab使用主动声纳系统进行水下目标检测(附源码)

    一.前言 此示例演示如何模拟具有两个目标的主动单基地声纳方案.声纳系统由各向同性投影仪阵列和单个水听器元件组成.投影仪阵列呈球形.反向散射信号由水听器接收.接收到的信号包括直接和多路径贡献. 二.水下 ...

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

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

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

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

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

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

  9. 活体检测python_活体检测很复杂?仅使用opencv就能实现!(附源码)!

    摘要: 活体检测在各行各业应用比较广泛,如何实现一个活体检测系统呢?早期实现很困难,现在仅使用opencv即可实现,快来尝试一下吧. 什么是活体检测,为什么需要它? 随着时代的发展,人脸识别系统的应用 ...

最新文章

  1. Nginx http keepalive提升链接效率
  2. 让问答更自然 - 基于拷贝和检索机制的自然答案生成系统研究 | 论文访谈间 #02...
  3. 不连续曲线 highcharts_无人车运动规划中常用的方法:多项式曲线
  4. Caffe + Ubuntu 15.04/16.04 + CUDA 7.5/8.0 在服务器上安装配置及卸载重新安装(已测试可执行)
  5. CSS3动画常用贝塞尔曲线-效果演示
  6. ICPR 2022 第一届卫星视频运动目标检测与跟踪挑战赛正式开赛
  7. 安卓python安装库_如何快速在安卓上搭建python3环境
  8. Docker学习总结(31)——使用Maven插件构建docker镜像
  9. 【已经解决】TypeError: read_img() missing 1 required positional argument: ‘filename‘
  10. Qt 定制字体选择 QFontComBobox
  11. Next主题美化博客
  12. 思科关闭日志_Cisco命令日志
  13. 广州市黄埔区水利工程管理划定带动水利人才上升
  14. openmodelica安装
  15. 汇编语言之DOSBox
  16. iOS 上传App Store 报 ITMS-90096错误处理方法
  17. 登录微软账户后远程桌面连接提示用户名错误
  18. python怎么算积分_蒙特卡洛方法求定积分及python实现(转)
  19. python writeline_Python文件写入函数 write()和writelines()
  20. [BUGKU] [MISC]普通的二维码

热门文章

  1. Uber提出损失变化分配方法LCA,揭秘神经网络“黑盒”
  2. 史上最大规模ACL大会放榜,百度10篇NLP论文被录用!
  3. 谈谈Python那些不为人知的冷知识(二)
  4. 马化腾:腾讯要帮助中国加快数字化,主要靠小程序(附演讲)
  5. 开源用于寻找系外行星的代码
  6. AI一分钟 | 北京发放自动驾驶首批牌照,百度获准测试;亿航美国分公司申请破产,债务高达数百万美元
  7. AI一分钟 | 妈呀!连地铁都开始无人驾驶了,飞机还远吗;北京无人驾驶新规出台,终于知道李彦宏该不该被罚了(12月19日)
  8. Spring Aop 常见注解和执行顺序
  9. 一款高颜值的MySQL管理工具:Sequel Pro
  10. 新手入门:Kaggle NLP比赛总结