文章目录
前言
囧, 人脸识别过后,需要看看活体识别的例子。为此,做些调研工作。
正文
1 概念
“活体检测是在一些身份验证场景确定对象真实生理特征的方法,在人脸识别应用中,活体检测能通过眨眼、张嘴、摇头、点头等组合动作,使用人脸关键点定位和人脸追踪等技术,验证用户是否为真实活体本人操作。可有效抵御照片、换脸、面具、遮挡以及屏幕翻拍等常见的攻击手段,从而帮助用户甄别欺诈行为,保障用户的利益” ——摘自百度百科
简单来说,就是识别一张人脸是不是真人。惯用的手法是让别人做动作,眨眼啊、点头啊。可惜老板说,这些我们用不了,也不能用红外感应。论如何在只有一个摄像头的情况下做到活体识别呢?
2 一些实现
2-1 腾讯优图的光线活体
发现了这么一篇文章,好像很厉害的样子
http://security.asmag.com.cn/news/201801/93005.html
“首先向它打一束光,必须要有一个主动能够发射光线的光源,然后发射出去,发出去之后,然后光会在这个物体的表面发生反射,然后反射的光线,然后我们再拿一个传感器,可以说就是摄像头,对这个光反射回来的光线进行处理。然后再让这个光线去变化,光线的颜色和强弱发生变化,这个时候我们就有拥有了一个视频,视频中它的信息是包含了人脸反射的那些变化信息。然后这个信息其实它是可以解码出来的,重建出来那个三维的形状。分析并推导活体判断所需的人脸3D和质感信息。”
2-2 论文综述
https://blog.csdn.net/liuxiao214/article/details/85485155
http://www.doc88.com/p-7748431159134.html
2-3 据说opencv可以实现
https://www.jianshu.com/p/370922016354
3 利用opencv试试
首先也是得有个参考
https://blog.csdn.net/u013841196/article/details/85041007
这个证实了opencv是有独立获取特征点能力的
3-1 opencv安卓环境搭建
看看我已经趟过的坑。
https://mp.csdn.net/mdeditor/96471275#
3-2 调用opencv获取人脸68个landmarks
这时候要编写c,先用纯c写段代码,然后给它写个接口就行了,这时候肯能需要一本开发手册
https://www.jianshu.com/p/b71aeb4ed13d
问题收集:
- 找不到<opencv2/face.hpp>
查了一下opencv4.1.0api
貌似我的opencv中根本就找不到face模块
最终google了一个下:
好吧,在其他模块中
下载下来,发现目标
- 在安卓中如何使用它呢,很显然需要编译
https://blog.csdn.net/u012905422/article/details/74926256
######警报:以下过程纯属挖坑,可以跳过#####################
当然能不能更简单一点呢,我在想这东西源码都给我了,我直接拷贝到项目中当成自己的代码,然后不就得了。
1)将头文件拷贝进来
2)在cmakelist中引入
3)修改代码头文件从自己的头文件中引入
万一so中已经有了具体实现,那么加个头文件应该就行了,make一下
报错了
如果这个报错说明,头文件引入成功了,后面就是具体代码了
4)CascadeClassifier 找不到
这个得查api了 https://docs.opencv.org/4.1.0/index.html
这个跟之前的Mat问题一样,缺少命名空间,找不到,直接加上cv::
或者同一加上命名空间
注意:这里的namespace face是在face.hpp中定义的,所以要加上头文件
运行
5)然后是这里
提示我应该加入头文件,然后需要把各种头文件里面的引用也给改一下
6)发现这个问题
这样就没办法了,看了一下它是定义在cpp文件中的,头文件中并没有,也就是so文件并不存在我们需要的东东。所以需要导入cpp源文件。
7)拷贝cpp文件过来,给他放到src/face文件夹下
最终会碰到一个无法解决的问题:这些cpp里面引用了opencv的库,我各种改import毫无卵用。
这就是个坑,大家不要效仿,记下来是因为太心酸了,同时如果最后一部没有外部依赖库,我几乎都要成功了有木有
############警报解除################################
- 下面了解下一个正确解法。
参考:https://blog.csdn.net/qq_34902522/article/details/81533145
这位大神已经将opencv和opencv_contrib版本编译完成,可以效仿他的过程进行编译,当然最后博主提供了编译好的版本,去他的github上下下来就行了。他的版本是3.4.2
问题收集:
1)接下来我本来想开发c版本的程序,结果遇到一个问题:
Opencv error: undefined reference to 'cv::CascadeClassifier::detectMultiScale
参考一些资料,说是我的android sdk tool和博主编译时的版本不一致,我看了下博主写的25.2.5,我的是26.0.0。我在as3.4上折腾了好久无法换过来,泪奔,有谁知道告诉我下
- 意外发现,博主的版本中有完全的android sdk支持,也就是说可以通过依赖他的module进行java开发。所以import module,这个网上很多参考。
3)调整完一些module间的依赖啊,版本不一致,添加so文件路径等问题后,就可以进行开发了。这里我也折腾了好久,没有案例怎么开发,省略中间步骤,直接告诉你们参考在这里
https://github.com/opencv/opencv_contrib/blob/master/modules/face/samples/Facemark.java
这里面有两个问题注意下:
这个library改成我们自己用的名称,否则他的xxx342.so。你会碰到一个问题,各种找不到so,趟过坑的表示各种心塞
还有
加载模型的时候,如果用他这里的加载“lbfmodel.yaml”,运行时会闪退。bug如下:
OpenCv Java) FaceMark: Exception: bad allocation during using FaceMark for loadModel
网上有些人说是模型太大,内存不够,我特意看了下内存,并没有突然变大,在一个角落里发现最终答案,应该改成createFacemarkLBF:
也就是说加载方法与加载的模型没有匹配。
至此,所有坑已经踩过去了
小结
这个问题困扰了我整整一天,希望大家不要被坑到?。演示下最后的结果:(图片仅供个人学习使用,两位大帅哥莫怪)