借助百度云API进行人脸识别
前言:本篇博客是笔者第一次使用百度云api进行人脸检测,主要内容包括两部分,一是获取接口,二是借助接口进行人脸检测。笔者也是初步了解这方面的内容,也是参考了杂七杂八的博文,内容可能存在错误及其他毛病,欢迎指出。
1:在百度AI里面创建应用
在百度AI开放平台使用百度的人脸识别能力,只需要三个核心步骤即可操作完成:
- 获取接口权限
- 准备接口调用工具
- 进行接口调用。
获取接口权限
获取接口权限是调用接口的前提,主要分为以下几步:
1、进入百度云的人脸识别控制台
地址:
https://console.bce.baidu.com/ai/?_=1528192333418&fromai=1#/ai/face/overview/index
若没有百度账号,可以用手机号快速注册一个。
2、创建人脸识别应用
账号登录成功,您需要创建应用才可正式调用AI能力。应用是您调用API服务的基本操作单元,您可以基于应用创建成功后获取的API Key及Secret Key,进行接口调用操作,及相关配置。

创建应用,填写【应用名称】和【应用描述】,即可创建应用(其他选项可以不做操作,使用默认值即可)

创建完成后,点击“返回应用列表”进行下一步操作。

3、获取秘钥
在您创建完毕应用后,平台将会分配给您此应用的相关凭证:API Key、Secret Key。使用秘钥将可以在下一步中获取调用接口所需的Access Token。

获取调用接口所需的Access Token
人脸识别在线接口主要针对HTTP API调用者,,调用API时必须在URL中带上accesss_token参数,获取Access Token的流程如下:
A、如果您使用的是mac电脑可以将此示例代码复制到“终端”上直接获取token。示例代码如下:
#!/bin/bash curl -i -k'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【API Key】&client_secret=【Seceret Key】
B、非Mac电脑操作流程如下,参考文档:http://ai.baidu.com/docs#/Auth/top
获取Access Token
请求URL数据格式
向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:
- grant_type: 必须参数,固定为client_credentials;
- client_id: 必须参数,应用的API Key;
- client_secret: 必须参数,应用的Secret Key;
例如:
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&
服务器返回的JSON文本参数如下:
- access_token: 要获取的Access Token;
- expires_in: Access Token的有效期(秒为单位,一般为1个月);
- 其他参数忽略,暂时不用;
例如:
{
"refresh_token": "25.b55fe1d287227ca97aab219bb249b8ab.315360000.1798284651.282335-8574074",
"expires_in": ,
"scope": "public wise_adapt",
"session_key": "9mzdDZXu3dENdFZQurfg0Vz8slgSgvvOAUebNFzyzcpQ5EnbxbF+hfG9DQkpUVQdh4p6HbQcAiz5RmuBAja1JJGgIdJI",
"access_token": "24.6c5e1ff107f0e8bcef8c46d3424a0e78.2592000.1485516651.282335-8574074",
"session_secret": "dfac94a3489fe9fca7c3221cbf7525ff"
}
若请求错误,服务器将返回的JSON文本包含以下参数:
- error: 错误码;关于错误码的详细信息请参考下方鉴权认证错误码。
- error_description: 错误描述信息,帮助理解和解决发生的错误。
例如认证失败返回:
{
"error": "invalid_client",
"error_description": "unknown client id"
}
保存获取到的Access Token,在调用接口时会用到。
2、 准备接口调用工具
Postman是一个比较给力的Http请求模拟工具,可以快速进行接口调用。
没有安装的小伙伴可以?下方 嘿 顺便把它还学了一遍
安装结束后进入主界面
如下图,这就是Postman的主界面。

4、 进行调用接口
在postman上可以快速进行接口请求,调用人脸识别接口需要输入正确的接口地址,提前准备人脸图片,具体如下:
输入请求地址
可直接复制的请求地址:“https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=【在第一步中获取的access-token】”
注:需要将请求格式切换为“Post”

修改请求头(header)
Key栏输入:Content-Type
Value栏输入:application/x-www-form-urlencoded

输入请求参数(body)
先选择“x-www-form-urlencoded”,然后参考下图输入参数:
- image_type=BASE64
- image=图片的base64转码后的结果(此处要使用即将注册到人脸库的人脸图片),转码工具:https://tool.css-js.com/base64.html(注意:在base64转码工具中,要取消默认选项“包含头”)
- group_id=gropu001(可自定义:由数字、字母、下划线组成)
- user_id=0001(可自定义:由数字、字母、下划线组成)

注意:在base64转码工具中,要取消默认选项“包含头”

开始请求
点击右上角的“send”,即可请求成功。

验证调用结果
进入百度云后台的人脸库可视化管理界面,点击人脸库名称并逐级进入到人脸维度,即可看到注册成功的人脸图片(注:调用在线API接口添加用户后,会延迟几分钟再展示到此页面,如果没更新,请勿着急)

2调用api进行人脸对比。
package Test1; import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
import com.baidu.aip.util.Base64Util;
import com.google.common.collect.Lists;
import org.apache.commons.io.FileUtils;
import org.json.JSONObject; import java.io.File;
import java.io.IOException;
import java.util.List; /**
* 人脸对比
*/
public class BaiduFaceTest { // 这里填写你自己应用的三项
public static final String APP_ID = "";
public static final String API_KEY = "iinpWTE1pvOnH3YNmk4tG5Z6";
public static final String SECRET_KEY = "LMl3pgidH2AzGcTnOM3qh1x3GFnh6jt5"; public static void main(String[] args) throws IOException {
AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY); String image1 = "C:\\Users\\19575\\Pictures\\Saved Pictures\\紫霞仙子\\a.jpg";
String image2 = "C:\\Users\\19575\\Pictures\\Saved Pictures\\紫霞仙子\\b.jpg"; byte[] b1 = FileUtils.readFileToByteArray(new File(image1));
byte[] b2 = FileUtils.readFileToByteArray(new File(image2)); String s1 = Base64Util.encode(b1);
String s2 = Base64Util.encode(b2); MatchRequest req1 = new MatchRequest(s1, "BASE64");
MatchRequest req2 = new MatchRequest(s2, "BASE64"); List<MatchRequest> list = Lists.newArrayList();
list.add(req1);
list.add(req2); JSONObject rs = client.match(list);
System.out.println(rs.toString()); } }
该代码要导入百度云的sdk,这是我用的sdk链接:https://files.cnblogs.com/files/henuliulei/aip-java-sdk-4.11.1.zip
以及用到的另外两个jar包
用到的两张图片如下,都是紫霞仙子


