All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.luna.baidu.api.BaiduUserFaceApi Maven / Gradle / Ivy

There is a newer version: 3.2.0
Show newest version
package com.luna.baidu.api;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import com.luna.baidu.constant.ImageConstant;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.luna.baidu.dto.face.UserFaceListResultDTO;
import com.luna.baidu.dto.face.UserFaceResultDTO;
import com.luna.baidu.dto.face.UserInfoListDTO;
import com.luna.common.net.HttpUtils;
import com.luna.common.net.HttpUtilsConstant;

/**
 * @author luna@mac
 * 2021年05月07日 19:21
 */
public class BaiduUserFaceApi {

    private static final Logger log = LoggerFactory.getLogger(BaiduUserFaceApi.class);

    /**
     * 人脸注册Api 返回face_token
     *
     * @param key
     * @param image 图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断。
     * 注:组内每个uid下的人脸图片数目上限为20张
     * @param imageType 图片类型
     * BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
     * URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
     * FACE_TOKEN:人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。
     * @param groupId
     * 用户组id,标识一组用户(由数字、字母、下划线组成),长度限制48B。产品建议:根据您的业务需求,可以将需要注册的用户,按照业务划分,分配到不同的group下,例如按照会员手机尾号作为groupid,用于刷脸支付、会员计费消费等,这样可以尽可能控制每个group下的用户数与人脸数,提升检索的准确率
     * @param userId 用户id(由数字、字母、下划线组成),长度限制128B
     * @param userInfo 用户资料,长度限制256B 默认空 (非必需)
     * @param qualityControl 图片质量控制 (非必需)
     * NONE: 不进行控制
     * LOW:较低的质量要求
     * NORMAL: 一般的质量要求
     * HIGH: 较高的质量要求
     * 默认 NONE
     * 若图片质量不满足要求,则返回结果中会提示质量检测失败
     * @param liveNessControl 活体检测控制 (非必需)
     * NONE: 不进行控制
     * LOW:较低的活体要求(高通过率 低攻击拒绝率)
     * NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
     * HIGH: 较高的活体要求(高攻击拒绝率 低通过率)
     * 默认NONE
     * 若活体检测结果不满足要求,则返回结果中会提示活体检测失败
     * @param actionType 操作方式 (非必需)
     * APPEND: 当user_id在库中已经存在时,对此user_id重复注册时,新注册的图片默认会追加到该user_id下
     * REPLACE : 当对此user_id重复注册时,则会用新图替换库中该user_id下所有图片
     * 默认使用APPEND
     * @param faceSortType 人脸检测排序类型 (非必需)
     * 0:代表检测出的人脸按照人脸面积从大到小排列
     * 1:代表检测出的人脸按照距离图片中心从近到远排列
     * 默认为0
     * @return
     */
    public static UserFaceResultDTO faceUserAdd(String key, String image, String imageType, String groupId,
        String userId,
        String userInfo, String qualityControl, String liveNessControl, String actionType, Integer faceSortType) {
        log.info("faceUserAdd start");

        ImmutableMap map = ImmutableMap.builder()
            .put("image", image)
            .put("image_type", imageType)
            .put("group_id", groupId)
            .put("user_id", userId)
            .put("user_info", userInfo)
            .put("quality_control", qualityControl)
            .put("liveness_control", liveNessControl)
            .put("action_type", actionType)
            .put("face_sort_type", faceSortType)
            .build();

        HttpResponse httpResponse = HttpUtils.doPost(BaiduApiConstant.HOST, BaiduApiConstant.FACE_USER_ADD,
            ImmutableMap.of("Content-Type", HttpUtilsConstant.JSON), ImmutableMap.of("access_token", key),
            JSON.toJSONString(map));
        String response = HttpUtils.checkResponseAndGetResult(httpResponse, true);
        UserFaceResultDTO userFaceResultDTO =
            JSON.parseObject(JSON.parseObject(response).getString("result"), UserFaceResultDTO.class);
        log.info("faceUserAdd success userFaceResultDTO={}, response={}", userFaceResultDTO, response);
        return userFaceResultDTO;
    }

