人脸识别接入常见问题汇总

2020-09-20 16:35:19 浏览数 (1)

一、接入常见问题

1.我现在还没有开通人脸识别服务,但是我想先体验一下人脸识别服务的效果,我该怎么做?

访问人脸识别功能演示页面可以在线体验人脸识别服务

https://cloud.tencent.com/act/event/iaidemo

2.SecretId和SecretKey是什么?我该怎么获取?

--1)API 密钥是构建腾讯云 API 请求的重要凭证,使用腾讯云 API 可以操作您名下的所有腾讯云资源,为了您的财产和服务安全,请妥善保存和定期更换密钥。

注:请勿通过任何方式(如 GitHub)上传或者分享您的密钥信息,一旦泄露至外部渠道,可能造成您的云上资产重大损失

--2)成功注册腾讯云账号之后,可以通过如下演示获取API秘钥

3.我已开通人脸识别服务,也能看懂API的接口调用说明,但是不懂代码,我怎样才能对API的功能及各项参数进行测试呢?

推荐使用API Explorer,因为API Explorer提供了在线调用、签名验证、 SDK 代码生成和快速检索接口等能力,能显著降低使用云 API 的难度。

使用方式说明:

这里我们以人脸识别-人脸检测与分析这个API为例,首先,通过参照人脸检测与分析的接口文档来填写API Explorer中调用人脸检测与分析的各项参数,然后点“在线调用”,点"发送请求"按钮即可

测试地址如下:

https://console.cloud.tencent.com/api/explorer?Product=iai&Version=2020-03-03&Action=DetectFace&SignVersion=

4.我们的项目对安全性要求非常高,通过云API方式调用人脸识别服务不符合我们的需求,请问是否可以支持私有化部署?

腾讯云人脸识别离线 SDK 提供在设备端本地集成的人脸采集、活体检测、人脸比对和人脸搜索等能力,可在无网络环境下离线使用。支持常见的 Android、ARM Linux(海思 DV300)、Windows(C )等计算平台。

当前仅开放 Android 平台的自助申请,您可登录 人脸识别控制台 - 离线识别 SDK 管理页面 申请测试及使用。如有疑问,或有其它平台需求,请添加人脸识别小助手(微信号:PJY-SJZ)对接,并备注“咨询人脸识别离线 SDK”。

5.我们近期将要开发一个人脸打卡系统,请问我们需要接入人脸识别的哪些接口呢?

人脸打卡的本质其实就是通过将打卡人的标准人脸照片与存储在人脸识别-人脸库中的人脸照片进行比对,当比对分数大于某个阈值时,可认为是同一个人,也就是打卡通过。

我们分析下该系统使用人脸识别各接口的逻辑:

第一步:因为我们要提前将人员的标准人脸图片存储到人脸识别人脸库中,所以我们需要调用“创建人员库”接口来创建一个用于存放人员人脸图片的存储空间,创建人员库接口的参考文档如下:

https://cloud.tencent.com/document/product/867/45015

第二步:人员库创建完成之后,我们需要调用“创建人员”接口创建人员,创建人员时需要上传一张人员的标准人脸照片,后续还可以调用“增加人脸”接口为该人员添加额外的标准人脸照片(最多支持5张),涉及到的接口参考文档如下:

创建人员接口的参考文档:

https://cloud.tencent.com/document/product/867/45014

增加人脸接口的参考文档(可选):

https://cloud.tencent.com/document/product/867/45016

第三步:既然是打卡考勤,那么肯定要对打卡人进行活体检测,这里我们推荐使用另外一款产品下的接口来实现活体检测,即人脸核身-活体检测,接口参考文档如下:

https://cloud.tencent.com/document/api/1007/35330

第四步:活体检测通过之后,可以提取活体检测视频中的一帧图片用于与人脸库中的人脸图片进行比对,这里我们需要调用人脸识别的“人脸搜索”接口,我们可以根据搜索出的人员匹配得分来判断打卡人是谁,通常推荐以大于80分的匹配值作为判断条件,人脸搜索接口参考文档如下:

https://cloud.tencent.com/document/product/867/44994

6.我在接入人脸识别-人脸检测与分析时,出现报错信息"Message": "图片解码失败。",此问题的原因及解决方案是什么呢?

