腾讯云人脸识别SDK集成

实现人脸识别功能的核心在于完成人脸信息的采集与比对。要在项目中集成这一功能,开发者需要在前端搭建完善的人脸录入和识别界面。下面主要是后端的集成步骤:

1.在腾讯官网配置

注册腾讯云账号并开通人脸识别服务,(腾讯云人脸识别首页) ,申请完成后需要创建创建人员库列表,指定人员库ID(在后续的开发中会被使用到)

创建好后如下:

刚创建之后人员数量为0

在项目中集成腾讯云的密钥

密钥地址:https://console.cloud.tencent.com/cam/overview(访问管理)

点击新建密钥就会生成密钥id和key,记得保存好。

将上面的4个参数集成到项目中

  • APPID

  • SecretId

  • secretKey(记得保存好)

  • face

    • groupName:sky(人员库ID)

    • region:ap-guangzhou

复制到yml文件:

bash 复制代码
tencent:
  cloud:
    appId: 
    secretId: 
    secretKey: 
    face:
      groupName: 
      region: ap-guangzhou

2.项目中集成

导入腾讯云的依赖库

XML 复制代码
<!--腾讯云-->
<dependency>
    <groupId>com.tencentcloudapi</groupId>
    <artifactId>tencentcloud-sdk-java</artifactId>
    <version>3.1.416</version>
</dependency>

API文档https://cloud.tencent.com/document/api/867/45014

1.人脸信息采集:

java 复制代码
@Service
@Slf4j
public class PersonFaceServiceImpl implements PatientFaceService {

    @Value("${tencent.cloud.secretId}")
    private String secretId;

    @Value("${tencent.cloud.secretKey}")
    private String secretKey;

    @Value("${tencent.cloud.face.groupName}")
    private String groupName;

    @Value("${tencent.cloud.face.region}")
    private String region;

    @Autowired
    private PersonFaceDao PersonFaceDao;

    @Autowired
    private PersonUserInfoDao PersonUserInfoDao;


    /**
     * 人脸信息录入
     * @param param
     */
    @Override
    @Transactional
    public void createFaceModel(Map param) {
        //从参数中获取用户ID和照片
        Integer userId = MapUtil.getInt(param, "userId");
        String photo = MapUtil.getStr(param, "photo");

        //创建腾讯云身份认证凭证
        Credential cred = new Credential(secretId, secretKey);
        IaiClient client = new IaiClient(cred, region);

        //查询用户姓名和性别
        Map<String,String> userInfo = PersonUserInfoDao.selectPersonUserInfoByUserId(userId);
        String name = userInfo.get("name");
        String sex = userInfo.get("sex");

        // 创建人员请求对象
        CreatePersonRequest req = new CreatePersonRequest();
        // 设置人员所属的分组ID,将该人员添加到指定的人员库(groupName)中
        // 以后可以通过这个分组来查询、管理该人员的人脸数据
        req.setGroupId(groupName);

        // 将用户ID转换为字符串格式并设置为该人员的唯一ID
        // 该ID用于唯一标识每个用户,并在以后的人脸比对或查询中使用
        req.setPersonId(String.valueOf(userId));

        // 根据用户的性别(sex)来设置该人员的性别
        // 性别用数字表示,1代表男性,2代表女性
        req.setGender(getGender(sex));

        // 设置图像质量控制参数,值的范围是 0-4,
        // 其中 0 为最低质量,4 为最高质量。这里设置为 4,表示要求较高的图像质量
        req.setQualityControl(4L);

        // 设置唯一性控制参数,用来控制人脸与其他人员的相似度
        // 值的范围是 0-4,0表示最低,4表示最严格。设置为4,要求较高的唯一性
        req.setUniquePersonControl(4L);

        // 设置人员的姓名,这里将数据库中获取的用户姓名设置到该字段
        // 用于标识该人员的名字
        req.setPersonName(name);

        // 设置人员的照片,用于创建人脸模型。照片数据通常是经过Base64编码后的图片数据
        req.setImage(photo);

        try {
            // 发起创建人员请求,调用腾讯云的人脸识别服务来创建该人员的人脸模型
            // 传递的参数是之前设置的 CreatePersonRequest(req),包含了用户的基本信息和照片
            CreatePersonResponse resp = client.CreatePerson(req);

            // 判断腾讯云返回的响应中是否有有效的人脸ID
            // 如果 FaceId 不为空,说明人脸模型成功创建,响应中返回了该人员的人脸ID
            if (StrUtil.isNotBlank(resp.getFaceId())) {
                // 更新数据库,标记用户已录入人脸模型
                updateUserFaceModelStatus(userId);
            }
        } catch (TencentCloudSDKException e) {
            // 捕获腾讯云SDK异常并抛出全局异常
            throw new GlobalException(e);
        }

    }
    // 提取数据库更新方法
    private void updateUserFaceModelStatus(Integer userId) {
        Map<String, Object> updateParams = Map.of("userId", userId, "existFaceModel", true);
        personUserInfoDao.updateExistFaceModel(updateParams);
    }
    // 提取性别判断方法
    private Long getGender(String sex) {
        return "男".equals(sex)?1L:2L;
    }

2.人脸信息识别:

java 复制代码
    //人脸信息识别
    @Override
    public boolean verifyFaceModel(int userId, String photo) {

        try {
            //Step 1: 初始化腾讯云凭证和客户端(可以考虑将其移到类的成员变量中,避免每次调用都创建新的实例)
            Credential cred = new Credential(secretId, secretKey);
            IaiClient client = new IaiClient(cred, region);

            // Step 2: 验证人脸识别是否匹配
            boolean isMatch = verifyPersonIdentity(client, userId, photo);
            if (!isMatch) {
                return false;// 如果人脸识别不匹配,提前返回false
            }
            // Step 3: 执行活体检测
            boolean isLiveness = detectLiveness(client, photo);
            // Step 4: 综合人脸识别和活体检测结果
            boolean result = isMatch && isLiveness;
            //如果验证通过,将相关信息保存数据库
            if (result) {
                saveFaceAuthToDatabase(userId);//只有验证通过才保存信息
            }
            return result;

        } catch (Exception e) {
            // 捕获所有异常并记录详细的错误日志
            log.error("人脸信息验证失败,userId: {}, 错误信息: {}", userId, e.getMessage(), e);
            return false; // 发生异常时返回false
        }
    }

