通過百度人臉對比API進行人臉對比
阿新 • • 發佈:2019-01-10
百度人臉對比API的使用
今天突然有興趣想做個人臉識別的小demo
效果如下:
步驟:
第一步,需要建立一個百度賬號,申請自己的AppID, API Key和Secret Key
地址為:http://ai.baidu.com/tech/face/compare
第二步:官網下載SDK,匯入jar包到專案中,官網提供了下載地址
下面是對比兩張圖片的人臉的藉口呼叫方法
返回結果為json字串:
{"error_code":0,"error_msg":"SUCCESS","log_id":3017296944,"timestamp":1527427917,"cached":0,
"result":{"score":93.78884125,"face_list":[{"face_token":"a29943d3b09c7ea637070f5ec40228ea"},{"face_token":"6c588b50c9c14f12721e6f4d5383b102"}]}}
其中"score"為:兩張人臉的相識度(0~100),建議為80以上,"face_token"為兩張人臉圖片的唯一標識,我們只需要解釋json字串獲取score就行了
呼叫介面的方法 * 重要提示程式碼中所需工具類 * FileUtil,Base64Util,HttpUtil,GsonUtils請從 * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72 * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3 * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3 * 下載 */ public static String match() { // 請求url String url = "https://aip.baidubce.com/rest/2.0/face/v3/match"; try { byte[] bytes1 = FileUtil.readFileByBytes("【本地檔案1地址】"); byte[] bytes2 = FileUtil.readFileByBytes("【本地檔案2地址】"); 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 = "【呼叫鑑權介面獲取的token】"; String result = HttpUtil.post(url, accessToken, "application/json", param); System.out.println(result); return result; } catch (Exception e) { e.printStackTrace(); } return null; }
下面是獲取token的方法:
/** * 獲取許可權token * */ public static String getAuth() { // 官網獲取的 API Key 更新為你註冊的 String clientId = "WrI9oUhvrG0GHngIFioNKxki"; // 官網獲取的 Secret Key 更新為你註冊的 String clientSecret = "WfGDqAyom7t8wunqYUM4sAw0SBhjlBZj"; return getAuth(clientId, clientSecret); } /** * 獲取API訪問token 該token有一定的有效期,需要自行管理,當失效時需重新獲取. * * @param ak * - 百度雲官網獲取的 API Key * @param sk * - 百度雲官網獲取的 Securet Key * @return assess_token 示例: * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567" */ public static String 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; } /** * 返回結果示例 */ JSONObject jsonObject = new JSONObject(result); String access_token = jsonObject.getString("access_token"); return access_token; } catch (Exception e) { System.err.printf("獲取token失敗!"); e.printStackTrace(System.err); } return null; }
獲得了兩張人臉圖片的相識度之後,親們就可以根據自己的情況做邏輯處理了。
由於方法返回的是一串json字串,下面是我的對json的解析獲取score
String res = faceMatch(base64,user.toString());//這是我自己修改過的人臉對比方法,只是加了引數,返回結果的格式不變
JsonObject jObject = new JsonParser().parse(res).getAsJsonObject();
JsonElement jsonElement = jObject.get("result");
float score = 0;
if(!jsonElement.isJsonNull()){ //人臉對比出錯的話,這裡是空的
score = jsonElement.getAsJsonObject().get("score").getAsFloat();
}
希望對大家有所幫助,
本人目前也是小白,如果有不明白的,歡迎加我QQ 1326140450進行交流指導。
轉載請註明出處