百度人臉識別

序言

本學期的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...

相關文章
相關標籤/搜索