本文档将利用京东云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类中输入如下内容作为调试代码

  1. package facesearch;
  2. import com.jdcloud.apigateway.signature.JdcloudSDKClient;
  3. import com.jdcloud.sdk.utils.BinaryUtils;
  4. import com.google.api.client.http.HttpResponse;
  5. import java.io.IOException;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import static com.jdcloud.sdk.http.Protocol.HTTP;
  9. //创建分组
  10. public class faceGroupCreate {
  11. public static void main(String[] args) {
  12. String accessKey = "请输入您的AK";
  13. String secretKey = "请输入您的SK";
  14. String endPoint = "aiapi.jdcloud.com";
  15. String path = "/jdai/faceGroupCreate";
  16. String method = "POST";
  17. Map<String, String> headers = new HashMap<>();
  18. Map<String, Object> queryMap = new HashMap<>();
  19. //queryMap.put("groupId", "10");
  20. queryMap.put("groupName", "请输入分组名称");
  21. queryMap.put("groupInfo", "请输入分组描述");
  22. String body = "\"\"";
  23. try {
  24. HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
  25. endPoint, path, method, headers, queryMap, body);
  26. System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
  27. } catch (IOException e) {
  28. System.out.println(e.getMessage());
  29. }
  30. }
  31. }



右击代码依次点击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

  1. package facesearch;
  2. import com.jdcloud.apigateway.signature.JdcloudSDKClient;
  3. import com.jdcloud.sdk.utils.BinaryUtils;
  4. import com.google.api.client.http.HttpResponse;
  5. import java.io.IOException;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import static com.jdcloud.sdk.http.Protocol.HTTP;
  9. //删除分组
  10. public class faceGroupDelete {
  11. public static void main(String[] args) {
  12. String accessKey = "请输入您的AK";
  13. String secretKey = "请输入您的SK";
  14. String endPoint = "aiapi.jdcloud.com";
  15. String path = "/jdai/faceGroupDelete";
  16. String method = "POST";
  17. Map<String, String> headers = new HashMap<>();
  18. Map<String, Object> queryMap = new HashMap<>();
  19. //queryMap.put("groupId", "10");
  20. queryMap.put("groupName", "请输入分组名称");
  21. String body = "{}";
  22. try {
  23. HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
  24. endPoint, path, method, headers, queryMap, body);
  25. System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
  26. } catch (IOException e) {
  27. System.out.println(e.getMessage());
  28. }
  29. }
  30. }

分组列表获取(getFaceGroupList

  1. package facesearch;
  2. import com.jdcloud.apigateway.signature.JdcloudSDKClient;
  3. import com.jdcloud.sdk.utils.BinaryUtils;
  4. import com.google.api.client.http.HttpResponse;
  5. import java.io.IOException;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import static com.jdcloud.sdk.http.Protocol.HTTP;
  9. //获取分组列表
  10. public class getFaceGroupList {
  11. public static void main(String[] args) {
  12. String accessKey = "请输入您的AK";
  13. String secretKey = "请输入您的SK";
  14. String endPoint = "aiapi.jdcloud.com";
  15. String path = "/jdai/getFaceGroupList";
  16. String method = "POST";
  17. Map<String, String> headers = new HashMap<>();
  18. Map<String, Object> queryMap = new HashMap<>();
  19. queryMap.put("start", "0");
  20. queryMap.put("length", "5");
  21. String body = "aaa";
  22. try {
  23. HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
  24. endPoint, path, method, headers, queryMap, body);
  25. System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
  26. } catch (IOException e) {
  27. System.out.println(e.getMessage());
  28. }
  29. }
  30. }

人脸创建(faceCreate

  1. package facesearch;
  2. import com.jdcloud.apigateway.signature.JdcloudSDKClient;
  3. import com.jdcloud.sdk.utils.BinaryUtils;
  4. import com.google.api.client.http.HttpResponse;
  5. import java.io.IOException;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import static com.jdcloud.sdk.http.Protocol.HTTP;
  9. //创建人脸
  10. public class faceCreate {
  11. public static void main(String[] args) {
  12. String accessKey = "请输入您的AK";
  13. String secretKey = "请输入您的SK";
  14. String endPoint = "aiapi.jdcloud.com";
  15. String path = "/jdai/faceCreate";
  16. String method = "POST";
  17. //创建
  18. Map<String, String> dataMap = new HashMap<>();
  19. //在线图片转base64:http://imgbase64.duoshitong.com/
  20. dataMap.put("marin1", "imageBase64=图片转换为Base64后的代码(去掉前面的data:image/jpeg;base64,)");
  21. dataMap.put("marin2", "imageBase64=图片转换为Base64后的代码(去掉前面的data:image/jpeg;base64,)");
  22. dataMap.put("corona", "imageBase64=图片转换为Base64后的代码(去掉前面的data:image/jpeg;base64,)");
  23. dataMap.put("dog", "imageBase64=图片转换为Base64后的代码(去掉前面的data:image/jpeg;base64,)");
  24. Map<String, String> headers = new HashMap<>();
  25. Map<String, Object> queryMap = new HashMap<>();
  26. queryMap.put("groupName", "请输入分组名称");
  27. String body;
  28. for (Map.Entry<String, String> entry: dataMap.entrySet()){
  29. queryMap.put("outerId", entry.getKey());
  30. body = entry.getValue();
  31. try {
  32. HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
  33. endPoint, path, method, headers, queryMap, body);
  34. System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
  35. } catch (IOException e) {
  36. System.out.println(e.getMessage());
  37. }
  38. queryMap.remove("outerId");
  39. }
  40. }
  41. }

