藉助百度雲API進行人臉識別

前言:本篇博客是筆者第一次使用百度雲api進行人臉檢測,主要內容包括兩部分,一是獲取接口,二是藉助接口進行人臉檢測。筆者也是初步瞭解這方面的內容,也是參考了雜七雜八的博文,內容可能存在錯誤及其餘毛病,歡迎指出。javascript

 

1:在百度AI裏面建立應用css

在百度AI開放平臺使用百度的人臉識別能力,只須要三個核心步驟便可操做完成:html

  • 獲取接口權限
  • 準備接口調用工具
  • 進行接口調用。

獲取接口權限java

獲取接口權限是調用接口的前提,主要分爲如下幾步:程序員

一、進入百度雲的人臉識別控制檯apache

地址:json

https://console.bce.baidu.com/ai/?_=1528192333418&fromai=1#/ai/face/overview/index

若沒有百度帳號,能夠用手機號快速註冊一個。api

二、建立人臉識別應用數組

帳號登陸成功,您須要建立應用纔可正式調用AI能力。應用是您調用API服務的基本操做單元,您能夠基於應用建立成功後獲取的API Key及Secret Key,進行接口調用操做,及相關配置。bash

建立應用,填寫【應用名稱】和【應用描述】,便可建立應用(其餘選項能夠不作操做,使用默認值便可)

建立完成後,點擊「返回應用列表」進行下一步操做。

三、獲取祕鑰

在您建立完畢應用後,平臺將會分配給您此應用的相關憑證:API Key、Secret Key。使用祕鑰將能夠在下一步中獲取調用接口所需的Access Token。

獲取調用接口所需的Access Token

人臉識別在線接口主要針對HTTP API調用者,,調用API時必須在URL中帶上accesss_token參數,獲取Access Token的流程以下:

A、若是您使用的是mac電腦能夠將此示例代碼複製到「終端」上直接獲取token。示例代碼以下:

#!/bin/bash curl -i -k'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【API Key】&client_secret=【Seceret Key】

B、非Mac電腦操做流程以下,參考文檔:http://ai.baidu.com/docs#/Auth/top

獲取Access Token

請求URL數據格式

向受權服務地址https://aip.baidubce.com/oauth/2.0/token發送請求(推薦使用POST),並在URL中帶上如下參數:

  • grant_type: 必須參數,固定爲client_credentials;
  • client_id: 必須參數,應用的API Key;
  • client_secret: 必須參數,應用的Secret Key;

例如:

https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&

服務器返回的JSON文本參數以下:

  • access_token: 要獲取的Access Token;
  • expires_in: Access Token的有效期(秒爲單位,通常爲1個月);
  • 其餘參數忽略,暫時不用;

例如:

{
    "refresh_token": "25.b55fe1d287227ca97aab219bb249b8ab.315360000.1798284651.282335-8574074",
    "expires_in": 2592000,
    "scope": "public wise_adapt",
    "session_key": "9mzdDZXu3dENdFZQurfg0Vz8slgSgvvOAUebNFzyzcpQ5EnbxbF+hfG9DQkpUVQdh4p6HbQcAiz5RmuBAja1JJGgIdJI",
    "access_token": "24.6c5e1ff107f0e8bcef8c46d3424a0e78.2592000.1485516651.282335-8574074",
    "session_secret": "dfac94a3489fe9fca7c3221cbf7525ff"
}

 

若請求錯誤,服務器將返回的JSON文本包含如下參數:

  • error: 錯誤碼;關於錯誤碼的詳細信息請參考下方鑑權認證錯誤碼。
  • error_description: 錯誤描述信息,幫助理解和解決發生的錯誤。



例如認證失敗返回:

{
    "error": "invalid_client", "error_description": "unknown client id" }

保存獲取到的Access Token,在調用接口時會用到。

二、  準備接口調用工具

Postman是一個比較給力的Http請求模擬工具,能夠快速進行接口調用。

沒有安裝的小夥伴能夠?下方 嘿 順便把它還學了一遍

程序員必備工具:PostMan

安裝結束後進入主界面

以下圖,這就是Postman的主界面。

四、  進行調用接口

在postman上能夠快速進行接口請求,調用人臉識別接口須要輸入正確的接口地址,提早準備人臉圖片,具體以下:

輸入請求地址

可直接複製的請求地址:「https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=【在第一步中獲取的access-token】」

注:須要將請求格式切換爲「Post」

修改請求頭(header)

Key欄輸入:Content-Type

Value欄輸入:application/x-www-form-urlencoded

輸入請求參數(body)

先選擇「x-www-form-urlencoded」,而後參考下圖輸入參數:

  • image_type=BASE64
  • image=圖片的base64轉碼後的結果(此處要使用即將註冊到人臉庫的人臉圖片),轉碼工具:https://tool.css-js.com/base64.html(注意:在base64轉碼工具中,要取消默認選項「包含頭」)
  • group_id=gropu001(可自定義:由數字、字母、下劃線組成)
  • user_id=0001(可自定義:由數字、字母、下劃線組成)

