• 沒有找到結果。

4.6 人脸资源管理

4.6.1 添加人脸

功能介绍

添加人脸到人脸库中。将单张图片中的人脸添加至人脸库中,支持添加最大人脸或所 有人脸。

前提条件:

请确保您已开通人脸识别服务,具体操作方法请参见申请服务。

约束限制:

● 只支持识别JPG、PNG、JPEG、BMP格式的图片。

● application/json请求的body中,请使用标准Json格式。

● Base64编码中请勿使用回车换行。

● 系统不保存用户图片。

● 图片大小小于8MB,由于过大图片会导致时延较长,并且图片信息量不大,建议 小于1MB。

● 图片分辨率小于4096*2160,图片中人脸像素大于80*80,建议120*120以上。

● 为保证识别效果,人脸图片建议要求如下:

a. 光照大于200lux、无反光强光阴影现象。

b. 人脸无遮挡、整体清晰无拖尾抖动等运动模糊。

c. 侧脸不超过30°、俯仰角小于15°、偏转角小于15°、图片中人脸保持竖置正 脸。

● 其他的约束限制信息请参见约束与限制章节。

建议:

● 由于过大图片对识别算法精度无明显提升,同时会导致时延较长,建议传入图片 小于1MB,一般500KB左右足够。

OBS上存储的图片也建议小于1MB。

调试

您可以在API Explorer中调试该接口。

URI

POST /v2/{project_id}/face-sets/{face_set_name}/faces

4-62 路径参数

参数 是否必选 参数类型 描述

project_id 是 String 项目ID,获取方法请参见获取项

目ID/账号名/AK/SK。

face_set_nam

e 是 String 人脸库名称。

请求参数

4-63 请求 Header 参数

参数 是否必选 参数类型 描述

X-Auth-Token 是 String 用户Token。

Token认证就是在调用API的时 候将Token加到请求消息头,从 而通过身份认证,获得操作API 的权限,响应消息头中X-Subject-Token的值即为Token。

4-64 请求 Body 参数

参数名 参数类型 是否必选 说明

image_url String 与

image_file

、image_base 64三选一

图片的URL路径,目前仅支持华为 云上OBS的URL,使用时只需保证 FRS有权限读取该OBS桶的数据。

开通读取权限的操作请参见服务

授权。

image_file File 与

image_url

、image_base 64三选一

本地图片文件,图片不能超过 8MB,建议小于1MB。上传文件 时,请求格式为multipart。

image_base64 String 与

image_file

、image_url 三选一

图像数据,Base64编码,要求:

● Base64编码后大小不超过 8MB,建议小于1MB。

● 图片为JPG/JPEG/BMP/PNG格 式。

参数名 参数类型 是否必选 说明 external_image_i

d String 否 用户指定的图片外部ID,与当前

图像绑定。用户没提供,系统会 生成一个。

该ID长度范围为1~36位,可以包 含字母、数字、中划线或者下划 线,不包含其他的特殊字符。

external_fields Object 否 根据用户自定义数据类型,填入 相应的数值。

需在创建人脸库时定义

external_fields字段,才可以在添 加人脸时使用该字段,Json字符 串不校验重复性,参考自定义字

段。

single boolean 否 是否将图片中的最大人脸添加至 人脸库。可选值包括:

● true:传入的单张图片中如果 包含多张人脸,则只将最大人 脸添加到人脸库中。

● false:默认为false。传入的单 张图片中如果包含多张人脸,

则将所有人脸添加至人脸库 中。

响应参数

状态码:200

4-65 响应 Body 参数

参数 参数类型 描述

face_set_id String 人脸库ID。 调用失败时无此字段。

face_set_nam

e String 人脸库名称。 调用失败时无此字段。

faces Array of

FaceSetFace

objects

人脸库当中的人脸结构,详见FaceSetFace。 调 用失败时无此字段。

4-66 FaceSetFace

参数 参数类型 描述

bounding_box

BoundingBox

object 人脸在图像中的位置。 BoundingBox结构见

BoundingBox。

external_field

s Object 用户添加的额外字段。

external_imag

e_id String 人脸所在的外部图片ID。

face_id String 人脸ID,由系统内部生成的唯一ID。

4-67 BoundingBox

参数 参数类型 描述

width Integer 矩形框宽度。

top_left_y Integer 矩形框左上角纵坐标。

top_left_x Integer 矩形框左上角横坐标。

height Integer 矩形框高度。

状态码: 400

4-68 响应 Body 参数

参数 参数类型 描述

