人脸 API 可以执行情感检测,以基于人类编码员感知的注释在面部表情中检测愤怒、蔑视、厌恶、恐惧、幸福、中性、悲伤和惊讶。 然而,需要注意的是,仅仅面部表情不一定代表人的内在状态。
除了返回面部表情的情感结果外,人脸 API 还可以返回检测到的人脸的边界框。
可以通过客户端库和 REST API 执行情感识别。 本文重点介绍如何通过 REST API 执行情感识别。 有关 REST API 的详细信息,请参阅
人脸 REST API
。
人脸 API 还可用于识别视频中人员的面部表情,并可以返回其情绪摘要。 有关详细信息,请参阅
如何实时分析视频
。
如果还没有
Azure 订阅
,可以在开始前创建一个
免费帐户
。
必须获取 API 密钥才能使用人脸 API。 这可以在
试用认知服务
中获取。
有关人脸 API 的详细信息,请参阅
人脸 API
。
对人脸 API 发出的每个请求都需要一个 API 密钥,该密钥应指定为标头的值
Ocp-Apim-Subscription-Key
。 下面的代码示例演示如何将 API 密钥添加到
Ocp-Apim-Subscription-Key
请求的标头:
public FaceRecognitionService()
_client = new HttpClient();
_client.DefaultRequestHeaders.Add("ocp-apim-subscription-key", Constants.FaceApiKey);
未能将有效的 API 密钥传递给人脸 API 将导致 401 响应错误。
情感识别是通过向 API https://[location].api.cognitive.microsoft.com/face/v1.0
发出包含图像的 detect
POST 请求来执行的,其中 [location]]
是用于获取 API 密钥的区域。 可选请求参数为:
returnFaceId
– 是否返回检测到的人脸的 faceIds。 默认值为 true
。
returnFaceLandmarks
– 是否返回检测到的人脸的人脸的地标。 默认值为 false
。
returnFaceAttributes
– 是分析和返回一个或多个指定的人脸属性。 支持的人脸属性包括 age
、、gender
、headPose
、smile
facialHair
、emotion
glasses
makeup
hair
、occlusion
、、accessories
、 blur
exposure
和 。noise
请注意,人脸属性分析具有额外的计算和时间成本。
图像内容必须作为 URL 或二进制数据放置在 POST 请求的正文中。
支持的图像文件格式为 JPEG、PNG、GIF 和 BMP,允许的文件大小为 1KB 到 4MB。
在示例应用程序中,通过调用 DetectAsync
方法调用情感识别过程:
Face[] faces = await _faceRecognitionService.DetectAsync(photoStream, true, false, new FaceAttributeType[] { FaceAttributeType.Emotion });
此方法调用指定包含图像数据的流、应返回 faceIds、不应返回人脸特征以及应分析图像的情感。 它还指定结果将作为对象的数组 Face
返回。 反过来,方法 DetectAsync
调用 detect
执行情感识别的 REST API:
public async Task<Face[]> DetectAsync(Stream imageStream, bool returnFaceId, bool returnFaceLandmarks, IEnumerable<FaceAttributeType> returnFaceAttributes)
var requestUrl =
$"{Constants.FaceEndpoint}/detect?returnFaceId={returnFaceId}" +
"&returnFaceLandmarks={returnFaceLandmarks}" +
"&returnFaceAttributes={GetAttributeString(returnFaceAttributes)}";
return await SendRequestAsync<Stream, Face[]>(HttpMethod.Post, requestUrl, imageStream);
此方法生成请求 URI,然后通过 SendRequestAsync
方法将请求发送到 detect
API。
必须在人脸 API 调用中使用与获取订阅密钥时相同的区域。 例如,如果从 westus
区域获取了订阅密钥,则人脸检测终结点将为 https://westus.api.cognitive.microsoft.com/face/v1.0/detect
。
方法 SendRequestAsync
向人脸 API 发出 POST 请求,并将结果作为 Face
数组返回:
async Task<TResponse> SendRequestAsync<TRequest, TResponse>(HttpMethod httpMethod, string requestUrl, TRequest requestBody)
var request = new HttpRequestMessage(httpMethod, Constants.FaceEndpoint);
request.RequestUri = new Uri(requestUrl);
if (requestBody != null)
if (requestBody is Stream)
request.Content = new StreamContent(requestBody as Stream);
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
// If the image is supplied via a URL
request.Content = new StringContent(JsonConvert.SerializeObject(requestBody, s_settings), Encoding.UTF8, "application/json");
HttpResponseMessage responseMessage = await _client.SendAsync(request);
if (responseMessage.IsSuccessStatusCode)
string responseContent = null;
if (responseMessage.Content != null)
responseContent = await responseMessage.Content.ReadAsStringAsync();
if (!string.IsNullOrWhiteSpace(responseContent))
return JsonConvert.DeserializeObject<TResponse>(responseContent, s_settings);
return default(TResponse);
return default(TResponse);
如果图像是通过流提供的,则 方法通过将图像流包装在实例中 StreamContent
来生成 POST 请求,该实例基于流提供 HTTP 内容。 或者,如果图像是通过 URL 提供的,则 方法通过将 URL 包装在实例中 StringContent
来生成 POST 请求,该实例基于字符串提供 HTTP 内容。
然后,POST 请求将发送到 detect
API。 响应是读取的、反序列化的,并返回到调用方法。
API detect
将在响应中发送 HTTP 状态代码 200 (正常) ,前提是请求有效,这表示请求成功且请求的信息在响应中。 有关可能的错误响应的列表,请参阅 人脸 REST API。
API 响应以 JSON 格式返回。 以下 JSON 数据显示了提供示例应用程序请求的数据的典型成功响应消息:
"faceId":"8a1a80fe-1027-48cf-a7f0-e61c0f005051",
"faceRectangle":{
"top":192,
"left":164,
"width":339,
"height":339
"faceAttributes":{
"emotion":{
"anger":0.0,
"contempt":0.0,
"disgust":0.0,
"fear":0.0,
"happiness":1.0,
"neutral":0.0,
"sadness":0.0,
"surprise":0.0
成功的响应消息由按人脸矩形大小降序排列的人脸条目数组组成,而空响应指示未检测到人脸。 每个识别的人脸都包含一系列可选人脸属性,这些属性由 returnFaceAttributes
方法的参数 DetectAsync
指定。
在示例应用程序中,JSON 响应反序列化为对象的数组 Face
。 解释人脸 API 的结果时,应将检测到的情感解释为分数最高的情感,因为分数将规范化为总和为 1。 因此,示例应用程序以图像中检测到的最大人脸的最高分数显示识别的情感。 使用以下代码即可实现此目的:
emotionResultLabel.Text = faces.FirstOrDefault().FaceAttributes.Emotion.ToRankedList().FirstOrDefault().Key;
以下屏幕截图显示了示例应用程序中情感识别过程的结果:
人脸 API。
Todo 认知服务 (示例)
人脸 Rest API