    public static UserFaceResultDTO faceUserAdd(String key, String image, String imageType, String groupId,
        String userId) {
        return faceUserAdd(key, image, imageType, groupId, userId, StringUtils.EMPTY, "NONE", "NONE", "APPEND", 0);
    }

    public static UserFaceResultDTO faceUserAdd(String key, String image, String imageType, String groupId,
        String userId, String userInfo) {
        return faceUserAdd(key, image, imageType, groupId, userId, userInfo, "NONE", "NONE", "APPEND", 0);
    }

    /**
     * 更新人脸接口
     *
     * @param key
     * @param image 图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断
     * @param imageType 图片类型
     * BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
     * URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
     * FACE_TOKEN: 人脸图片的唯一标识
     * @param groupId 用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B
     * @param userId 用户id(由数字、字母、下划线组成),长度限制48B
     * @param userInfo 用户资料,长度限制48B 默认空
     * @param qualityControl 图片质量控制
     * NONE: 不进行控制
     * LOW:较低的质量要求
     * NORMAL: 一般的质量要求
     * HIGH: 较高的质量要求
     * 默认 NONE
     * 若图片质量不满足要求,则返回结果中会提示质量检测失败
     * @param liveNessControl 活体检测控制
     * NONE: 不进行控制
     * LOW:较低的活体要求(高通过率 低攻击拒绝率)
     * NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
     * HIGH: 较高的活体要求(高攻击拒绝率 低通过率)
     * 默认NONE
     * 若活体检测结果不满足要求,则返回结果中会提示活体检测失败
     * @param actionType 操作方式
     * UPDATE: 会使用新图替换库中该user_id下所有图片, 若user_id不存在则会报错
     * REPLACE : 当user_id不存在时, 则会注册这个user_id的用户
     * 默认使用UPDATE
     * @return
     */
    public static UserFaceResultDTO faceUserUpdate(String key, String image, String imageType, String groupId,
        String userId, String userInfo, String qualityControl, String liveNessControl, String actionType) {

        log.info("faceUserUpdate start");
        ImmutableMap map = ImmutableMap.builder()
            .put("image", image)
            .put("image_type", imageType)
            .put("group_id", groupId)
            .put("user_id", userId)
            .put("user_info", userInfo)
            .put("quality_control", qualityControl)
            .put("liveness_control", liveNessControl)
            .put("action_type", actionType)
            .build();

        HttpResponse httpResponse = HttpUtils.doPost(BaiduApiConstant.HOST, BaiduApiConstant.FACE_USER_UPDATE,
            ImmutableMap.of("Content-Type", HttpUtilsConstant.JSON), ImmutableMap.of("access_token", key),
            JSON.toJSONString(map));
        String response = HttpUtils.checkResponseAndGetResult(httpResponse, true);
        UserFaceResultDTO userFaceResultDTO =
            JSON.parseObject(JSON.parseObject(response).getString("result"), UserFaceResultDTO.class);
        log.info("faceUserUpdate success userFaceResultDTO={}, response={}", JSON.toJSONString(userFaceResultDTO),
            response);
        return userFaceResultDTO;

    }

    public static UserFaceResultDTO faceUserUpdate(String key, String image, String imageType, String groupId,
        String userId) {
        return faceUserUpdate(key, image, imageType, groupId, userId, StringUtils.EMPTY, "NONE", "NONE", "UPDATE");
    }

