人工智能小白日记 人脸检测识别之6 活体识别调研(opencv采集landmark安卓版移植全过程)

17 篇文章 0 订阅

前言

囧, 人脸识别过后,需要看看活体识别的例子。为此,做些调研工作。

正文

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

问题收集:

  1. 找不到<opencv2/face.hpp>
    查了一下opencv4.1.0api
    在这里插入图片描述
    貌似我的opencv中根本就找不到face模块
    最终google了一个下:
    在这里插入图片描述
    好吧,在其他模块中

下载下来,发现目标
在这里插入图片描述

  1. 在安卓中如何使用它呢,很显然需要编译
    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毫无卵用。

这就是个坑,大家不要效仿,记下来是因为太心酸了,同时如果最后一部没有外部依赖库,我几乎都要成功了有木有

############警报解除################################

  1. 下面了解下一个正确解法。

参考: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上折腾了好久无法换过来,泪奔,有谁知道告诉我下

  1. 意外发现,博主的版本中有完全的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:
在这里插入图片描述
也就是说加载方法与加载的模型没有匹配。

至此,所有坑已经踩过去了

小结

这个问题困扰了我整整一天,希望大家不要被坑到?。演示下最后的结果:(图片仅供个人学习使用,两位大帅哥莫怪)
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值