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

相关推荐
高频因子挖掘机2 分钟前
实时行情为什么不应该逐只股票请求?批量查询与标的池管理实践
后端·github·api
程序猿DD5 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
蛋蛋的就会顺顺的8 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
余槐i8 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
Geek-Chow8 小时前
05.1 · AWS Lambda 版本(Version)详解:$LATEST、不可变快照与限定 ARN
云计算
需要8268 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡8 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
凤山老林9 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne10 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF10 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用