OpenCV活体检测
Posted OpenCV中文网
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV活体检测相关的知识,希望对你有一定的参考价值。
最近PyImageSearch博主Adrian Rosebrock用OpenCV构建了一个简易的活体检测,代码和数据已经公开(文末附下载),我们一起来看看吧。
活体检测是什么?
在很多需要验证身份的场合,比如打卡考勤,支付宝、滴滴的身份核验等,用到了人脸识别,但很多不法人员希望绕过这种人脸验证。
他们常用的手段包括:
1.打印照片;
2.播放视频;
3.单图像的人脸驱动动画;
4.定制人皮面具;
等。
在52CV的人脸识别群里就常有这样的人询问购买这种技术,行话叫“过人脸”。(因为基本都是黑产的人询问,所以CV君每次看到一定送飞机票)
这种对人脸识别系统的攻击,甚至已经催生了一个产业。当大部分人脸识别技术公司在宣扬99%的验证精度的时候,殊不知拿一张照片就能让它秒变废。
活体检测,就是系统判定过来的人脸是不是真实的人在摄像头前,如果不是,比对相似度再高,也要拒绝它。
目前,活体检测几乎成为所有商用人脸识别系统必须考虑的问题,成为这个技术领域的纯刚需。
如何进行活体检测?
既然是要区分人脸是不是活体,一直很直观的想法就是二分类了。有很多方法被提出来。
1)纹理分析,比如使用人脸区域的LBP特征,然后SVM二分类;
2)频域分析,将人脸图像转到傅立叶域进行检查;
3)相机变焦分析,检查两个连续帧之间像素值的变化;
4)启发式算法,比如检测眼球运动、嘴唇运动、眨眼检测等,确保用户不是拿着一张照片;
5)光流算法,检测从3D对象到2D平面生成的光流差异;
6)3D人脸形状,类似iPhone的人脸识别系统,用于区分真实人脸和照片等平面目标。
7)将上述方法组合起来。
更多关于活体检测的算法总结可以参考论文:
An Overview of Face liveness Detection
https://arxiv.org/pdf/1405.2227.pdf
动手做个CNN活体检测
Adrian Rosebrock的做法是把活体检测看作二分类问题,使用卷积神经网络分类真实人脸还是假脸。
Adrian分成四步,完成该系统构建:
1.创建数据集;
2.实现一个CNN架构的活体检测器,作者称之为LivenessNet;
3.训练LivenessNet;
4.使用Python-OpenCV+训练后的活体检测器在实时视频中进行活体检测。
创建数据集
作者首先自拍了自己的一段视频,然后在手机上播放,播放的同时用PC上的摄像头拍摄下来,
后录的视频就是假人脸视频。
这样作者就有了真/假脸的两段视频,用作训练数据。
当然作者收集的数据用在实际工程中是远远不够的,想要进一步研究的朋友,应该录更大量的更多人的视频为佳,最好是来自不同种族的。
从训练视频中检测、提取人脸区域。
提取出的真假人脸图像:
实现LivenessNet
其网络架构如下:
因为收集到的数据量很小,所以作者使用的网络层数不多,作者使用Keras实现的。
训练LivenessNet
构建训练的脚本,开始训练,直到收敛。
作者训练的网络最终在验证集上达到99%的精度。
使用OpenCV实时测试
可见,大部分时候其检测结果是正确的,但也偶有失败的时候。
如何改进?
可以看到,作者设计的活体检测系统还是很简单的,并不能适应真实的商用环境。
想要效果更好,可以:
1.收集更多不同人的数据;
2.收集不同种族不同肤色的人的数据;
3.收集将图像打印出来拍摄的数据;
4.将不同的活体检测方法联合起来用。
最后来看看作者的视频:
代码数据下载
原文链接:
https://www.pyimagesearch.com/2019/03/11/liveness-detection-with-opencv/
加群交流
关注关注人脸识别、检测、对齐、活体检测技术,欢迎加入52CV群,扫码添加52CV君拉你入群,
(请务必注明:人脸)
(不会时时在线,如果没能及时通过验证还请见谅)
以上是关于OpenCV活体检测的主要内容,如果未能解决你的问题,请参考以下文章