Воспринимаемое распознавание распознавания эмоций с помощью API распознавания лицPerceived Emotion Recognition Using the Face API

Загрузить образец загрузить примерDownload Sample Download the sample

API распознавания лиц может выполнять обнаружение распознавания эмоций для обнаружения гнев, неприятия, отвращение, аномалии, счастье, нейтрального, грусть и удивительного в выражении лица, основанного на воспринимаемых заметках человеческими программистами.The Face API can perform emotion detection to detect anger, contempt, disgust, fear, happiness, neutral, sadness, and surprise, in a facial expression based on perceived annotations by human coders. Важно отметить, однако, что только выражения лица могут необязательно представлять внутренние состояния людей.It is important to note, however, that facial expressions alone may not necessarily represent the internal states of people.

Помимо возврата результата распознавания эмоций для выражения лица, API распознавания лиц может также возвращать ограничивающий прямоугольник для обнаруженных сторон.In addition to returning an emotion result for a facial expression, the Face API can also returns a bounding box for detected faces.

Распознавание распознавания эмоций можно выполнить с помощью клиентской библиотеки и с помощью REST API.Emotion recognition can be performed via a client library, and via a REST API. В этой статье рассматривается выполнение распознавания эмоцийного распознавания с помощью REST API.This article focuses on performing emotion recognition via the REST API. Дополнительные сведения о REST API см. в разделе REST API лиц.For more information about the REST API, see Face REST API.

API распознавания лиц также можно использовать для распознавания выражений лица в видео и получения сводки по их эмоции.The Face API can also be used to recognize the facial expressions of people in video, and can return a summary of their emotions. Дополнительные сведения см. в статье анализ видео в режиме реального времени.For more information, see How to Analyze Videos in Real-time.

Примечание

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.If you don't have an Azure subscription, create a free account before you begin.

Чтобы использовать API распознавания лиц, необходимо получить ключ API.An API key must be obtained to use the Face API. Это можно получить на Cognitive Services попытки.This can be obtained at Try Cognitive Services.

Дополнительные сведения о API распознавания лиц см. в разделе API распознавания лиц.For more information about the Face API, see Face API.

Проверка подлинностиAuthentication

Для каждого запроса, выполненного в API распознавания лиц, требуется ключ API, который должен быть указан в качестве значения Ocp-Apim-Subscription-Key заголовка.Every request made to the Face API requires an API key that should be specified as the value of the Ocp-Apim-Subscription-Key header. В следующем примере кода показано, как добавить ключ API в Ocp-Apim-Subscription-Key заголовок запроса:The following code example shows how to add the API key to the Ocp-Apim-Subscription-Key header of a request:

public FaceRecognitionService()
{
  _client = new HttpClient();
  _client.DefaultRequestHeaders.Add("ocp-apim-subscription-key", Constants.FaceApiKey);
}

Сбой передачи допустимого ключа API в API распознавания лиц приведет к ошибке ответа 401.Failure to pass a valid API key to the Face API will result in a 401 response error.

Выполнение распознавания распознавания эмоцийPerform emotion recognition

Распознавание распознавания эмоций выполняется путем создания запроса POST, содержащего изображение, в detect API https://[location].api.cognitive.microsoft.com/face/v1.0 , где [location]] — это регион, который вы использовали для получения ключа API.Emotion recognition is performed by making a POST request containing an image to the detect API at https://[location].api.cognitive.microsoft.com/face/v1.0, where [location]] is the region you used to obtain your API key. Необязательные параметры запроса:The optional request parameters are:

  • returnFaceId— Указывает, следует ли возвращать Фацеидс обнаруженных сторон.returnFaceId – whether to return faceIds of the detected faces. Значение по умолчанию — true.The default value is true.
  • returnFaceLandmarks— Указывает, следует ли возвращать ориентиры обнаруженных лиц.returnFaceLandmarks – whether to return face landmarks of the detected faces. Значение по умолчанию — false.The default value is false.
  • returnFaceAttributes— следует ли анализировать и возвращать один или несколько указанных атрибутов лиц.returnFaceAttributes – whether to analyze and return one or more specified face attributes. Поддерживаются следующие атрибуты лиц: age , gender , headPose ,,,, smile facialHair glasses emotion , hair , makeup , occlusion ,,, accessories blur exposure и noise .Supported face attributes include age, gender, headPose, smile, facialHair, glasses, emotion, hair, makeup, occlusion, accessories, blur, exposure, and noise. Обратите внимание, что анализ атрибутов лица имеет дополнительные вычислительные и временные затраты.Note that face attribute analysis has additional computational and time cost.

Содержимое изображения должно быть помещено в текст запроса POST в виде URL-адреса или двоичных данных.Image content must be placed in the body of the POST request as a URL, or binary data.

Примечание

Поддерживаются форматы файлов изображений JPEG, PNG, GIF и BMP, а размер разрешенного файла — от 1 КБ до 4 МБ.Supported image file formats are JPEG, PNG, GIF, and BMP, and the allowed file size is from 1KB to 4MB.

