【腾讯云】使用人脸识别的面部分析技术


前言

随着人工智能的不断发展,以及对接云端上的技术也越来越重要,很多人都开启了了解学习云端技术,本文就介绍了腾讯云上的人脸识别技术对接内容。
腾讯云神图·人脸识别(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 次免费使用次数,可在购买的资源包管理中查询,超过这个会进行收费的,不过免费的已够我们开发测试用的了。在这里插入图片描述
说明一下:开通人脸识别后,针对每个功能接口腾讯云会为我们提供 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,以及相关文档, 有问题可以参照官网,也可以留言大家一起讨论下。 当然,文章中有哪些不当之处,也欢迎大家进行指正。

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
## 使用前准备​ 1. 前往注册: [腾讯云账号注册](https://cloud.tencent.com/register) (详细指引见 [注册腾讯云](https://cloud.tencent.com/document/product/378/9603)) 2. 取得存储桶名称 **BucketName**: 请前往 [创建存储桶](https://cloud.tencent.com/document/product/460/10637) 3. 取得 **APPID**、**SecretId**、**SecretKey**:请前往 [云API密钥](https://console.cloud.tencent.com/cam/capi) ,点击“新建密钥” ## 快速体验 1. 修改文件 src/main/java/com/qcloud/image/demo/Demo.java 的 main() 方法,填入上述申请到的 **APPID**、**SecretId**、**SecretKey**、**BucketName** 2. 导入到 IDE:工程用 Maven 构建,以 Intellij IDEA 为例,导入方式为:Import Project -> 选择工程目录 -> Import project from external model -> Maven 3. 运行:Demo.java 右键,Run Demo.main() ## 使用简介 ### 初始化 ```java ImageClient imageClient = new ImageClient(APPID, SecretId, SecretKey); ``` ### 设置代理 根据实际网络环境,可能要设置代理,例如: ```java Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress("127.0.0.1", 8080)); imageClient.setProxy(proxy); ``` ### 使用 SDK 提供功能如下: **像识别**:鉴黄,标签 **文字识别(OCR)**:身份证,名片,通用,驾驶证行驶证,营业执照,银行卡,车牌号 **人脸识别**:人脸检测,五官定位,个体信息管理,人脸验证,人脸对比及人脸检索 **人脸核身**:照片核身(通过照片和身份证信息),获取唇语验证码(用于活体核身),活体核身(通过视频和照片),活体核身(通过视频和身份证信息) ```java // 调用车牌识别API示例 String imageUrl = "http://youtu.qq.com/app/img/experience/char_general/icon_ocr_license_3.jpg"; String result = imageClient.ocrPlate(new OcrPlateRequest("bucketName", imageUrl)); System.out.println(result); ``` 更多例子详情可参见 [Demo.java](https://github.com/tencentyun/image-java-sdk-v2.0/blob/master/src/main/java/com/qcloud/image/demo/Demo.java) 的代码。 ## 集成到你的项目中 ### 获得 SDK jar 文件 1. 直接使用 release/*-with-dependencies.jar 2. 自行编译:在工程根目录下执行命令 `mvn assembly:assembly`,编译结果见 target/*-with-dependencies.jar ### 导入 jar 文件 根据项目具体情况导入 *-with-dependencies.jar
Uniapp是一款基于Vue.js框架开发的跨平台应用开发框架,它可以将我们的Vue代码编译成不同平台的原生应用。而腾讯云人脸识别活体检测是一项用于识别人脸并验证其真实性的技术,可以用于安全认证、人脸支付等场景。 在Uniapp中对接腾讯云人脸识别活体检测,我们可以按以下步骤进行: 1. 注册并创建腾讯云账号,开通人脸识别服务,并获取到相关的API密钥和访问密钥。 2. 在Uniapp项目中引入相关的插件或库,比如uni-app-faceid插件,该插件是为了方便Uniapp与腾讯云人脸识别服务进行交互而开发的。 3. 在Uniapp的页面中,使用插件提供的组件或方法,调用腾讯云人脸识别服务的接口,传递待识别的人脸像数据。 4. 接收腾讯云人脸识别服务返回的结果,根据返回的结果判断活体检测是否通过。 需要注意的是,在使用腾讯云人脸识别活体检测时,我们需要保证传入的人脸像质量较高,且能够满足腾讯云人脸识别服务的要求,例如需要清晰可见的人脸像。 除了以上步骤,根据具体需求,我们还可以根据腾讯云人脸识别服务的其他功能,如人脸比对、人脸搜索等,进行更高级的功能扩展。 总之,Uniapp与腾讯云人脸识别活体检测的对接,需要通过引入插件或库来实现与腾讯云交互,并根据返回结果判断活体检测是否通过。这样我们就可以在Uniapp项目中应用腾讯云人脸识别服务,实现更广泛的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟学会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值