远程调用百度AI开放平台的web服务,快速完成人脸识别

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 在检测人脸数量、位置、性别、口罩等场景时,可以考虑使用百度开放平台提供的web接口,一个web请求就能完成检测得到结果,本篇记录了从申请到真实调用的完整过程,由以下步骤组成:

注册百度账号

  • 按照您的实际情况,注册个人或者企业账号,这个不多说了

登录百度智能云

实名认证

创建应用

  • 为了能够使用百度服务,需要创建一个应用
  • 先选择类别,在控制台页面,操作如下图,点击红框四:

  • 此刻已跳转到管理引用的页面,点击下图红框中的创建应用

  • 为了免费使用百度的服务,先点击下图红框中的去领取:

  • 在领取页面勾选人脸检测:

  • 领取完成后,回到创建应用的页面,发现这些服务已经被勾选,如下图:

  • 应用相关的信息填写完成后,提交表单即可完成创建应用

拿到API Key和Secret Key

  • 在应用列表页面拿到API Key和Secret Key,这些都是调用百度服务的关键授权信息,如下图红框所示:

得到access_token

  • 在使用百度提供的各种服务(如人脸检测)的时候,需要带上授权信息证明你有使用该服务的权限,这个授权信息就是access_token
  • 最简单的方式就是curl命令获取
curl -i -k 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【百度云应用的API Key】&client_secret=【百度云应用的Secret Key】'
  • 这里用postman尝试上述请求,如下图,红框中就是这次请求咱们要得到的access_token信息:

  • 拿到access_token,就可以开始的调用百度的服务了,如下图,官方文档说了这个access_token的有效期是30天:

  • 关于百度云授权信息的更多信息请在此查看:https://cloud.baidu.com/doc/FACE/s/Tkqahnjtk

编码

  • 百度关于人脸检测的文档:https://ai.baidu.com/ai-doc/FACE/yk37c1u4t
  • 人脸检测服务是个web接口,也能通过操作curl或者postman来完成,但是为了在代码中使用百度的服务,这里写一段代码来完成人脸检测
  • 今天的项目是个普通的maven工程,没有使用spring或者spingboot框架,只有一些简单的java类和main方法
  • 首先要在项目中引入下面三个库:
<!-- 快捷代码辅助库 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
<!-- 网络请求库 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.10.0</version>
</dependency>
<!-- JSON处理 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
  • 先新建一个对象FaceDetectRequest.java,用于保存请求参数:
package com.bolingcavalry.grabpush.bean.request;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data; /**
* @author willzhao
* @version 1.0
* @description 请求对象
* @date 2022/1/1 16:21
*/
@Data
public class FaceDetectRequest {
// 图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断
String image; // 图片类型
// BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
// URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
// FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。
@JsonProperty("image_type")
String imageType; // 包括age,expression,face_shape,gender,glasses,landmark,landmark150,quality,eye_status,emotion,face_type,mask,spoofing信息
//逗号分隔. 默认只返回face_token、人脸框、概率和旋转角度
@JsonProperty("face_field")
String faceField; // 最多处理人脸的数目,默认值为1,根据人脸检测排序类型检测图片中排序第一的人脸(默认为人脸面积最大的人脸),最大值120
@JsonProperty("max_face_num")
int maxFaceNum; // 人脸的类型
// LIVE表示生活照:通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等
// IDCARD表示身份证芯片照:二代身份证内置芯片中的人像照片
// WATERMARK表示带水印证件照:一般为带水印的小图,如公安网小图
// CERT表示证件照片:如拍摄的身份证、工卡、护照、学生证等证件图片
// 默认LIVE
@JsonProperty("face_type")
String faceType; // 活体控制 检测结果中不符合要求的人脸会被过滤
// NONE: 不进行控制
// LOW:较低的活体要求(高通过率 低攻击拒绝率)
// NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
// HIGH: 较高的活体要求(高攻击拒绝率 低通过率)
// 默认NONE
@JsonProperty("liveness_control")
String livenessControl; // 人脸检测排序类型
// 0:代表检测出的人脸按照人脸面积从大到小排列
// 1:代表检测出的人脸按照距离图片中心从近到远排列
// 默认为0
@JsonProperty("face_sort_type")
int faceSortType;
}
  • 其次是响应对象FaceDetectResponse.java:
package com.bolingcavalry.grabpush.bean.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.ToString; import java.io.Serializable;
import java.util.List; /**
* @author willzhao
* @version 1.0
* @description TODO
* @date 2022/1/1 13:30
*/
@Data
@ToString
public class FaceDetectResponse implements Serializable {
// 返回码
@JsonProperty("error_code")
String errorCode;
// 描述信息
@JsonProperty("error_msg")
String errorMsg;
// 返回的具体内容
Result result; /**
* @author willzhao
* @version 1.0
* @description 返回的具体内容
* @date 2022/1/1 16:01
*/
@Data
public static class Result {
// 人脸数量
@JsonProperty("face_num")
private int faceNum;
// 每个人脸的信息
@JsonProperty("face_list")
List<Face> faceList; /**
* @author willzhao
* @version 1.0
* @description 检测出来的人脸对象
* @date 2022/1/1 16:03
*/
@Data
public static class Face {
// 位置
Location location;
// 是人脸的置信度
@JsonProperty("face_probability")
double face_probability;
// 口罩
Mask mask; /**
* @author willzhao
* @version 1.0
* @description 人脸在图片中的位置
* @date 2022/1/1 16:04
*/
@Data
public static class Location {
double left;
double top;
double width;
double height;
double rotation;
} /**
* @author willzhao
* @version 1.0
* @description 口罩对象
* @date 2022/1/1 16:11
*/
@Data
public static class Mask {
int type;
double probability;
}
}
}
}
  • 这里有一处要注意:FaceDetectResponse对象中的字段是少于真实响应返回的字段的,这是因为这个demo不需要完整的返回内容,因此只要选择应用需要的字段定义在FaceDetectResponse.java中即可
  • 最后是完整的服务类BaiduCloudService.java,如下所示,即读取图片 -> 转base64 -> 构造请求对象 -> 提交请求 -> 收到响应 -> 解析响应:
package com.bolingcavalry.grabpush.extend;

import com.bolingcavalry.grabpush.bean.request.FaceDetectRequest;
import com.bolingcavalry.grabpush.bean.response.FaceDetectResponse;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;
import sun.misc.BASE64Encoder;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; /**
* @author willzhao
* @version 1.0
* @description 百度云服务的调用
* @date 2022/1/1 11:06
*/
public class BaiduCloudService { // 转换
BASE64Encoder encoder = new BASE64Encoder(); OkHttpClient client = new OkHttpClient(); static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); static final String URL_TEMPLATE = "https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=%s"; String token; ObjectMapper mapper = new ObjectMapper(); public BaiduCloudService(String token) {
this.token = token; // 重要:反序列化的时候,字符的字段如果比类的字段多,下面这个设置可以确保反序列化成功
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
} /**
* 将指定位置的图片转为base64字符串
* @param imagePath
* @return
*/
private String img2Base64(String imagePath) {
InputStream inputStream = null;
byte[] data = null; try {
inputStream = new FileInputStream(imagePath);
data = new byte[inputStream.available()];
inputStream.read(data);
inputStream.close();
} catch (IOException ioException) {
ioException.printStackTrace();
} return null==data ? null :encoder.encode(data);
} /**
* 检测指定的图片
* @param imageBase64
* @return
*/
public FaceDetectResponse detect(String imageBase64) {
// 请求对象
FaceDetectRequest faceDetectRequest = new FaceDetectRequest();
faceDetectRequest.setImageType("BASE64");
faceDetectRequest.setFaceField("mask");
faceDetectRequest.setMaxFaceNum(6);
faceDetectRequest.setFaceType("LIVE");
faceDetectRequest.setLivenessControl("NONE");
faceDetectRequest.setFaceSortType(0);
faceDetectRequest.setImage(imageBase64); FaceDetectResponse faceDetectResponse = null; try {
// 用Jackson将请求对象序列化成字符串
String jsonContent = mapper.writeValueAsString(faceDetectRequest); //
RequestBody requestBody = RequestBody.create(JSON, jsonContent);
Request request = new Request
.Builder()
.url(String.format(URL_TEMPLATE, token))
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
String rawRlt = response.body().string();
faceDetectResponse = mapper.readValue(rawRlt, FaceDetectResponse.class);
} catch (IOException ioException) {
ioException.printStackTrace();
} return faceDetectResponse;
} public static void main(String[] args) {
// 图片在本地的位置
String imagePath = "E:\\temp\\202201\\01\\pic\\1.jpeg"; // 百度云的token,是通过此接口得到的:https://aip.baidubce.com/oauth/2.0/token
String token = "24.95xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxx.xxxxxxxxxx.xxxxxx-xxxxxxxx"; // 实例化服务对象
BaiduCloudService service = new BaiduCloudService(token); // 将图片转为base64字符串
String imageBase64 = service.img2Base64(imagePath); // 向百度服务发请求,检测人脸
FaceDetectResponse faceDetectResponse = service.detect(imageBase64); // 输出检测结果
System.out.println(faceDetectResponse);
}
}
  • 确保用于检测的照片与上述代码中的路径一致(E:\temp\202201\01\pic\1.jpeg),我这里选用了一张戴口罩的单人照,如下图:

  • 执行BaiduCloudService的main方法,控制台将百度返回的检测结果打印出来,注意下面的内容并非JSON,而是lombok的@ToString注解拼接出的效果:

  • 至此,通过百度的web接口调用人脸检测的实战已完成,可见有了云平台的支持,对于使用方来说开发过程变得非常简单

使用限制

  • 既然是免费的,就很难十全十美,这样的web服务存在QPS限制,如下图,一秒钟不能超过两个,如果完成了企业认证,可以增加到十个,如果依旧不能满足需要,就只能付费了:

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