    /**
     * 删除人脸
     *
     * @param key
     * @param groupId
     * @param userId
     * @param faceToken
     * @return
     */
    public static Boolean faceUserDelete(String key, String groupId, String userId, String faceToken) {
        log.info("faceUserDelete start");
        HttpResponse httpResponse = HttpUtils.doPost(BaiduApiConstant.HOST, BaiduApiConstant.FACE_USER_FACE_DELETE,
            ImmutableMap.of("Content-Type", HttpUtilsConstant.JSON), ImmutableMap.of("access_token", key),
            JSON.toJSONString(ImmutableMap.of("face_token", faceToken, "group_id", groupId, "user_id", userId)));
        String response = HttpUtils.checkResponseAndGetResult(httpResponse, true);
        Integer errorCode = JSON.parseObject(response).getInteger("error_code");
        log.info("faceUserDelete success error_code={}", errorCode);
        return errorCode == 0;
    }

    /**
     * 用户信息查询
     *
     * @param key
     * @param groupId 用户组id(由数字、字母、下划线组成,长度限制48B),如传入“@ALL”则从所有组中查询用户信息。注:处于不同组,但uid相同的用户,我们认为是同一个用户。
     * @param userId 用户id(由数字、字母、下划线组成),长度限制48B
     */
    public static UserInfoListDTO getUserInfo(String key, String userId, String groupId) {
        log.info("getUserInfo start");
        if (StringUtils.isEmpty(groupId)) {
            groupId = "@ALL";
        }
        HttpResponse httpResponse = HttpUtils.doPost(BaiduApiConstant.HOST, BaiduApiConstant.FACE_USER_INFO,
            ImmutableMap.of("Content-Type", HttpUtilsConstant.JSON), ImmutableMap.of("access_token", key),
            JSON.toJSONString(ImmutableMap.of("user_id", userId, "groupId", groupId)));
        String response = HttpUtils.checkResponseAndGetResult(httpResponse, true);
        UserInfoListDTO userInfoListDTO =
            JSON.parseObject(JSON.parseObject(response).getString("result"), UserInfoListDTO.class);
        log.info("faceUserDelete success userInfoListDTO={}, response={}", JSON.toJSONString(userInfoListDTO),
            response);
        return userInfoListDTO;
    }

    /**
     * 获取用户人脸列表
     *
     * @param key
     * @param userId
     * @param groupId
     */
    public static UserFaceListResultDTO userFaceList(String key, String userId, String groupId) {
        log.info("userFaceList start");
        HttpResponse httpResponse = HttpUtils.doPost(BaiduApiConstant.HOST, BaiduApiConstant.FACE_USER_FACE_LIST,
            ImmutableMap.of("Content-Type", HttpUtilsConstant.JSON), ImmutableMap.of("access_token", key),
            JSON.toJSONString(ImmutableMap.of("user_id", userId, "group_id", groupId)));
        String response = HttpUtils.checkResponseAndGetResult(httpResponse, true);
        UserFaceListResultDTO userFaceListResultDTO =
            JSON.parseObject(JSON.parseObject(response).getString("result"), UserFaceListResultDTO.class);
        log.info("faceUserDelete success userInfoListDTO={}, response={}", JSON.toJSONString(userFaceListResultDTO),
            response);
        return userFaceListResultDTO;
    }

    /**
     * 删除用户
     *
     * @param key
     * @param userId
     * @param groupId
     */
    public static Boolean deleteUser(String key, String userId, String groupId) {
        log.info("deleteUser start");
        HttpResponse httpResponse = HttpUtils.doPost(BaiduApiConstant.HOST, BaiduApiConstant.FACE_USER_DELETE,
            ImmutableMap.of("Content-Type", HttpUtilsConstant.JSON), ImmutableMap.of("access_token", key),
            JSON.toJSONString(ImmutableMap.of("user_id", userId, "group_id", groupId)));
        String s = HttpUtils.checkResponseAndGetResult(httpResponse, true);
        return JSON.parseObject(s).getInteger("error_code") == 0;
    }

