腾讯云人脸识别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也就完成了。

相关推荐
嘻哈baby2 小时前
分布式组网架构设计:从BitTorrent DHT到现代SD-WAN的演进
分布式·后端·asp.net
就叫飞六吧2 小时前
pdf转国产ofd格式代码案例-Java
java·python·pdf
LiamTuc2 小时前
Java 接口定义变量
java·开发语言
小坏讲微服务2 小时前
Spring Cloud Alibaba 微服务整合自定义日志注解完整教程
java·spring cloud·微服务·云原生·架构
2401_865854882 小时前
腾讯云的信息队列是做什么的
云计算·腾讯云
wanhengidc3 小时前
在线服务器的功能都有哪些
运维·服务器·科技·智能手机·云计算
赵得C3 小时前
软件设计师进阶知识点解析:分布式与数据应用考点精讲
java·开发语言·分布式·设计模式
雨中飘荡的记忆3 小时前
Docker与Java实战指南
java·docker·容器