Obtenha dados de deteção facial

Este guia demonstra como usar a deteção facial para extrair atributos como sexo, idade ou pose a partir de uma determinada imagem. Os fragmentos de código neste guia são escritos em C# utilizando a biblioteca de clientes Azure Cognitive Services Face. A mesma funcionalidade está disponível através da API REST.

Este guia mostra-lhe como:

  • Obtenha as localizações e dimensões dos rostos numa imagem.
  • Obtenha a localização de vários marcos faciais, como pupilas, nariz e boca, numa imagem.
  • Adivinha o sexo, idade, emoção, e outros atributos de um rosto detetado.

Configuração

Este guia pressupõe que já construiu um objeto FaceClient, faceClient nomeado, com uma chave de subscrição Face e URL de ponto final. A partir daqui, pode utilizar a função de deteção facial chamando detectWithUrlAsync, que é usado neste guia, ou DetectWithStreamAsync. Para obter instruções sobre como configurar esta função, siga um dos arranques rápidos.

Este guia centra-se nas especificidades da chamada Detect, como os argumentos que pode passar e o que pode fazer com os dados devolvidos. Recomendamos que se questione apenas para as funcionalidades de que necessita. Cada operação leva tempo adicional para ser concluída.

Obtenha dados básicos do rosto

Para encontrar rostos e obter as suas localizações numa imagem, ligue para o método DetectWithUrlAsync ou DetectWithStreamAsync com o parâmetro DevoluçãoFaceId definido como verdadeiro. Esta é a predefinição.

IList<DetectedFace> faces = await faceClient.Face.DetectWithUrlAsync(url: imageUrl, returnFaceId: true, detectionModel: DetectionModel.Detection03);

Pode consultar os objetos DetectedFace devolvidos para os seus IDs únicos e um retângulo que dá as coordenadas de pixel do rosto.

foreach (var face in faces)
{
    string id = face.FaceId.ToString();
    FaceRectangle rect = face.FaceRectangle;
}

Para obter informações sobre como analisar a localização e as dimensões do rosto, consulte FaceRectangle. Normalmente, este retângulo contém os olhos, sobrancelhas, nariz e boca. A parte superior da cabeça, orelhas e queixo não estão necessariamente incluídas. Para usar o retângulo facial para cortar uma cabeça completa ou obter um retrato a meio do tiro, talvez para uma imagem do tipo foto, você pode expandir o retângulo em cada direção.

Obtenha marcos de rosto

Marcos faciais são um conjunto de pontos fáceis de encontrar em um rosto, como as pupilas ou a ponta do nariz. Para obter dados de referência de rosto, desafie o parâmetro detecçãoModel para DetectionModel.Detection01 e o parâmetro de retornoFaceLandmarks para verdadeiro.

// Note DetectionModel.Detection02 cannot be used with returnFaceLandmarks.
IList<DetectedFace> faces2 = await faceClient.Face.DetectWithUrlAsync(url: imageUrl, returnFaceId: true, returnFaceLandmarks: true, detectionModel: DetectionModel.Detection01);

O seguinte código demonstra como pode recuperar a localização do nariz e das pupilas:

foreach (var face in faces2)
{
    var landmarks = face.FaceLandmarks;

    double noseX = landmarks.NoseTip.X;
    double noseY = landmarks.NoseTip.Y;

    double leftPupilX = landmarks.PupilLeft.X;
    double leftPupilY = landmarks.PupilLeft.Y;

    double rightPupilX = landmarks.PupilRight.X;
    double rightPupilY = landmarks.PupilRight.Y;

Também pode usar dados de marcos faciais para calcular com precisão a direção do rosto. Por exemplo, pode definir a rotação do rosto como um vetor do centro da boca para o centro dos olhos. O seguinte código calcula este vetor:

    var upperLipBottom = landmarks.UpperLipBottom;
    var underLipTop = landmarks.UnderLipTop;

    var centerOfMouth = new Point(
        (upperLipBottom.X + underLipTop.X) / 2,
        (upperLipBottom.Y + underLipTop.Y) / 2);

    var eyeLeftInner = landmarks.EyeLeftInner;
    var eyeRightInner = landmarks.EyeRightInner;

    var centerOfTwoEyes = new Point(
        (eyeLeftInner.X + eyeRightInner.X) / 2,
        (eyeLeftInner.Y + eyeRightInner.Y) / 2);

    Vector faceDirection = new Vector(
        centerOfTwoEyes.X - centerOfMouth.X,
        centerOfTwoEyes.Y - centerOfMouth.Y);
}

Quando souber a direção do rosto, pode rodar a face retangular para alinhá-la mais corretamente. Para cortar rostos numa imagem, pode rodar programáticamente a imagem para que os rostos apareçam sempre na vertical.

Obtenha atributos faciais

Além de retângulos e marcos faciais, a API de deteção facial pode analisar vários atributos conceptuais de um rosto. Para obter uma lista completa, consulte a secção conceptual de atributos Face.

Para analisar os atributos faciais, defina o parâmetro de detecçãoModel.Detection01 e o parâmetro de retornoFaceAttributes para uma lista de valores FaceAttributeType Enum.

var requiredFaceAttributes = new FaceAttributeType?[] {
    FaceAttributeType.Age,
    FaceAttributeType.Gender,
    FaceAttributeType.Smile,
    FaceAttributeType.FacialHair,
    FaceAttributeType.HeadPose,
    FaceAttributeType.Glasses,
    FaceAttributeType.Emotion
};
// Note DetectionModel.Detection02 cannot be used with returnFaceAttributes.
var faces3 = await faceClient.Face.DetectWithUrlAsync(url: imageUrl, returnFaceId: true, returnFaceAttributes: requiredFaceAttributes, detectionModel: DetectionModel.Detection01);

Em seguida, obtenha referências aos dados devolvidos e faça mais operações de acordo com as suas necessidades.

foreach (var face in faces3)
{
    var attributes = face.FaceAttributes;
    var age = attributes.Age;
    var gender = attributes.Gender;
    var smile = attributes.Smile;
    var facialHair = attributes.FacialHair;
    var headPose = attributes.HeadPose;
    var glasses = attributes.Glasses;
    var emotion = attributes.Emotion;
}

Para saber mais sobre cada um dos atributos, consulte a deteção do Rosto e atribui o guia conceptual.

Passos seguintes

Neste guia, aprendeu a utilizar as várias funcionalidades de deteção facial. Em seguida, integre estas funcionalidades numa app para adicionar dados faciais dos utilizadores.