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