Reconocimiento de emociones percibido mediante Face API

Ejemplo de descarga Descarga del ejemplo

Face API puede realizar la detección de emociones para detectar la emoción, el desprecio, el sentimiento, el miedo, la emoción, la neutralidad, la emoción y la sorpresa, en una expresión facial basada en anotaciones percibidas por los codificadores humanos. Sin embargo, es importante tener en cuenta que las expresiones faciales por sí solas pueden no representar necesariamente los estados internos de las personas.

Además de devolver un resultado de emociones para una expresión facial, Face API también puede devolver un cuadro de límite para las caras detectadas.

El reconocimiento de emociones se puede realizar a través de una biblioteca cliente y a través de una API REST. Este artículo se centra en realizar el reconocimiento de emociones a través de la API REST. Para obtener más información sobre la API REST, vea Face REST API.

Face API también se puede usar para reconocer las expresiones faciales de las personas en vídeo y puede devolver un resumen de sus emociones. Para obtener más información, vea How to Analyze Videos in Real-time( Cómo analizar vídeos en tiempo real).

Nota:

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Se debe obtener una clave de API para usar Face API. Esto se puede obtener en Try Cognitive Services.

Para más información sobre Face API, consulte Face API.

Autenticación

Cada solicitud realizada a Face API requiere una clave de API que se debe especificar como valor del Ocp-Apim-Subscription-Key encabezado. En el ejemplo de código siguiente se muestra cómo agregar la clave de API al Ocp-Apim-Subscription-Key encabezado de una solicitud:

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

Si no se pasa una clave de API válida a Face API, se producirá un error de respuesta 401.

Realización del reconocimiento de emociones

El reconocimiento de emociones se realiza realizando una solicitud POST que contiene una imagen a la API en , donde es la región que usó detect para obtener la clave de https://[location].api.cognitive.microsoft.com/face/v1.0[location]] API. Los parámetros de solicitud opcionales son:

  • returnFaceId : si se deben devolver faceIds de las caras detectadas. El valor predeterminado es true.
  • returnFaceLandmarks : si se deben devolver puntos de referencia de caras de las caras detectadas. El valor predeterminado es false.
  • returnFaceAttributes : si se va a analizar y devolver uno o varios atributos de cara especificados. Entre los atributos de cara admitidos age se incluyen , , , , , , , gender , headPosesmile y facialHairglassesemotionhairmakeupocclusionaccessoriesblurexposurenoise . Tenga en cuenta que el análisis de atributos faciales tiene costos de cálculo y tiempo adicionales.

El contenido de la imagen debe colocarse en el cuerpo de la solicitud POST como una dirección URL o datos binarios.

Nota:

Los formatos de archivo de imagen admitidos son JPEG, PNG, GIF y BMP, y el tamaño de archivo permitido es de 1 KB a 4 MB.

En la aplicación de ejemplo, el proceso de reconocimiento de emociones se invoca mediante una llamada al DetectAsync método :

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

Esta llamada al método especifica la secuencia que contiene los datos de la imagen, que se deben devolver faceIds, que no se deben devolver los puntos de referencia de la cara y que se debe analizar la emoción de la imagen. También especifica que los resultados se devolverán como una matriz de Face objetos . A su vez, el DetectAsync método invoca la API REST que realiza el reconocimiento de detect emociones:

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);
}

Este método genera un URI de solicitud y, a continuación, envía la solicitud a la detect API a través del método SendRequestAsync .

Nota:

Debe usar la misma región en las llamadas de Face API que usó para obtener las claves de suscripción. Por ejemplo, si obtuvo las claves de suscripción de la región, el punto de conexión de westus detección de caras será https://westus.api.cognitive.microsoft.com/face/v1.0/detect .

Envío de la solicitud

El SendRequestAsync método realiza la solicitud POST a Face API y devuelve el resultado como una Face matriz:

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);
}

Si la imagen se proporciona a través de una secuencia, el método compila la solicitud POST encapsulando la secuencia de imagen en una instancia de , que proporciona contenido HTTP basado StreamContent en una secuencia. Como alternativa, si la imagen se proporciona a través de una dirección URL, el método compila la solicitud POST encapsulando la dirección URL en una instancia de , que proporciona contenido HTTP basado en StringContent una cadena.

A continuación, la solicitud POST se envía a detect la API. La respuesta se lee, se deserializa y se devuelve al método que realiza la llamada.

La API enviará el código de estado HTTP 200 (CORRECTO) en la respuesta, siempre que la solicitud sea válida, lo que indica que la solicitud se ha hecho correctamente y que la información solicitada está en detect la respuesta. Para obtener una lista de posibles respuestas de error, consulte Face REST API.

Procesamiento de la respuesta

La respuesta de la API se devuelve en formato JSON. Los siguientes datos JSON muestran un mensaje de respuesta correcto típico que proporciona los datos solicitados por la aplicación de ejemplo:

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

Un mensaje de respuesta correcto consta de una matriz de entradas de caras clasificadas por tamaño de rectángulo de cara en orden descendente, mientras que una respuesta vacía indica que no se han detectado caras. Cada cara reconocida incluye una serie de atributos de cara opcionales, que se especifican mediante el returnFaceAttributes argumento para el método DetectAsync .

En la aplicación de ejemplo, la respuesta JSON se deserializa en una matriz de Face objetos . Al interpretar los resultados de Face API, la emoción detectada debe interpretarse como la emoción con la puntuación más alta, ya que las puntuaciones se normalizan para sumar a una. Por lo tanto, la aplicación de ejemplo muestra la emoción reconocida con la puntuación más alta para la cara detectada más grande en la imagen. Esto se consigue con el código siguiente:

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

En la captura de pantalla siguiente se muestra el resultado del proceso de reconocimiento de emociones en la aplicación de ejemplo:

Reconocimiento de emociones