java使用百度人脸识别API

随着人工智能和大数据分析技术越来越广泛,众多的生活场景都存在着这些技术的身影,比如像现在比较流行的人脸识别技术,其底层的算法实现的支撑,为众多的业务场景铺垫了基础,像支付宝的刷脸支付,我们在火车站安检经过闸机口时的刷脸识别等,都是上层应用对于这类技术的具体应用,那么其实现原理是怎样的呢?

大体来说,我把理解整理成如下步骤,
java使用百度人脸识别API_第1张图片

1、用户注册,即首次刷脸之前需通过应用层向人脸数据库提交个人原始照片;
2、人脸数据库经过计算分析保存人脸数据的元数据信息;
3、注册成功后,假如业务需要用户刷脸,应用只需要调用刷脸识别接口或者自己实现一套刷脸识别算法,对比当前用户扫脸的数据,如果是调用第三方的API,只需调用响应接口进行比对,通过,即可进行后续操作;

其实最有难度的还是底层的关于人脸识别的算法,那些技术算法我们暂时无从得知,但是大致的原理还是可以理解的,通过提取人的面部特征信息,作为元数据进行保存,下一次进行对比的人脸照片,同样的算法解析后直接和元信息进行对比,根据算法分析的相关度得分进行后面的业务操作;

下面来说说百度人脸识别的开源API实现,百度在AI领域也算起步比较早的,和科大讯飞类似很早就开始在人工智能方面进行研究,我们可以借鉴百度的人脸识别API结合到我们自己的业务中做相关的应用,前提是需要对其实现有一定的了解,

1、首先,你需要登录到 https://ai.baidu.com/ 百度AI主页去注册一个百度账号,如果你有了百度云账号,可以直接进入到控制台里面去,创建一个应用,创建成功后,会分配给你一个应用信息,包含
AppID ,API Key,Secret Key,这些是你调用人脸识别API的凭证,妥善保管,
java使用百度人脸识别API_第2张图片

2、打开API 文档,简单浏览一下里面的接口说明,方便我们了解每个接口的大致作用,要注意的是你的应用归属的版本,人脸识别的API接口文档有多个版本,我这里使用的是V3版本,每个版本的具体使用可能会有点差异,
java使用百度人脸识别API_第3张图片

3、接口基本使用,其实研究过后发现,调用百度的这套人脸识别API 接口,主要是3步,第一步创建应用获取系统分配的应用信息,第二步使用应用的appId和key获取access_token,拿到了token后,之后的接口调用都是基于这个token的,但是具体到每个接口的调用以及前后顺序上有一些差别,这个里面有两个小细节值得注意,

正如流程图所说,要使用人脸识别,需要在数据库进行用户数据的注册,很自然联想到,我们首先需要调用注册人脸的接口,

获取access_token部分代码,

public class GetAuthToken {
	
	// 设置APPID/AK/SK
	public static final String APP_ID = "16245390";
	public static final String API_KEY = "你的api_key";
	public static final String SECRET_KEY = "你的secret_key";

	// 刚刚获取到的token
	// 24.2e100fbaf8d9049e9df8cc01f0f15ebc.2592000.1560429706.282335-16245390
	public static final String access_token = "24.2e100fbaf8d9049e9df8cc01f0f15ebc.2592000.1560429706.282335-16245390";
	
	public static String getAuth() {

		String clientId = API_KEY;// 官网获取的 API Key 更新为你注册的
		String clientSecret = SECRET_KEY;// 官网获取的 Secret Key 更新为你注册的
		return getAuth(clientId, clientSecret);
	}

	public static String getAuth(String ak, String sk) {
		// 获取token地址
		String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
		String getAccessTokenUrl = authHost
				
				+ "grant_type=client_credentials"		// 1. grant_type为固定参数
				+ "&client_id=" + ak					// 2. 官网获取的 API Key
				+ "&client_secret=" + sk;				// 3. 官网获取的 Secret Key
		try {
			URL realUrl = new URL(getAccessTokenUrl);
			// 打开和URL之间的连接
			HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
			connection.setRequestMethod("GET");
			connection.connect();
			// 获取所有响应头字段
			Map> map = connection.getHeaderFields();
			// 遍历所有的响应头字段
			for (String key : map.keySet()) {
				System.err.println(key + "--->" + map.get(key));
			}
			// 定义 BufferedReader输入流来读取URL的响应
			BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
			String result = "";
			String line;
			while ((line = in.readLine()) != null) {
				result += line;
			}
			/**
			 * 返回结果示例
			 */
			System.err.println("result:" + result);

			JSONObject jsonObject = JSONObject.parseObject(result);
			String access_token = jsonObject.getString("access_token");
			return access_token;
		} catch (Exception e) {
			System.err.printf("获取token失败!");
			e.printStackTrace(System.err);
		}
		return null;
	}

}

运行上述程序,我们在控制台上可以打印并得到access_token的值,我这里拿到的token是:24.2e100fbaf8d9049e9df8cc01f0f15ebc.2592000.1560429706.282335-16245390,这个token的过期时间默认是30天,、

4、拿到了token之后,我们使用一下注册用户的信息,即往远程的库里面添加一个用户信息,在调用这个接口之前,建议大家阅读一下里面的几个参数,对于我们调用接口写代码时有帮助,比如画圈的参数,在接口调用时候就很不一样,大家可通过代码自行体会琢磨,
java使用百度人脸识别API_第4张图片