--1)如果您的人脸图片是Url入参,请核对如下问题:

  • 检查参数位置是否填写正确,比如您提供的图片的网络Url,但是却将其填写到了Image入参中,这种情况也是会报解码失败错误的
  • 检查入参的图片是否真的是标准图片类型,某些时候,可能这个文件只是拥有了图片的扩展名,但这个文件存储的并不是标准的二进制文件内容,这种情况下,就无法对图片内容进行解码;检查方式也很简单,你可以直接打开图片文件,看是否正常,如果图片文件展示的不是图片内容,或者无法正常展示,那么就需要您去确定图片的来源或者更换一张新得标准图片了
  • 检查图片是否损坏,方法仍然是测试图片是否可以正常展示,如果无法展示并报错,那么基本可以确定图片存在异常或者损坏了,需要更换标准图片

--2)如果您的人脸图片是Image入参,请核对如下问题:

  • 检查参数位置是否填写正确,比如您提供的图片的base64字符串,但是却将其填写到了Url入参中,这种情况也是会报解码失败错误的
  • 检查您入参的图片的base64字符串是否有携带特征头,因为API的Image入参是需要去掉特征头的,特征头的内容类似"data:image/jpeg;base64,",例如我这里有张jpg的图片的base64字符串的部分值如下
代码语言:javascript复制
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUD

那么,您在入参时,是需要去掉"data:image/jpeg;base64,"

  • 检查您的Image入参是否不完整,可能由于某些原因,您提交的base64字符串并不是完整的,这种情况,您可以将base64解码还原为图片,然后测试图片是否能正常展示,这里为您推荐一款base64还原为图片的网络工具:

http://tool.chinaz.com/tools/imgtobase/

注意:还原时,base64字符需要携带特征头,如这里的"data:image/jpeg;base64,"

7.我们的服务安全性要求非常高,对出站IP有严格的控制,请问是否可以提供人脸识别服务的IP段以便我们将其配置为白名单来获取人脸识别服务?

同样是出于安全方面的考虑,人脸识别服务的IP没有固定的IP段,IP切换是动态无规律可循的,关于您的需求,我们为您提供如下解决方案: 方案一:您可以将您的业务服务器部署到您的内网环境中,然后搭建一台代理服务器,您的业务服务器发起的人脸识别服务请求通过代理服务器转发到人脸识别服务端,这样可以提升您的业务服务器的安全性

方案二:也是基于代理服务器的逻辑,我们向您推荐API网关,使用API网关之后,您可以将人脸识别API请求托管到API网关,然后您可以通过请求API网关发起人脸识别服务请求。

API网关参考文档:https://cloud.tencent.com/document/product/628/41654

8.我要怎么配置才能使得某个子账号只具备调用人脸识别下某一个API的权限?

十分抱歉,人脸识别的权限控制是服务级的,目前仅支持人脸识别(FR)全读写访问权限和人脸识别(FR)只读访问权限

更细粒度的权限配置,目前我们正在调试阶段,敬请期待。更新信息,请留意官方文档动态。

9.近期我们的项目打算接入人脸识别服务,我们通过对多家厂商的人脸识别服务的识别准确率、效率进行了调研,发现只有腾讯云的人脸识别服务符合我们的标准,但目前我们有个问题,我们的图片存储在国外,请问贵公司能否提供一个接入方案呢?

目前腾讯云人脸识别服务仅提供境内的调用请求(不覆盖港澳台及国外),如果您的图片在境外,而人脸识别服务的图片下载器在境内,由于境内服务器访问境外服务器受到跨境带宽的限制,下载速度会非常不稳定(普遍存在的现象);为了保证您在调用境内的人脸识别服务时,图片的下载速度不受影响,我们推荐如下两种方案: 方案一:使用腾讯云内容分发网络CDN 在您现有的境外图片服务器的基础上搭配腾讯云内容分发网络CDN的海外加速服务,通过将您境外的图片同步到境内的分发节点,可有效提升人脸图片的下载速度进而提升人脸识别服务接口的调用效率。腾讯云内容分发网络CDN参考文档如下:

https://cloud.tencent.com/document/product/228/3149

方案二:使用腾讯云对象存储COS

