java 通过旷视接口实现人脸识别登陆




     一次偶然的机会接触到了开课吧的体验课,经过学习之后写一篇记录成长。

人脸识别实现的接口

  • 首先登陆 旷视Face++官网,点击技术–人脸检测–应用管理–创建API。
  • 由于金钱等因素的原因,我选择了体验版。创建完成后记得打开API文档,然后准备我们一步步实现项目。

对人脸识别登陆过程的理解

  先来介绍一下人脸识别的原理。通过连接旷视Face++人脸检测接口完成用户登陆,每次对人脸检测,一张人脸会返回一个face_token值,这个值对于相同的一张人脸每次也都是不一样的。对于旷视供的API中,search是每次登陆都需要使用的一个方法,它的原理是每次在FaceSet中寻找当前face_token值,在人脸集合中寻找,并返回请求值(下方有例子),在其中有一个名为 thresholds 的JSONObject它提供三个键值对(我个人这样理解了一下JSONObject), 他们的key值分别为(“1e-3”,“1e-4”,“1e-5”),然后我们获取其中1e-5的value,为什么要获取"1e-5"的值呢,这其实是一个精度,为了尽可能的减少出错的概率,所以选用这个值,同样的,在result数组中我们获得 confidence 的value(置信值),用这个置信值与1e-5进行比较,如果置信值比较大的话就可以确定在十万分之一出错的概率下,确保两个照片中的人脸是出自同一个人。(详情请参考Face++中search API,当然这些东西都在jar包中封装好了,你可以理解一下,直接引用。也可以理解一下,尝试自己重新封装这个jar包)。

{
    "request_id": "1470481443,0d749845-7153-4f5e-a996-ffc5a1ac0a79", 
    "time_used": 1126, 
    "thresholds": {
        "1e-3": 65.3, 
        "1e-5": 76.5, 
        "1e-4": 71.8
    }, 
    "results": [
        {
            "confidence": 96.46, 
            "user_id": "234723hgfd", 
            "face_token": "4dc8ba0650405fa7a4a5b0b5cb937f0b"
        }
    ]
}
  • 首先在搭建项目之前我们需要明白,通过人脸登陆需要有怎么样的一个过程。
  • 我们需要先进行用户注册,不然的话人脸集合中没有人脸信息。
  • 注册和登陆首先都是提供一张照片来检测照片中是否出现人脸。
  • 那么第一个条件出现了—— 检测人脸
  • 这个时候分为两种情况,即出现和不出现。
  • 对于不出现人脸的情况我们可以直接宣布,注册(登陆)失败。
  • 如果我们先不管登陆,对于检测出人脸的图片可以直接宣布注册成功吗?
  • 当然是不可以,我们还需要对图片进行分析,分析我们这个照片中的人脸个数。
  • 为什么要分析人脸个数呢?
  • 注册登陆这种事情,当然是不能两个人一起来啦!
  • 所以这个时候,第二个条件也出现了——检查人脸的个数
  • 如果人脸个数>1,那么就可以提醒操作失败了。
  • 如果人脸个数 == 1 ,继续下一步。 搜索此人的人脸是否在我们的人脸集合中。
  • 注册:查找为不在集合中,把人脸信息添加到集合中。在集合中就提示注册失败。
  • 登陆:查找为不在集合中,通知登陆失败。在集合中就提示登陆成功。
  • 由于服务器等异常,还需要增加条件提示服务器异常影响操作失败。

搭建项目步骤

  1. 打开Eclipse,创建一个 Dynamic web project ,命名FaceLoginByMyself。

  2. 创建项目完成后,在Src中创建一个包 com.zy.facelogin.Servlet,并在包中创建一个FaceControlServlet用来处理网页请求。

  3. 引用封装好的jar包,将其复制后,粘贴在如下位置。

在这里插入图片描述

  1. 这个时候你可能已经发现了api.properties文件,这个文件存储了我们很多方法里所要用到的几个必要参数,分别存储了API_KEY,API_SERECT,DISPLAY_NAME,OUTER_ID。前两个在Face++里可以找到,后面两个是自己定义的人脸集合。关于配置文件的读取在Util文件中,直接引用jar包的话必须把配置文件命名为上述形式,并且配置文件中对四个变量进行赋值。
  2. Util中的文件在faceMade_zy.jar中进行了封装,所以我们在引用了jar包之后就不需要重新写这些Util文件。
  3. 在写Servlet文件之前,我们要明白人脸识别登陆的整体流程。可以参考第二步中对人脸识别登陆的理解来写出登陆步骤。
  4. 下面给出Servlet中的代码,要注意@WebServlet("/faceController")这个注解,因为前段的代码里已经指明要调用这个Servlet,所以我们如果更改了括号内的内容,就没办法实现网页调用Servlet。
  5. 如果想要自己写Util,一定要注意相关API文档中介绍必要参数的调用,否则会出现一直注册失败,至于为什么我会知道!
  6. 相关文件的下载链接,原来另一个号注销了,又重新上传了一下。
  7. 有什么疑问的话,欢迎在评论区留言。
package com.zy.facelogin.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zy.facelogin.util.FaceUtil;
import com.zy.facelogin.util.ImageUtils;

/**
 * Servlet implementation class FaceControler
 */
@WebServlet("/faceController")
public class FaceController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		File file = ImageUtils.uploadImg(request, "imgData", "upimg");
		boolean res = false;
		boolean delFlag = true;
		try {
			// 检测
			String faceToken = FaceUtil.detect(file);

			if (faceToken != null) {
				// 包含开始search
				res = FaceUtil.search(faceToken);
				String type = request.getParameter("type");
				if ("register".equals(type)) {
					if (res) {// 已经注册过
						res = false;
					} else {// 开始注册,添加信息到faceSet中,保留照片
						res = FaceUtil.addFace(faceToken);
						delFlag = false;
					}
				}
				// 1 有 登陆成功
				// 2 无 登陆失败
			} else {
				// 不包含
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 删除照片
			if (delFlag)
				file.delete();
			// 数据返回到客户端,登陆是否成功
		//	if(res) response.sendRedirect(request.getContextPath()+"/index.jsp");
			PrintWriter out = response.getWriter();
			String msg = " {\"success\":" + res + "}";
			out.write(msg);
			out.close();
			
		//	response.sendRedirect(request.getContextPath()+"/index.jsp");
		}

	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值