![59d06533ab86115c7bba235a46dc2990.png](https://i-blog.csdnimg.cn/blog_migrate/a1721e6c149cedfd3547668043142307.jpeg)
本文档将利用京东云AI SDK来实践人脸识别中的人脸搜索功能,主要涉及到分组创建/删除、分组列表获取、人脸创建/删除、人脸搜索,本次实操的最终效果是:创建一个人脸库,拿一张图片在人脸库中搜索出相似度最高的一张,实现1:N的人脸识别
,操作示意图如下:
![3f41b22418aaf9f6d7eb1ae01e67f8e0.png](https://i-blog.csdnimg.cn/blog_migrate/263c82baf6c86f4f7d4fef6125f93566.jpeg)
一、准备工作
1. 创建AK/SK
登陆京东云控制台:https://console.jdcloud.com,点击右上角账户AccessKey 管理
,接着如图点击创建Access Key
![701ceb0e6409f41871d95d25194b016e.png](https://i-blog.csdnimg.cn/blog_migrate/6e430bc61ebd512e2a66ed11fd1447b8.jpeg)
2. 购买人脸搜索服务
人脸搜索通过 API 调用次数计费,目前人脸搜索功能有0元免费试用
,调用量限制为13
我们登陆到京东云控制台,依次点击左侧导航人工智能
-人脸识别
-人脸搜索
,点击立即购买
完成购买操作。
![0b211ee05d415ad8f25db0ce7bb7fe8f.png](https://i-blog.csdnimg.cn/blog_migrate/d97fa959e77895f872c74c87e43e82ca.jpeg)
3.下载SDK
购买完成后,返回人脸搜索的控制台,如图点击下载SDK
完成京东云AI SDK的下载操作
![19953f01e7491be0dd6566bab1da011d.png](https://i-blog.csdnimg.cn/blog_migrate/947e2cdb54ad247062363ef5c596ff88.jpeg)
![49cf60ed82969ee1e54307f6b5a73243.png](https://i-blog.csdnimg.cn/blog_migrate/24f220d843cabae45b4c355c13158c71.jpeg)
4.下载Eclipse并安装
Eclipse下载地址:https://www.eclipse.org/downloads/,Eclipse安装方法请自行百度。
二、实操开始
1.新建JAVA项目
打开Eclipse,依次点击File
-New
-Java Project
,输入Project name
如下图设置后,点击Finish
-Don't Create
![319c50486fb50c85d7d2c01886b1f6f6.png](https://i-blog.csdnimg.cn/blog_migrate/35d7b7898d37100c82ec4bd409205ab5.jpeg)
右击JAVA项目中的src
目录,依次点击new
-Package
![25b0c77c115205cd7baa11247c02bb1f.png](https://i-blog.csdnimg.cn/blog_migrate/c438880d9fde751a95f58920bae87caf.jpeg)
![93631cc7be96bae5b4d930dd2f3b422b.png](https://i-blog.csdnimg.cn/blog_migrate/d6bfb6eecc630f01e76fefe13fefbf43.jpeg)
接下来我们分别创建分组创建(faceGroupCreate
)/删除(faceGroupDelete
)、分组列表获取(getFaceGroupList
)、人脸创建(faceCreate
)/删除(faceDelete
)、人脸搜索(faceSearch
)相关的(类)Class,新建Class
的方法如下:
![69e0fd7ed6d30a7bd9d6dac35dbf510b.png](https://i-blog.csdnimg.cn/blog_migrate/4b1a4cefdc23cce2f653cdc2ce0c9819.jpeg)
![cc9ae27386b1b57d4943cf75d5ba77c1.png](https://i-blog.csdnimg.cn/blog_migrate/b234d3f3c556b61e1373ddcf5b636a51.jpeg)
全部Class创建完成后如下图:
![11f92c5e7b245d1e900209dd2e2fd1fa.png](https://i-blog.csdnimg.cn/blog_migrate/dc2fccefbf4c4c0e13f0266eaec8134e.jpeg)
2.装载京东云AI SDK
将我们下载好的京东云AI SDK解压,然后复制到我们新建的JAVA项目的根目录里
![d8462adb8c5b496371ecf36797d71311.png](https://i-blog.csdnimg.cn/blog_migrate/e6f8932677c8839dae9186d504c4cc74.jpeg)
刷新Eclipse中的Package Explorer
便可看到我们复制进来的京东云AI SDK文件,选中全部jar包文件,右击,依次点击Build Path
-Add to Build Path
来重新构建路径(Build Path)
![621e2e0c4364bc33bd90cb31735a91e3.png](https://i-blog.csdnimg.cn/blog_migrate/a910077d95f09bedf05101c65b5e12a6.jpeg)
重新构建路径完成后,我们在Eclipse的Package Explorer
中可看到Referenced Libraries
,里面包含我们重构路径的所有jar包
![bcb0d03af86fb2582906612a1fde0fca.png](https://i-blog.csdnimg.cn/blog_migrate/66d880c224be1608fd44b0f0ad4f8bbc.jpeg)
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}
![009a644883d7876d4d07eb96cd830f49.png](https://i-blog.csdnimg.cn/blog_migrate/cd179c9235bfa7938fccbf6530b0458d.jpeg)
右击代码依次点击Run as
-1 Java Application
运行代码
![195999a9e880f8d9d3369c3c7b65f5bc.png](https://i-blog.csdnimg.cn/blog_migrate/6bf12809e1021581912605208652347c.jpeg)
运行后发现报错信息如下(这里虽然有报错,但我们定义的名称为请输入分组名称
的组已成功创建):
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.
![4c84d3ec345a1c7049ef2374a9688ad7.png](https://i-blog.csdnimg.cn/blog_migrate/d219bbfe780b9c3ef6a04de69615b9d2.jpeg)
由此我们可以看出,报出错误的地方主要是slf4j的jar包,而故障码中Failed to load class "org.slf4j.impl.StaticLoggerBinder"
的意思则是加载类文件org.slf4j.impl.StaticLoggerBinder时失败
我们下载slf4j-nop.jar
,然后像添加AI SDK jar包一样添加到build path中即可解决问题,slf4j-nop.jar
jar包我已打包上传到京东云对象存储,下载地址为:https://pocenv-hcc.s3.cn-north-1.jdcloud-oss.com/slf4j-nop-1.7.28.jar
将slf4j包下载后复制到京东云AI SDK文件夹里,然后在Eclipse内添加到构建路径里即可
![a14fcf00f853dddcd678fbd7e4a6fc9d.png](https://i-blog.csdnimg.cn/blog_migrate/ad1df22e3c0cb7cff5408e3ce5dee3dc.jpeg)
接下来依次创建其他类文件
注意:
如下代码中涉及到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
,结果如下:
![ee15f8acfc45091e66a6ec2e80df6f2d.png](https://i-blog.csdnimg.cn/blog_migrate/a731eee4a2564762d604202b3d7a6c59.jpeg)
获取分组列表
运行getFaceGroupList.java
,结果如下:
![a707f3185995b8ee17fa40624c96722c.png](https://i-blog.csdnimg.cn/blog_migrate/b74532c2ecf3afa219f93d0df7c15439.jpeg)
创建人脸库
运行faceCreate.java
,结果如下:
![bce924c5d66a9412433ff06a3c3df7c2.png](https://i-blog.csdnimg.cn/blog_migrate/f87fb8c6fb06b3c6d3a46345f7461fdc.jpeg)
人脸搜索
运行faceSearch.java
,结果如下:
![2558fc3be5a008faeffe6051899f13a2.png](https://i-blog.csdnimg.cn/blog_migrate/fd082436090f3966842790ef83e3c129.jpeg)
删除人脸
运行faceDelete.java
,结果如下:
![a322778bd56ce76a4ea4dd4bc357ce8a.png](https://i-blog.csdnimg.cn/blog_migrate/ce03cc6eeaf49be81328c825d2911fd4.jpeg)
删除分组
运行faceGroupDelete.java
,结果如下:
![18a89cc1ff8c2b28f3559bbcab1d60aa.png](https://i-blog.csdnimg.cn/blog_migrate/03ffcd9f806311f14193cffe98b91bfd.jpeg)
如上,我们通过marin1.jpg
、marin2.jpg
、corona.jpg
、dog.jpg
创建了人脸库,最后通过marin.jpg
将相似度最高的marin1.jpg
搜索了出来,至此,操作演示完毕~~
点击“京东云”了解京东云人脸对比
![1524b55a3e728fe111d97994204f8e78.png](https://i-blog.csdnimg.cn/blog_migrate/8dff6b2638e1b868dd211fe0b4e05b7f.jpeg)
![93d511aa5ba4d3bb8cf33cf890e76a36.gif](https://i-blog.csdnimg.cn/blog_migrate/38f4342865af5cc9b36dc63b076777a4.gif)