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

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


原文地址:https://www.cnblogs.com/jdclouddeveloper/p/11697840.html

时间: 2024-08-29 15:57:47

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

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

基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型. Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP.Python.Perl.Ruby 等服务端语言平起平坐的脚本语言. 发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装. Node对一些特殊用

技能节-AI人脸识别

我们收到技能节项目的通知是在两周之前,项目要求做个人脸评分系统. 两周时间写一个"人脸评分系统",好像时间比较紧了,还好我们完成了~这个项目是将摄像头捕获到的包含人脸的图像传输到百度AI的云服务器中,然后调用运用了百度AI的人脸对比API分析图中的数据,最后将分析出的数据传送回来, 在使用这个项目时需要连接互联网. 当然百度AI的人脸对比API不会让你免费使用,你必须要成为百度AI的开发者,在搜索栏中输入(AI,baidu,com),在控制台中选择人脸识别,然后注册登录,接着在左边的导

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

基于百度AI的人脸识别及语音合成课题 课题需求 (1)人脸识别 在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄.性别.颜值等信息,将信息返回到Web界面进行显示. (2)人脸比对 在Web界面上传两张人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口比对照片信息,返回相似度. (3)语音识别 在Web页面上传语音文件,判断语音文件格式,如果不是wav格式进行转码处理,然后调用平台接口进行识别,

百度人脸识别SDK学习

之前看到同事说人脸识别多么高大上之类的, 我就好奇搜索了一下, 本人是小白级别,喜欢用百度多一点,所以就使用了百度的人脸识别SDK进行研究.不得不说百度提供的完档很详细,在学习过程中很少出现不能解决的问题, 所以本人也偷个懒,把sdk文档复制下来. 注:貌似有个bug,我在百度语音中菜单下创建的人脸识别,然后获取API_key和Secret_key, 在学习尝试过程中, 或多或少有请求量, 但是报表中却没有任何记录, 难道是bug吗? 我在想是不是可以无限制的调用了,作为尝试, 没去批量去测试,

人脸识别技术探讨:1:1,1:小N/大N,大姿态识别,活体识别

人脸识别是一种基于人的脸部特征信息进行身份认证的生物特征识别技术.静态人脸识别和动态人脸识别静态人脸识别是在特定的区域或者范围内来采集人脸照片并进行识别,如当前常见的门禁考勤应用.又或者是输入一张照片到人脸识别系统,如Facebook应用中采集用户的标签照片.又如警察输入照片并搜索数据库查看他/她是谁.在这两种情况下,我们都是输入一张照片来进行人脸识别.静态人脸识别的工作流程包括检测人脸.人脸对齐.提取特征向量(我们在后文也会谈及),然后将提取的特征向量与数据库中的特征向量进行比较,以确定他/她

Dlib+OpenCV深度学习人脸识别

目录(?)[+] DlibOpenCV深度学习人脸识别 前言 人脸数据库导入 人脸检测 人脸识别 异常处理 Dlib+OpenCV深度学习人脸识别 前言 人脸识别在LWF(Labeled Faces in the Wild)数据集上人脸识别率现在已经99.7%以上,这个识别率确实非常高了,但是真实的环境中的准确率有多少呢?我没有这方面的数据,但是可以确信的是真实环境中的识别率并没有那么乐观.现在虽然有一些商业应用如员工人脸识别管理系统.海关身份验证系统.甚至是银行人脸识别功能,但是我们可以仔细想

人脸识别算法初次了解

这是转载别人的帖子,认为好,大家一块学习http://www.cnblogs.com/guoyiqi/archive/2011/07/28/2129300.html 前言 在写此文之前,先扯点东西.我一直在找一个东西,让我思考,让我久久的深陷当中,永久的,不断的思考.现在,我意识到,这个东西即是算法.我一直在找一家合适的公司,能让我的兴趣无比放肆的,自由驰骋. ok,由于在一家公司的面试过程中,面试官提到过这个人脸识别算法,由于在此之前,未曾有过了解,所以,特作此番学习与研究.有不论什么问题,欢

[Android]虹软arcface人脸识别SDK引擎使用总结

虹软开放了人脸识别的SDK引擎(免费的哦),刚好有Android版的,就体验了一波.下面来说说Android版的SDK使用心得: ArcFace 虹软人脸认知引擎简介 目前开放的版本有人脸比对(1:1)和人脸检索(1:N),根据应用场景可选择 人脸检索分为小型网络(检测100人内),中型网络(1000人内),大型网络(需联系虹软官方) 目前开放的功能有人脸比对,人脸识别,人脸追踪 关于如何使用 在官网下载SDK引擎后集成到你的项目中,然后我在此举例说下其中一个sample:人脸识别 官方samp

OpenCV 和 Dlib 人脸识别基础

00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测试 在键盘按 Win + R, 输入 cmd,回车,将会打开cmd窗口,输入 activate base, 如下所示,表明anaconda环境系统变量无误. IDE PyCharm的安装 自行百度搜索下载并破解. http://idea.lanyus.com/ OpenCV安装 C:\Users\A