干货 | AI人脸识别之人脸搜索
本文檔將利用京東云AI SDK來實踐人臉識別中的人臉?biāo)阉鞴δ埽饕婕暗椒纸M創(chuàng)建/刪除、分組列表獲取、人臉創(chuàng)建/刪除、人臉?biāo)阉鳎敬螌嵅俚淖罱K效果是:創(chuàng)建一個人臉庫,拿一張圖片在人臉庫中搜索出相似度最高的一張,實現(xiàn)1:N的人臉識別,操作示意圖如下:
一、準(zhǔn)備工作
1. 創(chuàng)建AK/SK
登陸京東云控制臺:https://console.jdcloud.com,點擊右上角賬戶AccessKey 管理,接著如圖點擊創(chuàng)建Access Key
2. 購買人臉?biāo)阉鞣?wù)
人臉?biāo)阉魍ㄟ^ API 調(diào)用次數(shù)計費,目前人臉?biāo)阉鞴δ苡?元免費試用,調(diào)用量限制為13
我們登陸到京東云控制臺,依次點擊左側(cè)導(dǎo)航人工智能-人臉識別-人臉?biāo)阉鳎c擊立即購買完成購買操作。
3.下載SDK
購買完成后,返回人臉?biāo)阉鞯目刂婆_,如圖點擊下載SDK完成京東云AI SDK的下載操作
4.下載Eclipse并安裝
Eclipse下載地址:https://www.eclipse.org/downloads/,Eclipse安裝方法請自行百度。
二、實操開始
1.新建JAVA項目
打開Eclipse,依次點擊File-New-Java Project,輸入Project name如下圖設(shè)置后,點擊Finish-Don't Create
右擊JAVA項目中的src目錄,依次點擊new-Package
接下來我們分別創(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項目的根目錄里
刷新Eclipse中的Package Explorer便可看到我們復(fù)制進(jìn)來的京東云AI SDK文件,選中全部jar包文件,右擊,依次點擊Build Path-Add to Build Path來重新構(gòu)建路徑(Build Path)
重新構(gòu)建路徑完成后,我們在Eclipse的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 = "請輸入您的AK";
        String secretKey = "請輸入您的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", "請輸入分組名稱");
        queryMap.put("groupInfo", "請輸入分組描述");
        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());
        }
    }
}
右擊代碼依次點擊Run as-1 Java Application運行代碼
運行后發(fā)現(xiàn)報錯信息如下(這里雖然有報錯,但我們定義的名稱為請輸入分組名稱的組已成功創(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.
由此我們可以看出,報出錯誤的地方主要是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包我已打包上傳到京東云對象存儲,下載地址為: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)建路徑里即可
接下來依次創(chuàng)建其他類文件
注意: 如下代碼中涉及到String body = "imageBase64=";的部分
需要先將圖片轉(zhuǎn)換為Base64,轉(zhuǎn)換地址為:http://imgbase64.duoshitong.com/;
然后將轉(zhuǎn)換后的代碼復(fù)制到imageBase64=之后(轉(zhuǎn)換后的代碼需去除掉“data:image/jpeg;base64,”后再復(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 = "請輸入您的AK";
        String secretKey = "請輸入您的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", "請輸入分組名稱");
        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 = "請輸入您的AK";
       String secretKey = "請輸入您的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 = "請輸入您的AK";
        String secretKey = "請輸入您的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", "請輸入分組名稱");
        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 = "請輸入您的AK";
        String secretKey = "請輸入您的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", "請輸入分組名稱");
        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 = "請輸入您的AK";
        String secretKey = "請輸入您的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", "請輸入分組名稱");
        //如下填寫同一人的第三張人臉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)行演示
如下演示都通過右擊對應(yīng)的代碼執(zhí)行Run as-1 Java Application來運行代碼查看結(jié)果
創(chuàng)建分組
運行faceGroupCreate.java,結(jié)果如下:
獲取分組列表
運行g(shù)etFaceGroupList.java,結(jié)果如下:
創(chuàng)建人臉庫
運行faceCreate.java,結(jié)果如下:
人臉?biāo)阉?/strong>
運行faceSearch.java,結(jié)果如下:
刪除人臉
運行faceDelete.java,結(jié)果如下:
刪除分組
運行faceGroupDelete.java,結(jié)果如下:
如上,我們通過marin1.jpg、marin2.jpg、corona.jpg、dog.jpg創(chuàng)建了人臉庫,最后通過marin.jpg將相似度最高的marin1.jpg搜索了出來,至此,操作演示完畢~~
點擊“京東云”了解京東云人臉對比
總結(jié)
以上是生活随笔為你收集整理的干货 | AI人脸识别之人脸搜索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 京东自动抢茅台脚本 Python
- 下一篇: Apache Hudi重磅特性解读之全局
