最近好多人找我要关于人脸识别活体检测的案例,今天正好有空我就更新一下,先解释一下活体,顾名思义就是看看是否是活人在测检(大白话解说),用技术上的话也就是看看当前操作者是否是在用照片或者其他方法来操作,比如我们的人脸识别,人脸登陆(想要了解的可以点击这里),存在一个最大的问题就是,当张三来登陆的时候如果张三本人登陆成功没有问题,要是张三拿着李四的照片来进行登陆,这也能登陆成功的话就是个最大的bug了,为此,我们来解决一下这个问题。
项目运行的截图大家先看看吧:
1.两张真人(同一个人)图片上传:
第一张:
可以看出来,很明显不是同一个人,一个男的一个女的,运行结果:
3.第一张假的,第二张真的(同一个人)图片上传:
第一张:
这张照片是我手机第二次进行拍照所得的,
4.第一张真的,第二张假的(同一个人)图片上传:
第一张:
第二张:
运行结果为:
5.第一张假的,第二张真的(不同人)图片上传:
第一张:
第二张:
相信大家都理解了,那么我们来做一下吧!!
我们现在myeclipse里面创建个项目,普通的项目就OK啦。
喏,如图所示,项目名称我们就随便起个,就叫它:face_Live_test
然后点击finish,就完成了项目创建的第一步了。
我们在项目下面新建个目录,名字是lib,用来放我们的jar包吧,如图所示
:
jar包地址:点击下载
没有积分的可以联系我进行下载。
现在把jar导入到我们项目下面的lib目录中,接着新建个class,类名随便起,我这边的类名起的是TestMain.java。
创建好类之后就可以编码啦~
我们先要去百度云中创建个人脸识别的应用,我已经创建好了:
//百度云接口信息
public static final String APP_ID = "********";
public static final String API_KEY = "******";
public static final String SECRET_KEY = "*********";
public static AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
把代码中的*换成你自己的信息即可,这里不再多做解释。
然后我们重新创建个方法:
此方法代码如下:
/**
*
* @Description: 该方法的主要作用:人脸比对
* @Title: match
* @param @param client 设定文件
* @return 返回类型:void
* @throws
* 个人博客:https://blog.csdn.net/qq_34137397
*/
public static void match(AipFace client){
// 传入可选参数调用接口
HashMap options = new HashMap();
//返回的活体信息,“faceliveness,faceliveness” 表示对比对的两张图片都做活体检测;
//“,faceliveness” 表示对第一张图片不做活体检测、第二张图做活体检测;
//“faceliveness,” 表示对第一张图片做活体检测、第二张图不做活体检测;
options.put("image_liveness", "faceliveness,faceliveness");
//参数为本地图片路径列表
String path1 = "I:\\test\\picture\\1111.png";
String path2 = "I:\\test\\picture\\psb.jpg";
ArrayList images = new ArrayList();
images.add(path1);
images.add(path2);
org.json.JSONObject res = client.match(images, options);
//解析json
JSONObject jsonObject = JSONObject.fromObject(res.toString(2));
String ext_info = jsonObject.getString("ext_info"); // 找到ext_info节点
JSONObject josnObject_ext_info = JSONObject.fromObject(ext_info);
String faceliveness = josnObject_ext_info.getString("faceliveness").toString();
//根据,截取两个活体值,分别进行判断,逗号前面的代表第一章图片,后面的代表第二章图片
int index_douhao = faceliveness.indexOf(",");
Double first = Double.parseDouble(faceliveness.substring(0,index_douhao));
Double secord = Double.parseDouble(faceliveness.substring(index_douhao+1));
// 活体分数,如0.49999。单帧活体检测参考阈值0.393241,大于该值就是活体,否则就是翻拍的
if(first>0.393241){
System.out.println("第一张是真人");
if(secord>0.393241){
System.out.println("第二张时真人");
//继续判断是否是同一个人
JSONArray jsonArray = jsonObject.getJSONArray("result"); //找到result节点
String json_result = jsonArray.get(0).toString();
JSONObject jsonObject_result = JSONObject.fromObject(json_result);
Double score = Double.parseDouble(jsonObject_result.get("score").toString());
//分数大于80算同一个人
System.out.println("一般分数大于80证明是同一个人,否则不是同一个人,当前比对分数为:"+score);
if(score>80){
System.out.println("比对结果:是同一个人");
}else{
System.out.println("比对结果:不是同一个人");
}
}else{
System.out.println("第二张是假的");
}
}else{
System.out.println("第一张是假的");
}
}
到此为止就可以了,本代码的原理我先说下:
先上传两张一次拍照的照片,然后实现比对功能,上传照片完成之后会进行对每张照片活体检测,检测完成第一张照片之后继续检测第二张,如果照片不是活体(这里指的是照片进行二次翻拍),那么久不进行下面的比对,否则进行比对,当然比对的时候在判断是否比对成功。