error_code String 调用失败时的错误码,具体请参考错误码。 调用 成功时无此字段。

error_msg String 调用失败时的错误信息。 调用成功时无此字段。

请求示例

X-Auth-Token值获取方法请参见快速入门。

● 请求样例(方式一:使用图片的BASE64编码)

POST https://{endpoint}/v2/{project_id}/face-sets/showFaceSet/faces Request Header:

Content-Type: application/json

X-Auth-Token: MIINRwYJKoZIhvcNAQcCoIINODCCDTQCAQExDT...

Request Body:

{ "image_base64": "/9j/4AAQSkZJRgABAgEASABIAAD", "external_image_id": "imageID",

"external_fields": { "timestamp": 12,

"id": "home"

external_fields: {"timestamp" : 12,"id" : "home"}

● 请求样例(方式三:使用图片URL)

{ "image_url":"/BucketName/ObjectName", "external_image_id":"imageID",

"external_fields" : { "timestamp": 12, "id": "home"

} }

● Python3语言请求代码示例(其他语言参照下列示例编写或使用FRS SDK)

# coding:utf-8 -*-import requests import base64

endpoint = '开通服务所在region的人脸识别服务域名' project_id = '开通服务所在region的用户项目ID' token = '用户获取得到的实际token值'

headers = {'Content-Type': 'application/json', 'X-Auth-Token': token}

face_set_name = 'showFaceSet'

url = "https://{endpoint}/v2/{project_id}/face-sets/{face_set_name}/faces".format(

endpoint=endpoint,project_id=project_id,face_set_name=face_set_name) imagepath = r'./data/face-demo.png'

with open(imagepath, "rb") as bin_data:

image_data = bin_data.read()

image_base64 = base64.b64encode(image_data).decode("utf-8") body = {

"image_base64": image_base64, "external_image_id": "imageID", "external_fields": {

"timestamp": 12, "id": "home"

} }

response = requests.post(url, headers=headers, json=body, verify=False) print(response.text)

● Java语言请求代码示例(其他语言参照下列示例编写或使用FRS SDK)

import com.huawei.trace.http.apache.httpclient.TraceApacheHttpClientBuilder;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

* 使用前需已配置HttpClient jar包。jar包可通过下载SDK获取 */

public class AddFace {

protected static HttpClientBuilder buildClient(HttpClientBuilder httpClientBuilder) { SSLContext sslContext = null;

try {

sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {

public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { return true;

httpClientBuilder.setSSLContext(sslContext);

httpClientBuilder.setConnectionTimeToLive(30, TimeUnit.SECONDS);

HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;

SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);

Registry<ConnectionSocketFactory> socketFactoryRegistry

= RegistryBuilder.<ConnectionSocketFactory>create().register("http",

PlainConnectionSocketFactory.getSocketFactory()).register("https", sslSocketFactory).build();

PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager(socketFactoryRegistry);

connMgr.setMaxTotal(200);

connMgr.setDefaultMaxPerRoute(100);

httpClientBuilder.setConnectionManager(connMgr);

return httpClientBuilder;

}

public static String doPost(String url, String jsonStr, String token, CloseableHttpClient client) { HttpPost post = new HttpPost(url);

StringEntity entity = new StringEntity(jsonStr, ContentType.APPLICATION_JSON);

post.setEntity(entity);

post.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");

//time unit is milliseconds RequestConfig requestConfig =

RequestConfig.custom().setConnectTimeout(3000).setSocketTimeout(3000).build();

post.setConfig(requestConfig);

post.setHeader("X-Auth-Token", token);

HttpResponse response = null;

String result = "";

try {

System.arraycopy(byteStream, 0, new byte[byteStream.length], 0, byteStream.length);

result = new String(byteStream, StandardCharsets.UTF_8);

public static void main(String[] args) {

CloseableHttpClient client = buildClient(TraceApacheHttpClientBuilder.create()).build();

// endpoint,project_id和face_set_name需要替换成实际信息。

String url = "https://{{endpoint}}/v2/{{project_id}}/face-sets/{{face_set_name}}/faces";

String jsonStr = "{ \"image_base64\": \"/9j/4AAQSkZJRgABAgEASABIAAD...\"}";

String token = "对应region的token";

{ "face_set_id": "T785tx1N", "face_set_name": "showFaceSet", "faces": [

"external_image_id": "Xr0phyap", "external_fields" : {

{ "error_code": "FRS.0404",

"error_msg": "Detect no face, can not add it to face set."

}

状态码

状态码请参见状态码。

错误码

错误码请参见错误码。