本文档将利用京东云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/downloads/,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.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

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搜索了出来,至此,操作演示完毕~~

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



干货 | AI人脸识别之人脸搜索的更多相关文章

  1. java 虹软ArcFace 2.0,java SDK使用、人脸识别-抽取人脸特征并做比对

    java人脸识别 虹软ArcFace 2.0,java SDK使用.人脸识别-抽取人脸特征并做比对 虹软产品地址:http://ai.arcsoft.com.cn/product/arcface.ht ...

  2. 基于node.js人脸识别之人脸对比

    基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...

  3. 使用python3.7和opencv4.1来实现人脸识别和人脸特征比对以及模型训练

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_126 OpenCV4.1已经发布将近一年了,其人脸识别速度和性能有了一定的提高,这里我们使用opencv来做一个实时活体面部识别的 ...

  4. 百度云人脸识别API人脸对比

    from urllib import request import base64 import requests import re import json import urllib import ...

  5. 百度云人脸识别API人脸库管理

      from urllib import request import base64 import requests import re import json import urllib impor ...

  6. face-api.js 前端人脸识别,人脸检测,登录认证

    1.参考face-api.js https://github.com/justadudewhohacks/face-api.js#face-api.js-for-the-browser

  7. 技能节-AI人脸识别

    我们收到技能节项目的通知是在两周之前,项目要求做个人脸评分系统. 两周时间写一个"人脸评分系统",好像时间比较紧了,还好我们完成了~这个项目是将摄像头捕获到的包含人脸的图像传输到百 ...

  8. 基于百度AI开放平台的人脸识别及语音合成

    基于百度AI的人脸识别及语音合成课题 课题需求 (1)人脸识别 在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄.性别.颜 ...

  9. AI大厂算法测试心得:人脸识别关键指标有哪些?

    仅仅在几年前,程序员要开发一款人脸识别应用,就必须精通算法的编写.但现在,随着成熟算法的对外开放,越来越多开发者只需专注于开发垂直行业的产品即可. 由调查机构发布的<中国AI产业地图研究> ...

随机推荐

  1. spring core:@AliasFor的派生性

    spring对Annotation的派生性应用可谓炉火纯青,在spring core:@Component的派生性讲过支持层次上派生性,而属性上派生的需求则借助了@AliasFor,它是从spring ...

  2. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-eject

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  3. printf的封装与实现

    1 UART通信协议 1.1 UART通信的物理连接 图1 UART的物理连接 1.2 逻辑电平 用电平表示逻辑1和逻辑0,逻辑1和逻辑0用来组织计算机层面的数据. 1.3 电平标准 根据通讯使用的电 ...

  4. c# quartz

    quartz调度核心元素: Scheduler:任务调度器,是实际执行任务调度的控制器.在spring中通过SchedulerFactoryBean封装起来. Trigger:触发器,用于定义任务调度 ...

  5. python正则表达式匹配多行

    参数re.S jsProp = 'b' fpData = '''var a = []; var b = []; var c = [];'''   .*是尽可能匹配多的 searchResult = r ...

  6. 树莓派3b安装Windows10 Arm

    感谢老外的这个项目:https://github.com/WOA-Project/WOA-Deployer-Rpi 还有这个:https://uupdump.ml/ 首先从https://uupdum ...

  7. TS-Lint 安装方法

    1  在 Visual Studio Extensions  里下载 TSLint  2  在项目根目录下放 tslint.json 文件 (里面的规则定死就好 我认为没有特别大的意义)

  8. 使用CORDIC算法求解角度正余弦及Verilog实现

    本文是用于记录在了解和学习CORDIC算法期间的收获,以供日后自己及他人参考:并且附上了使用Verilog实现CORDIC算法求解角度的正弦和余弦的代码.简单的testbench测试代码.以及在Mod ...

  9. [LeetCode] 929. Unique Email Addresses 独特的邮件地址

    Every email consists of a local name and a domain name, separated by the @ sign. For example, in ali ...

  10. 13 装备的添加和移除(Unity3D)

    本案例主要实现功能如下:1.创建UI界面,包含两个装备栏,四个武器选择栏以及显示人物的属性的文本框2.每一个装备都有自己的属性(AD/AP/AR/MP)3.人物也有自己的基础属性(AD/AP/AR/M ...