百度人脸识别应用(二)

257 阅读3分钟

「这是我参与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);
        }
    }