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上的摄像头拍摄下来,

后录的视频就是假人脸视频。


OpenCV活体检测


这样作者就有了真/假脸的两段视频,用作训练数据。


当然作者收集的数据用在实际工程中是远远不够的,想要进一步研究的朋友,应该录更大量的更多人的视频为佳,最好是来自不同种族的。

从训练视频中检测、提取人脸区域。

OpenCV活体检测


提取出的真假人脸图像:


OpenCV活体检测


实现LivenessNet


其网络架构如下:


OpenCV活体检测


因为收集到的数据量很小,所以作者使用的网络层数不多,作者使用Keras实现的。

训练LivenessNet


构建训练的脚本,开始训练,直到收敛。


OpenCV活体检测


OpenCV活体检测

作者训练的网络最终在验证集上达到99%的精度。


使用OpenCV实时测试

OpenCV活体检测


可见,大部分时候其检测结果是正确的,但也偶有失败的时候。


如何改进?


可以看到,作者设计的活体检测系统还是很简单的,并不能适应真实的商用环境。
想要效果更好,可以:
1.收集更多不同人的数据;
2.收集不同种族不同肤色的人的数据;
3.收集将图像打印出来拍摄的数据;
4.将不同的活体检测方法联合起来用。


最后来看看作者的视频:




代码数据下载


OpenCV活体检测


原文链接:

https://www.pyimagesearch.com/2019/03/11/liveness-detection-with-opencv/


加群交流


关注关注人脸识别、检测、对齐、活体检测技术,欢迎加入52CV群,扫码添加52CV君拉你入群,

请务必注明:人脸

(不会时时在线,如果没能及时通过验证还请见谅)


以上是关于OpenCV活体检测的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV活体检测

干货 | 史上最全 OpenCV 活体检测教程!

opencv怎么实现人脸识别活体检测?

使用dlib人脸检测模型进行人脸活体检测:眨眼检测

人脸识别中的活体检测是啥?

如何通过活体检测