    /**
     * 复制用户
     *
     * @param key
     * @param userId 用户id,长度限制48B
     * @param srcGroupId 从指定组里复制信息
     * @param dstGroupId 需要添加用户的组id
     * @return
     */
    public static Boolean userCopy(String key, String userId, String srcGroupId, String dstGroupId) {
        log.info("userCopy start, key={}, userId={}, srcGroupId={}, dstGroupId={}", key, userId, srcGroupId,
            dstGroupId);

        HttpResponse httpResponse = HttpUtils.doPost(BaiduApiConstant.HOST, BaiduApiConstant.FACE_USER_COPY,
            ImmutableMap.of("Content-Type", HttpUtilsConstant.JSON), ImmutableMap.of("access_token", key),
            JSON.toJSONString(
                ImmutableMap.of("user_id", userId, "src_group_id", srcGroupId, "dst_group_id", dstGroupId)));
        String s = HttpUtils.checkResponseAndGetResult(httpResponse, true);
        return JSON.parseObject(s).getInteger("error_code") == 0;
    }

    /**
     * 查询用户组
     *
     * @param key
     * @param start 默认值0,起始序号
     * @param length 返回数量,默认值100,最大值1000
     * @return
     */
    public static List getUserGroup(String key, Integer start, Integer length) {
        log.info("getUserGroup start, key={}, start={}", key, start);

        HttpResponse httpResponse = HttpUtils.doPost(BaiduApiConstant.HOST, BaiduApiConstant.FACE_USER_GROUP_LIST,
            ImmutableMap.of("Content-Type", HttpUtilsConstant.JSON), ImmutableMap.of("access_token", key),
            JSON.toJSONString(ImmutableMap.of("start", start, "length", length)));
        String response = HttpUtils.checkResponseAndGetResult(httpResponse, true);
        List groupIdList = JSON.parseArray(
            JSON.parseObject(JSON.parseObject(response).getString("result")).getString("group_id_list"), String.class);
        log.info("getUserGroup success groupIdList={}, response={}", groupIdList, response);
        return groupIdList;
    }

    /**
     * 添加用户组
     *
     * @param key
     * @param groupId
     * @return
     */
    public static Boolean createUserGroup(String key, String groupId) {
        log.info("createUserGroup start, key={}, groupId={}", key, groupId);

        HttpResponse httpResponse = HttpUtils.doPost(BaiduApiConstant.HOST, BaiduApiConstant.FACE_USER_CREATE_GROUP,
            ImmutableMap.of("Content-Type", HttpUtilsConstant.JSON), ImmutableMap.of("access_token", key),
            JSON.toJSONString(ImmutableMap.of("group_id", groupId)));
        String s = HttpUtils.checkResponseAndGetResult(httpResponse, true);
        return JSON.parseObject(s).getInteger("error_code") == 0;
    }

    /**
     * 删除用户组
     *
     * @param key
     * @param groupId
     * @return
     */
    public static Boolean deleteUserGroup(String key, String groupId) {
        log.info("deleteUserGroup start, key={}, groupId={}", key, groupId);
        HttpResponse httpResponse = HttpUtils.doPost(BaiduApiConstant.HOST, BaiduApiConstant.FACE_USER_GROUP_DELETE,
            ImmutableMap.of("Content-Type", HttpUtilsConstant.JSON), ImmutableMap.of("access_token", key),
            JSON.toJSONString(ImmutableMap.of("group_id", groupId)));
        String s = HttpUtils.checkResponseAndGetResult(httpResponse, true);
        return JSON.parseObject(s).getInteger("error_code") == 0;
    }

