1. 程式人生 > >通過百度人臉對比API進行人臉對比

通過百度人臉對比API進行人臉對比

百度人臉對比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進行交流指導。

轉載請註明出處