最简单的人脸检测(免费调用百度AI开放平台接口)的更多相关文章

  1. 百度AI开放平台- API实战调用

    百度AI开放平台- API实战调用 一.      前言 首先说一下项目需求. 两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有60-1 ...

  2. 百度AI开放平台,语音识别,语音合成以及短文本相似度

    百度AI开放平台:https://ai.baidu.com/ 语音合成 from aip import AipSpeech APP_ID=" #'你的 App ID' API_KEY=&qu ...

  3. selenium自动化 | 借助百度AI开放平台识别验证码登录职教云

    #通过借助百度AI开放平台识别验证码登录职教云 from PIL import Image from aip import AipOcr import unittest # driver.get(zj ...

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

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

  5. 百度AI开放平台 UNIT平台开发在线客服 借助百度的人工智能如何开发一个在线客服系统

    这段时间在研究一些人工智能的产品,对比了国内几家做人工智能在线客服的,有些接口是要收费的,有些是免费的,但是做了很多限制,比如每天调用的接口次数限制是100次.后来就找到了百度的AI,大家也知道,目前 ...

  6. 百度AI开放平台 情感倾向分析实例以及gbk编码解决

    f=open('test.txt','a+',encoding='utf-8') for index,row in cxzg.iterrows(): text=str(row['text']) tex ...

  7. 微信小程序,天气预报(百度地图开放平台API)

    小程序看似一种全新的东西,但好在基本上就是曾经HTML,CSS,JS的一个微变版本. 语法和之前一样.只是一些用法和名字(标签)发生了一些变化. 小程序主要就四种扩展名的文件:js,json,wxml ...

  8. 腾讯AI开放平台的接口调用指南

    最近无意发现腾讯AI开放平台上提供了大量好玩的人工智能云服务,而且是完全免费的.只需要用QQ号登录即可.这么好的东西,作为一个程序员,当然要试试了! 从上图可以看出腾讯AI开放平台提供的人工智能服务主 ...

  9. 运用百度开放平台接口根据ip地址获取位置

    使用百度开放平台接口根据ip地址获取位置 今天无意间发现在百度开放平台接口,就把一段代码拿了下来,有需要的可以试试看:http://opendata.baidu.com/api.php?query=5 ...

  10. 百度 LBS 开放平台,开发人员众測计划正式启动

    Hi各位亲爱滴开发人员:   你是否以前-- 期望第一时间率先接触到百度LBS开放平台的最新功能? 期望被邀请作为最最尊贵的首批试用志愿者感受志愿者的特权? 期望自己的意见被产品经理採纳.优化功能.从 ...

随机推荐

  1. 腾讯出品小程序自动化测试框架【Minium】系列(七)测试框架的设计和开发

    前言 整个框架的开发及调通是在3月27日晚上22点完成,如下: 这篇文章真的是拖了太久了,久到我居然把代码部分完成后,彻底给忘了,这记性,真的是年纪大了! 框架的设计开发 1.框架搭建设计要素 日志& ...

  2. Ubuntu2204部署容器引擎Containerd

    为什么使用containerd? 使用containerd的原因主要有两点吧,第一个是docker在k8s1.24以后不再支持,如果需要在k8s中继续使用docker作为容器引擎,我们需要额外部署cr ...

  3. RDIFramework.NET开发框架在线表单设计整合工作流程的使用

    1.概述 在RDIFramework.NET开发框架在线表单设计助力可视化快速开发文章中,我们介绍了不使用编码的方式进行表单的在线设计并挂接在对应的模块下,加速应用的落地与实现.同样,通过在线设计的表 ...

  4. TENGSHE-OS-渗透测试系统-win11版

    下载ISO文件 创建新的虚拟机 VM17 已支持直接创建 win11 x64 稍后安装系统 选中win11 修改路径 win11需要设置8位加密密码 勾选安全引导 根据自身情况选择 默认即可 150G ...

  5. Ldap同步过滤问题

    https://docs.oracle.com/cd/E26217_01/E35191/html/ldap-filters-attrs-users.html

  6. Kubernetes(K8S) kubesphere 安装

    安装KubeSphere最好的方法就是参考官方文档,而且官方文档是中文的. 官网地址:https://kubesphere.com.cn/ https://github.com/kubesphere/ ...

  7. C# 监听窗口分辨率/DPI变更

    当程序运行,窗口已经加载后,如果修改屏幕分辨率,会影响窗口的正常显示. 举个案例: 悬浮窗口,显示在屏幕右下角.当分辨率.文本显示比例变更后,窗口位置可能会超出屏幕范围. 所以当屏幕变更时,我们需要知 ...

  8. java优先队列PriorityQueue

    文章目录 前言 PriorityQueue 优先队列 java中优先队列的声明 按优先级排序 常见方法 private void grow(int minCapacity) public boolea ...

  9. Linux期末佛脚指南

    Linux的期末佛脚复习 常用文件操作命令 touch (创建文件) cat (查看文件内容) head (查看文件开头) tail (查看文件结尾) cp (复制文件) mv (移动文件) ls ( ...

  10. C++ | 类继承

    1. 概述 C++有3种继承方式:公有继承(public).保护继承(protected).私有继承(private). 一个B类继承于A类,或称从类A派生类B.这样的话,类A称为基类(父类),类B称 ...