一. 准备工作
需要做的准备工作主要有两部分,一是完成应用创建,二是下周官方工具类和maven注入
A. 应用创建
1. 百度用户创建登录
如果已经有百度云账号可直接登录,没有就需要先行注册,登陆地址:https://login.bce.baidu.com/?account=
?2. 进入人脸识别服务
?3. 应用创建
创建输入应用名称和描述,其余默认选择,应用创建成功后出来领取免费资源,免费资源发放存在延迟,后续若出现这样的报错Open api qps request limit reached,则可能是领取的免费资源还未发放。
?4.应用查看
看到如下应用列表,表示你可以开始人脸识别开发了
B. 开发准备
1. 工具类下载
进行开发前,需要将以下工具类下载并添加到项目中,下载地址如下
- https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
- https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
- https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
2. maven依赖注入
在pom.xml的dependencies标签中添加以下依赖:
<!-- 百度人脸识别 -->
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>4.6.0</version>
</dependency>
?
二. 调用实现
A. 看文档
要使用百度的人脸识别API,首先需要看懂他提供出来的开源调用文档,文档地址已提供在参考资料模块,可自行查看。
查看文档时,需要重点注意的,就是它的API地址和API参数
?B. 代码实例
人脸识别API的调用基本差不多,所以这里以人脸识别的人脸搜索,以人脸图片找人为例,来展示人脸识别API调用实现。补充资源代码里含有完整代码,包含人脸注册、人脸更新、人脸删除、人脸搜索和人脸检测的调用实现。
1. 人脸识别参数类
其中appid、apikey和sercetkey为创建应用是生成的,将自己应用的对应值填入即可。需要注意的是token值30天会刷新一次,所以在刷新前需要更新token,以正常使用人脸识别接口。
/**
* @author -china.com
* @version 1.0
* @ClassName FaceAPIConstants
* 创建时间:2021/8/18 15:00
* 类说明: 人脸识别常量类
*/
public class FaceAPIConstants {
// 人脸识别API验证信息
// (value = "百度人脸识别应用appid")
public static final String APP_ID = "appid";
// (value = "百度人脸识别应用apikey")
public static final String API_KEY = "apikey";
// (value = "百度人脸识别应用sercetkey")
public static final String SECRET_KEY = "sercetkey";
// (value = "百度人脸识别token 有效期一个月,避免失效,采用实时获取")
public static String TOKEN = "";
// (value = "请求类型")
public static final String CONTENT_TYPE = "application/json";
// 人脸识别API
// (value = "人脸添加API")
public static final String ADD_URL = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add";
// (value = "人脸更新API")
public static final String UPDATE_URL = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/update";
// (value = "人脸删除API")
public static final String DELETE_URL = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/face/delete";
// (value = "人脸搜索API")
public static final String SEARCH_URL = "https://aip.baidubce.com/rest/2.0/face/v3/search";
// (value = "人脸检测API")
public static final String DETECT_URL = "https://aip.baidubce.com/rest/2.0/face/v3/detect";
}
2. token获取类
token通过apikey和sercetkey去获取,token初始方式可灵活处理
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
/**
* @author
* @version 1.0
* @ClassName FaceAuthService
* 创建时间:2021/8/18 15:09
* 类说明: 人脸识别获取token类
*/
public class FaceAuthService {
/**
* 获取权限token
*/
public static void setFaceAuth() {
if (StringUtils.isEmpty(FaceAPIConstants.TOKEN)) {
// 官网获取的 API Key 更新为你注册的
String clientId = FaceAPIConstants.API_KEY;
// 官网获取的 Secret Key 更新为你注册的
String clientSecret = FaceAPIConstants.SECRET_KEY;
FaceAPIConstants.TOKEN = getFaceAuth(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 getFaceAuth(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;
}
/**
* 返回结果示例
*/
System.err.println("result:" + result);
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;
}
}
?3. 人脸搜索方法
人脸搜索需要的参数首先肯定是识别图片,其次是检索范围,这里的检索范围是按用户组来指定的,用户组可在应用管理进行添加,也可通过API调用添加,我这里是直接在应用管理中找的可视化人脸库,进入应用,添加组。
/**
* @return
* @description 人脸搜索
* @author
* @date 2021/8/19 9:36
* @params
* @version 1.0
*/
public static FaceResultVO faceSearch(FaceParaVO dto) throws IOException {
// 比对图片
String image = Base64Util.encode(FileUtil.readFileByBytes(dto.getFaceImgUrl()));
try {
Map<String, Object> map = new HashMap<>();
map.put("image", image);
map.put("image_type", "BASE64");
map.put("group_id_list", dto.getGroupId());
String param = GsonUtils.toJson(map);
// 获取access_token
FaceAuthService.setFaceAuth();
String accessToken = FaceAPIConstants.TOKEN;
String result = HttpUtil.post(FaceAPIConstants.SEARCH_URL, accessToken, FaceAPIConstants.CONTENT_TYPE, param);
// 结果处理
FaceReturnVO resultVO = FaceCommonUtils.getReturnObj(result);
if ("0".equals(resultVO.getErrorCode())) {
return resultVO.getResult();
} else {
throw new MtException(resultVO.getErrorMsg());
}
} catch (Exception e) {
e.printStackTrace();
throw new MtException(e.getMessage());
}
}
注意:
此实例是以本地图片实现的,如果需要以URL图片地址实现,需要将image_type赋值为URL,同时图片不用再进行转码。
?4. 方法调用
参数传入用户组和用户图片
FaceParaVO faceParaVO = new FaceParaVO();
faceParaVO.setGroupId("110");
faceParaVO.setFaceImgUrl("D:\\MyDocuments\\Work Files\\face_images\\sts_1.jpg");
FaceDetectUtils.faceSearch(faceParaVO);
5. 人脸识别结果
补充:
需要完整代码的,可从此地址下载:https://download.csdn.net/download/qwerdfcv/21353239
三. 参考资料
- 人脸识别百度文档地址:https://cloud.baidu.com/apiexplorer/index.html?Product=GWSE-nmhroEsyriA&Api=GWAI-eSX4WxmdzLE
- 百度智能云-管理中心地址:https://console.bce.baidu.com/ai/?_=1629371219202&fromai=1#/ai/face/overview/index
- 人脸识别相关百度视频教学地址:https://abcxueyuan.baidu.com/#/line_course?nodeId=74&index=0-2-0&pageNo=1&sortTag=1
|