乾貨 | AI人臉識別之人臉搜尋

京東科技開發者發表於2019-10-18
乾貨 | AI人臉識別之人臉搜尋


本文件將利用京東雲AI SDK來實踐人臉識別中的人臉搜尋功能,主要涉及到分組建立/刪除、分組列表獲取、人臉建立/刪除、人臉搜尋,本次實操的最終效果是: 建立一個人臉庫,拿一張圖片在人臉庫中搜尋出相似度最高的一張,實現1:N的人臉識別,操作示意圖如下:

乾貨 | AI人臉識別之人臉搜尋

一、準備工作

1. 建立AK/SK

登陸京東雲控制檯:,點選右上角賬戶 AccessKey 管理,接著如圖點選 建立Access Key
乾貨 | AI人臉識別之人臉搜尋

2. 購買人臉搜尋服務

人臉搜尋透過 API 呼叫次數計費,目前人臉搜尋功能有 0元免費試用,呼叫量限制為 13
我們登陸到京東雲控制檯,依次點選左側導航 人工智慧- 人臉識別- 人臉搜尋,點選 立即購買完成購買操作。
乾貨 | AI人臉識別之人臉搜尋

3.下載SDK

購買完成後,返回人臉搜尋的控制檯,如圖點選 下載SDK完成京東雲AI SDK的下載操作
乾貨 | AI人臉識別之人臉搜尋
乾貨 | AI人臉識別之人臉搜尋

4.下載Eclipse並安裝

Eclipse下載地址:,Eclipse安裝方法請自行百度。

二、實操開始

1.新建JAVA專案

開啟Eclipse,依次點選 File- New- Java Project,輸入 Project name如下圖設定後,點選 Finish- Don't Create
乾貨 | AI人臉識別之人臉搜尋


右擊JAVA專案中的 src目錄,依次點選 new- Package

乾貨 | AI人臉識別之人臉搜尋
乾貨 | AI人臉識別之人臉搜尋


接下來我們分別建立分組建立( faceGroupCreate)/刪除( faceGroupDelete)、分組列表獲取( getFaceGroupList)、人臉建立( faceCreate)/刪除( faceDelete)、人臉搜尋( faceSearch)相關的 (類)Class,新建 Class的方法如下:

乾貨 | AI人臉識別之人臉搜尋
乾貨 | AI人臉識別之人臉搜尋


全部Class建立完成後如下圖:

乾貨 | AI人臉識別之人臉搜尋

2.裝載京東雲AI SDK

將我們下載好的京東雲AI SDK解壓,然後複製到我們新建的JAVA專案的根目錄裡
乾貨 | AI人臉識別之人臉搜尋


重新整理Eclipse中的 Package Explorer便可看到我們複製進來的京東雲AI SDK檔案,選中全部jar包檔案,右擊,依次點選 Build Path- Add to Build Path來重新構建路徑(Build Path)

乾貨 | AI人臉識別之人臉搜尋


重新構建路徑完成後,我們在Eclipse的 Package Explorer中可看到 Referenced Libraries,裡面包含我們重構路徑的所有jar包

乾貨 | AI人臉識別之人臉搜尋

3.除錯介面

建立分組(faceGroupCreate)

faceGroupCreate類中輸入如下內容作為除錯程式碼
 1package facesearch;

2
3import com.jdcloud.apigateway.signature.JdcloudSDKClient;
4import com.jdcloud.sdk.utils.BinaryUtils;
5import com.google.api.client.http.HttpResponse;
6import java.io.IOException;
7import java.util.HashMap;
8import java.util.Map;
9
10import static com.jdcloud.sdk.http.Protocol.HTTP;
11
12//建立分組
13public class faceGroupCreate {
14    public static void main(String[] args) {
15        String accessKey = "請輸入您的AK";
16        String secretKey = "請輸入您的SK";
17        String endPoint = "aiapi.jdcloud.com";
18        String path = "/jdai/faceGroupCreate";
19        String method = "POST";
20        Map<String, String> headers = new HashMap<>();
21        Map<String, Object> queryMap = new HashMap<>();
22        //queryMap.put("groupId", "10");
23        queryMap.put("groupName", "請輸入分組名稱");
24        queryMap.put("groupInfo", "請輸入分組描述");
25        String body = "\"\"";
26        try {
27            HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
28                endPoint, path, method, headers, queryMap, body);
29            System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
30        } catch (IOException e) {
31            System.out.println(e.getMessage());
32        }
33    }
34}
乾貨 | AI人臉識別之人臉搜尋


右擊程式碼依次點選 Run as- 1 Java Application執行程式碼

乾貨 | AI人臉識別之人臉搜尋


執行後發現報錯資訊如下( 這裡雖然有報錯,但我們定義的名稱為 請輸入分組名稱 的組已成功建立):

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: Defaulting to no-operation (NOP) logger implementationSLF4J: See for further details.
乾貨 | AI人臉識別之人臉搜尋


由此我們可以看出,報出錯誤的地方主要是slf4j的jar包,而故障碼中 Failed to load class "org.slf4j.impl.StaticLoggerBinder"的意思則是 載入類檔案org.slf4j.impl.StaticLoggerBinder時失敗

我們下載 slf4j-nop.jar,然後像新增AI SDK jar包一樣新增到build path中即可解決問題, slf4j-nop.jarjar包我已打包上傳到京東雲物件儲存,下載地址為:
將slf4j包下載後複製到京東雲AI SDK資料夾裡,然後在Eclipse內新增到構建路徑裡即可
乾貨 | AI人臉識別之人臉搜尋


接下來依次建立其他類檔案

注意:如下程式碼中涉及到 String body = "imageBase64=";的部分 需要先將圖片轉換為Base64,轉換地址為:; 然後將轉換後的程式碼複製到 imageBase64=之後(轉換後的程式碼需去除掉“ data:image/jpeg;base64,”後再複製)。

刪除分組(`faceGroupDelete`)

 1package facesearch;

2
3import com.jdcloud.apigateway.signature.JdcloudSDKClient;
4import com.jdcloud.sdk.utils.BinaryUtils;
5import com.google.api.client.http.HttpResponse;
6import java.io.IOException;
7import java.util.HashMap;
8import java.util.Map;
9
10import static com.jdcloud.sdk.http.Protocol.HTTP;
11
12//刪除分組
13public class faceGroupDelete {
14    public static void main(String[] args) {
15        String accessKey = "請輸入您的AK";
16        String secretKey = "請輸入您的SK";
17        String endPoint = "aiapi.jdcloud.com";
18        String path = "/jdai/faceGroupDelete";
19        String method = "POST";
20        Map<String, String> headers = new HashMap<>();
21        Map<String, Object> queryMap = new HashMap<>();
22        //queryMap.put("groupId", "10");
23        queryMap.put("groupName", "請輸入分組名稱");
24        String body = "{}";
25        try {
26            HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
27                endPoint, path, method, headers, queryMap, body);
28            System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
29        } catch (IOException e) {
30            System.out.println(e.getMessage());
31        }
32    }
33}

分組列表獲取(`getFaceGroupList`)

 1package facesearch;

2
3import com.jdcloud.apigateway.signature.JdcloudSDKClient;
4import com.jdcloud.sdk.utils.BinaryUtils;
5import com.google.api.client.http.HttpResponse;
6import java.io.IOException;
7import java.util.HashMap;
8import java.util.Map;
9
10import static com.jdcloud.sdk.http.Protocol.HTTP;
11
12//獲取分組列表
13public class getFaceGroupList {
14    public static void main(String[] args) {
15        String accessKey = "請輸入您的AK";
16        String secretKey = "請輸入您的SK";
17        String endPoint = "aiapi.jdcloud.com";
18        String path = "/jdai/getFaceGroupList";
19        String method = "POST";
20        Map<String, String> headers = new HashMap<>();
21        Map<String, Object> queryMap = new HashMap<>();
22        queryMap.put("start", "0");
23        queryMap.put("length", "5");
24        String body = "aaa";
25        try {
26            HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
27                endPoint, path, method, headers, queryMap, body);
28            System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
29        } catch (IOException e) {
30            System.out.println(e.getMessage());
31        }
32    }
33}

人臉建立(`faceCreate`)

 1package facesearch;

2
3import com.jdcloud.apigateway.signature.JdcloudSDKClient;
4import com.jdcloud.sdk.utils.BinaryUtils;
5import com.google.api.client.http.HttpResponse;
6import java.io.IOException;
7import java.util.HashMap;
8import java.util.Map;
9
10import static com.jdcloud.sdk.http.Protocol.HTTP;
11
12//建立人臉
13public class faceCreate {
14    public static void main(String[] args) {
15        String accessKey = "請輸入您的AK";
16        String secretKey = "請輸入您的SK";
17        String endPoint = "aiapi.jdcloud.com";
18        String path = "/jdai/faceCreate";
19        String method = "POST";
20        //建立
21        Map<String, String> dataMap = new HashMap<>();
22        //線上圖片轉base64:
23        dataMap.put("marin1", "imageBase64=圖片轉換為Base64後的程式碼(去掉前面的data:image/jpeg;base64,)");
24        dataMap.put("marin2", "imageBase64=圖片轉換為Base64後的程式碼(去掉前面的data:image/jpeg;base64,)");
25        dataMap.put("corona", "imageBase64=圖片轉換為Base64後的程式碼(去掉前面的data:image/jpeg;base64,)");
26        dataMap.put("dog", "imageBase64=圖片轉換為Base64後的程式碼(去掉前面的data:image/jpeg;base64,)");
27        Map<String, String> headers = new HashMap<>();
28        Map<String, Object> queryMap = new HashMap<>();
29        queryMap.put("groupName", "請輸入分組名稱");
30        String body;
31        for (Map.Entry<String, String> entry: dataMap.entrySet()){
32            queryMap.put("outerId", entry.getKey());
33            body = entry.getValue();
34            try {
35                HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
36                    endPoint, path, method, headers, queryMap, body);
37                System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
38            } catch (IOException e) {
39                System.out.println(e.getMessage());
40            }
41            queryMap.remove("outerId");
42        }
43    }
44}

人臉刪除(`faceDelete`)

 1package facesearch;

2
3import com.jdcloud.apigateway.signature.JdcloudSDKClient;
4import com.jdcloud.sdk.utils.BinaryUtils;
5import com.google.api.client.http.HttpResponse;
6import java.io.IOException;
7import java.util.HashMap;
8import java.util.Map;
9
10import static com.jdcloud.sdk.http.Protocol.HTTP;
11
12//刪除人臉
13public class faceDelete {
14    public static void main(String[] args) {
15        String accessKey = "請輸入您的AK";
16        String secretKey = "請輸入您的SK";
17        String endPoint = "aiapi.jdcloud.com";
18        String path = "/jdai/faceDelete";
19        String method = "POST";
20        Map<String, String> headers = new HashMap<>();
21        Map<String, Object> queryMap = new HashMap<>();
22        queryMap.put("groupName", "請輸入分組名稱");
23        queryMap.put("outerId", "marin1");
24        queryMap.put("outerId", "marin2");
25        queryMap.put("outerId", "corona");
26        queryMap.put("outerId", "dog");
27        String body = "{}";
28        try {
29            HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
30                endPoint, path, method, headers, queryMap, body);
31            System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
32        } catch (IOException e) {
33            System.out.println(e.getMessage());
34        }
35    }
36}

人臉搜尋(`faceSearch`)

 1package facesearch;

2
3import com.jdcloud.apigateway.signature.JdcloudSDKClient;
4import com.jdcloud.sdk.utils.BinaryUtils;
5import com.google.api.client.http.HttpResponse;
6import java.io.IOException;
7import java.util.HashMap;
8import java.util.Map;
9
10import static com.jdcloud.sdk.http.Protocol.HTTP;
11
12//人臉搜尋
13public class faceSearch {
14    public static void main(String[] args) {
15        String accessKey = "請輸入您的AK";
16        String secretKey = "請輸入您的SK";
17        String endPoint = "aiapi.jdcloud.com";
18        String path = "/jdai/faceSearch";
19        String method = "POST";
20        Map<String, String> headers = new HashMap<>();
21        Map<String, Object> queryMap = new HashMap<>();
22        queryMap.put("groupName", "請輸入分組名稱");
23        //如下填寫同一人的第三張人臉Base64程式碼進行人臉搜尋,這裡用人臉marin.jpg
24        String body = "imageBase64=圖片轉換為Base64後的程式碼(去掉前面的data:image/jpeg;base64,)";
25        try {
26            HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
27                endPoint, path, method, headers, queryMap, body);
28            System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
29        } catch (IOException e) {
30            System.out.println(e.getMessage());
31        }
32    }
33}

4.進行演示

如下演示都透過右擊對應的程式碼執行 Run as- 1 Java Application來執行程式碼檢視結果

建立分組

執行 faceGroupCreate.java,結果如下:
乾貨 | AI人臉識別之人臉搜尋

獲取分組列表

執行 getFaceGroupList.java,結果如下:
乾貨 | AI人臉識別之人臉搜尋

建立人臉庫

執行 faceCreate.java,結果如下:
乾貨 | AI人臉識別之人臉搜尋

人臉搜尋

執行 faceSearch.java,結果如下:
乾貨 | AI人臉識別之人臉搜尋

刪除人臉

執行 faceDelete.java,結果如下:
乾貨 | AI人臉識別之人臉搜尋

刪除分組

執行 faceGroupDelete.java,結果如下:
乾貨 | AI人臉識別之人臉搜尋


如上,我們透過 marin1.jpgmarin2.jpgcorona.jpgdog.jpg建立了人臉庫,最後透過 marin.jpg將相似度最高的 marin1.jpg搜尋了出來,至此,操作演示完畢~~


點選“ 京東雲 ”瞭解京東雲人臉對比


歡迎點選“ 京東雲 ”瞭解更多精彩內容


乾貨 | AI人臉識別之人臉搜尋

乾貨 | AI人臉識別之人臉搜尋



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2660500/,如需轉載,請註明出處,否則將追究法律責任。

相關文章