通过百度人脸对比API进行人脸对比

百度人脸对比API的使用

今天突然有兴趣想做个人脸识别的小demo,项目代码地址:https://github.com/lxixi01/Face_Recognition

效果如下:

 

步骤:

第一步,需要建立一个百度账号,申请自己的AppID, API Key和Secret Key 

            地址为:http://ai.baidu.com/tech/face/compare

第二步:官网下载SDK,导入jar包到项目中,官网提供了下载地址 

   下面是对比两张图片的人脸的借口调用方法

返回结果为json字符串:

{"error_code":0,"error_msg":"SUCCESS","log_id":3017296944,"timestamp":1527427917,"cached":0,

"result":{"score":93.78884125,"face_list":[{"face_token":"a29943d3b09c7ea637070f5ec40228ea"},{"face_token":"6c588b50c9c14f12721e6f4d5383b102"}]}}

其中"score"为:两张人脸的相识度(0~100),建议为80以上,"face_token"为两张人脸图片的唯一标识,我们只需要解释json字符串获取score就行了

    调用接口的方法
    * 重要提示代码中所需工具类
    * FileUtil,Base64Util,HttpUtil,GsonUtils请从
    * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
    * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
    * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
    * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
    * 下载
    */
    public static String match() {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/match";
        try {


            byte[] bytes1 = FileUtil.readFileByBytes("【本地文件1地址】");
            byte[] bytes2 = FileUtil.readFileByBytes("【本地文件2地址】");
            String image1 = Base64Util.encode(bytes1);
            String image2 = Base64Util.encode(bytes2);


            List<Map<String, Object>> images = new ArrayList<>();


            Map<String, Object> 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<String, Object> 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);


            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = "【调用鉴权接口获取的token】";


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

下面是获取token的方法:

/**
	 * 获取权限token
	 * 
	 */
	public static String getAuth() {
		// 官网获取的 API Key 更新为你注册的
		String clientId = "WrI9oUhvrG0GHngIFioNKxki";
		// 官网获取的 Secret Key 更新为你注册的
		String clientSecret = "WfGDqAyom7t8wunqYUM4sAw0SBhjlBZj";
		return getAuth(clientId, clientSecret);
	}

	/**
	 * 获取API访问token 该token有一定的有效期,需要自行管理,当失效时需重新获取.
	 * 
	 * @param ak
	 *            - 百度云官网获取的 API Key
	 * @param sk
	 *            - 百度云官网获取的 Securet Key
	 * @return assess_token 示例:
	 *         "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
	 */
	public static String getAuth(String ak, String sk) {
		// 获取token地址
		String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
		String getAccessTokenUrl = authHost
		// 1. grant_type为固定参数
				+ "grant_type=client_credentials"
				// 2. 官网获取的 API Key
				+ "&client_id=" + ak
				// 3. 官网获取的 Secret Key
				+ "&client_secret=" + sk;
		try {
			URL realUrl = new URL(getAccessTokenUrl);
			// 打开和URL之间的连接
			HttpURLConnection connection = (HttpURLConnection) realUrl
					.openConnection();
			connection.setRequestMethod("GET");
			connection.connect();
			// 获取所有响应头字段
			Map<String, List<String>> 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;
			}
			/**
			 * 返回结果示例
			 */
			JSONObject jsonObject = new JSONObject(result);
			String access_token = jsonObject.getString("access_token");
			return access_token;
		} catch (Exception e) {
			System.err.printf("获取token失败!");
			e.printStackTrace(System.err);
		}
		return null;
	}

获得了两张人脸图片的相识度之后,亲们就可以根据自己的情况做逻辑处理了。

由于方法返回的是一串json字符串,下面是我的对json的解析获取score

String res = faceMatch(base64,user.toString());//这是我自己修改过的人脸对比方法,只是加了参数,返回结果的格式不变
			JsonObject jObject = new JsonParser().parse(res).getAsJsonObject();
			JsonElement jsonElement = jObject.get("result");
			float score = 0;
			if(!jsonElement.isJsonNull()){    //人脸对比出错的话,这里是空的
				score = jsonElement.getAsJsonObject().get("score").getAsFloat();
			}

以上是对自己的业余兴趣做个记录。
 

 

 

转载请注明出处

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值