注意:在base64轉碼工具中,要取消默認選項「包含頭」

開始請求

點擊右上角的「send」,便可請求成功。

驗證調用結果

進入百度雲後臺的人臉庫可視化管理界面,點擊人臉庫名稱並逐級進入到人臉維度,便可看到註冊成功的人臉圖片(注:調用在線API接口添加用戶後,會延遲幾分鐘再展現到此頁面,若是沒更新,請勿着急)

 

2調用api進行人臉對比。

 1 package Test1;
 2 
 3 import com.baidu.aip.face.AipFace;
 4 import com.baidu.aip.face.MatchRequest;
 5 import com.baidu.aip.util.Base64Util;
 6 import com.google.common.collect.Lists;
 7 import org.apache.commons.io.FileUtils;
 8 import org.json.JSONObject;
 9 
10 import java.io.File;
11 import java.io.IOException;
12 import java.util.List;
13 
14 /**
15  * 人臉對比
16  */
17 public class BaiduFaceTest {
18 
19 // 這裏填寫你本身應用的三項
20     public static final String APP_ID = "16090420";
21     public static final String API_KEY = "iinpWTE1pvOnH3YNmk4tG5Z6";
22     public static final String SECRET_KEY = "LMl3pgidH2AzGcTnOM3qh1x3GFnh6jt5";
23 
24 
25 
26     public static void main(String[] args) throws IOException {
27         AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
28 
29         String image1 = "C:\\Users\\19575\\Pictures\\Saved Pictures\\紫霞仙子\\a.jpg";
30         String image2 = "C:\\Users\\19575\\Pictures\\Saved Pictures\\紫霞仙子\\b.jpg";
31 
32 
33         byte[] b1 = FileUtils.readFileToByteArray(new File(image1));
34         byte[] b2 = FileUtils.readFileToByteArray(new File(image2));
35 
36 
37         String s1 = Base64Util.encode(b1);
38         String s2 = Base64Util.encode(b2);
39 
40 
41 
42         MatchRequest req1 = new MatchRequest(s1, "BASE64");
43         MatchRequest req2 = new MatchRequest(s2, "BASE64");
44 
45         List<MatchRequest> list = Lists.newArrayList();
46         list.add(req1);
47         list.add(req2);
48 
49         JSONObject rs = client.match(list);
50         System.out.println(rs.toString(2));
51 
52     }
53 
54 }
View Code

該代碼要導入百度雲的sdk,這是我用的sdk連接:https://files.cnblogs.com/files/henuliulei/aip-java-sdk-4.11.1.zip

以及用到的另外兩個jar包

用到的兩張圖片以下,都是紫霞仙子
 

 

 

程序運行結果以下:

{
  "result": {
    "score": 94.56459045,
    "face_list": [
      {"face_token": "7e88487df6dba99d358a14e503ae54c4"},
      {"face_token": "ec1a03aba650adc1a7a9fcaca62a0414"}
    ]
  },
  "log_id": 305486860102237231,
  "error_msg": "SUCCESS",
  "cached": 0,
  "error_code": 0,
  "timestamp": 1556010223
}

得分爲94點多,因此基本能夠斷定兩張圖片是同一我的臉(通常得分大於80就能夠認爲是同一我的)

 

3:調用api進行人臉匹配(就是在一堆圖片中看有沒有要被匹配的圖片)

代碼:

 1 package Test1;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.util.HashMap;
 7 
 8 import org.json.JSONObject;
 9 
10 import com.baidu.aip.face.AipFace;
11 
12 import sun.misc.BASE64Encoder;
13 
14 /**
15  * 人臉對比
16  */
17 public class BaiduFaceTest {
18 
19 // 這裏填寫你本身應用的三項
20     public static final String APP_ID = "16090420";
21     public static final String API_KEY = "iinpWTE1pvOnH3YNmk4tG5Z6";
22     public static final String SECRET_KEY = "LMl3pgidH2AzGcTnOM3qh1x3GFnh6jt5";
23 
24 
25 
26     public static void main(String[] args) throws IOException {
27         AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
28 
29         String image1 = "C:\\Users\\19575\\Pictures\\Saved Pictures\\紫霞仙子\\c.jpg";
30         System.out.println(image1);
31         String image2 = "C:\\Users\\19575\\Pictures\\Saved Pictures\\紫霞仙子\\b.jpg";
32        
33         String msg=GetImageStr(image1);
34           JSONObject rs = client.search(msg, "BASE64", "group002", new HashMap<>());
35        // JSONObject rs=client.detect(image1, "URL", new HashMap<>());
36         System.out.println(rs.toString(2));
37 
38     }
39     public static String GetImageStr(String imgFile)  
40     {//將圖片文件轉化爲字節數組字符串,並對其進行Base64編碼處理  
41         InputStream in = null;  
42         byte[] data = null;  
43         //讀取圖片字節數組  
44         try   
45         {  
46             in = new FileInputStream(imgFile);          
47             data = new byte[in.available()];  
48             in.read(data);  
49             in.close();  
50         }   
51         catch (IOException e)   
52         {  
53             e.printStackTrace();  
54         }  
55         //對字節數組Base64編碼  
56         BASE64Encoder encoder = new BASE64Encoder();  
57         return encoder.encode(data);//返回Base64編碼過的字節數組字符串  
58     }  
59 
60 
61 }
View Code
 1 {
 2   "result": {
 3     "face_token": "93299a14e0a246dcc5b4cc5484341ea4",
 4     "user_list": [{
 5       "score": 100,
 6       "group_id": "group002",
 7       "user_id": "user1",
 8       "user_info": ""
 9     }]
10   },
11   "log_id": 305486860288576101,
12   "error_msg": "SUCCESS",
13   "cached": 0,
14   "error_code": 0,
15   "timestamp": 1556028857
16 }

結果滿分,說明存在,同時"group_id": "group002","user_id": "user1",指明瞭具體的位置。

我的表示在實現上個代碼花了很長時間,遇到了各類錯誤,其中最主要的仍是下面兩種。

1:使用identifyUser()報錯

解決辦法已經在我這篇博客講明:http://www.javashuo.com/article/p-wkznxyac-hb.html

2:即便用和庫裏面相同的圖片,檢測結果也是0,

解決辦法已經在我這篇博客講明:http://www.javashuo.com/article/p-ffeybqua-gy.html

 4:調用api進行人臉檢測

 1 package Test1;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.util.HashMap;
 7 
 8 import org.json.JSONObject;
 9 
10 import com.baidu.aip.face.AipFace;
11 
12 import sun.misc.BASE64Encoder;
13 
14 /**
15  * 人臉對比
16  */
17 public class BaiduFaceTest {
18 
19 // 這裏填寫你本身應用的三項
20     public static final String APP_ID = "16090420";
21     public static final String API_KEY = "iinpWTE1pvOnH3YNmk4tG5Z6";
22     public static final String SECRET_KEY = "LMl3pgidH2AzGcTnOM3qh1x3GFnh6jt5";
23 
24 
25 
26     public static void main(String[] args) throws IOException {
27         AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
28 
29         String image1 = "C:\\Users\\19575\\Pictures\\Saved Pictures\\紫霞仙子\\b.jpg";
30        
31         String msg=GetImageStr(image1);
32          sample(client,msg);
33 
34     }
35     public static String GetImageStr(String imgFile)  
36     {//將圖片文件轉化爲字節數組字符串,並對其進行Base64編碼處理  
37         InputStream in = null;  
38         byte[] data = null;  
39         //讀取圖片字節數組  
40         try   
41         {  
42             in = new FileInputStream(imgFile);          
43             data = new byte[in.available()];  
44             in.read(data);  
45             in.close();  
46         }   
47         catch (IOException e)   
48         {  
49             e.printStackTrace();  
50         }  
51         //對字節數組Base64編碼  
52         BASE64Encoder encoder = new BASE64Encoder();  
53         return encoder.encode(data);//返回Base64編碼過的字節數組字符串  
54     }  
55     public static void sample(AipFace client,String msg) {
56         // 傳入可選參數調用接口
57         HashMap<String, String> options = new HashMap<String, String>();
58         options.put("face_field", "age");
59         options.put("max_face_num", "2");
60         options.put("face_type", "LIVE");
61 
62         String image = msg;
63         String imageType = "BASE64";
64 
65         // 人臉檢測
66         JSONObject res = client.detect(image, imageType, null);
67         System.out.println(res.toString(2));
68 
69     }
70 
71 
72 }
View Code

運行結果以下,能夠獲得人臉的各類信息。

 1 {
 2   "result": {
 3     "face_num": 1,
 4     "face_list": [{
 5       "angle": {
 6         "roll": 15.52,
 7         "pitch": 5.23,
 8         "yaw": -19.37
 9       },
10       "face_token": "456e1e3b70e535d5e2cce32317018510",
11       "location": {
12         "top": 54.95,
13         "left": 174.35,
14         "rotation": 16,
15         "width": 139,
16         "height": 139
17       },
18       "face_probability": 1
19     }]
20   },
21   "log_id": 304569260325958791,
22   "error_msg": "SUCCESS",
23   "cached": 0,
24   "error_code": 0,
25   "timestamp": 1556032595
26 }

這是百度雲的接口說明:https://cloud.baidu.com/doc/FACE/Face-Java-SDK.html#.E4.BA.BA.E8.84.B8.E6.A3.80.E6.B5.8B

其餘接口的使用請自行參考,這裏再也不細述。

reference

https://cloud.tencent.com/developer/article/1169345

相關文章
相關標籤/搜索