SDK 参考
文档版本 01
发布日期 2022-02-15
版权所有 © 华为技术有限公司 2022。 保留一切权利。
非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传 播。
商标声明
和其他华为商标均为华为技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
您购买的产品、服务或特性等应受华为公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或 特性可能不在您的购买或使用范围之内。除非合同另有约定,华为公司对本文档内容不做任何明示或暗示的声 明或保证。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文 档中的所有陈述、信息和建议不构成任何明示或暗示的担保。
华为技术有限公司
地址: 深圳市龙岗区坂田华为总部办公楼 邮编:518129 网址:
https://www.huawei.com
客户服务邮箱:
[email protected]
客户服务电话:4008302118目 录
1 简介...1
2 Java SDK...3
3 Python SDK... 11
4 Go SDK... 18
5 .NET SDK...24
6 Node.js SDK...34
7 PHP SDK...39
8 C++ SDK... 47
A 修订记录... 57
1 简介
人脸识别服务软件开发工具包(FRS SDK)是对人脸识别服务提供的REST API进行的 封装,以简化用户的开发工作。FRS SDK目前支持Java、Python、Go、.NET、
Node.js、PHP、C++版本。
接口与 API 对应关系
人脸识别接口与API对应关系请参见表1-1。
表1-1 接口与 API 对应关系表
接口 API
人脸检测 POST /v2/{project_id}/face-detect 人脸比对 POST /v2/{project_id}/face-compare 人脸搜索 POST /v2/{project_id}/face-sets/
{face_set_name}/search
活体检测 动作活体检测 POST /v1/{project_id}/live-detect 静默活体检测 POST /v1/{project_id}/live-detect-face 人脸库资源管
理
创建人脸库 POST /v2/{project_id}/face-sets 查询所有人脸
库
GET /v2/{project_id}/face-sets
查询人脸库 GET /v2/{project_id}/face-sets/{face_set_name}
删除人脸库 DELETE /v2/{project_id}/face-sets/
{face_set_name}
人脸资源管理 添加人脸 POST /v2/{project_id}/face-sets/
{face_set_name}/faces
查询人脸 GET /v2/{project_id}/face-sets/
{face_set_name}/faces?offset=xxx&limit=xxx
接口 API
更新人脸 PUT /v2/{project_id}/face-sets/
{face_set_name}/faces
删除人脸 DELETE /v2/{project_id}/face-sets/
{face_set_name}/faces?field_name=field_value 批量删除人脸 DELETE /v2/{project_id}/face-sets/
{face_set_name}/faces/batch
2 Java SDK
本章节介绍人脸识别服务Java SDK,您可以参考本章节进行快速集成开发。
准备工作
● 已注册华为云帐号,并完成实名认证,帐号不能处于欠费或冻结状态。
● 已开通人脸识别服务。如未开通,请登录人脸识别管理控制台开通所需服务。
● 已具备开发环境,支持Java JDK 1.8 及其以上版本。
● 登录“我的凭证 > 访问秘钥”页面,获取Access Key(AK)和Secret Access Key
(SK)。
● 登录“我的凭证”页面,获取“IAM用户名”“、帐号名”以及待使用区域的
“项目ID”。调用服务时会用到这些信息,请提前保存。
本样例以“华北-北京四”区域为例,获取对应的项目ID(project_id)。
图2-1 我的凭证
安装 SDK
推荐您通过Maven方式获取和安装SDK,首先需要在您的操作系统中下载并安装
Maven,安装完成后您只需要在Java项目的pom.xml文件中加入相应的依赖项即可。
使用SDK前,需要安装“huaweicloud-sdk-core”和“huaweicloud-sdk-frs”。SDK 的版本信息请参见SDK中心。
<dependency>
<groupId>com.huaweicloud.sdk</groupId>
<artifactId>huaweicloud-sdk-core</artifactId>
<version>3.0.56</version>
</dependency>
<dependency>
<groupId>com.huaweicloud.sdk</groupId>
<artifactId>huaweicloud-sdk-frs</artifactId>
<version>3.0.56</version>
</dependency>
开始使用
详细的SDK介绍,使用异步客户端,配置日志请参见SDK中心、Java SDK使用指导、
Java SDK使用视频。
1. 导入依赖模块
import com.huaweicloud.sdk.core.auth.ICredential;
import com.huaweicloud.sdk.core.auth.BasicCredentials;
import com.huaweicloud.sdk.core.exception.ConnectionException;
import com.huaweicloud.sdk.core.exception.RequestTimeoutException;
import com.huaweicloud.sdk.core.exception.ServiceResponseException;
//导入v2版本sdk
import com.huaweicloud.sdk.frs.v2.region.FrsRegion;
import com.huaweicloud.sdk.frs.v2.*;
import com.huaweicloud.sdk.frs.v2.model.*;
2. 配置认证信息
配置AK、SK信息。华为云通过AK识别用户的身份,通过SK对请求数据进行签名 验证,用于确保请求的机密性、完整性和请求者身份的正确性。AK、SK获取方法 请参见准备工作。
public static ICredential getCredential(String ak, String sk) { return new BasicCredentials()
.withAk(ak) .withSk(sk);
}
3. 初始化客户端 指定region方式
public static FrsClient getClient(Region region, ICredential auth) { // 初始化人脸识别服务的客户端
return FrsClient.newBuilder() .withCredential(auth)
.withRegion(region) // 选择服务所在区域 FrsRegion.valueOf("cn-north-4") .build();
}
服务部署区域请参见终端节点。
4. 发送请求并查看响应
// 以调用人脸检测 DetectFaceByBase64 接口为例
DetectFaceByBase64Request request = new DetectFaceByBase64Request();
FaceDetectBase64Req body = new FaceDetectBase64Req();
body.withImageBase64("/9j/4AAQSkZJRgABAQAAAQABAAD...");
request.withBody(body);
DetectFaceByBase64Response response = client.detectFaceByBase64(request);
System.out.println(response.toString());
说明
使用人脸比对SDK时,image1、image2参数需为相同类型,即同为url、base64或file。
5. 异常处理
表2-1 异常处理
一级分类 一级分类说明 二级分类 二级分类说明
ConnectionExcepti
on 连接类异常 HostUnreachableE
xception 网络不可达、被拒 绝。
一级分类 一级分类说明 二级分类 二级分类说明 SslHandShakeExce
ption SSL认证异常。
RequestTimeoutEx
ception 响应超时异常 CallTimeoutExcept
ion 单次请求,服务器
处理超时未返回。
RetryOutageExcep
tion 在重试策略消耗完
成后,仍无有效的 响应。
ServiceResponseEx
ception 服务器响应异
常 ServerResponseEx
ception 服务端内部错误,
Http响应码:
[500,]。
ClientRequestExce
ption 请求参数不合法,
Http响应码:[400, 500)
DetectFaceByBase64Request request = new DetectFaceByBase64Request();
try {
DetectFaceByBase64Response response = client.detectFaceByBase64(request);
System.out.println(response.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
SDK demo 代码解析
● 人脸检测
DetectFaceByBase64Request detectRequest = new DetectFaceByBase64Request();
FaceDetectBase64Req faceDetectBase64Req = new FaceDetectBase64Req();
faceDetectBase64Req.withImageBase64("/9j/4AAQSkZJRgABAQAAAQABAAD...");
faceDetectBase64Req.withAttributes("2");
detectRequest.setBody(faceDetectBase64Req);
try {
DetectFaceByBase64Response detectResponse = client.detectFaceByBase64(detectRequest);
System.out.println(detectResponse.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 人脸比对
CompareFaceByBase64Request compareRequest = new CompareFaceByBase64Request();
FaceCompareBase64Req faceCompareBase64Req = new FaceCompareBase64Req();
faceCompareBase64Req.withImage1Base64("/9j/4AAQSkZJRgABAQAAAQABAAD...");
faceCompareBase64Req.withImage2Base64("/9j/4AAQSkZJRgABAQAAAQABAAD...");
compareRequest.withBody(faceCompareBase64Req);
try {
CompareFaceByBase64Response compareResponse = client.compareFaceByBase64(compareRequest);
System.out.println(compareResponse.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 人脸搜索
SearchFaceByBase64Request searchRequest = new SearchFaceByBase64Request();
searchRequest.withFaceSetName("face_set_name");
FaceSearchBase64Req faceSearchBase64Req = new FaceSearchBase64Req();
List<Map<String, String>> listbodySort = new ArrayList<>();
Map<String, String> map = new HashMap<>();
map.put("timestamp","asc");
listbodySort.add(map);
List<String> listbodyReturnFields = new ArrayList<>();
listbodyReturnFields.add("timestamp");
listbodyReturnFields.add("id");
faceSearchBase64Req.withSort(listbodySort);
faceSearchBase64Req.withReturnFields(listbodyReturnFields);
faceSearchBase64Req.withImageBase64("/9j/4AAQSkZJRgABAQAAAQABAAD...");
searchRequest.withBody(faceSearchBase64Req);
try {
SearchFaceByBase64Response searchResponse = client.searchFaceByBase64(searchRequest);
System.out.println(searchResponse.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 创建人脸库
CreateFaceSetRequest createFaceSetRequest = new CreateFaceSetRequest();
CreateFaceSetReq createFaceSetReq = new CreateFaceSetReq();
createFaceSetReq.withFaceSetName("face_set_name");
Map<String, TypeInfo> stringTypeInfoMap = new HashMap<>();
TypeInfo typeInfo = new TypeInfo();
typeInfo.withType("long");
stringTypeInfoMap.put("timestamp", typeInfo);
createFaceSetReq.withExternalFields(stringTypeInfoMap);
createFaceSetRequest.withBody(createFaceSetReq);
try {
CreateFaceSetResponse createFaceSetResponse = client.createFaceSet(createFaceSetRequest);
System.out.println(createFaceSetResponse.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 查询人脸库
ShowFaceSetRequest showFaceSetRequest = new ShowFaceSetRequest();
showFaceSetRequest.withFaceSetName("face_set_name");
try {
ShowFaceSetResponse showFaceSetResponse = client.showFaceSet(showFaceSetRequest);
System.out.println(showFaceSetResponse.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 查询所有人脸库
ShowAllFaceSetsRequest showAllFaceSetsRequest = new ShowAllFaceSetsRequest();
try {
ShowAllFaceSetsResponse showAllFaceSetsResponse = client.showAllFaceSets(showAllFaceSetsRequest);
System.out.println(showAllFaceSetsResponse.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 删除人脸库
DeleteFaceSetRequest deleteFaceSetRequest = new DeleteFaceSetRequest();
deleteFaceSetRequest.withFaceSetName("face_set_name");
try {
DeleteFaceSetResponse deleteFaceSetResponse = client.deleteFaceSet(deleteFaceSetRequest);
System.out.println(deleteFaceSetResponse.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 添加人脸
//add face
AddFacesByBase64Request addFacesByBase64Request = new AddFacesByBase64Request();
addFacesByBase64Request.withFaceSetName("face_set_name");
AddFacesBase64Req addFacesBase64Req = new AddFacesBase64Req();
addFacesBase64Req.withExternalFields("{\"timestamp\":12}");
addFacesBase64Req.withImageBase64("9j/4AAQSkZJRgABAQAAAQABAAD...");
addFacesByBase64Request.withBody(addFacesBase64Req);
try {
AddFacesByBase64Response addFacesByBase64Response = client.addFacesByBase64(addFacesByBase64Request);
System.out.println(addFacesByBase64Response.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 删除人脸
//delete face by faceId
DeleteFaceByFaceIdRequest deleteFaceByFaceIdRequest = new DeleteFaceByFaceIdRequest();
deleteFaceByFaceIdRequest.withFaceSetName("face_set_name");
deleteFaceByFaceIdRequest.withFaceId("iexEBb6t");
try {
DeleteFaceByFaceIdResponse deleteFaceByFaceIdResponse = client.deleteFaceByFaceId(deleteFaceByFaceIdRequest);
System.out.println(deleteFaceByFaceIdResponse.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
//delete face by externalImageId
DeleteFaceByExternalImageIdRequest deleteFaceRequest = new DeleteFaceByExternalImageIdRequest();
deleteFaceRequest.withFaceSetName("face_set_name");
deleteFaceRequest.withExternalImageId("iexEBb6t");
try {
DeleteFaceByExternalImageIdResponse response = client.deleteFaceByExternalImageId(deleteFaceRequest);
System.out.println(response.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 批量删除人脸
BatchDeleteFacesRequest batchDeleteFacesRequest = new BatchDeleteFacesRequest();
batchDeleteFacesRequest.withFaceSetName("face_set_name");
DeleteFacesBatchReq deleteFacesBatchReq = new DeleteFacesBatchReq();
deleteFacesBatchReq.withFilter("age:[20 TO 30]");
batchDeleteFacesRequest.withBody(deleteFacesBatchReq);
try {
BatchDeleteFacesResponse batchDeleteFacesResponse = client.batchDeleteFaces(batchDeleteFacesRequest);
System.out.println(batchDeleteFacesResponse.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 更新人脸
UpdateFaceRequest updateFaceRequest = new UpdateFaceRequest();
updateFaceRequest.withFaceSetName("face_set_name");
UpdateFaceReq updateFaceReq = new UpdateFaceReq();
updateFaceReq.withFaceId("iexEBb6t");
updateFaceRequest.withBody(updateFaceReq);
try {
UpdateFaceResponse response = client.updateFace(updateFaceRequest);
System.out.println(response.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 查询人脸
//show faces by faceId
ShowFacesByFaceIdRequest showFacesByFaceIdRequest = new ShowFacesByFaceIdRequest();
showFacesByFaceIdRequest.withFaceSetName("face_set_name");
showFacesByFaceIdRequest.withFaceId("iexEBb6t");
try {
ShowFacesByFaceIdResponse response = client.showFacesByFaceId(showFacesByFaceIdRequest);
System.out.println(response.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
//show faces by limit
ShowFacesByLimitRequest showFacesByLimitRequest = new ShowFacesByLimitRequest();
showFacesByLimitRequest.withFaceSetName("face_set_name");
showFacesByLimitRequest.withOffset(0);
showFacesByLimitRequest.withLimit(10);
try {
ShowFacesByLimitResponse showFacesByLimitResponse = client.showFacesByLimit(showFacesByLimitRequest);
System.out.println(showFacesByLimitResponse.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 动作活体检测
//detect live by base64
DetectLiveByBase64Request request = new DetectLiveByBase64Request();
LiveDetectBase64Req body = new LiveDetectBase64Req();
body.withActions("1,2,3,4");
body.withVideoBase64("/9j/4AAQSkZJRgABAQAAAQABAAD...");
request.withBody(body);
try {
DetectLiveByBase64Response response = client.detectLiveByBase64(request);
System.out.println(response.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
● 静默活体检测
//detect live face by base64
DetectLiveFaceByBase64Request request = new DetectLiveFaceByBase64Request();
LiveDetectFaceBase64Req body = new LiveDetectFaceBase64Req();
body.withImageBase64("/9j/4AAQSkZJRgABAQAAAQABAAD...");
request.withBody(body);
try {
DetectLiveFaceByBase64Response response = client.detectLiveFaceByBase64(request);
System.out.println(response.toString());
} catch (ConnectionException e) { e.printStackTrace();
} catch (RequestTimeoutException e) { e.printStackTrace();
} catch (ServiceResponseException e) { e.printStackTrace();
System.out.println(e.getHttpStatusCode());
System.out.println(e.getErrorCode());
System.out.println(e.getErrorMsg());
}
SDK 代码自动生成
API Explorer提供API检索及平台调试,支持全量快速检索、可视化调试、帮助文档查
看、在线咨询。您只需要在API Explorer中修改接口参数,即可自动生成对应的代码示例。同时,可在 集成开发环境CloudIDE中完成代码的构建、调试、运行等操作。
图2-2 API Explorer
3 Python SDK
本章节介绍人脸识别服务Python SDK,您可以参考本章节进行快速集成开发。
准备工作
● 已注册华为云帐号,并完成实名认证,帐号不能处于欠费或冻结状态。
● 已开通人脸识别服务。如未开通,请登录人脸识别管理控制台人脸识别管理控制 台开通所需服务。
● 已具备开发环境,支持Python3及以上版本。
● 登录“我的凭证 > 访问秘钥”页面,获取Access Key(AK)和Secret Access Key
(SK)。
● 登录“我的凭证”页面,获取“IAM用户名”“、帐号名”以及待使用区域的
“项目ID”。调用服务时会用到这些信息,请提前保存。
本样例以“华北-北京四”区域为例,获取对应的项目ID(project_id)。
图3-1 我的凭证
安装 SDK
支持Python3及以上版本,执行python --version检查当前Python的版本信息。
使用SDK前,需要安装“huaweicloudsdkcore”和“huaweicloudsdkfrs”。
# 安装核心库
pip install huaweicloudsdkcore
# 安装FRS服务库
pip install huaweicloudsdkfrs
开始使用
详细的SDK介绍,使用异步客户端,配置日志请参见SDK中心、Python SDK使用指
导、Python SDK使用视频。
1. 导入依赖模块
from huaweicloudsdkcore.auth.credentials import BasicCredentials from huaweicloudsdkcore.exceptions import exceptions
# 导入v2版本sdk
from huaweicloudsdkfrs.v2.region.frs_region import FrsRegion from huaweicloudsdkfrs.v2 import *
2. 配置认证信息
配置AK、SK信息。华为云通过AK识别用户的身份,通过SK对请求数据进行签名 验证,用于确保请求的机密性、完整性和请求者身份的正确性。AK、SK获取方法 请参见准备工作。
def GetCredential():
return BasicCredentials(ak, sk)
3. 初始化客户端 指定region方式
# 初始化人脸识别服务的客户端,并选择服务部署区域 def GetClient():
return FrsClient.new_builder(FrsClient) \ .with_credentials(credentials) \
.with_region(FrsRegion.value_of("cn-north-4")) \ .build()
服务部署区域请参见终端节点。
4. 发送请求并查看响应
# 以调用人脸检测 DetectFaceByBase64 接口为例 request = DetectFaceByBase64Request() request.body = FaceDetectBase64Req(
image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..."
)response = client.detect_face_by_base64(request) print(response)
说明
使用人脸比对SDK时,image1、image2参数需为相同类型,即同为url、base64或file。
5. 异常处理
表3-1 异常处理
一级分类 一级分类说明 二级分类 二级分类说明
ConnectionExcepti
on 连接类异常 HostUnreachableE
xception 网络不可达、被拒 绝。
SslHandShakeExce
ption SSL认证异常。
RequestTimeoutEx
ception 响应超时异常 CallTimeoutExcept
ion 单次请求,服务器
处理超时未返回。
RetryOutageExcep
tion 在重试策略消耗完
成后,仍无有效的 响应。
一级分类 一级分类说明 二级分类 二级分类说明 ServiceResponseEx
ception 服务器响应异
常 ServerResponseEx
ception 服务端内部错误,
Http响应码:
[500,]。
ClientRequestExce
ption 请求参数不合法,
Http响应码:[400, 500)
try: request = DetectFaceByBase64Request() request.body = FaceDetectBase64Req(
image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..."
)
response = client.detect_face_by_base64(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
SDK 代码解析
● 人脸检测
def detectFaceByBase64():
try:
request = DetectFaceByBase64Request() request.body = FaceDetectBase64Req(
image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD...", attributes="2,4"
)
response = client.detect_face_by_base64(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 人脸比对
def compareFaceByBase64():
try:
request = CompareFaceByBase64Request() request.body = FaceCompareBase64Req(
image1_base64="/9j/4AAQSkZJRgABAQAAAQABAAD...", image2_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..."
)
response = client.compare_face_by_base64(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 人脸搜索
def searchFaceByBase64():
try:
request = SearchFaceByBase64Request() request.face_set_name = "face_set_name"
listFaceSearchBase64ReqReturnFieldsbody = [ "timestamp"
]
request.body = FaceSearchBase64Req(
return_fields=listFaceSearchBase64ReqReturnFieldsbody, image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..."
)
response = client.search_face_by_base64(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 创建人脸库
def createFaceSet():
try:
request = CreateFaceSetRequest() request.body = CreateFaceSetReq(
face_set_name="face_set_name",
external_fields={"timestamp": {"type": "long"}}
)
response = client.create_face_set(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 查询人脸库
def showFaceSet():
try:
request = ShowFaceSetRequest() request.face_set_name = "face_set_name"
response = client.show_face_set(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 查询所有人脸库
def showAllFaceSet():
try:
request = ShowAllFaceSetsRequest() response = client.show_all_face_sets(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 删除人脸库
def deleteFaceSet():
try:
request = DeleteFaceSetRequest() request.face_set_name = "face_set_name"
response = client.delete_face_set(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 添加人脸
def addFacesByBase64():
try:
request = AddFacesByBase64Request()
request.face_set_name = "face_set_name"
request.body = AddFacesBase64Req(
external_fields="{\"timestamp\":12}",
image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..."
)
response = client.add_faces_by_base64(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 删除人脸
def deleteFace():
# Delete Face By FaceId try:
request = DeleteFaceByFaceIdRequest() request.face_set_name = "face_set_name"
request.face_id = "LkPJblq6"
response = client.delete_face_by_face_id(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
# Delete Face By ExternalImageId try:
request = DeleteFaceByExternalImageIdRequest() request.face_set_name = "face_set_name"
request.external_image_id = "external_image_id"
response = client.delete_face_by_external_image_id(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 批量删除人脸
def batchDeleteFaces():
try:
request = BatchDeleteFacesRequest() request.face_set_name = "face_set_name"
request.body = DeleteFacesBatchReq(
filter="age:[20 TO 30]"
)
response = client.batch_delete_faces(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 更新人脸
def updateFace():
try:
request = UpdateFaceRequest()
request.face_set_name = "face_set_name"
request.body = UpdateFaceReq(face_id="LkPJblq6") response = client.update_face(request)
print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 查询人脸
def showFaces():
# Show Faces By FaceId try:
request = ShowFacesByFaceIdRequest() request.face_set_name = "face_set_name"
request.face_id = "LkPJblq6"
response = client.show_faces_by_face_id(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) # Show Faces By Limit try:
request = ShowFacesByLimitRequest() request.face_set_name = "face_set_name"
request.offset = 0 request.limit = 10
response = client.show_faces_by_limit(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 动作活体检测
def detectLiveByBase64():
try:
request = DetectLiveByBase64Request() request.body = LiveDetectBase64Req(
actions="1,2,3,4",
video_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..."
)
response = client.detect_live_by_base64(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
● 静默活体检测
def detectLiveFaceByBase64():
try:
request = DetectLiveFaceByBase64Request() request.body = LiveDetectFaceBase64Req(
image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..."
)
response = client.detect_live_face_by_base64(request) print(response)
except exceptions.ClientRequestException as e:
print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
SDK 代码自动生成
API Explorer提供API检索及平台调试,支持全量快速检索、可视化调试、帮助文档查
看、在线咨询。您只需要在API Explorer中修改接口参数,即可自动生成对应的代码示例。同时,可在 集成开发环境CloudIDE中完成代码的构建、调试、运行等操作。
图3-2 API Explorer
4 Go SDK
本章节介绍人脸识别服务Go SDK,您可以参考本章节进行快速集成开发。
准备工作
● 已注册华为云帐号,并完成实名认证,帐号不能处于欠费或冻结状态。
● 已开通人脸识别服务。如未开通,请登录人脸识别管理控制台人脸识别管理控制 台开通所需服务。
● 已具备开发环境,Go SDK 支持 go 1.14 及以上版本,可执行 go version 检查当 前 Go 的版本信息。
● 登录“我的凭证 > 访问秘钥”页面,获取Access Key(AK)和Secret Access Key
(SK)。
● 登录“我的凭证”页面,获取“IAM用户名”“、帐号名”以及待使用区域的
“项目ID”。调用服务时会用到这些信息,请提前保存。
本样例以“华北-北京四”区域为例,获取对应的项目ID(project_id)。
图4-1 我的凭证
安装 SDK
使用SDK前需要安装华为云Go SDK 库。
# 安装华为云Go库
go get -u github.com/huaweicloud/huaweicloud-sdk-go-v3
# 安装依赖
go get github.com/json-iterator/go
开始使用
详细的SDK介绍请参见SDK中心、Go SDK使用指导、Go SDK使用视频。
1. 导入依赖模块
import ( "fmt"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
// 导入v2版本sdk
frs "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/frs/v2"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/frs/v2/model"
region "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/frs/v2/region"
)
2. 配置认证信息
配置AK、SK信息。华为云通过AK识别用户的身份,通过SK对请求数据进行签名 验证,用于确保请求的机密性、完整性和请求者身份的正确性。AK、SK获取方法 请参见准备工作。
func GetCredential(ak, sk string) basic.Credentials { // Init Auth Info
return basic.NewCredentialsBuilder().
WithAk(ak).
WithSk(sk).
Build() }
3. 初始化客户端 指定region方式
// # 初始化人脸识别服务的客户端,并选择服务部署区域 func GetClient(auth basic.Credentials) *frs.FrsClient { return frs.NewFrsClient(
frs.FrsClientBuilder().
WithRegion(region.CN_NORTH_4).
WithCredential(auth).
Build()) }
服务部署区域请参见终端节点。
4. 发送请求并查看下响应
request := &model.DetectFaceByBase64Request{}
request.Body = &model.FaceDetectBase64Req{
ImageBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", }response, err := client.DetectFaceByBase64(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
说明
使用人脸比对SDK时,image1、image2参数需为相同类型,即同为url、base64或file。
5. 异常处理
表4-1 异常处理
一级分类 一级分类说明
ServiceResponseError 服务响应异常
url.Error url异常
response, err := client.DetectFaceByBase64(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
SDK demo 代码解析
● 人脸检测
request := &model.DetectFaceByBase64Request{}
attributesFaceDetectBase64Req := "2"
request.Body = &model.FaceDetectBase64Req{
Attributes: &attributesFaceDetectBase64Req, ImageBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", }response, err := client.DetectFaceByBase64(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 人脸比对
request := &model.CompareFaceByBase64Request{}
request.Body = &model.FaceCompareBase64Req{
Image1Base64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", Image2Base64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", }response, err := client.CompareFaceByBase64(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 人脸搜索
request := &model.SearchFaceByBase64Request{}
request.FaceSetName = "face_set_name"
var listReturnFieldsbody = []string{
"timestamp", "id",
}request.Body = &model.FaceSearchBase64Req{
ReturnFields: &listReturnFieldsbody,
ImageBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", }response, err := client.SearchFaceByBase64(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 创建人脸库
request := &model.CreateFaceSetRequest{}
request.Body = &model.CreateFaceSetReq{
FaceSetName: "face_set_name",
}response, err := client.CreateFaceSet(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 查询人脸库
request := &model.ShowFaceSetRequest{}
request.FaceSetName = "face_set_name"
response, err := client.ShowFaceSet(request)
if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 查询所有人脸库
request := &model.ShowAllFaceSetsRequest{}
response, err := client.ShowAllFaceSets(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 删除人脸库
request := &model.DeleteFaceSetRequest{}
request.FaceSetName = "face_set_name"
response, err := client.DeleteFaceSet(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 添加人脸
request := &model.AddFacesByBase64Request{}
request.FaceSetName = "face_set_name"
var externalFieldsAddFacesBase64Req interface{} = "{\"timestamp\":12}"
request.Body = &model.AddFacesBase64Req{
ExternalFields: &externalFieldsAddFacesBase64Req, ImageBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", }response, err := client.AddFacesByBase64(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 删除人脸
request := &model.DeleteFaceByExternalImageIdRequest{}
request.FaceSetName = "face_set_name"
request.ExternalImageId = "external_image_id"
response, err := client.DeleteFaceByExternalImageId(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 批量删除人脸
request := &model.BatchDeleteFacesRequest{}
request.FaceSetName = "face_set_name"
request.Body = &model.DeleteFacesBatchReq{
Filter: "age:[20 TO 30]",
}response, err := client.BatchDeleteFaces(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 更新人脸
request := &model.UpdateFaceRequest{}
request.FaceSetName = "face_set_name"
externalImageIdUpdateFaceReq:= "external_image_id"
var externalFieldsUpdateFaceReq interface{} = "{\"timestamp\":12}"
request.Body = &model.UpdateFaceReq{
FaceId: "LkPJblq6",
ExternalImageId: &externalImageIdUpdateFaceReq, ExternalFields: &externalFieldsUpdateFaceReq, }response, err := client.UpdateFace(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 查询人脸
//Show Faces By FaceId
request := &model.ShowFacesByFaceIdRequest{}
request.FaceSetName = "face_set_name"
request.FaceId = "LkPJblq6"
response, err := client.ShowFacesByFaceId(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 动作活体检测
//detect live by base64
request := &model.DetectLiveByBase64Request{}
request.Body = &model.LiveDetectBase64Req{
Actions: "1,2,3,4",
VideoBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", }response, err := client.DetectLiveByBase64(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
● 静默活体检测
//detect live face by base64
request := &model.DetectLiveFaceByBase64Request{}
request.Body = &model.LiveDetectFaceBase64Req{
ImageBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", }response, err := client.DetectLiveFaceByBase64(request) if err == nil {
fmt.Printf("%+v\n", response) } else {
fmt.Println(err) }
SDK 代码自动生成
API Explorer提供API检索及平台调试,支持全量快速检索、可视化调试、帮助文档查
看、在线咨询。您只需要在API Explorer中修改接口参数,即可自动生成对应的代码示例。同时,可在 集成开发环境CloudIDE中完成代码的构建、调试、运行等操作。
图4-2 API Explorer
5 .NET SDK
本章节介绍.NET SDK,您可以参考本章节进行快速集成开发。
准备工作
● 已注册华为云帐号,并完成实名认证,帐号不能处于欠费或冻结状态。
● 已具备开发环境,.NET SDK 适用于.NET Standard 2.0 及其以上版本;C# 4.0 及 其以上版本。
● 登录“我的凭证 > 访问秘钥”页面,获取Access Key(AK)和Secret Access Key
(SK)。
● 登录“我的凭证”页面,获取“IAM用户名”“、帐号名”以及待使用区域的
“项目ID”。调用服务时会用到这些信息,请提前保存。
本样例以“华北-北京四”区域为例,获取对应的项目ID(project_id)。
图5-1 我的凭证
安装 SDK
使用SDK前,需要安装“HuaweiCloud.SDK.Core”和“HuaweiCloud.SDK.Frs”,有 两种安装方式,分别如下。
● 使用 .NET CLI 工具
dotnet add package HuaweiCloud.SDK.Core dotnet add package HuaweiCloud.SDK.Frs
● 使用 Package Manager
Install-Package HuaweiCloud.SDK.Core Install-Package HuaweiCloud.SDK.Frs
开始使用
详细的SDK介绍,使用异步客户端,配置日志请参见SDK中心、.NET SDK使用指
导、.NET SDK视频指导。
1. 导入依赖模块
using System;
using System.Collections.Generic;
using HuaweiCloud.SDK.Core;
using HuaweiCloud.SDK.Core.Auth;
using HuaweiCloud.SDK.Frs;
using HuaweiCloud.SDK.Frs.V2;
using HuaweiCloud.SDK.Frs.V2.Model;
2. 配置客户端连接参数 – 默认配置
// 使用默认配置
var config = HttpConfig.GetDefaultConfig();
– 网络代理(可选)
// 根据需要配置网络代理
config.ProxyHost = "proxy.huaweicloud.com";
config.ProxyPort = 8080;
config.ProxyUsername = "test";
config.ProxyPassword = "test";
– 超时配置(可选)
// 默认超时时间为120秒,可根据需要调整 config.Timeout = 120;
– SSL配置(可选)
// 根据需要配置是否跳过SSL证书验证 config.IgnoreSslVerification = true;
3. 配置认证信息
配置AK、SK信息。华为云通过AK识别用户的身份,通过SK对请求数据进行签名 验证,用于确保请求的机密性、完整性和请求者身份的正确性。AK、SK获取方法 请参见准备工作。
const string ak = "<YOUR AK>";
const string sk = "<YOUR SK>";
var auth = new BasicCredentials(ak, sk);
4. 初始化客户端
– 指定云服务region方式(推荐)
// 初始化指定云服务的客户端 {Service}Client ,以初始化FRS服务的 FrsClient 为例 var client = FrsClient.NewBuilder()
.WithCredential(auth)
.WithRegion(FrsRegion.ValueOf("cn-north-4")) .WithHttpConfig(config)
.Build();
– 指定云服务endpoint方式
// 指定终端节点,以FRS服务北京四的 endpoint 为例
String endpoint = "https://face.cn-north-4.myhuaweicloud.com";
// 初始化客户端认证信息,需要填写相应 projectId,以初始化 BasicCredentials 为例 var auth = new BasicCredentials(ak, sk, projectId);
// 初始化指定云服务的客户端 {Service}Client,以初始化FRS服务的 FrsClient 为例 var client = FrsClient.NewBuilder()
.WithCredential(auth) .WithEndPoint(endpoint) .WithHttpConfig(config) .Build();
endpoint是华为云各服务应用区域和各服务的终端节点,详情请查看 地区和
终端节点 。
5. 发送请求并查看响应
// 以调用人脸检测接口 DetectFaceByBase64 为例 var req = new DetectFaceByBase64Request {};
req.Body = new FaceDetectBase64Req() { ImageBase64 = "图片的base64编码"
};
try{
var resp = client.DetectFaceByBase64(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
说明
使用人脸比对SDK时,image1、image2参数需为相同类型,即同为url、base64或file。
6. 异常处理
表5-1 异常处理
一级分类 一级分类说明 二级分类 二级分类说明
ConnectionExcepti
on 连接类异常 HostUnreachableE
xception 网络不可达、被拒 绝。
SslHandShakeExce
ption SSL认证异常。
RequestTimeoutEx
ception 响应超时异常 CallTimeoutExcept
ion 单次请求,服务器
处理超时未返回。
RetryOutageExcep
tion 在重试策略消耗完
成后,仍无有效的 响应。
ServiceResponseEx
ception 服务器响应异
常 ServerResponseEx
ception 服务端内部错误,
Http响应码:
[500,]。
ClientRequestExce
ption 请求参数不合法,
Http响应码:[400, 500)
try{
var resp = client.DetectFaceByBase64(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage);
}catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage);
}
SDK demo 代码解析
● 人脸检测
var req = new DetectFaceByBase64Request {
};
req.Body = new FaceDetectBase64Req() {
ImageBase64 = "图片的base64编码"
};
try {
var resp = client.DetectFaceByBase64(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 人脸比对
var req = new CompareFaceByBase64Request {
};
req.Body = new FaceCompareBase64Req() {
Image1Base64 = "图片1的base64编码", Image2Base64 = "图片2的base64编码"
};
try {
var resp = client.CompareFaceByBase64(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 人脸搜索
var req = new SearchFaceByBase64Request {
};
req.Body = new FaceSearchBase64Req() {
ImageBase64 = "图片的base64编码"
};
try {
var resp = client.SearchFaceByBase64(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 创建人脸库
var req = new CreateFaceSetRequest {
};
req.Body = new CreateFaceSetReq() {
FaceSetName = "人脸库名称"
};
try {
var resp = client.CreateFaceSet(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 查询人脸库
var req = new ShowFaceSetRequest {
FaceSetName = "人脸库名称"
};
try {
var resp = client.ShowFaceSet(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException)
{
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 查询所有人脸库
var req = new ShowAllFaceSetsRequest {
};
try {
var resp = client.ShowAllFaceSets(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 删除人脸库
var req = new DeleteFaceSetRequest {
FaceSetName = "人脸库名称"
};
try {
var resp = client.DeleteFaceSet(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 添加人脸
var req = new AddFacesByBase64Request {
};
req.Body = new AddFacesBase64Req()
{
ImageBase64 = "图片的base64编码"
};
try {
var resp = client.AddFacesByBase64(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 删除人脸
var req = new DeleteFaceByFaceIdRequest {
FaceSetName = "人脸库名称", FaceId = "人脸ID"
};
try {
var resp = client.DeleteFaceByFaceId(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 批量删除人脸
var req = new BatchDeleteFacesRequest {
};
req.Body = new DeleteFacesBatchReq() {
Filter = "过滤条件"
};
try {
var resp = client.BatchDeleteFaces(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException)
{
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 更新人脸
var req = new UpdateFaceRequest {
};
req.Body = new UpdateFaceReq() {
FaceId = "人脸库ID"
};
try {
var resp = client.UpdateFace(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
} }
● 查询人脸
var req = new ShowFacesByFaceIdRequest {
FaceSetName = "人脸库名称", FaceId = "人脸ID"
};
try {
var resp = client.ShowFacesByFaceId(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 动作活体检测
var req = new DetectLiveByBase64Request {
};
req.Body = new LiveDetectBase64Req() {
Actions = "动作代码顺序列表",
VideoBase64 = "视频数据的base64编码"
};
try {
var resp = client.DetectLiveByBase64(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
● 静默活体检测
var req = new DetectLiveFaceByBase64Request {
};
req.Body = new LiveDetectFaceBase64Req() {
ImageBase64 = "图片的base64编码"
};
try {
var resp = client.DetectLiveFaceByBase64(req);
var respStatusCode = resp.HttpStatusCode;
Console.WriteLine(respStatusCode);
}
catch (RequestTimeoutException requestTimeoutException) {
Console.WriteLine(requestTimeoutException.ErrorMessage);
}
catch (ServiceResponseException clientRequestException) {
Console.WriteLine(clientRequestException.HttpStatusCode);
Console.WriteLine(clientRequestException.ErrorCode);
Console.WriteLine(clientRequestException.ErrorMsg);
}
catch (ConnectionException connectionException) {
Console.WriteLine(connectionException.ErrorMessage);
}
SDK 代码自动生成
API Explorer提供API检索及平台调试,支持全量快速检索、可视化调试、帮助文档查
看、在线咨询。您只需要在API Explorer中修改接口参数,即可自动生成对应的代码示例。
图5-2 API Explorer
6 Node.js SDK
本章节介绍新版Node.js SDK,您可以参考本章节进行快速集成开发。
准备工作
● 已注册华为云帐号,并完成实名认证,帐号不能处于欠费或冻结状态。
● 已具备开发环境,支持Node 10.16.1 及其以上版本。
● 登录“我的凭证 > 访问秘钥”页面,获取Access Key(AK)和Secret Access Key
(SK)。
● 登录“我的凭证”页面,获取“IAM用户名”“、帐号名”以及待使用区域的
“项目ID”。调用服务时会用到这些信息,请提前保存。
本样例以“华北-北京四”区域为例,获取对应的项目ID(project_id)。
图6-1 我的凭证
安装 SDK
使用SDK前,需要安装“@huaweicloud/huaweicloud-sdk-core”和
“@huaweicloud/huaweicloud-sdk-frs”。
推荐您使用 npm 安装 SDK。
npm install @huaweicloud/huaweicloud-sdk-core npm i @huaweicloud/huaweicloud-sdk-frs
开始使用
详细的SDK介绍请参见SDK中心、Node.js SDK使用指导、Node.js SDK视频指导。
1. 导入依赖模块
const core = require('@huaweicloud/huaweicloud-sdk-core');
const frs = require("@huaweicloud/huaweicloud-sdk-frs");
2. 配置客户端链接参数 – 默认配置
const client = frs.FrsClient.newBuilder()
– 网络代理(可选)
// 使用代理服务器(可选)
client.withProxyAgent("http://username:[email protected]:8080")
– SSL配置(可选)
// 配置跳过服务端证书验证(可选)
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"
3. 配置认证信息
配置AK、SK、project_id信息。华为云通过AK识别用户的身份,通过SK对请求数 据进行签名验证,用于确保请求的机密性、完整性和请求者身份的正确性。
const credentials = new core.BasicCredentials() .withAk(ak)
.withSk(sk)
.withProjectId(project_id)
认证参数说明:
– ak、sk:访问秘钥信息,获取方法请参见准备工作。
– project_id:华为云项目ID,获取方法请参见准备工作。
4. 初始化客户端
指定云服务endpoint方式
// 指定终端节点,以 FRS 服务北京四的 endpoint 为例
const endpoint = "https://face.cn-north-4.myhuaweicloud.com";
const client = frs.FrsClient.newBuilder() .withCredential(credentials) .withEndpoint(endpoint) .build();
endpoint是华为云各服务应用区域和各服务的终端节点,详情请查看 地区和终端
节点 。
5. 发送请求并查看响应
// 以调用人脸检测接口 DetectFaceByBase64 为例 const request = new frs.DetectFaceByBase64Request();
const body = new frs.FaceDetectBase64Req();
body.withImageBase64("图片的base64编码");
request.withBody(body);
const result = client.detectFaceByBase64(request);
result.then(result => {
console.log("JSON.stringify(result)::" + JSON.stringify(result));
}).catch(ex => {
console.log("exception:" + JSON.stringify(ex));
});
说明
使用人脸比对SDK时,image1、image2参数需为相同类型,即同为url、base64或file。
SDK demo 代码解析
● 人脸检测
const request = new frs.DetectFaceByBase64Request();
const body = new frs.FaceDetectBase64Req();
body.withImageBase64("图片的base64编码");
request.withBody(body);
const result = client.detectFaceByBase64(request);
result.then(result => {
console.log("JSON.stringify(result)::" + JSON.stringify(result));
}).catch(ex => {
console.log("exception:" + JSON.stringify(ex));
});
● 人脸比对
const request = new frs.CompareFaceByBase64Request();
const body = new frs.FaceCompareBase64Req();
body.withImage1Base64("图片1的base64编码");
body.withImage2Base64("图片2的base64编码");
request.withBody(body);
const result = client.compareFaceByBase64(request);
result.then(result => {
console.log("JSON.stringify(result)::" + JSON.stringify(result));
}).catch(ex => {
console.log("exception:" + JSON.stringify(ex));
});
● 人脸搜索
const request = new frs.SearchFaceByBase64Request();
const body = new frs.FaceSearchBase64Req();
body.withImageBase64("图片的base64编码");
request.withBody(body);
const result = client.searchFaceByBase64(request);
result.then(result => {
console.log("JSON.stringify(result)::" + JSON.stringify(result));
}).catch(ex => {
console.log("exception:" + JSON.stringify(ex));
});
● 创建人脸库
const request = new frs.CreateFaceSetRequest();
const body = new frs.CreateFaceSetReq();
body.withFaceSetName("人脸库名称");
request.withBody(body);
const result = client.createFaceSet(request);
result.then(result => {
console.log("JSON.stringify(result)::" + JSON.stringify(result));
}).catch(ex => {
console.log("exception:" + JSON.stringify(ex));
});
● 查询人脸库
const request = new frs.ShowFaceSetRequest();
request.faceSetName = "人脸库名称";
const result = client.showFaceSet(request);
result.then(result => {
console.log("JSON.stringify(result)::" + JSON.stringify(result));
}).catch(ex => {
console.log("exception:" + JSON.stringify(ex));
});
● 查询所有人脸库
const request = new frs.ShowAllFaceSetsRequest();
const result = client.showAllFaceSets(request);
result.then(result => {
console.log("JSON.stringify(result)::" + JSON.stringify(result));
}).catch(ex => {
console.log("exception:" + JSON.stringify(ex));
});
● 删除人脸库
const request = new frs.DeleteFaceSetRequest();
request.faceSetName = "人脸库名称";
const result = client.deleteFaceSet(request);
result.then(result => {
console.log("JSON.stringify(result)::" + JSON.stringify(result));
}).catch(ex => {
console.log("exception:" + JSON.stringify(ex));
});