干货 | AI人脸识别之人脸搜索

本文档将利用京东云AI SDK来实践人脸识别中的人脸搜索功能,主要涉及到分组建立/删除、分组列表获取、人脸建立/删除、人脸搜索,本次实操的最终效果是:建立一我的脸库,拿一张图片在人脸库中搜索出类似度最高的一张,实现1:N的人脸识别,操做示意图以下:html

1、准备工做

1. 建立AK/SK

登录京东云控制台:https://console.jdcloud.com,点击右上角帐户AccessKey 管理,接着如图点击建立Access Keyjava

2. 购买人脸搜索服务

人脸搜索经过 API 调用次数计费,目前人脸搜索功能有 0元免费试用,调用量限制为 13

咱们登录到京东云控制台,依次点击左侧导航人工智能-人脸识别-人脸搜索,点击当即购买完成购买操做。api

3.下载SDK

购买完成后,返回人脸搜索的控制台,如图点击下载SDK完成京东云AI SDK的下载操做eclipse

4.下载Eclipse并安装

Eclipse下载地址:https://www.eclipse.org/downloads/,Eclipse安装方法请自行百度。ui

2、实操开始

1.新建JAVA项目

打开Eclipse,依次点击File-New-Java Project,输入Project name以下图设置后,点击Finish-Don't Creategoogle

右击JAVA项目中的src目录,依次点击new-Package人工智能

接下来咱们分别建立分组建立(faceGroupCreate)/删除(faceGroupDelete)、分组列表获取(getFaceGroupList)、人脸建立(faceCreate)/删除(faceDelete)、人脸搜索(faceSearch)相关的(类)Class,新建Class的方法以下:spa

所有Class建立完成后以下图:3d

2.装载京东云AI SDK

将咱们下载好的京东云AI SDK解压,而后复制到咱们新建的JAVA项目的根目录里调试

刷新Eclipse中的Package Explorer即可看到咱们复制进来的京东云AI SDK文件,选中所有jar包文件,右击,依次点击Build Path-Add to Build Path来从新构建路径(Build Path)

从新构建路径完成后,咱们在Eclipse的Package Explorer中可看到Referenced Libraries,里面包含咱们重构路径的全部jar包

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}

右击代码依次点击Run as-1 Java Application运行代码

运行后发现报错信息以下(这里虽然有报错,但咱们定义的名称为请输入分组名称的组已成功建立):

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#StaticLoggerBinder 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包下载后复制到京东云AI SDK文件夹里,而后在Eclipse内添加到构建路径里便可

接下来依次建立其余类文件

注意:
以下代码中涉及到 String body = "imageBase64=";的部分
须要先将图片转换为Base64,转换地址为: http://imgbase64.duoshitong.com/
而后将转换后的代码复制到 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:http://imgbase64.duoshitong.com/
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,结果以下:

获取分组列表

运行getFaceGroupList.java,结果以下:

建立人脸库

运行faceCreate.java,结果以下:

人脸搜索

运行faceSearch.java,结果以下:

删除人脸

运行faceDelete.java,结果以下:

删除分组

运行faceGroupDelete.java,结果以下:

如上,咱们经过marin1.jpgmarin2.jpgcorona.jpgdog.jpg建立了人脸库,最后经过marin.jpg将类似度最高的marin1.jpg搜索了出来,至此,操做演示完毕~~

点击“京东云”了解京东云人脸对比

欢迎点击“连接”了解京东云更多精彩内容

相关文章
相关标签/搜索