本文档将利用京东云 AI SDK 来实践人脸识别中的人脸搜索功能,主要涉及到分组创建 / 删除、分组列表获取、人脸创建 / 删除、人脸搜索,本次实操的最终效果是:创建一个人脸库,拿一张图片在人脸库中搜索出相似度最高的一张,实现 1:N 的人脸识别,操作示意图如下:
一、准备工作
1. 创建 AK/SK
登陆京东云控制台:https://console.jdcloud.com,点击右上角账户 AccessKey 管理,接着如图点击创建 Access Key
2. 购买人脸搜索服务
人脸搜索通过 API 调用次数计费,目前人脸搜索功能有 0 元免费试用,调用量限制为 13
我们登陆到京东云控制台,依次点击左侧导航人工智能 - 人脸识别 - 人脸搜索,点击立即购买完成购买操作。
3. 下载 SDK
购买完成后,返回人脸搜索的控制台,如图点击下载 SDK 完成京东云 AI SDK 的下载操作
4. 下载 Eclipse 并安装
Eclipse 下载地址:https://www.eclipse.org/downl…,Eclipse 安装方法请自行百度。
二、实操开始
1. 新建 JAVA 项目
打开 Eclipse,依次点击 File-New-Java Project,输入 Project name 如下图设置后,点击 Finish-Don’t Create
右击 JAVA 项目中的 src 目录,依次点击 new-Package
接下来我们分别创建分组创建(faceGroupCreate)/ 删除(faceGroupDelete)、分组列表获取(getFaceGroupList)、人脸创建(faceCreate)/ 删除(faceDelete)、人脸搜索(faceSearch)相关的(类)Class,新建 Class 的方法如下:
全部 Class 创建完成后如下图:
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 类中输入如下内容作为调试代码
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 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 运行代码
运行后发现报错信息如下( 这里虽然有报错,但我们定义的名称为请输入分组名称的组已成功创建 ):
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.ht… 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-nort…
将 slf4j 包下载后复制到京东云 AI SDK 文件夹里,然后在 Eclipse 内添加到构建路径里即可
接下来依次创建其他类文件
注意: 如下代码中涉及到 String body = “imageBase64=”; 的部分
- 需要先将图片转换为 Base64,转换地址为:http://imgbase64.duoshitong.com/;
- 然后将转换后的代码复制到 imageBase64= 之后(转换后的代码需去除掉“data:image/jpeg;base64,”后再复制)。
删除分组(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());
}
}
}
人脸创建(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;
// 创建人脸
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";
// 创建
Map<String, String> dataMap = new HashMap<>();
// 在线图片转 base64:http://imgbase64.duoshitong.com/
dataMap.put("marin1", "imageBase64= 图片转换为 Base64 后的代码(去掉前面的 data:image/jpeg;base64,)");
dataMap.put("marin2", "imageBase64= 图片转换为 Base64 后的代码(去掉前面的 data:image/jpeg;base64,)");
dataMap.put("corona", "imageBase64= 图片转换为 Base64 后的代码(去掉前面的 data:image/jpeg;base64,)");
dataMap.put("dog", "imageBase64= 图片转换为 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());
}
}
}
人脸搜索(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;
// 人脸搜索
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 代码进行人脸搜索, 这里用人脸 marin.jpg
String body = "imageBase64= 图片转换为 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. 进行演示
如下演示都通过右击对应的代码执行 Run as-1 Java Application 来运行代码查看结果
创建分组
运行 faceGroupCreate.java,结果如下:
获取分组列表
运行 getFaceGroupList.java,结果如下:
创建人脸库
运行 faceCreate.java,结果如下:
人脸搜索
运行 faceSearch.java,结果如下:
删除人脸
运行 faceDelete.java,结果如下:
删除分组
运行 faceGroupDelete.java,结果如下:
如上,我们通过 marin1.jpg、marin2.jpg、corona.jpg、dog.jpg 创建了人脸库,最后通过 marin.jpg 将相似度最高的 marin1.jpg 搜索了出来,至此,操作演示完毕~~
点击“京东云”了解京东云人脸对比