当前位置:   article > 正文

人脸打分! 如何用Java接入百度AI人脸识别并部署到公众号?_java如何接入百度ai

java如何接入百度ai

前言

主要涉及的技术 SpringBoot框架、RestTemplate、fastjson、HttpHeaders、URIBuilder 整体难度并不高,并且十分有趣

一、接入百度AI

链接 详细内容查看官方文档

 https://cloud.baidu.com/product/face
  • 1

获取AccessToken

接口

public interface BaiDuAccessTokenService {

        /**
         * 获取权限token
         * @return 返回示例:
         * {
         * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
         * "expires_in": 2592000
         * }
         */
        public String getAuth();


        /**
         *
         * 获取API访问的token
         * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
         * @param ak - 百度云官网获取的 API Key
         * @param sk - 百度云官网获取的 Securet Key
         */
        public void getAuth(String ak, String sk);


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

实体类,为了设置期限,我们封装一个实体类,其中定义一个
public boolean isExpired()方法,用于查看是否过期,这里我们set方法构造方法都经过了修改,
在这里插入图片描述

public class BaiDuAccessToken {
    private String accessToken;
    private long expires_time;

    public BaiDuAccessToken(String accessToken) {
        this.accessToken = accessToken;
        this.expires_time = System.currentTimeMillis() + 2592000 * 1000L;
    }

    public BaiDuAccessToken() {
    }

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public long getExpires_time() {
        return expires_time;
    }

    // 一个月的时间过期
    public void setExpires_time() {
        this.expires_time = System.currentTimeMillis() + 2592000 * 1000L;
    }

    public boolean isExpired() {
        return System.currentTimeMillis() > expires_time;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

Impl,我们需要获得accesstoken时,就调用该类,使用无参的public String getAuth(),其会根据过期时间自动化判断是否需要获取access_token,无需人工干预

@Service
public class BaiDuAccessTokenServiceImpl implements BaiDuAccessTokenService {
    //构建一个baiDuAccessToken对象,从而提升运行速度,避免每次都发送请求
    private static BaiDuAccessToken baiDuAccessToken = new BaiDuAccessToken();

    // 官网获取的 API Key 更新为你注册的
    private String clientId = "官网的API Key";
    // 官网获取的 Secret Key 更新为你注册的
    private String clientSecret = "官网的 Secret Key";

	// 调用该类,获取accesstoken时的方法
    @Override
    public String getAuth() {
        if (baiDuAccessToken == null || baiDuAccessToken.isExpired()){
            getAuth(clientId,clientSecret);
        }

        return  baiDuAccessToken.getAccessToken();
    }

    @Override
    public void getAuth(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("百度access_token获取的result:" + result);
            JSONObject jsonObject = JSONObject.parseObject(result);

            String access_token = jsonObject.getString("access_token");

            // 给baiDuAccessToken赋值
            baiDuAccessToken.setAccessToken(access_token);
            baiDuAccessToken.setExpires_time();

        } catch (Exception e) {
            System.err.printf("获取token失败!");
            e.printStackTrace(System.err);
        }
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

二、人脸识别

接口

public interface FaceDetectService {

    /**
     * 发送请求,获取人脸信息
     * @param faceDetectReq
     * @return
     */
    public String getFaceInfo(FaceDetectReq faceDetectReq);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注意我们的请求参数的设置,文档中我们需要发送post请求,设置URL、Header以及请求Json,这需要用到HttpHeaders设置header, URIBuilder组合URL,fastjson格式化实体类,RestTemplate发送请求,并整合URL、Header以及JSON

实体类,这是我们请求参数的封装类,不是返回参数的封装,返回参数封装比较繁琐,这里不再赘述。我们使用BASE64作为图片参数,(因为微信公众号平台的图片链接,百度AI无法直接解析,需要转为BASE64)

public class FaceDetectReq {
    private String image;
    private String image_type="BASE64";
    private long max_face_num = 10L ;

    public long getMax_face_num() {
        return max_face_num;
    }

    // 主流的备选信息age,beauty,expression,face_shape,gender,glasses
    private String face_field="age,beauty,expression,face_shape,gender,glasses";

    public FaceDetectReq() {
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getImage_type() {
        return image_type;
    }

    public String getFace_field() {
        return face_field;
    }

    // 将image的信息设置为url地址
    public FaceDetectReq(String base64) {
        image = base64;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

Impl

@Service
public class FaceDetectServiceImpl implements FaceDetectService {

    BaiDuAccessTokenServiceImpl accessTokenService = new BaiDuAccessTokenServiceImpl();

    //请求的URL
    final String url = "https://aip.baidubce.com/rest/2.0/face/v3/detect";
    final String access_token = accessTokenService.getAuth();

    @Override
    public String getFaceInfo(FaceDetectReq faceDetectReq) {
        //设置header
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        httpHeaders.set("Content-Type","application/json");

        //对象转为jsonObject
        JSONObject jsonObject = new JSONObject();
        String params = jsonObject.toJSONString(faceDetectReq);
        jsonObject = JSONObject.parseObject(params);

        //设置URL
        URIBuilder uriBuilder = null;
        try {
            uriBuilder = new URIBuilder(url);
            uriBuilder.addParameter("access_token",access_token);
            System.out.println(uriBuilder);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        //发送post请求携带header以及json
        HttpEntity httpEntity = new HttpEntity(jsonObject,httpHeaders);
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.postForObject(uriBuilder.toString(),httpEntity,String.class);

        return result;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

大体上,我们已经实现了业务层的编码工作,部署到公众号还需有个人的域名、服务器、以及掌握json转xml、封装百度ai返回值这些技能,如果有兴趣,可以再出一篇博客。

公众号

这里贴上几张测试图,也欢迎大家来公众号玩一玩这个人脸识别的功能。(返回格式可能会有变化,功能也会逐渐完善)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/150469?site
推荐阅读
相关标签
  

闽ICP备14008679号