/**
 * 人脸注册
 * @author asus
 *
 */
public class FaceAdd {

	private static String accessToken = "24.2e100fbaf8d9049e9df8cc01f0f15ebc.2592000.1560429706.282335-16245390";

	public static String add() throws Exception {

		byte[] bytes1 = FileUtil.readFileByBytes("D:\\pic\\22.jpg");
		String image1 = Base64Util.encode(bytes1);

		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add";
		try {
			Map map = new HashMap();
			map.put("image", image1);
			map.put("group_id", "group_repeat");
			map.put("user_id", "user1");
			map.put("user_info", "abc");
			map.put("liveness_control", "NORMAL");
			//map.put("image_type", "FACE_TOKEN");   
			map.put("image_type", "BASE64");
			map.put("quality_control", "LOW");

			String param = GsonUtils.toJson(map);
			// 客户端可自行缓存,过期后重新获取。
			String result = HttpUtil.post(url, accessToken, "application/json", param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[] args) throws Exception {
		FaceAdd.add();
	}

}

运行上述代码,控制台输出信息,我在库中注册了一张本地的人脸照片,注册成功后,其中有一个很重要的字段,就是face_token,这个相当于是这张人脸照片的唯一标识,如果继续注册相同的照片会提示已经存在,这个face_token后续可以作为业务字段存放在我们本地的业务数据库中进行后续的使用, 其他的参数大家可结合API的使用文档进行详细参考java使用百度人脸识别API_第5张图片
这时候我们再去看控制台,已经展示出我们注册的用户信息,
java使用百度人脸识别API_第6张图片

5、下面我们来使用一个很有意思的接口,就是人脸对比,让程序来帮我们判断两张照片是不是同一个人呢?对应的业务场景和业务意义也很有使用价值,
java使用百度人脸识别API_第7张图片

public class FaceMatch {

	public static final String accessToken = "24.2e100fbaf8d9049e9df8cc01f0f15ebc.2592000.1560429706.282335-16245390";

	public static String match() {

		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v3/match";
		try {

			byte[] bytes1 = FileUtil.readFileByBytes("D:\\个人简历\\22.jpg");
			byte[] bytes2 = FileUtil.readFileByBytes("D:\\个人简历\\33.jpg");
			String image1 = Base64Util.encode(bytes1);
			String image2 = Base64Util.encode(bytes2);

			List> images = new ArrayList>();

			Map map1 = new HashMap();
			map1.put("image", image1);
			map1.put("image_type", "BASE64");
			map1.put("face_type", "LIVE");
			map1.put("quality_control", "LOW");
			map1.put("liveness_control", "NORMAL");

			Map map2 = new HashMap();
			map2.put("image", image2);
			map2.put("image_type", "BASE64");
			map2.put("face_type", "LIVE");
			map2.put("quality_control", "LOW");
			map2.put("liveness_control", "NORMAL");

			images.add(map1);
			images.add(map2);

			String param = GsonUtils.toJson(images);

			String result = HttpUtil.post(url, accessToken, "application/json", param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[] args) {
		FaceMatch.match();
	}

}

运行这段程序,控制台的打印结果如下,我们主要关注的是这个score,也就是匹配的分值,分值越高,越能够断定结果是否同一个人,真人是谁呢?
在这里插入图片描述
看来程序还是可信的啊
java使用百度人脸识别API_第8张图片

另外可以看到的是返回值里面还有face_token,因为这两张照片都是我之前注册过的照片,所以API接口直接返回来了,所以在接口文档中还有另一种方式就是传入face_token进行对比,代码如下,

public class FaceMatch {

	public static final String accessToken = "24.2e100fbaf8d9049e9df8cc01f0f15ebc.2592000.1560429706.282335-16245390";

	public static String match() {

		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v3/match";
		try {

			/*byte[] bytes1 = FileUtil.readFileByBytes("D:\\pic\\22.jpg");
			byte[] bytes2 = FileUtil.readFileByBytes("D:\\pic\\33.jpg");
			String image1 = Base64Util.encode(bytes1);
			String image2 = Base64Util.encode(bytes2);*/

			List> images = new ArrayList>();

			Map map1 = new HashMap();
			map1.put("image", "3d99844358b2f487c3ccdd912ba091d0");
			map1.put("image_type", "FACE_TOKEN");
			map1.put("face_type", "LIVE");
			map1.put("quality_control", "LOW");
			map1.put("liveness_control", "NORMAL");

			Map map2 = new HashMap();
			map2.put("image", "c0535fb9cce522e71b6bea906678d041");
			map2.put("image_type", "FACE_TOKEN");
			map2.put("face_type", "LIVE");
			map2.put("quality_control", "LOW");
			map2.put("liveness_control", "NORMAL");

			images.add(map1);
			images.add(map2);

			String param = GsonUtils.toJson(images);

			String result = HttpUtil.post(url, accessToken, "application/json", param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[] args) {
		FaceMatch.match();
	}

}

运行之后,同样可以得到相同的接口,上面的那种方式是直接对比,可以不提前注册,
在这里插入图片描述

API的基本使用就到此结束了,有兴趣的伙伴可以按照这个思路继续往下走,尝试一下其他接口的使用,官方还提供了SDK的方式进行使用,也可以一起学习下,最后感谢观看!

需要源码的伙伴可前往自行下载,附上下载地址:https://download.csdn.net/download/zhangcongyi420/11180946

你可能感兴趣的:(人脸识别,java)