人脸识别活体检测测试案例

举报
穆雄雄 发表于 2022/12/16 20:38:52 2022/12/16
【摘要】 最近好多人找我要关于人脸识别活体检测的案例,今天正好有空我就更新一下,先解释一下活体,顾名思义就是看看是否是活人在测检(大白话解说),用技术上的话也就是看看当前操作者是否是在用照片或者其他方法来操作,比如我们的人脸识别,人脸登陆(想要了解的可以点击这里),存在一个最大的问题就是,当张三来登陆的时候如果张三本人登陆成功没有问题,要是张三拿着李四的照片来进行登陆,这也能登陆成功的话就是个最大的b...

最近好多人找我要关于人脸识别活体检测的案例,今天正好有空我就更新一下,先解释一下活体,顾名思义就是看看是否是活人在测检(大白话解说),用技术上的话也就是看看当前操作者是否是在用照片或者其他方法来操作,比如我们的人脸识别,人脸登陆(想要了解的可以点击这里),存在一个最大的问题就是,当张三来登陆的时候如果张三本人登陆成功没有问题,要是张三拿着李四的照片来进行登陆,这也能登陆成功的话就是个最大的bug了,为此,我们来解决一下这个问题。
项目运行的截图大家先看看吧:
1.两张真人(同一个人)图片上传:
第一张:
这里写图片描述

第二张:
这里写图片描述

然后结果运行结果:
这里写图片描述

2.两张真人(不是同一个人)图片上传:
第一张:
这里写图片描述
第二张:
这里写图片描述

可以看出来,很明显不是同一个人,一个男的一个女的,运行结果:
这里写图片描述

3.第一张假的,第二张真的(同一个人)图片上传:
第一张:
这里写图片描述
这张照片是我手机第二次进行拍照所得的,

第二张:
这里写图片描述

运行结果为:
这里写图片描述

4.第一张真的,第二张假的(同一个人)图片上传:
第一张:
这里写图片描述
第二张:
这里写图片描述

运行结果为:
这里写图片描述
5.第一张假的,第二张真的(不同人)图片上传:
第一张:
这里写图片描述
第二张:
这里写图片描述

运行结果为:
这里写图片描述

6.第一张真的,第二张假的(不同人)图片上传:
第一张:
这里写图片描述

第二张:
这里写图片描述

运行结果为:
这里写图片描述

相信大家都理解了,那么我们来做一下吧!!

我们现在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<String, String> options = new HashMap<String, String>();
	    //返回的活体信息,“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<String> images = new ArrayList<String>();
	    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("第一张是假的");
		}
	}

到此为止就可以了,本代码的原理我先说下:
先上传两张一次拍照的照片,然后实现比对功能,上传照片完成之后会进行对每张照片活体检测,检测完成第一张照片之后继续检测第二张,如果照片不是活体(这里指的是照片进行二次翻拍),那么久不进行下面的比对,否则进行比对,当然比对的时候在判断是否比对成功。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。