「这是我参与11月更文挑战的第 4 天,活动详情查看:2021最后一次更文挑战」
1、前言
在上一次的分享中,我们提到了人脸库这个概念。本次我们就介绍下人脸库API的使用及注意事项。
2、人脸库API的使用
首先,现在百度的人脸识别相关的API分为v2与v3版本,两个版本中调用的方法有所不同,并且v3版本在人脸识别上更精确了些,特别是在【双胞胎】情况下。
想要使用人脸查找功能,那么就必须构建一个人脸库,那么该如何构造人脸库呢?这里有两种方式。一种是通过百度的控制台来手工创建人脸库信息,另一种是在程序中,当我们向人脸库中注册人脸信息时,会带上人脸库ID,若不存在则会自动创建这个人脸库。
下面就详细介绍下人脸库相关功能的应用:
1、人脸注册->把人脸特征信息添加到人脸库中
这里百度提供的API使用起来还是相当方便的,我们只需要提供一个随机的用户uid,还有userInfo,这里的用户信息可以存一些我们自己系统的用户主键这些,将来排查问题是也很好排查,还有组ID-groupID即人脸库的ID(这个ID是可以自定义的),还有就是人脸照片的路径信息,百度的API会将其转换成base64编码格式,然后通过http的形式调用接口。
/**
* 人脸库注册用户
* @param certId
* @param imgPath
* @return
*/
public MessageModel addUser(String certId, String imgPath) {
MessageModel messageModel = new MessageModel();
//判断人脸图片文件是否存在
File tempFile = new File(imgPath);
if (!tempFile.exists()) {
messageModel.setErrorCode(messageModel.constErrorCode);
messageModel.setErrMsg("人脸图像文件不存在!图像路径:" + imgPath + ",用户信息:" + certId);
return messageModel;
}
//获取group_id
String groupId = getGroupId();
//获取用户id(uid)用于向人脸库中注册
String randomUid = genFaceUid();
LOGGER.info("百度人脸库注册,uid:{},userInfo:{},group_id:{},imgPath:{}", randomUid, userInfo, groupId, imgPath);
JSONObject resObject = aipFace.addUser(randomUid, userInfo, groupId, imgPath, null);
LOGGER.info("百度人脸库注册,返回信息为:{}", resObject);
if (resObject.has("error_code")) {
int errCode = (int)resObject.get("error_code");
Properties properties = ResourceUtil.getResourcePropertiesBaiDu();
messageModel.setErrorCode(messageModel.constErrorCode);
messageModel.setErrMsg(String.format("人脸库注册失败,返回码:(%s)。请重试!", errCode));
LOGGER.error(String.format("人脸库注册失败,返回码:(%s),错误信息:%s。请重试!", errCode), properties.getProperty("baidu."+errCode));
return messageModel;
}
//更新对应group下的用户数量
faceGroupMapper.updateFaceGroupUserNum(groupId);
messageModel.setCode(messageModel.constOKCode);
messageModel.setMsg(String.format("人脸库注册成功,当前用户:%s!", userInfo));
return messageModel;
}
2、人脸删除:删除指定用户的某张人脸。这里是根据uid来进行删除的。需要注意的一个点是,百度的文档里说的是提供uid即可删除所有人脸库中的某张人脸信息,但实际情况下,仅提供uid并不能调通接口。还需要提供groupID。所以之恶能删除某个人脸库下的某张人脸。所以我们在向人脸库中注册用户时,一定要保证一张人脸只注册到一个人脸库中,并且保证uid的唯一(可以使用java的uuid)
/**
* 从人脸库删除用户
* @return
*/
public void delUserFromFaceGroup(PhotoInfo photoInfo) throws Exception {
//对certId获取人脸库注册的uid以及组ID
String faceGroupId = photoInfo.getFace_group_id();
String faceUid = photoInfo.getFace_uid();
if (StringUtils.isNotBlank(faceGroupId) && StringUtils.isNotBlank(faceUid)) {
JSONObject resObject = aipFace.deleteGroupUser(faceGroupId, faceUid, null);
if (resObject.has("error_code")) {
int errCode = (int)resObject.get("error_code");
Properties properties = ResourceUtil.getResourcePropertiesBaiDu();
String errorMsg = String.format("人脸库删除用户失败,返回码:(%s),错误信息:%s。请重试!", errCode, properties.getProperty("baidu."+errCode));
LOGGER.error(errorMsg);
throw new RuntimeException(errorMsg);
}
//更新group下的用户数量
faceGroupMapper.subFaceGroupUserNum(faceGroupId);
}
}