人脸识别如果无特殊要求的话流程应该是:
- 通过前端传来的图片检测是否为活体。
- 通过用户或其他方式获取当前用户所在人员库,没有时自动创建。
- 判断当前用户是否为第一次使用人脸识别,第一次使用时应该是收入用户人脸数据(创建人员)。
- 如果用户是第二次使用人脸识别,应该走人员检测接口,通过当前用户的人员ID和当前获取到的图片检测。
- 第三步和第四步是同一等级,一次只能走其中一个,再判断结果并把处理结果返还给前端。
安装腾讯云SDK
- 选择需要的版本添加到项目的composer.json文件中。
- 添加完以后直接composer更新即可。
获取图片
人脸识别都依赖于图像,所以第一步我们应该获取前端传过来的图片,如果不需要保存的话让前端传一个Base64字符串,直接用base64来进行活体检测,如果需要保存就先保存图片再拿到图片的URL地址,也可以直接获取到当前图片的base64字符串。
如果图片不需要前端及时上传,那直接获取数据库保存的URL即可。
use文件
use TencentCloud\Bda\V20200324\Models\CreateGroupRequest;
use TencentCloud\Bda\V20200324\Models\DeletePersonRequest;
use TencentCloud\Iai\V20200303\Models\CreatePersonRequest;
use TencentCloud\Common\Credential;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use TencentCloud\Iai\V20200303\IaiClient;
use TencentCloud\Iai\V20200303\Models\DetectLiveFaceRequest;
use TencentCloud\Iai\V20200303\Models\VerifyPersonRequest;
引用的文件可根据自己的需求进行删减
注意:SDK中会包含低版本的代码,所以引用的文件一定要跟API Explorer中生成的一样,我就引用过低版本,跟腾讯技术人员找了半天都没找到问题。
活体检测
全称是:人脸静态活体检测,点击进入腾讯云官方文档
//实例化一个证书对象,入参需要腾讯云账户secretId,secretKey
$cred = new Credential("", "");
// 实例化一个http选项
$httpProfile = new HttpProfile();
// 指定接入地域(默认就近接入)
$httpProfile->setEndpoint("iai.tencentcloudapi.com");
//实例化客户端
$clientProfile = new ClientProfile();
//配置http
$clientProfile->setHttpProfile($httpProfile);
//实例化人脸识别对象 第二个参数是地域参数
$client = new IaiClient($cred, "ap-chongqing", $clientProfile);
//人脸识别图像对象
$req = new DetectLiveFaceRequest();
//组装请求参数 我当前使用的是URL 如果是base64的话可以使用:["Image"=>$base64]
$params = array(
"Url" => $imgUrl
);
//赋值json化数据
$req->fromJsonString(json_encode($params));
//这里加try的原因是如果当前图像检测有误,或参数有误如直接报错
try {
//进行活体检测
$resp = $client->DetectLiveFace($req);
//获取请求结果
$res = $resp->toJsonString();
//请求结果转数组
$res = json_decode($res, true);
}catch(TencentCloudSDKException $e) {
return $this->setErrorData(40006,$e->getMessage());
}
//判断结果 这一步是进一步判断 也可以省掉 直接进行下一步判断
if(empty($res["Score"])){
return $this->setErrorData(40005,"验证失败,请重新获取认证图像");
}
//判断活体值 腾讯云判断小于87分的不为活体 一般只要是自拍照 无美颜 没有遮挡的图片活体值都是95以上
if($res["Score"] < 85){
return $this->setErrorData(40006,"验证失败,请重新获取认证图像");
}
//当前图像是活体,可以直接跟上自己的业务逻辑
创建人员库
//实例化一个证书对象,入参需要腾讯云账户secretId,secretKey
$cred = new Credential("", "");
// 实例化一个http选项
$httpProfile = new HttpProfile();
// 指定接入地域(默认就近接入)
$httpProfile->setEndpoint("iai.tencentcloudapi.com");
//实例化客户端
$clientProfile = new ClientProfile();
//配置http
$clientProfile->setHttpProfile($httpProfile);
//实例化人脸识别对象 第二个参数是地域参数
$client = new IaiClient($cred, "ap-chongqing", $clientProfile);
try {
//在这之前一定要先获取当当前人脸使用的人员库名以及人员库ID 并添加到数据库 避免下次还会请求添加人员库
//还要开启事务 避免腾讯云添加失败 但数据库已经记录
//获取人体库请求对象
$req = new CreateGroupRequest();
//组装创建人体库所需参数
$params = array(
"GroupName" => $data["group_name"],
"GroupId" => $data["group_id"],
);
//赋值json对象数据
$req->fromJsonString(json_encode($params));
//创建人员库
$resp = $client->CreateGroup($req);
//获取请求结果
$res = $resp->toJsonString();
//请求结果转数组
$res = json_decode($res, true);
//判断结果
if(empty($res["FaceModelVersion"])){
//事务回滚 数据库与腾讯云人员库同步
$this->rollback();
return $this->setErrorData(40005,"创建腾讯云人员库失败");
}
$this->commit();
}catch(TencentCloudSDKException $e) {
$this->rollback();
return $this->setErrorData(40006,$e->getMessage());
}
//人员库添加成功 跟上自己的业务逻辑
创建人员
//实例化一个证书对象,入参需要腾讯云账户secretId,secretKey
$cred = new Credential("", "");
// 实例化一个http选项
$httpProfile = new HttpProfile();
// 指定接入地域(默认就近接入)
$httpProfile->setEndpoint("iai.tencentcloudapi.com");
//实例化客户端
$clientProfile = new ClientProfile();
//配置http
$clientProfile->setHttpProfile($httpProfile);
//实例化人脸识别对象 第二个参数是地域参数
$client = new IaiClient($cred, "ap-chongqing", $clientProfile);
//获取创建人员对象
$req = new CreatePersonRequest();
//组装请求参数
$params = array(
"GroupId" => "人员库ID",
"PersonName" => "人员姓名",
"PersonId" => "人员ID",//人员ID一定要保存到数据库 人员的后续操作都依赖于人员ID
"Url" => $imgUrl,//图像信息
"QualityControl" => 3,//图像要求等级
"NeedRotateDetection" => 1,//是否旋转识别
);
//赋值json化数据
$req->fromJsonString(json_encode($params));
try {
//创建人员
$resp = $client->CreatePerson($req);
//获取请求结果
$res = $resp->toJsonString();
//请求结果转数组
$res = json_decode($res, true);
}catch(TencentCloudSDKException $e) {
return $this->setErrorData(40006,$e->getMessage());
}
//判断FaceId是否为空 这一步判断是为了严谨一点
if(empty($res["FaceId"])){
return $this->setErrorData(40005,"验证失败,当前认证图像有误,请刷新重试");
}
//人员添加成功 可根据自己的需要实现自己的业务逻辑
人员验证
通过人员ID和人脸图片判断是否为同一个人
//实例化一个证书对象,入参需要腾讯云账户secretId,secretKey
$cred = new Credential("", "");
// 实例化一个http选项
$httpProfile = new HttpProfile();
// 指定接入地域(默认就近接入)
$httpProfile->setEndpoint("iai.tencentcloudapi.com");
//实例化客户端
$clientProfile = new ClientProfile();
//配置http
$clientProfile->setHttpProfile($httpProfile);
//实例化人脸识别对象 第二个参数是地域参数
$client = new IaiClient($cred, "ap-chongqing", $clientProfile);
//人员验证对象
$req = new VerifyPersonRequest();
//组装请求参数
$params = array(
"Url" => $imgUrl,//图像数据
"PersonId" => $personId,//人员ID
"QualityControl" => 3//图像等级
);
//赋值json化数据
$req->fromJsonString(json_encode($params));
try {
//进行人员验证
$resp = $client->VerifyPerson($req);
//获取请求结果
$res = $resp->toJsonString();
//请求结果转数组
$res = json_decode($res, true);
}catch(TencentCloudSDKException $e) {
return $this->setErrorData(40006,$e->getMessage());
}
//判断结果
if(empty($res["IsMatch"]) || $res["IsMatch"] == false){
return $this->setErrorData(40005,"验证失败,请账号拥有者验证");
}
//人员验证成功 当前人员ID和人脸是同一个人 可根据自己的需要实现自己的业务逻辑