人脸删除(faceDelete

  1. package facesearch;
  2. import com.jdcloud.apigateway.signature.JdcloudSDKClient;
  3. import com.jdcloud.sdk.utils.BinaryUtils;
  4. import com.google.api.client.http.HttpResponse;
  5. import java.io.IOException;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import static com.jdcloud.sdk.http.Protocol.HTTP;
  9. //删除人脸
  10. public class faceDelete {
  11. public static void main(String[] args) {
  12. String accessKey = "请输入您的AK";
  13. String secretKey = "请输入您的SK";
  14. String endPoint = "aiapi.jdcloud.com";
  15. String path = "/jdai/faceDelete";
  16. String method = "POST";
  17. Map<String, String> headers = new HashMap<>();
  18. Map<String, Object> queryMap = new HashMap<>();
  19. queryMap.put("groupName", "请输入分组名称");
  20. queryMap.put("outerId", "marin1");
  21. queryMap.put("outerId", "marin2");
  22. queryMap.put("outerId", "corona");
  23. queryMap.put("outerId", "dog");
  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. }

人脸搜索(faceSearch

  1. package facesearch;
  2. import com.jdcloud.apigateway.signature.JdcloudSDKClient;
  3. import com.jdcloud.sdk.utils.BinaryUtils;
  4. import com.google.api.client.http.HttpResponse;
  5. import java.io.IOException;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import static com.jdcloud.sdk.http.Protocol.HTTP;
  9. //人脸搜索
  10. public class faceSearch {
  11. public static void main(String[] args) {
  12. String accessKey = "请输入您的AK";
  13. String secretKey = "请输入您的SK";
  14. String endPoint = "aiapi.jdcloud.com";
  15. String path = "/jdai/faceSearch";
  16. String method = "POST";
  17. Map<String, String> headers = new HashMap<>();
  18. Map<String, Object> queryMap = new HashMap<>();
  19. queryMap.put("groupName", "请输入分组名称");
  20. //如下填写同一人的第三张人脸Base64代码进行人脸搜索,这里用人脸marin.jpg
  21. String body = "imageBase64=图片转换为Base64后的代码(去掉前面的data:image/jpeg;base64,)";
  22. try {
  23. HttpResponse response = JdcloudSDKClient.execute(accessKey, secretKey, HTTP,
  24. endPoint, path, method, headers, queryMap, body);
  25. System.out.println(new String(BinaryUtils.toByteArray(response.getContent())));
  26. } catch (IOException e) {
  27. System.out.println(e.getMessage());
  28. }
  29. }
  30. }

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. yum 安装 tomcat

    前言对于一个新安装的 centos 系统来说,是没有 tomcat 服务器的.用下面的命令可以查看 tomcat 服务的状态. systemctl status tomcat.service//或者 ...

  2. docker centos 镜像中安装python36详解!生成centos+python36的基础镜像

    获取centos镜像docker pull centos:7.4.1708 启动并进入centos的容器docker run -i –t centos /bin/bash下载安装python编译环境依 ...

  3. Word 写论文的一些教训和经验

    参考文献 写正文时就在引用位置添加参考文献的title,写完后,在百度学术或谷歌学术中搜索参考文献获取GB/T 7714的参考格式,在参考文献的章节为文献编号,在引用位置插入交叉引用. 插图 可以先在 ...

  4. Golang函数-函数的基本概念

    Golang函数-函数的基本概念 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数的概述 1>.函数定义语法格式 Go语言函数定义格式如下: func 函数名( 函数参 ...

  5. CheckBox标签和属性

    CheckBox的作用:可以提供复选 下面是我点击按钮查看所选内容的代码:定义按钮监听器,并在onClick方法中调用shoeAlt方法(此方法会在第二块代码定义) Button btn=(Butto ...

  6. 【LeetCode】最小栈

    [问题] 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈 ...

  7. WinForm读写App.config配置文件

    一.配置文件概述: 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是conf ...

  8. WCF基础调用

    WCF学习demo代码下载 调用:启动wcf服务程序,然后建立一个控制台应用程序 建立wcf程序 添加 using System; using System.Collections.Generic; ...

  9. c++程序—三目运算符

    #include<iostream> using namespace std; #include<string> int main() { //三目运算符 ; ; ; c = ...

  10. 小程序分享H5页面

    1.在要分享的按钮上写一个跳转 <navigator url="../invite1/invite1"> <button class="invite_b ...