程序运行结果如下:
{
"result": {
"score": 94.56459045,
"face_list": [
{"face_token": "7e88487df6dba99d358a14e503ae54c4"},
{"face_token": "ec1a03aba650adc1a7a9fcaca62a0414"}
]
},
"log_id": ,
"error_msg": "SUCCESS",
"cached": ,
"error_code": ,
"timestamp":
}
得分为94点多,所以基本可以判定两张图片是同一个人脸(一般得分大于80就可以认为是同一个人)
3:调用api进行人脸匹配(就是在一堆图片中看有没有要被匹配的图片)
代码:
package Test1; import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap; import org.json.JSONObject; import com.baidu.aip.face.AipFace; import sun.misc.BASE64Encoder; /**
* 人脸对比
*/
public class BaiduFaceTest { // 这里填写你自己应用的三项
public static final String APP_ID = "";
public static final String API_KEY = "iinpWTE1pvOnH3YNmk4tG5Z6";
public static final String SECRET_KEY = "LMl3pgidH2AzGcTnOM3qh1x3GFnh6jt5"; public static void main(String[] args) throws IOException {
AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY); String image1 = "C:\\Users\\19575\\Pictures\\Saved Pictures\\紫霞仙子\\c.jpg";
System.out.println(image1);
String image2 = "C:\\Users\\19575\\Pictures\\Saved Pictures\\紫霞仙子\\b.jpg"; String msg=GetImageStr(image1);
JSONObject rs = client.search(msg, "BASE64", "group002", new HashMap<>());
// JSONObject rs=client.detect(image1, "URL", new HashMap<>());
System.out.println(rs.toString()); }
public static String GetImageStr(String imgFile)
{//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
InputStream in = null;
byte[] data = null;
//读取图片字节数组
try
{
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
//对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);//返回Base64编码过的字节数组字符串
} }
{
"result": {
"face_token": "93299a14e0a246dcc5b4cc5484341ea4",
"user_list": [{
"score": ,
"group_id": "group002",
"user_id": "user1",
"user_info": ""
}]
},
"log_id": ,
"error_msg": "SUCCESS",
"cached": ,
"error_code": ,
"timestamp":
}
结果满分,说明存在,同时"group_id": "group002","user_id": "user1",指明了具体的位置。
个人表示在实现上个代码花了很长时间,遇到了各种错误,其中最主要的还是下面两种。
1:使用identifyUser()报错
解决办法已经在我这篇博客讲明:https://www.cnblogs.com/henuliulei/p/10759473.html
2:即使用和库里面相同的图片,检测结果也是0,
解决办法已经在我这篇博客讲明:https://www.cnblogs.com/henuliulei/p/10759567.html
4:调用api进行人脸检测
package Test1; import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap; import org.json.JSONObject; import com.baidu.aip.face.AipFace; import sun.misc.BASE64Encoder; /**
* 人脸对比
*/
public class BaiduFaceTest { // 这里填写你自己应用的三项
public static final String APP_ID = "";
public static final String API_KEY = "iinpWTE1pvOnH3YNmk4tG5Z6";
public static final String SECRET_KEY = "LMl3pgidH2AzGcTnOM3qh1x3GFnh6jt5"; public static void main(String[] args) throws IOException {
AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY); String image1 = "C:\\Users\\19575\\Pictures\\Saved Pictures\\紫霞仙子\\b.jpg"; String msg=GetImageStr(image1);
sample(client,msg); }
public static String GetImageStr(String imgFile)
{//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
InputStream in = null;
byte[] data = null;
//读取图片字节数组
try
{
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
//对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);//返回Base64编码过的字节数组字符串
}
public static void sample(AipFace client,String msg) {
// 传入可选参数调用接口
HashMap<String, String> options = new HashMap<String, String>();
options.put("face_field", "age");
options.put("max_face_num", "");
options.put("face_type", "LIVE"); String image = msg;
String imageType = "BASE64"; // 人脸检测
JSONObject res = client.detect(image, imageType, null);
System.out.println(res.toString()); } }
运行结果如下,可以得到人脸的各种信息。
{
"result": {
"face_num": ,
"face_list": [{
"angle": {
"roll": 15.52,
"pitch": 5.23,
"yaw": -19.37
},
"face_token": "456e1e3b70e535d5e2cce32317018510",
"location": {
"top": 54.95,
"left": 174.35,
"rotation": ,
"width": ,
"height":
},
"face_probability":
}]
},
"log_id": ,
"error_msg": "SUCCESS",
"cached": ,
"error_code": ,
"timestamp":
}
这是百度云的接口说明:https://cloud.baidu.com/doc/FACE/Face-Java-SDK.html#.E4.BA.BA.E8.84.B8.E6.A3.80.E6.B5.8B
其他接口的使用请自行参考,这里不再细述。
reference:
https://cloud.tencent.com/developer/article/1169345
借助百度云API进行人脸识别的更多相关文章
- 树莓派+百度api实现人脸识别
title: 树莓派+百度api实现人脸识别 tags: 树莓派 date: 2018-5-31 20:06:00 --- 树莓派对接百度api 我以前玩安卓的时候一直用的讯飞的平台和api,对于百度 ...
- 利用百度云接口实现车牌识别·python
一个小需求---实现车牌识别. 目前有两个想法 1. 调云在线的接口或者使用SDK做开发(配置环境和变异第三方库麻烦,当然使用python可以避免这些问题) 2. 自己实现车牌识别算法(复杂) 一开始 ...
- 借助百度地图API制作企业百度地图
做网站需要插入地图,可以借助百度地图API,具体步骤如下: 1.打开百度地图API的网址: http://api.map.baidu.com/lbsapi/creatmap/ 2.设置中心点 3. ...
- 使用Azure人脸API对图片进行人脸识别
人脸识别是人工智能机器学习比较成熟的一个领域.人脸识别已经应用到了很多生产场景.比如生物认证,人脸考勤,人流监控等场景.对于很多中小功能由于技术门槛问题很难自己实现人脸识别的算法.Azure人脸API ...
- spring boot2 基于百度云apiface实现人脸检测与认证1
原理介绍: 基于百度云的人脸资料库(用户上传),调用本地摄像头抓拍的图像,与百度云的用户图像做比对,实现人脸认证. 主要步骤如下: 1. 创建百度去账号 2. 在百度云控制台中创建人脸识别的应用,并记 ...
- spring boot2 基于百度云apiface实现人脸检测与认证2
接上一篇,上篇只实现了人脸的认证,接下来实现人脸的检测. 原理介绍: 把摄像头抓拍的图像上传到服务器,服务器把图像上传到百度云,百度云返回识别出的人脸的数量和位置,前端根据服务端的返回,在图像中画出人 ...
- python利用百度云接口实现车牌识别
一个小需求---实现车牌识别. 目前有两个想法 调云在线的接口或者使用SDK做开发(配置环境和编译第三方库很麻烦,当然使用python可以避免这些问题) 自己实现车牌识别算法(复杂) ! 一开始准备使 ...
- 微信小程序城市定位(借助百度地图API判断城市)
概述 微信小程序提供一些API(地址)用于获取当前用户的地理位置等信息,但无论是wx.getLocation,还是wx.chooseLocation均没有单独的字段表示国家与城市信息,仅有经纬度信息. ...
- 调用百度云Api实现从百度云盘自动下载文件
一.注册账号 要从百度云下载文件,首先,注册一个百度云账号,现在可能都要注册手机号啦,当然,如果你已经注册过,很幸运,就可以省略掉此步骤啦. 如图登录后所示: 点击Access Key,即显示上面的图 ...
随机推荐
- 讲解一下this (作用域)
this的指向:普通函数内的this指向全局变量 构造函数内部this指向新创建出来的对象 对象方法内的this指向的是调用该方法的对象 call,apply,bind可以改变this的指向
- Tulpar-web渗透小工具
首先git clone一下,项目地址:https://github.com/anilbaranyelken/tulpar 下载完后打开文件 然后安装所需的Python模块 安装完成后先看一下帮助 命令 ...
- python's seventeenth day for me 面向对象
用函数做一个简单的游戏: def Person(name,sex,hp,ad): self = {'name':name,'sex':sex,'hp':hp,'ad':ad} def attack(d ...
- Python Twisted网络编程框架与异步编程入门教程
原作出处:twisted-intro-cn 作者:Dave 译者:杨晓伟 luocheng likebeta 转载声明:版权归原作出处所有,转载只为让更多人看到这部优秀作品合集,如果侵权,请留言告知 ...
- django-model之Q查询补充
之前我们使用Q查询都是直接将Q对象写死到filter中,例如: 1.查询id大于1并且评论数大于100的书 print(models.Book.objects.filter(Q(nid__gt=1)& ...
- logback-spring.xml的schema
<?xml version="1.0" encoding="utf-8" ?> <configuration xmlns:xsi=" ...
- java基础之JDBC一:概述及步骤详解
1. JDBC的简介 概述: 就是Java用来操作不同数据库(DBMS)的类库(技术), 本质就是一些类和接口. /* 类: DriverManager 接口: Driver, Connection, ...
- SaeMysql操作示例
新浪sae的官方说明文档:http://apidoc.sinaapp.com/sae/SaeMysql.html Class SaeMysql 具体实现:http://apidoc.sinaapp.c ...
- cocos2d-x 在vs2010下的搭建(win7系统)
1从官网下载cocos2d-x2.1.3的源码地址如下: http://cocos2d-x.org/ 2.解压下载的软件包我们会发现红框中vs2010的项目文件双击打开它 3.打开后我们要生成一些wi ...
- Linux查看内存,负载状态
Linux查看内存,负载状态 查看内存使用情况 www.ahlinux.com cat /proc/meminfo MemTotal: 16332644 kB MemFree: ...