百度人脸识别

序言

本学期的android实验,打算作一款关于小应用,其中打算使用人脸识别技术,因此找到了百度AI,免费的开放API,为个人实验带来了极大的便利。java

建立百度AI应用

要使用百度AI的接口,首先咱们要注册一个帐号,而后建立应用:android

clipboard.png

而后表单填写,勾选你想使用的接口。我这里就默认了。编程

clipboard.png

最后建立好后,你会获得这样的一组信息:json

clipboard.png

这在后面咱们调用接口的时候回用到。api

好了,接下来,咱们就开始API的使用。缓存

人脸识别

首先,咱们要清楚大概的过程,要进行人脸的识别,首先要先获取人脸的信息,也就是人脸检测。咱们先检测出人脸的相关信息,而后才能进行比对,就是人脸对比。因此咱们须要使用两个接口人脸检测人脸对比。(相关的说明文档,我在本文最后会给出连接。)网络

获取token

在调用百度的API以前,首先须要获取到token。app

这里不得不给百度点个赞,示例代码有各类语言,共不一样需求的开发者使用ide

clipboard.png

这里我是用的是javapost

/**
     * 获取权限token
     * @return 返回token
     */
    @Override
    public String getAuth() {
        // 官网获取的 API Key
        String clientId = "API key";
        // 官网获取的 Secret Key
        String clientSecret = "Secret Key";
        return getAuth(clientId, clientSecret);
    }

    /**
     * 获取API访问token
     * 该token有必定的有效期,须要自行管理,当失效时需从新获取.
     * @param apiKey - 百度云官网获取的 API Key
     * @param secretKey - 百度云官网获取的 Secret Key
     * @return assess_token 
     */
    @Override
    public String getAuth(String apiKey, String secretKey) {
        // 获取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=" + apiKey
                // 3. 官网获取的 Secret Key
                + "&client_secret=" + secretKey;
                
        // 请求API,获取token
        JSONObject jsonObject = restTemplate.getForObject(getAccessTokenUrl, JSONObject.class);
        if (jsonObject != null) {
            return jsonObject.getString("access_token");
        }
        
        return null;
    }
官方给的实例代码很完善,在使用时只须要替换本身的 API keySecret Key就好了。这里我根据本身的编程习惯,进行了一点改动。使用 restTemplate进行第三方请求。

人脸检测

接下来,咱们就能够根据获取的token进行人脸检测

/**
     * 人脸检测
     * @return  返回检测信息
     */
    @Override
    public String detect() {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/detect";
        try {
            Map<String, Object> map = new HashMap<>();
            map.put("image", "027d8308a2ec665acb1bdf63e513bcb9");
            map.put("face_field", "faceshape,facetype");
            map.put("image_type", "face_token");

            String param = GsonUtils.toJson(map);

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过时时间, 客户端可自行缓存,过时后从新获取。
            String accessToken = this.getAuth();

            String result = HttpUtil.post(url, accessToken, "application/json", param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

上面使用的HttpUtilGsonUtils请到官网中自行下载。

在图片的参数处,咱们使用了face_token,这是我以前请求过一次获得的,每张图片屡次请求,都会获得一个惟一的face_token。可是实际状况下,咱们大多数是不知道face_token的,这里只是为了简短代码。

clipboard.png

他还支持URLbase64的图片格式,可是有时限于网络缘由,使用URL方式可能会很慢,因此,在实际的请求中,建议选择base64的方式检查图片。

最后返回的信息以下:

clipboard.png

人脸对比

人脸对比,能够用在身份认证。好比咱们使用人脸登陆的时候就可使用。

如今咱们使用两张照片进行比对:

/**
     * 图片比对
     * @return 对比结果
     */
    @Override
    public String match() {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/match";
        try {

            byte[] bytes1 = FileUtil.readFileByBytes("src/main/resources/static/test.jpg");
            byte[] bytes2 = FileUtil.readFileByBytes("src/main/resources/static/test1.jpg");
            String image1 = Base64Util.encode(bytes1);
            String image2 = Base64Util.encode(bytes2);

            List<Map<String, Object>> images = new ArrayList<>();

            Map<String, Object> map1 = new HashMap<>();
            map1.put("image", image1);
            map1.put("image_type", "BASE64");
            map1.put("face_type", "LIVE");
            map1.put("quality_control", "LOW");
            map1.put("liveness_control", "NORMAL");

            Map<String, Object> map2 = new HashMap<>();
            map2.put("image", image2);
            map2.put("image_type", "BASE64");
            map2.put("face_type", "LIVE");
            map2.put("quality_control", "LOW");
            map2.put("liveness_control", "NORMAL");

            images.add(map1);
            images.add(map2);

            String param = GsonUtils.toJson(images);

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过时时间, 客户端可自行缓存,过时后从新获取。
            String accessToken = this.getAuth();

            String result = HttpUtil.post(url, accessToken, "application/json", param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

咱们的请求参数中,后面的三个是对照片的限制:

clipboard.png

而后获取的结果相似以下:

clipboard.png

具体含义请参照官方文档。

总结

本文只是实现了对两张照片的比对,可是实际的状况,不少时候会用到人脸采集,可是笔者在这里注册不了企业信息,因此就只能作个低配版的了:将动态采集变成静态图片比对。


官方文档:

https://ai.baidu.com/docs#/Fa...

相关文章
相关标签/搜索