    // 将验证通过的用户人脸信息保存到数据库
    private void saveFaceAuthToDatabase(int userId) {
        //查询用户的信息ID
        Integer id = personUserInfoDao.selectIdByUserId(userId);
        if (id != null) {
            //如果找到用户信息ID,创建FaceAuth对象并保存
            FaceAuth faceAuth = new FaceAuth();
            faceAuth.setDate(DateUtil.today());
            faceAuth.setPatientCardId(id);
            patientFaceDao.insert(faceAuth);
        } else {
            // 如果未找到用户信息,记录警告日志
            log.warn("未找到用户信息,userId: {}", userId); // 用户信息不存在时,记录警告
        }
    }

    // 执行活体检测,验证照片是否为真实的动态人脸
    private boolean detectLiveness(IaiClient client, String photo) {
        // 创建活体检测请求对象
        DetectLiveFaceRequest request = new DetectLiveFaceRequest();
        request.setImage(photo); // 设置照片

        try {
            // 调用腾讯云API进行活体检测
            DetectLiveFaceResponse response = client.DetectLiveFace(request);
            return response.getIsLiveness(); // 返回活体检测结果
        } catch (TencentCloudSDKException e) {
            // 如果活体检测过程中发生异常,记录错误日志并返回false
            log.error("活体检测失败,错误信息: {}", e.getMessage(), e);
            return false; // 如果检测失败,返回false
        }
    }

    // 验证人脸信息是否匹配
    private boolean verifyPersonIdentity(IaiClient client, int userId, String photo) {
        // 创建人脸识别请求对象
        VerifyPersonRequest request = new VerifyPersonRequest();
        request.setPersonId(String.valueOf(userId)); // 设置用户ID
        request.setImage(photo); // 设置照片
        request.setQualityControl(4L); // 设置质量控制参数(此处4L为较高质量,建议将该数字提取为常量)
        try {
            // 调用腾讯云API进行人脸识别
            VerifyPersonResponse response = client.VerifyPerson(request);
            return response.getIsMatch(); // 返回人脸匹配结果
        } catch (TencentCloudSDKException e) {
            // 如果人脸识别过程中发生异常,记录错误日志并返回false
            log.error("人脸识别失败,userId: {}, 错误信息: {}", userId, e.getMessage(), e);
            return false; // 如果识别失败,返回false
        }
    }

完善上面的人脸信息的录入和识别web层接口后就可以进行测试了。

3.测试人脸信息的录入与识别

这里我用的移动端,先进行人脸信息录入:

录入成功后查看数据库,如果相关参数和数据保存正常,同时腾讯云:

后续在进行人脸识别和验证:

更加详细的集成方式的可以自行看官网文档(点击)进行设置,那么到这里项目中集成腾讯云SDK也就完成了。

相关推荐
q***44152 分钟前
SpringSecurity踢出指定用户
java
SHolmes18543 分钟前
Python all函数 判断是否同时满足多个条件
java·服务器·python
shejizuopin8 分钟前
基于JavaSSM+MySQL的实验室考勤管理系统设计与实现
java·mysql·vue·毕业设计·论文·springboot·实验室考勤管理系统设计与实现
J***516819 分钟前
SpringSecurity的配置
java
数字游民952720 分钟前
网站备案全流程回放(腾讯云)
人工智能·git·github·腾讯云·网站备案·waytoopc
面汤放盐20 分钟前
软件架构指南 Software Architecture Guide
java·微服务·devops
tkevinjd20 分钟前
JUC5(线程池)
java·线程池·多线程·juc
武子康20 分钟前
大数据-210 如何在Scikit-Learn中实现逻辑回归及正则化详解(L1与L2)
大数据·后端·机器学习
Tao____21 分钟前
如何对接Modbus-tcp协议(使用Thinlinks物联网平台)
java·物联网·网络协议·tcp/ip·modbus
鱼跃鹰飞26 分钟前
经典面试题:K8S的自动缩扩容和崩溃恢复
java·容器·kubernetes