前言
随着人工智能的不断发展,以及对接云端上的技术也越来越重要,很多人都开启了了解学习云端技术,本文就介绍了腾讯云上的人脸识别技术对接内容。
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
一、人脸识别是什么?
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
产品功能
人脸检测与分析
五官定位
人脸比对
人员库管理
人脸验证
人脸搜索
人脸静态活体检测(高精度版)
人脸静态活体检测
二、使用步骤
1.引入库
java代码如下(示例):
<!-- 腾讯云的人脸识别 (IAI)API3.0 最新版本:3.1.978 -->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java-iai</artifactId>
<version>3.1.978</version>
</dependency>
2.application.yml 自定义属性值
说明一下:上图是密钥的获取方式
tencent:
cloud:
appId: xxxxxx #APPID
secretId: xxxxxx #密钥
secretKey: xxxxxx #密钥key
face:
groupId: xxxxxx #人员库ID
region: ap-shanghai #地域
3.静态参数初始化类 StaticConfig
package com.example.hospital.patient.wx.api.config;
import com.example.hospital.patient.wx.api.util.IaiUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* 静态参数初始化
*/
@Component
public class StaticConfig {
@Value("${tencent.cloud.appId}")
private String appId;
@Value("${tencent.cloud.secretKey}")
private String secretKey;
@Value("${tencent.cloud.secretId}")
private String secretId;
@Value("${tencent.cloud.face.region}")
private String region;
@Value("${tencent.cloud.face.groupId}")
private String groupId;
/**
* 用于标记一个方法,该方法将在bean的依赖注入实例化完成之后,在调用任何构造方法之前被调用,
* init方法会在StaticConfig bean实例化后被立即调用
*/
@PostConstruct
public void init() {
IaiUtil.init(appId,secretKey,secretId,region,groupId);
}
}
4.IaiUtil 工具类
实现功能:
1、获取人员库信息
2、修改人员库信息
3、创建人员:用于创建人脸信息
4、增加人脸 createFace
5、人脸搜索
6、人脸验证 用于验证登录的账号是否是本人
7、人脸静态活体检测(非高精度版)
8、将File文件转成base64编码
说明一下:开通人脸识别后,针对每个功能接口腾讯云会为我们提供 10000 次免费使用次数,可在购买的资源包管理中查询,超过这个会进行收费的,不过免费的已够我们开发测试用的了。
package com.example.hospital.patient.wx.api.util;
import cn.hutool.core.map.MapUtil;
import com.example.hospital.patient.wx.api.exception.HospitalException;
import com.tencentcloudapi.common.AbstractModel;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
//导入可选配置类
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.iai.v20180301.IaiClient;
import com.tencentcloudapi.iai.v20180301.models.*;
import java.io.File;
import java.io.FileInputStream;
import java.util.*;
public class IaiUtil {
private static String appId;
private static String secretKey;
private static String secretId;
private static String region;
private static String groupId;
/**
* 总结:
* 为什么static修饰的字段就不能通过@Value设置值呢,这是因为@Value设置值是通过spring容器来ioc设置值的,可是static修饰的字段在构造
* 函数之前就加载完毕了,所以是没办法通过@Value来设置值。但是我们却可以通过加配置类以及添加init的方法,来辅助完成对静态成员变量赋值的问题。
* 在启动加了@Component注解的 pojo类实例化后,通过调用init方法来给static修饰的字段设置新的值,通过这种方式就可以解决这种问题了。
* @param appId
* @param secretKey
* @param secretId
* @param region
* @param groupId
*/
public static void init(String appId, String secretKey, String secretId, String region, String groupId){
IaiUtil.appId = appId;
IaiUtil.secretKey = secretKey;
IaiUtil.secretId = secretId;
IaiUtil.region = region;
IaiUtil.groupId = groupId;
}
/**
* 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
* @return client
*/
public static IaiClient getClientInstance() {
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
Credential cred = new Credential(secretId, secretKey);
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("iai.tencentcloudapi.com");
// httpProfile.setReqMethod("GET"); // get请求(默认为post请求) get请求可能会报错,报414,uri路径过长
httpProfile.setConnTimeout(30); // 请求连接超时时间,单位为秒(默认60秒)
httpProfile.setWriteTimeout(30); // 设置写入超时时间,单位为秒(默认0秒)
httpProfile.setReadTimeout(30); // 设置读取超时时间,单位为秒(默认0秒)
// 实例化一个client选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
IaiClient client = new IaiClient(cred, region, clientProfile);
return client;
}
/**
* 获取人员库信息
* @param groupId
*/
public static String GetGroupInfo(String groupId) throws TencentCloudSDKException {
try{
IaiClient client = getClientInstance();
// 实例化一个请求对象,每个接口都会对应一个request对象
GetGroupInfoRequest req = new GetGroupInfoRequest();
req.setGroupId(groupId);
// 返回的resp是一个GetGroupInfoResponse的实例,与请求对象对应
GetGroupInfoResponse resp = client.GetGroupInfo(req);
// 输出json格式的字符串回包
return AbstractModel.toJsonString(resp);
} catch (TencentCloudSDKException e) {
throw new TencentCloudSDKException(e.getMessage());
}
}
/**
* 修改人员库信息
* @param map
*/
public static String modifyGroup(Map map) {
try{
IaiClient client = getClientInstance();
// 实例化一个请求对象,每个接口都会对应一个request对象
ModifyGroupRequest req = new ModifyGroupRequest();
req.setGroupName(MapUtil.getStr(map, "groupName"));
req.setGroupId(MapUtil.getStr(map, "groupId"));
req.setTag(MapUtil.getStr(map, "tag"));
// 返回的resp是一个ModifyGroupResponse的实例,与请求对象对应
ModifyGroupResponse resp = client.ModifyGroup(req);
// 输出json格式的字符串回包
return AbstractModel.toJsonString(resp);
} catch (TencentCloudSDKException e) {
throw new HospitalException(e.getMessage());
}
}
/**
* 创建人员:用于创建人脸信息,创建人员信息
* @param map
*/
public static String createPerson(Map map) throws TencentCloudSDKException{
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
IaiClient client = getClientInstance();
// 实例化一个请求对象,每个接口都会对应一个request对象
CreatePersonRequest req = new CreatePersonRequest();
req.setGroupId(groupId);
req.setPersonId(MapUtil.getStr(map, "userId"));
req.setPersonName(MapUtil.getStr(map, "name"));
req.setGender(MapUtil.getStr(map, "sex").equals("男") ? 1L : 2L); // 0代表未填写,1代表男性,2代表女性
// image和url 必须提供一个,如果都提供则只用url
req.setImage(MapUtil.getStr(map, "image")); // 图片base64数据,base64编码后大小不可超过5M
req.setUrl(MapUtil.getStr(map, "url"));
req.setUniquePersonControl(4L); // 0-4L 数值越大,疑似同一人的概率越小
req.setQualityControl(4L); // 图片质量控制
req.setNeedRotateDetection(0L); // 是否开启图片旋转识别支持,0为不开启,1为开启。默认为0
// 返回的resp是一个CreatePersonResponse的实例,与请求对象对应
CreatePersonResponse resp = client.CreatePerson(req);
// 输出json格式的字符串回包
return AbstractModel.toJsonString(resp);
}
/**
* 增加人脸 createFace
* 将一组人脸图片添加到一个人员中。一个人员最多允许包含 5 张图片。若该人员存在多个人员库中,所有人员库中该人员图片均会增加。
* @param map
*/
public static String createFace(Map map) {
try{
// 实例化一个认证对象
IaiClient client = getClientInstance();
// 实例化一个请求对象,每个接口都会对应一个request对象
CreateFaceRequest req = new CreateFaceRequest();
req.setPersonId(MapUtil.getStr(map, "personId")); // 取值为创建人员接口中的PersonId
String[] images = MapUtil.getStr(map, "images").split(",");
req.setImages(images);
req.setUrls(null);
req.setQualityControl(4L);
req.setNeedRotateDetection(4L);
// 返回的resp是一个CreateFaceResponse的实例,与请求对象对应
CreateFaceResponse resp = client.CreateFace(req);
// 输出json格式的字符串回包
return AbstractModel.toJsonString(resp);
} catch (TencentCloudSDKException e) {
throw new HospitalException(e.getMessage());
}
}
/**
* 人脸搜索
* {"Results":[{"Candidates":[
* {"PersonId":"3","FaceId":"5747033611227397943","Score":100.0},
* {"PersonId":"1","FaceId":"5746743768021743449","Score":29.923056},
* {"PersonId":"2","FaceId":"5746932940559900637","Score":12.88152}
* ],"FaceRect":{"X":254,"Y":420,"Width":348,"Height":456},"RetCode":0}],
* "FaceNum":3,"FaceModelVersion":"3.0","RequestId":"0bc3c6d1-ef85-43ec-bd67-4e0318c2ad0d"}
* @param map
* @return
*/
public static String searchFaces(Map map) {
try{
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
IaiClient client = getClientInstance();
// 实例化一个请求对象,每个接口都会对应一个request对象
SearchFacesRequest req = new SearchFacesRequest();
req.setGroupIds(MapUtil.getStr(map,"groupIds").split(","));
req.setImage(fileToBase64());
// 返回的resp是一个SearchFacesResponse的实例,与请求对象对应
SearchFacesResponse resp = client.SearchFaces(req);
// 输出json格式的字符串回包
return AbstractModel.toJsonString(resp);
} catch (TencentCloudSDKException e) {
throw new HospitalException(e.getMessage());
}
}
/**
* 用于验证登录的账号是否是本人
* 人员验证:给定一张人脸图片和一个 PersonId,判断图片中的人和 PersonId 对应的人是否为同一人。
* 本接口会将该人员(Person)下的所有人脸(Face)进行融合特征处理,即若某个Person下有4张 Face,本接口会将4张 Face 的特征进行融合处理,
* 生成对应这个 Person 的特征,使人员验证(确定待识别的人脸图片是某人员)更加准确。
* 输出参数示例:{"Score":100.0,"IsMatch":true,"FaceModelVersion":"3.0","RequestId":"c1ea2cc5-1c8f-4433-9715-4339ac96f8b4"}
* @param map
* @return
*/
public static String verifyPerson(Map map) throws TencentCloudSDKException {
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
IaiClient client = getClientInstance();
// 实例化一个请求对象,每个接口都会对应一个request对象
VerifyPersonRequest req = new VerifyPersonRequest();
req.setPersonId(MapUtil.getStr(map, "userId"));
req.setImage(MapUtil.getStr(map, "image"));
// 返回的resp是一个VerifyPersonResponse的实例,与请求对象对应
VerifyPersonResponse resp = client.VerifyPerson(req);
// 输出json格式的字符串回包
return AbstractModel.toJsonString(resp);
}
/**
* 人脸静态活体检测(非高精度版)
* @param map
* @return
* @throws TencentCloudSDKException
*/
public static String detectLiveFace(Map map) throws TencentCloudSDKException {
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
IaiClient client = getClientInstance();
// 实例化一个请求对象,每个接口都会对应一个request对象
DetectLiveFaceRequest req = new DetectLiveFaceRequest();
// image和url 必须传一个
req.setImage(MapUtil.getStr(map, "image"));
req.setUrl(MapUtil.getStr(map, "url"));
req.setFaceModelVersion("3.0");
// 返回的resp是一个DetectLiveFaceResponse的实例,与请求对象对应
DetectLiveFaceResponse resp = client.DetectLiveFace(req);
// 返回json格式的字符串回包
return AbstractModel.toJsonString(resp);
}
/**
* 将File文件转成base64编码
* 也可以在前端直接将图片转化为 base64字符串数据
*
* @return base64编码
*/
public static String fileToBase64() {
File file = new File("/Users/mac/Documents/我的照片/照片.jpg");
if (!file.exists()) {
return null;
}
// base64编码
String context = null;
try {
FileInputStream inputFile = new FileInputStream(file);
byte[] buffer = new byte[(int) file.length()];
inputFile.read(buffer);
inputFile.close();
// public static Encoder getEncoder():基本型 base64 编码器
// 基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/
context = Base64.getEncoder().encodeToString(buffer);
} catch (Exception e) {
e.printStackTrace();
}
return context;
}
}
【更多详情信息可参考官网:】
https://cloud.tencent.com/document/product/867
三、总结
以上就是今天要记录的内容,本文主要介绍了人脸识别中的人脸的创建、验证,以及人脸静态活体检测等的使用,而腾讯云为我们提供了大量的处理人脸识别的API接口和SDK,以及相关文档, 有问题可以参照官网,也可以留言大家一起讨论下。 当然,文章中有哪些不当之处,也欢迎大家进行指正。