序言
本学期的 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…