    /**
     *
     * 人脸搜索
     *
     * @param key
     * @param image 图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断
     * @param imageType 图片类型
     * BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
     * URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
     * FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。
     * @param groupIdList 从指定的group中进行查找 用逗号分隔,上限10个
     * @param qualityControl 图片质量控制 (非必需)
     * NONE: 不进行控制
     * LOW:较低的质量要求
     * NORMAL: 一般的质量要求
     * HIGH: 较高的质量要求
     * 默认 NONE
     * 若图片质量不满足要求,则返回结果中会提示质量检测失败
     * @param liveNessControl 活体检测控制 (非必需)
     * NONE: 不进行控制
     * LOW:较低的活体要求(高通过率 低攻击拒绝率)
     * NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
     * HIGH: 较高的活体要求(高攻击拒绝率 低通过率)
     * 默认NONE
     * 若活体检测结果不满足要求,则返回结果中会提示活体检测失败 (非必需)
     * @param userId 当需要对特定用户进行比对时,指定user_id进行比对。即人脸认证功能。
     * @param maxUserNum 查找后返回的用户数量。返回相似度最高的几个用户,默认为1,最多返回50个。
     * @param faceSortType 人脸检测排序类型 (非必需)
     * 0:代表检测出的人脸按照人脸面积从大到小排列
     * 1:代表检测出的人脸按照距离图片中心从近到远排列
     * 默认为0
     */
    public static UserInfoListDTO userFaceSearch(String key, String image, String imageType, String groupIdList,
        String qualityControl, String liveNessControl, String userId, Integer maxUserNum, Integer faceSortType) {
        log.info("userFaceSearch start");

        Map map = Maps.newHashMap();
        map.put("image", image);
        map.put("image_type", imageType);
        map.put("group_id_list", groupIdList);
        map.put("quality_control", qualityControl);
        map.put("liveness_control", liveNessControl);
        if (StringUtils.isNotBlank(userId)) {
            map.put("user_id", userId);
        }
        map.put("max_user_num", maxUserNum);
        map.put("face_sort_type", faceSortType);

        HttpResponse httpResponse = HttpUtils.doPost(BaiduApiConstant.HOST, BaiduApiConstant.SEARCH,
            ImmutableMap.of("Content-Type", HttpUtilsConstant.JSON), ImmutableMap.of("access_token", key),
            JSON.toJSONString(map));
        String response = HttpUtils.checkResponseAndGetResult(httpResponse, true);
        UserInfoListDTO userFaceResultDTO =
            JSON.parseObject(JSON.parseObject(response).getString("result"), UserInfoListDTO.class);
        log.info("userFaceSearch success userFaceResultDTO={}, response={}", JSON.toJSONString(userFaceResultDTO),
            response);
        return userFaceResultDTO;
    }

    public static UserInfoListDTO userFaceSearch(String key, String image, String imageType, String groupIdList) {
        return userFaceSearch(key, image, imageType, groupIdList, "NONE", "NONE", StringUtils.EMPTY, 1, 0);
    }

    public static UserInfoListDTO userFaceSearch(String key, String image, String imageType, Integer maxUserNum,
        String groupIdList) {
        return userFaceSearch(key, image, imageType, groupIdList, "NONE", "NONE", StringUtils.EMPTY, maxUserNum, 0);
    }

    public static UserInfoListDTO userFaceSearchWithBase64(String key, String image, Integer maxUserNum,
        String groupIdList) {
        return userFaceSearch(key, image, ImageConstant.IMAGE_BASE.getImageStr(), groupIdList, "NONE", "NONE",
            StringUtils.EMPTY, maxUserNum, 0);
    }

    public static UserInfoListDTO userFaceSearchWithUrl(String key, String image, Integer maxUserNum,
        String groupIdList) {
        return userFaceSearch(key, image, ImageConstant.IMAGE_URL.getImageStr(), groupIdList, "NONE", "NONE",
            StringUtils.EMPTY, maxUserNum, 0);
    }

    public static UserInfoListDTO userFaceSearchWithFaceToken(String key, String image, Integer maxUserNum,
        String groupIdList) {
        return userFaceSearch(key, image, ImageConstant.FACE_TOKEN.getImageStr(), groupIdList, "NONE", "NONE",
            StringUtils.EMPTY, maxUserNum, 0);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy