借助百度云API进行人脸识别
前言:本篇博客是筆者第一次使用百度云api進行人臉檢測,主要內容包括兩部分,一是獲取接口,二是借助接口進行人臉檢測。筆者也是初步了解這方面的內容,也是參考了雜七雜八的博文,內容可能存在錯誤及其他毛病,歡迎指出。
1:在百度AI里面創建應用
在百度AI開放平臺使用百度的人臉識別能力,只需要三個核心步驟即可操作完成:
獲取接口權限
準備接口調用工具
進行接口調用。
獲取接口權限
獲取接口權限是調用接口的前提,主要分為以下幾步:
1、進入百度云的人臉識別控制臺
地址:
https://console.bce.baidu.com/ai/?_=1528192333418&fromai=1#/ai/face/overview/index
若沒有百度賬號,可以用手機號快速注冊一個。
2、創建人臉識別應用
賬號登錄成功,您需要創建應用才可正式調用AI能力。應用是您調用API服務的基本操作單元,您可以基于應用創建成功后獲取的API Key及Secret Key,進行接口調用操作,及相關配置。
創建應用,填寫【應用名稱】和【應用描述】,即可創建應用(其他選項可以不做操作,使用默認值即可)
創建完成后,點擊“返回應用列表”進行下一步操作。
3、獲取秘鑰
在您創建完畢應用后,平臺將會分配給您此應用的相關憑證: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,在調用接口時會用到。
2、 準備接口調用工具
Postman是一個比較給力的Http請求模擬工具,可以快速進行接口調用。
沒有安裝的小伙伴可以?下方 嘿 順便把它還學了一遍
程序員必備工具:PostMan
安裝結束后進入主界面
如下圖,這就是Postman的主界面。
4、 進行調用接口
在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包
https://files.cnblogs.com/files/henuliulei/google-collect-1.0.jar.zip
https://files.cnblogs.com/files/henuliulei/commons-io-2.6-bin.zip
用到的兩張圖片如下,都是紫霞仙子
程序運行結果如下:
{
"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()報錯
解決辦法已經在我這篇博客講明:https://www.cnblogs.com/henuliulei/p/10759473.html
2:即使用和庫里面相同的圖片,檢測結果也是0,
解決辦法已經在我這篇博客講明:https://www.cnblogs.com/henuliulei/p/10759567.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
總結
以上是生活随笔為你收集整理的借助百度云API进行人脸识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言中void arrout,c语言学
- 下一篇: 科幻惊悚片《梅根》确认引进:AI 玩偶变