前言:本篇博客是筆者第一次使用百度雲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中帶上如下參數:
例如:
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&
服務器返回的JSON文本參數以下:
例如:
{ "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": "invalid_client", "error_description": "unknown client id" }
保存獲取到的Access Token,在調用接口時會用到。
二、 準備接口調用工具
Postman是一個比較給力的Http請求模擬工具,能夠快速進行接口調用。
沒有安裝的小夥伴能夠?下方 嘿 順便把它還學了一遍
安裝結束後進入主界面
以下圖,這就是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」,而後參考下圖輸入參數:
注意:在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 }
該代碼要導入百度雲的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 }
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 }
運行結果以下,能夠獲得人臉的各類信息。
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: