干货 | AI人脸识别之人脸搜索
本文檔將利用京東云AI SDK來(lái)實(shí)踐人臉識(shí)別中的人臉?biāo)阉鞴δ埽饕婕暗椒纸M創(chuàng)建/刪除、分組列表獲取、人臉創(chuàng)建/刪除、人臉?biāo)阉鳎敬螌?shí)操的最終效果是:創(chuàng)建一個(gè)人臉庫(kù),拿一張圖片在人臉庫(kù)中搜索出相似度最高的一張,實(shí)現(xiàn)1:N的人臉識(shí)別,操作示意圖如下:
一、準(zhǔn)備工作
1. 創(chuàng)建AK/SK
登陸京東云控制臺(tái):https://console.jdcloud.com,點(diǎn)擊右上角賬戶AccessKey 管理,接著如圖點(diǎn)擊創(chuàng)建Access Key
2. 購(gòu)買(mǎi)人臉?biāo)阉鞣?wù)
人臉?biāo)阉魍ㄟ^(guò) API 調(diào)用次數(shù)計(jì)費(fèi),目前人臉?biāo)阉鞴δ苡?元免費(fèi)試用,調(diào)用量限制為13
我們登陸到京東云控制臺(tái),依次點(diǎn)擊左側(cè)導(dǎo)航人工智能-人臉識(shí)別-人臉?biāo)阉鳎c(diǎn)擊立即購(gòu)買(mǎi)完成購(gòu)買(mǎi)操作。
3.下載SDK
購(gòu)買(mǎi)完成后,返回人臉?biāo)阉鞯目刂婆_(tái),如圖點(diǎn)擊下載SDK完成京東云AI SDK的下載操作
4.下載Eclipse并安裝
Eclipse下載地址:https://www.eclipse.org/downloads/,Eclipse安裝方法請(qǐng)自行百度。
二、實(shí)操開(kāi)始
1.新建JAVA項(xiàng)目
打開(kāi)Eclipse,依次點(diǎn)擊File-New-Java Project,輸入Project name如下圖設(shè)置后,點(diǎn)擊Finish-Don't Create
右擊JAVA項(xiàng)目中的src目錄,依次點(diǎn)擊new-Package
接下來(lái)我們分別創(chuàng)建分組創(chuàng)建(faceGroupCreate)/刪除(faceGroupDelete)、分組列表獲取(getFaceGroupList)、人臉創(chuàng)建(faceCreate)/刪除(faceDelete)、人臉?biāo)阉鳎╢aceSearch)相關(guān)的(類)Class,新建Class的方法如下:
全部Class創(chuàng)建完成后如下圖:
2.裝載京東云AI SDK
將我們下載好的京東云AI SDK解壓,然后復(fù)制到我們新建的JAVA項(xiàng)目的根目錄里
刷新Eclipse中的Package Explorer便可看到我們復(fù)制進(jìn)來(lái)的京東云AI SDK文件,選中全部jar包文件,右擊,依次點(diǎn)擊Build Path-Add to Build Path來(lái)重新構(gòu)建路徑(Build Path)
重新構(gòu)建路徑完成后,我們?cè)贓clipse的Package Explorer中可看到Referenced Libraries,里面包含我們重構(gòu)路徑的所有jar包
3.調(diào)試接口
創(chuàng)建分組(faceGroupCreate)
在faceGroupCreate類中輸入如下內(nèi)容作為調(diào)試代碼
package facesearch;
import com.jdcloud.apigateway.signature.JdcloudSDKClient;
import com.jdcloud.sdk.utils.BinaryUtils;
import com.google.api.client.http.HttpResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static com.jdcloud.sdk.http.Protocol.HTTP;
//創(chuàng)建分組
public class faceGroupCreate {
public static void main(String[] args) {
String accessKey = "請(qǐng)輸入您的AK";
String secretKey = "請(qǐng)輸入您的SK";
String endPoint = "aiapi.jdcloud.com";
String path = "/jdai/faceGroupCreate";
String method = "POST";
Map<String, String> headers = new HashMap<>();
Map<String, Object> queryMap = new HashMap<>();
//queryMap.put("groupId", "10");
queryMap.put("groupName", "請(qǐng)輸入分組名稱");
queryMap.put("groupInfo", "請(qǐng)輸入分組描述");
String body = """";
try {
HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
endPoint, path, method, headers, queryMap, body);
System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
右擊代碼依次點(diǎn)擊Run as-1 Java Application運(yùn)行代碼
運(yùn)行后發(fā)現(xiàn)報(bào)錯(cuò)信息如下(這里雖然有報(bào)錯(cuò),但我們定義的名稱為請(qǐng)輸入分組名稱的組已成功創(chuàng)建):
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html for further details.
由此我們可以看出,報(bào)出錯(cuò)誤的地方主要是slf4j的jar包,而故障碼中Failed to load class "org.slf4j.impl.StaticLoggerBinder"的意思則是加載類文件org.slf4j.impl.StaticLoggerBinder時(shí)失敗
我們下載slf4j-nop.jar,然后像添加AI SDK jar包一樣添加到build path中即可解決問(wèn)題,slf4j-nop.jarjar包我已打包上傳到京東云對(duì)象存儲(chǔ),下載地址為:https://pocenv-hcc.s3.cn-north-1.jdcloud-oss.com/slf4j-nop-1.7.28.jar
將slf4j包下載后復(fù)制到京東云AI SDK文件夾里,然后在Eclipse內(nèi)添加到構(gòu)建路徑里即可
接下來(lái)依次創(chuàng)建其他類文件
注意: 如下代碼中涉及到String body = "imageBase64=";的部分
需要先將圖片轉(zhuǎn)換為Base64,轉(zhuǎn)換地址為:http://imgbase64.duoshitong.com/;
然后將轉(zhuǎn)換后的代碼復(fù)制到imageBase64=之后(轉(zhuǎn)換后的代碼需去除掉“data:image/jpeg;base64,”后再?gòu)?fù)制)。
刪除分組(faceGroupDelete)
package facesearch;
import com.jdcloud.apigateway.signature.JdcloudSDKClient;
import com.jdcloud.sdk.utils.BinaryUtils;
import com.google.api.client.http.HttpResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static com.jdcloud.sdk.http.Protocol.HTTP;
//刪除分組
public class faceGroupDelete {
public static void main(String[] args) {
String accessKey = "請(qǐng)輸入您的AK";
String secretKey = "請(qǐng)輸入您的SK";
String endPoint = "aiapi.jdcloud.com";
String path = "/jdai/faceGroupDelete";
String method = "POST";
Map<String, String> headers = new HashMap<>();
Map<String, Object> queryMap = new HashMap<>();
//queryMap.put("groupId", "10");
queryMap.put("groupName", "請(qǐng)輸入分組名稱");
String body = "{}";
try {
HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
endPoint, path, method, headers, queryMap, body);
System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
分組列表獲取(getFaceGroupList)
package facesearch;
import com.jdcloud.apigateway.signature.JdcloudSDKClient;
import com.jdcloud.sdk.utils.BinaryUtils;
import com.google.api.client.http.HttpResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static com.jdcloud.sdk.http.Protocol.HTTP;
//獲取分組列表
public class getFaceGroupList {
public static void main(String[] args) {
String accessKey = "請(qǐng)輸入您的AK";
String secretKey = "請(qǐng)輸入您的SK";
String endPoint = "aiapi.jdcloud.com";
String path = "/jdai/getFaceGroupList";
String method = "POST";
Map<String, String> headers = new HashMap<>();
Map<String, Object> queryMap = new HashMap<>();
queryMap.put("start", "0");
queryMap.put("length", "5");
String body = "aaa";
try {
HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
endPoint, path, method, headers, queryMap, body);
System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
人臉創(chuàng)建(faceCreate)
package facesearch;
import com.jdcloud.apigateway.signature.JdcloudSDKClient;
import com.jdcloud.sdk.utils.BinaryUtils;
import com.google.api.client.http.HttpResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static com.jdcloud.sdk.http.Protocol.HTTP;
//創(chuàng)建人臉
public class faceCreate {
public static void main(String[] args) {
String accessKey = "請(qǐng)輸入您的AK";
String secretKey = "請(qǐng)輸入您的SK";
String endPoint = "aiapi.jdcloud.com";
String path = "/jdai/faceCreate";
String method = "POST";
//創(chuàng)建
Map<String, String> dataMap = new HashMap<>();
//在線圖片轉(zhuǎn)base64:http://imgbase64.duoshitong.com/
dataMap.put("marin1", "imageBase64=圖片轉(zhuǎn)換為Base64后的代碼(去掉前面的data:image/jpeg;base64,)");
dataMap.put("marin2", "imageBase64=圖片轉(zhuǎn)換為Base64后的代碼(去掉前面的data:image/jpeg;base64,)");
dataMap.put("corona", "imageBase64=圖片轉(zhuǎn)換為Base64后的代碼(去掉前面的data:image/jpeg;base64,)");
dataMap.put("dog", "imageBase64=圖片轉(zhuǎn)換為Base64后的代碼(去掉前面的data:image/jpeg;base64,)");
Map<String, String> headers = new HashMap<>();
Map<String, Object> queryMap = new HashMap<>();
queryMap.put("groupName", "請(qǐng)輸入分組名稱");
String body;
for (Map.Entry<String, String> entry: dataMap.entrySet()){
queryMap.put("outerId", entry.getKey());
body = entry.getValue();
try {
HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
endPoint, path, method, headers, queryMap, body);
System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
} catch (IOException e) {
System.out.println(e.getMessage());
}
queryMap.remove("outerId");
}
}
}
人臉刪除(faceDelete)
package facesearch;
import com.jdcloud.apigateway.signature.JdcloudSDKClient;
import com.jdcloud.sdk.utils.BinaryUtils;
import com.google.api.client.http.HttpResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static com.jdcloud.sdk.http.Protocol.HTTP;
//刪除人臉
public class faceDelete {
public static void main(String[] args) {
String accessKey = "請(qǐng)輸入您的AK";
String secretKey = "請(qǐng)輸入您的SK";
String endPoint = "aiapi.jdcloud.com";
String path = "/jdai/faceDelete";
String method = "POST";
Map<String, String> headers = new HashMap<>();
Map<String, Object> queryMap = new HashMap<>();
queryMap.put("groupName", "請(qǐng)輸入分組名稱");
queryMap.put("outerId", "marin1");
queryMap.put("outerId", "marin2");
queryMap.put("outerId", "corona");
queryMap.put("outerId", "dog");
String body = "{}";
try {
HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
endPoint, path, method, headers, queryMap, body);
System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
人臉?biāo)阉鳎?code>faceSearch)
package facesearch;
import com.jdcloud.apigateway.signature.JdcloudSDKClient;
import com.jdcloud.sdk.utils.BinaryUtils;
import com.google.api.client.http.HttpResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static com.jdcloud.sdk.http.Protocol.HTTP;
//人臉?biāo)阉?public class faceSearch {
public static void main(String[] args) {
String accessKey = "請(qǐng)輸入您的AK";
String secretKey = "請(qǐng)輸入您的SK";
String endPoint = "aiapi.jdcloud.com";
String path = "/jdai/faceSearch";
String method = "POST";
Map<String, String> headers = new HashMap<>();
Map<String, Object> queryMap = new HashMap<>();
queryMap.put("groupName", "請(qǐng)輸入分組名稱");
//如下填寫(xiě)同一人的第三張人臉Base64代碼進(jìn)行人臉?biāo)阉?這里用人臉marin.jpg
String body = "imageBase64=圖片轉(zhuǎn)換為Base64后的代碼(去掉前面的data:image/jpeg;base64,)";
try {
HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
endPoint, path, method, headers, queryMap, body);
System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
4.進(jìn)行演示
如下演示都通過(guò)右擊對(duì)應(yīng)的代碼執(zhí)行Run as-1 Java Application來(lái)運(yùn)行代碼查看結(jié)果
創(chuàng)建分組
運(yùn)行faceGroupCreate.java,結(jié)果如下:
獲取分組列表
運(yùn)行g(shù)etFaceGroupList.java,結(jié)果如下:
創(chuàng)建人臉庫(kù)
運(yùn)行faceCreate.java,結(jié)果如下:
人臉?biāo)阉?/strong>
運(yùn)行faceSearch.java,結(jié)果如下:
刪除人臉
運(yùn)行faceDelete.java,結(jié)果如下:
刪除分組
運(yùn)行faceGroupDelete.java,結(jié)果如下:
如上,我們通過(guò)marin1.jpg、marin2.jpg、corona.jpg、dog.jpg創(chuàng)建了人臉庫(kù),最后通過(guò)marin.jpg將相似度最高的marin1.jpg搜索了出來(lái),至此,操作演示完畢~~
點(diǎn)擊“京東云”了解京東云人臉對(duì)比
總結(jié)
以上是生活随笔為你收集整理的干货 | AI人脸识别之人脸搜索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 京东自动抢茅台脚本 Python
- 下一篇: Apache Hudi重磅特性解读之全局