本學期的android實驗
,打算作一款關於小應用,其中打算使用人臉識別
技術,因此找到了百度AI
,免費的開放API,爲個人實驗帶來了極大的便利。java
要使用百度AI的接口,首先咱們要註冊一個帳號,而後建立應用:android
而後表單填寫,勾選你想使用的接口。我這裏就默認了。編程
最後建立好後,你會獲得這樣的一組信息:json
這在後面咱們調用接口的時候回用到。api
好了,接下來,咱們就開始API的使用。緩存
首先,咱們要清楚大概的過程,要進行人臉的識別,首先要先獲取人臉的信息,也就是人臉檢測
。咱們先檢測出人臉的相關信息,而後才能進行比對,就是人臉對比
。因此咱們須要使用兩個接口人臉檢測
和人臉對比
。(相關的說明文檔,我在本文最後會給出連接。)網絡
在調用百度的API以前,首先須要獲取到token。app
這裏不得不給百度點個贊,示例代碼有各類語言,共不一樣需求的開發者使用ide
這裏我是用的是java
。post
/** * 獲取權限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 key
和Secret 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; }
上面使用的HttpUtil
和GsonUtils
請到官網中自行下載。
在圖片的參數處,咱們使用了face_token
,這是我以前請求過一次獲得的,每張圖片屢次請求,都會獲得一個惟一的face_token
。可是實際狀況下,咱們大多數是不知道face_token
的,這裏只是爲了簡短代碼。
他還支持URL
和base64
的圖片格式,可是有時限於網絡緣由,使用URL方式可能會很慢,因此,在實際的請求中,建議選擇base64
的方式檢查圖片。
最後返回的信息以下:
人臉對比,能夠用在身份認證。好比咱們使用人臉登陸的時候就可使用。
如今咱們使用兩張照片進行比對:
/** * 圖片比對 * @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; }
咱們的請求參數中,後面的三個是對照片的限制:
而後獲取的結果相似以下:
具體含義請參照官方文檔。
本文只是實現了對兩張照片的比對,可是實際的狀況,不少時候會用到人臉採集,可是筆者在這裏註冊不了企業信息,因此就只能作個低配版的了:將動態採集
變成靜態圖片
比對。
官方文檔: