序言本学期的android实验,打算做一款关于小应用,其中打算使用人脸识别技术,所以找到了百度AI,免费的开放API,为我的实验带来了极大的便利。创建百度AI应用要使用百度AI的接口,首先我们要注册一个账号,然后创建应用:然后表单填写,勾选你想使用的接口。我这里就默认了。最后创建好后,你会得到这样的一组信息:这在后面我们调用接口的时候回用到。好了,接下来,我们就开始API的使用。人脸识别首先,我们要清楚大概的过程,要进行人脸的识别,首先要先获取人脸的信息,也就是人脸检测。我们先检测出人脸的相关信息,然后才能进行比对,就是人脸对比。所以我们需要使用两个接口人脸检测和人脸对比。(相关的说明文档,我在本文最后会给出链接。)获取token在调用百度的API之前,首先需要获取到token。这里不得不给百度点个赞,示例代码有各种语言,共不同需求的开发者使用这里我是用的是java。 /** * 获取权限token * @return 返回token / @Override public String getAuth() { // 官网获取的 API Key String clientId = “API key”; // 官网获取的 Secret Key String clientSecret = “Secret Key”; return getAuth(clientId, clientSecret); } /* * 获取API访问token * 该token有一定的有效期,需要自行管理,当失效时需重新获取. * @param apiKey - 百度云官网获取的 API Key * @param secretKey - 百度云官网获取的 Secret Key * @return assess_token / @Override public String getAuth(String apiKey, String secretKey) { // 获取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=” + apiKey // 3. 官网获取的 Secret Key + “&client_secret=” + secretKey; // 请求API,获取token JSONObject jsonObject = restTemplate.getForObject(getAccessTokenUrl, JSONObject.class); if (jsonObject != null) { return jsonObject.getString(“access_token”); } return null; }官方给的实例代码很完善,在使用时只需要替换自己的API key和Secret Key就行了。这里我根据自己的编程习惯,进行了一点改动。使用restTemplate进行第三方请求。人脸检测接下来,我们就可以根据获取的token进行人脸检测。 /* * 人脸检测 * @return 返回检测信息 / @Override public String detect() { // 请求url String url = “https://aip.baidubce.com/rest/2.0/face/v3/detect"; try { Map<String, Object> map = new HashMap<>(); map.put(“image”, “027d8308a2ec665acb1bdf63e513bcb9”); map.put(“face_field”, “faceshape,facetype”); map.put(“image_type”, “face_token”); String param = GsonUtils.toJson(map); // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。 String accessToken = this.getAuth(); String result = HttpUtil.post(url, accessToken, “application/json”, param); System.out.println(result); return result; } catch (Exception e) { e.printStackTrace(); } return null; }上面使用的HttpUtil和GsonUtils请到官网中自行下载。在图片的参数处,我们使用了face_token,这是我之前请求过一次得到的,每张图片多次请求,都会得到一个唯一的face_token。但是实际情况下,我们大多数是不知道face_token的,这里只是为了简短代码。他还支持URL和base64的图片格式,但是有时限于网络原因,使用URL方式可能会很慢,所以,在实际的请求中,建议选择base64的方式检查图片。最后返回的信息如下:人脸对比人脸对比,可以用在身份认证。比如我们使用人脸登录的时候就可以使用。现在我们使用两张照片进行比对: /* * 图片比对 * @return 对比结果 */ @Override public String match() { // 请求url String url = “https://aip.baidubce.com/rest/2.0/face/v3/match"; try { byte[] bytes1 = FileUtil.readFileByBytes(“src/main/resources/static/test.jpg”); byte[] bytes2 = FileUtil.readFileByBytes(“src/main/resources/static/test1.jpg”); 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 = this.getAuth(); String result = HttpUtil.post(url, accessToken, “application/json”, param); System.out.println(result); return result; } catch (Exception e) { e.printStackTrace(); } return null; }我们的请求参数中,后面的三个是对照片的限制:然后获取的结果类似如下:具体含义请参照官方文档。总结本文只是实现了对两张照片的比对,但是实际的情况,很多时候会用到人脸采集,但是笔者在这里注册不了企业信息,所以就只能做个低配版的了:将动态采集变成静态图片比对。官方文档:https://ai.baidu.com/docs#/Fa…
百度人脸识别
March 28, 2019 · 2 min · jiezi