В примере приложения процесс распознавания распознавания эмоций вызывается путем вызова DetectAsync метода:In the sample application, the emotion recognition process is invoked by calling the DetectAsync method:

Face[] faces = await _faceRecognitionService.DetectAsync(photoStream, true, false, new FaceAttributeType[] { FaceAttributeType.Emotion });

Этот вызов метода задает поток, содержащий данные изображения, которые Фацеидс должны быть возвращены, и эти ориентиры не должны возвращаться и распознавания эмоций изображения.This method call specifies the stream containing the image data, that faceIds should be returned, that face landmarks shouldn't be returned, and that the emotion of the image should be analyzed. Он также указывает, что результаты будут возвращены в виде массива Face объектов.It also specifies that the results will be returned as an array of Face objects. В свою очередь, DetectAsync метод вызывает detect REST API, который выполняет распознавание распознавания эмоций:In turn, the DetectAsync method invokes the detect REST API that performs emotion recognition:

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 запроса, а затем отправляет запрос detect API через SendRequestAsync метод.This method generates a request URI and then sends the request to the detect API via the SendRequestAsync method.

Примечание

Вы должны использовать один и тот же регион в API распознавания лицных вызовах, как вы использовали для получения ключей подписки.You must use the same region in your Face API calls as you used to obtain your subscription keys. Например, если вы получили ключи подписки из westus региона, конечная точка обнаружения лиц будет иметь значение https://westus.api.cognitive.microsoft.com/face/v1.0/detect .For example, if you obtained your subscription keys from the westus region, the face detection endpoint will be https://westus.api.cognitive.microsoft.com/face/v1.0/detect.

Отправка запросаSend the request

SendRequestAsyncМетод выполняет запрос POST к API распознавания лиц и возвращает результат в виде Face массива:The SendRequestAsync method makes the POST request to the Face API and returns the result as a Face array:

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");
    }
    else
    {
      // 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);
  }
  else
  {
    ...
  }
  return default(TResponse);
}

Если образ предоставляется через поток, метод создает запрос POST путем заключения потока изображения в StreamContent экземпляр, который предоставляет содержимое HTTP на основе потока.If the image is supplied via a stream, the method builds the POST request by wrapping the image stream in a StreamContent instance, which provides HTTP content based on a stream. Кроме того, если образ предоставляется через URL-адрес, метод создает запрос POST путем заключения URL-адреса в StringContent экземпляр, который предоставляет содержимое HTTP на основе строки.Alternatively, if the image is supplied via a URL, the method builds the POST request by wrapping the URL in a StringContent instance, which provides HTTP content based on a string.

Затем запрос POST отправляется в detect API.The POST request is then sent to detect API. Ответ считывается, десериализуется и возвращается вызывающему методу.The response is read, deserialized, and returned to the calling method.

detectAPI отправит код состояния HTTP 200 (ОК) в ответе при условии, что запрос действителен, что означает, что запрос выполнен успешно и запрошенные сведения находятся в ответе.The detect API will send HTTP status code 200 (OK) in the response, provided that the request is valid, which indicates that the request succeeded and that the requested information is in the response. Список возможных ответов об ошибках см. в разделе REST API.For a list of possible error responses, see Face REST API.

Обработка ответаProcess the response

Ответ API возвращается в формате JSON.The API response is returned in JSON format. В следующих данных JSON показано типичное успешное сообщение ответа, которое предоставляет данные, запрошенные образцом приложения:The following JSON data shows a typical successful response message that supplies the data requested by the sample application:

[  
   {  
      "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
         }
      }
   }
]

Сообщение об успешном ответе состоит из массива записей лиц, ранжированных по размеру прямоугольника в убывающем порядке, в то время как пустой ответ означает, что лица не обнаружены.A successful response message consists of an array of face entries ranked by face rectangle size in descending order, while an empty response indicates no faces detected. Каждое распознанное лицо включает ряд дополнительных атрибутов, которые задаются returnFaceAttributes аргументом для DetectAsync метода.Each recognized face includes a series of optional face attributes, which are specified by the returnFaceAttributes argument to the DetectAsync method.

В примере приложения ответ JSON десериализуется в массив Face объектов.In the sample application, the JSON response is deserialized into an array of Face objects. При интерпретации результатов API распознавания лиц, обнаруженный распознавания эмоций должен интерпретироваться как распознавания эмоций с наивысшим рейтингом, так как оценки нормализованы до одной суммы.When interpreting results from the Face API, the detected emotion should be interpreted as the emotion with the highest score, as scores are normalized to sum to one. Таким образом, пример приложения отображает распознанный распознавания эмоций с наивысшим рейтингом для наибольшего обнаруженного лица в изображении.Therefore, the sample application displays the recognized emotion with the highest score for the largest detected face in the image. Для этого используется такой код:This is achieved with the following code:

emotionResultLabel.Text = faces.FirstOrDefault().FaceAttributes.Emotion.ToRankedList().FirstOrDefault().Key;

На следующем снимке экрана показан результат процесса распознавания распознавания эмоций в примере приложения:The following screenshot shows the result of the emotion recognition process in the sample application:

Распознавание эмоций