干货 | AI人脸识别之人脸搜索
本文档将利用京东云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人脸识别之人脸搜索的更多相关文章
- java 虹软ArcFace 2.0,java SDK使用、人脸识别-抽取人脸特征并做比对
java人脸识别 虹软ArcFace 2.0,java SDK使用.人脸识别-抽取人脸特征并做比对 虹软产品地址:http://ai.arcsoft.com.cn/product/arcface.ht ...
- 基于node.js人脸识别之人脸对比
基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...
- 使用python3.7和opencv4.1来实现人脸识别和人脸特征比对以及模型训练
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_126 OpenCV4.1已经发布将近一年了,其人脸识别速度和性能有了一定的提高,这里我们使用opencv来做一个实时活体面部识别的 ...
- 百度云人脸识别API人脸对比
from urllib import request import base64 import requests import re import json import urllib import ...
- 百度云人脸识别API人脸库管理
from urllib import request import base64 import requests import re import json import urllib impor ...
- face-api.js 前端人脸识别,人脸检测,登录认证
1.参考face-api.js https://github.com/justadudewhohacks/face-api.js#face-api.js-for-the-browser
- 技能节-AI人脸识别
我们收到技能节项目的通知是在两周之前,项目要求做个人脸评分系统. 两周时间写一个"人脸评分系统",好像时间比较紧了,还好我们完成了~这个项目是将摄像头捕获到的包含人脸的图像传输到百 ...
- 基于百度AI开放平台的人脸识别及语音合成
基于百度AI的人脸识别及语音合成课题 课题需求 (1)人脸识别 在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄.性别.颜 ...
- AI大厂算法测试心得:人脸识别关键指标有哪些?
仅仅在几年前,程序员要开发一款人脸识别应用,就必须精通算法的编写.但现在,随着成熟算法的对外开放,越来越多开发者只需专注于开发垂直行业的产品即可. 由调查机构发布的<中国AI产业地图研究> ...
随机推荐
- 数据结构——KMP(串)
KMP一个非常经典的字符串模式匹配算法,虽然网上有很多kmp算法的博客,但是为了更好的理解kmp我还是自己写了一遍(这个kmp的字符串存储是基于堆的(heap),和老师说的定长存储略有不同,字符串索引 ...
- python 编写程序输出50以内勾股数,如下图所示,要求每组显示六祖,各组勾股数无重复
import math n = 0 for a in range(1,49): for b in range(a,49): c = math.ceil(math.sqrt(a**2+b**2)) if ...
- Centos 时间与主机时间不匹配问题解决
有时候新安装的虚拟机的系统时间会和主机的时间差8个小时,这是因为虚拟机和主机所在的时区不同. 这会导致当你往mysql数据库插入数据时如果设置时间为current_time结果会和虚拟机保持一致. 1 ...
- 自定义spark UDAF
官网链接 样例代码: import java.util.ArrayList; import java.util.List; import org.apache.spark.sql.Dataset; i ...
- AI 伴游小精灵
北京市商汤科技开发有限公司面向青少年研发了一款智能伴游机器人-- AI 伴游小精灵.一经推出,深受孩子们的喜爱,可爱又机智的小精灵会想出很多有趣的小游戏来启迪孩子们思考.今天,小精灵给你提出了一个神奇 ...
- js 加密解密 TripleDES
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- UVA - 11134 Fabled Rooks(传说中的车)(贪心)
题意:在n*n的棋盘上放n个车,使得任意两个车不相互攻击,且第i个车在一个给定的矩形Ri之内,不相互攻击是指不同行不同列,无解输出IMPOSSIBLE,否则分别输出第1,2,……,n个车的坐标. 分析 ...
- UVA - 1606 Amphiphilic Carbon Molecules(两亲性分子)(扫描法)
题意:平面上有n(n <= 1000)个点,每个点为白点或者黑点.现在需放置一条隔板,使得隔板一侧的白点数加上另一侧的黑点数总数最大.隔板上的点可以看做是在任意一侧. 分析:枚举每个基准点i,将 ...
- 每天一点点之 taro 框架开发 - taro静态资源引入
1.说明: taro中客园自由的引用静态资源,不需要安装任何的loader 引用样式文件 通过ES6的import引入 2.引用js文件 import { functionName } from '. ...
- java floor,ceil和round方法
Math.floor():返回值是double类型的,返回的是不大于它的最大整数 举例: double x = Math.floor(5.8); System.out.println(x); //输出 ...