如果您的客户在境外,您可以在境内创建一个存储桶,例如将存储桶设置为广州地域,然后利用COS的全球加速功能,将您的客户的人脸图片上传到广州存储桶,然后在调用境内的人脸识别服务时,境内人脸识别服务的图片下载器去下载广州存储通的人脸图片时,下载速度就可以有质的提升。对象存储全球加速参考文档如下:

https://cloud.tencent.com/document/product/436/38866

10.我的项目接入了企业微信开放平台的人脸识别-人脸门禁产品,目前存在一些问题,请问腾讯云是否可以提供技术支持?

由于腾讯云暂时无法完全支持企业微信开放平台的技术问题,还请参考如下文档联系专人对接

https://work.weixin.qq.com/api/doc/90002/90625/91333

11.我在调用人脸识别服务时出现报错提示"Message": "图片下载错误。",请问这是什么原因以及相应的解决方案又是什么?

根据报错,我们可以推测您的图片入参方式是Url,这里的Url指的是基于HTTP协议的Web访问地址,通俗的说就是一个HTTP协议的网络地址,通过公网要能正常访问图片,建议您做如下排查:

  • 请检查您是否填写了一个本地文件地址,例如E:test.png、E:test.pngAItest.png都是不支持的,标准的Url地址类似http://test.image.myzijiebao.com/testA.jpg、https://test.image.myzijiebao.com/testA.jpg
  • 请检查您是否将Url字符填写错误了,导致无法正确访问到您的图片服务器
  • 请检车您的HTTPS协议的Url是否配置了自定义端口,Url的HTTPS协议仅支持标准的443端口,则图片是无法正常下载的,请修改为标准的443端口即可
  • 请检查Url是否配置了重定向且重定向后的Url无法正常访问
  • 请检查Url对应的图片下载耗时是否较长,如果超过4.5s,也是会报此错误的,另外,如果您的Url指向的境外服务器(如港澳台、国外),由于跨境带宽限制,图片的下载耗时也会拉长,如果超时也会出现此报错,所以建议条件允许尽可能将图片存储 在境内(不包含港澳台),如果图片一定要存储在境外,请参考问题9中的方案

二、SDK接入相关问题

1.我们的业务服务器部署在内网中,无法访问公网,请提供一个SDK调用人脸识别服务的方案

如果SDK运行在内网服务器中,需要通过内网服务器中的SDK发起人脸识别服务器请求到代理服务器,再由代理服务器将请求转发至人脸识别服务端。 1)首先我们假设您的代理服务器已经配置完成,此时需要在SDK的接口调用中配置代理服务器的信息,我们这里为您提供各开发语言版本SDK的代理配置方法

第一步:设置环境变量,设置https_proxy、http_proxy环境变量即可

第二步:下载您需要的开发语言SDK

https://cloud.tencent.com/document/sdk/Java

第三步:在SDK的接口调用Demo中进行配置

PHP
代码语言:javascript复制
//代理方案 $httpProfile->setProxy('https://ip:port');
$httpProfile = new HttpProfile();
$httpProfile->setProxy("http://127.0.0.1:12639");
golang

不支持代码中设置代理,可通过环境变量设置

python
代码语言:javascript复制
#如果需要指定proxy访问接口,可以按照如下方式初始化 python2
httpProfile = HttpProfile(proxy="http://用户名:密码@代理IP:代理端口")
#python3
httpProfile.proxy = "http://127.0.0.1:12639" #http://用户名:密码@代理IP:代理端口 也可
JAVA 从3.0.96版本开始
代码语言:javascript复制
HttpProfile httpProfile = new HttpProfile();
httpProfile.setProxyHost("127.0.0.1");
httpProfile.setProxyPort("12639");
.NET
代码语言:javascript复制
 // 代理服务器,当你的环境下有代理服务器时设定
httpProfile.WebProxy = Environment.GetEnvironmentVariable("HTTPS_PROXY");
//或者
httpProfile.WebProxy = "http://127.0.0.1:12639";
nodejs

不支持代码中设置代理,可通过环境变量设置

2)如果您还没有搭建好代理服务器,我们以人脸识别-人脸检测与分析这个接口为例,为您提供Nginx代理服务器的搭建方式以及Java SDK调用Nginx代理服务器的整个过程,请参考如下文档和示例Demo 文档:

tencentcloud-sdk-java通过代理访问云API.pdf

示例Demo

代码语言:javascript复制
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;

import com.tencentcloudapi.iai.v20200303.IaiClient;

import com.tencentcloudapi.iai.v20200303.models.DetectFaceRequest;
import com.tencentcloudapi.iai.v20200303.models.DetectFaceResponse;

public class DetectFace
{
    public static void main(String [] args) {
        try{

            Credential cred = new Credential("AKIDbx60g9mLlwxhBLAYFfneDbKlwqTpxxxx", "JL5oGVSDhGYzCD3ctxkHVVM8cpokaD4D");
            
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("iai.tencentcloudapi.com");
            System.setProperty("https.proxyHost", "tencent.cdhwdl.com");
            System.setProperty("https.proxyPort", "443");
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            
            IaiClient client = new IaiClient(cred, "ap-guangzhou", clientProfile);
            
            String params = "{"Url":"https://tencent-1256311141.cos.ap-chengdu.myzijiebao.com/ai/人脸图片.jpg"}";
            DetectFaceRequest req = DetectFaceRequest.fromJsonString(params, DetectFaceRequest.class);
            
            DetectFaceResponse resp = client.DetectFace(req);
            
            System.out.println(DetectFaceResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
                System.out.println(e.toString());
        }

    }
    
}

2.我的项目环境架构是LAMP,目前我已经接入了PHP SDK 3.0-tencentcloud-sdk-php,但是目前通过Apache访问人脸识别服务时,报如下错误,请问应该怎么解决呢?

[TencentCloudCommonExceptionTencentCloudSDKException] code: message:cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) requestId:

Web服务器访问人脸识别服务时,会涉及到双向认证,所以您的Apache服务端也需要配置证书。请参考如下解决方案:

第一步:到 https://curl.haxx.se/ca/cacert.pem 下载证书文件cacert.pem,将其保存到 PHP 安装路径下。

第二步:编辑php.ini文件,删除curl.cainfo配置项前的分号注释符(;),值设置为保存的证书文件cacert.pem的绝对路径。

第三步:重启Apache服务或其他Web服务

3.我们的项目是基于微信小程序云开发环境实现的,请问我应该怎么调用腾讯云人脸识别服务? 首先,为您分析需求的实现逻辑:

您可以将Nodejs3.0(tencentcloud-sdk-nodejs)部署到微信小程序云开发环境中,然后通过小程序调用相机组件在线拍摄人脸照片并将人脸照片传入到云开发服务端,然后由云开发服务端携带人脸图片参数向人脸识别服务端发起请求。具体实现过程及Demo可以参考云加社区的文档:

https://cloud.tencent.com/developer/article/1621119

4.我们的项目接入了腾讯云Nodejs 3.0,我们了解到HmacSHA256签名算法的POST请求体不得超过1MB,如果超过就需要配置前面算法为TC3-HmacSHA256,但是我们引入的官方Nodejs 3.0中仅支持配置签名算法为HmacSHA256,请问此问题应该怎么解决?

您可以通过如下Github获取集成了V3签名算法的Nodejs 3.0,然后配置签名算法参数为TC-HmacSHA256

https://github.com/TencentCloud/tencentcloud-sdk-nodejs/tree/signature3

代码语言:javascript复制
clientProfile.signMethod = "TC3-HMAC-SHA256";

三、API接入相关问题

1.人脸识别的签名方法V1和V3有什么不同,它们的计算逻辑分别是怎样的?

V1的特点:

  • 签名方法 V1 简单易用,但是功能和安全性都不如签名方法 V3,推荐使用签名方法 V3。
  • V1使用的签名算法是HmacSHA1, HmacSHA256
  • V1的POST请求体大小上限为1M,素材超过1M,需要使用 V3

V3的特点:

  • 签名方法 V3(TC3-HMAC-SHA256)功能上覆盖了以前的签名方法 V1,而且更安全,支持更大的请求,支持 json 格式,性能有一定提升,推荐使用该签名方法计算签名。
  • V3使用的签名方法是TC3-HMAC-SHA256,可以支持更大的素材(超过1M)

对于签名计算逻辑,我们以人脸识别-人脸检测与分析这个接口的POST请求为例进行分析,可以使用API Explorer工具来辅助签名计算

V1签名的计算逻辑:

第一步:将所有请求参数(注意是所有,包含业务参数和公共参数)按照参数名的字典序升序排序,获得A

代码语言:javascript复制
{

    'Action' : 'DetectFace',

    'Language' : 'zh-CN',

    'Nonce' : '3351',

    'Region' : 'ap-guangzhou',

    'SecretId' : 'AKIDbx60g9mLlwxhBLAYFfneDbKlwqTxxxx',

    'Timestamp' : '1600507388',

    'Url' : 'https://tencent-1256311141.cos.ap-chengdu.myzijiebao.com/ai/人脸图片.jpg',

    'Version' : '2020-03-03',

}

第二步:将排序好的请求参数转换为"A=B&C=D&E=F"格式,获得B

代码语言:javascript复制
Action=DetectFace

Language=zh-CN

Nonce=3351

Region=ap-guangzhou

SecretId=AKIDbx60g9mLlwxhBLAYFfneDbKlwqTpooQp

Timestamp=1600507388

Url=https://tencent-1256311141.cos.ap-chengdu.myzijiebao.com/ai/人脸图片.jpg

Version=2020-03-03

第三步:拼接签名原文串,获得C

代码语言:javascript复制
POSTiai.tencentcloudapi.com/?Action=DetectFace&Language=zh-CN&Nonce=3351&Region=ap-guangzhou&SecretId=AKIDbx60g9mLlwxhBLAYFfneDbKlwqTpxxxx&Timestamp=1600507388&Url=https://tencent-1256311141.cos.ap-chengdu.myzijiebao.com/ai/人脸图片.jpg&Version=2020-03-03

第四步:调用HmacSha1加密算法,以C为加密内容,SecretKey为秘钥进行加密处理,获得签名D

代码语言:javascript复制
ij5TTZ4By45s81jCVZLUvW8MdOo=

V3签名的计算逻辑:

第一步:拼接规范请求串

规范请求串=HTTP方法 HTTPURI URL查询字符串 参与签名的Header(键值对) 参与签名的Header(键) 请求主体的16进制小写SHA256值

代码语言:javascript复制
POST
/

content-type:application/json
host:iai.tencentcloudapi.com

content-type;host
ebceaf7ac530ad0f31861941ef4c28c35e510d7b27a6a8044f45305f630f60a5

第二步:拼接待签名字符串

待签名字符串=签名方法 时间戳 凭证范围 规范请求串的哈希值(SHA256)

代码语言:javascript复制
TC3-HMAC-SHA256
1600508422
2020-09-19/iai/tc3_request
82bd31084c670fe9febb0a86685c6f80b55e662a8830e6d221eb9d3e14451c48

第三步:计算签名,签名的计算包含如下三个值

SecretKey(控制台可获取) Date(即待签名字符串中的凭证范围中的date值) Service(即待签名字符串中的凭证范围中的service,人脸识别是iai

计算签名又包含四个步骤

--1)计算SecretDate

拼接TC3和SecretKey作为HMACSHA256加密算法的秘钥,Date作为HMACSHA256加密算法的消息

--2)计算SecretService 将SecretDate作为HMACSHA256加密算法的秘钥,Service作为HMACSHA256加密算法的消息

--3)计算SecretSigning 将SecretService作为HMACSHA256加密算法的秘钥,tc3_request作为HMACSHA256加密算法的消息

--4)计算签名 将SecretSigning作为HMACSHA256加密算法的消息,将待签名字符串作为HMACSHA256加密算法的秘钥(转16进制小写)

代码语言:javascript复制
e0fb9ec2d229c3d9b802abf5796e2a25d3a543ccefd1510bdc7e2b37fb929bfc

第四步:拼接Authorization

Authorization=签名方法(TC3-HMAC-SHA256) "空格" "Credential=SecretId/凭证范围" "逗号" "空格" "SignedHeaders=content-type;host" "逗号" "空格" "Signature=签名

代码语言:javascript复制
TC3-HMAC-SHA256 Credential=AKIDbx60g9mLlwxhBLAYFfneDbKlwqTpxxxx/2020-09-19/iai/tc3_request, SignedHeaders=content-type;host, Signature=e0fb9ec2d229c3d9b802abf5796e2a25d3a543ccefd1510bdc7e2b37fb929bfc

0 人点赞