Chamar a API de deteção

Atenção

O acesso ao serviço presencial é limitado com base em critérios de elegibilidade e uso, a fim de apoiar nossos princípios de IA responsável. O serviço Face só está disponível para clientes e parceiros geridos pela Microsoft. Use o formulário de admissão de Reconhecimento Facial para solicitar acesso. Para obter mais informações, consulte a página Acesso limitado Face.

Atenção

A Microsoft aposentou ou limitou os recursos de reconhecimento facial que podem ser usados para tentar inferir estados emocionais e atributos de identidade que, se usados indevidamente, podem sujeitar as pessoas a estereótipos, discriminação ou negação injusta de serviços. As capacidades aposentadas são a emoção e o género. As capacidades limitadas são idade, sorriso, pelos faciais, cabelo e maquilhagem. Envie um e-mail para a API do Azure Face se você tiver um caso de uso responsável que se beneficiaria do uso de qualquer um dos recursos limitados. Leia mais sobre esta decisão aqui.

Este guia demonstra como usar a API de deteção de rosto para extrair atributos de uma determinada imagem. Você aprenderá as diferentes maneiras de configurar o comportamento dessa API para atender às suas necessidades.

Os trechos de código neste guia são escritos em C# usando a biblioteca de cliente do Azure AI Face. A mesma funcionalidade está disponível através da API REST.

Configurar

Este guia pressupõe que você já construiu um objeto FaceClient , chamado faceClient, usando uma chave Face e uma URL de ponto de extremidade. Para obter instruções sobre como configurar esse recurso, siga um dos inícios rápidos.

Enviar dados ao serviço

Para encontrar rostos e obter suas localizações em uma imagem, chame o DetectAsync. Ele usa uma cadeia de caracteres de URL ou o binário de imagem bruta como entrada.

var response = await faceClient.DetectAsync(new Uri(imageUrl), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, returnFaceId: false);
IReadOnlyList<FaceDetectionResult> faces = response.Value;

O serviço retorna um objeto FaceDetectionResult , que você pode consultar para diferentes tipos de informações, especificadas abaixo.

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. O topo da cabeça, orelhas e queixo não estão necessariamente incluídos. Para usar o retângulo facial para cortar uma cabeça completa ou obter um retrato no meio da foto, você deve expandir o retângulo em cada direção.

Determinar como processar os dados

Este guia se concentra nas especificidades da chamada Detetar, como quais argumentos você pode passar e o que pode fazer com os dados retornados. Recomendamos que você consulte apenas os recursos necessários. Cada operação leva mais tempo para ser concluída.

Obter ID facial

Se você definir o parâmetro returnFaceId como true (somente clientes aprovados), poderá obter o ID exclusivo para cada rosto, que poderá ser usado em tarefas posteriores de reconhecimento facial.

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

O parâmetro opcional faceIdTimeToLive especifica por quanto tempo (em segundos) o face ID deve ser armazenado no servidor. Após este tempo expirar, o ID do rosto é removido. O valor padrão é 86400 (24 horas).

Obter pontos de referência de rosto

Pontos de referência 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 pontos de referência faciais, defina o parâmetro detectionModel como FaceDetectionModel.Detection03 e o parâmetro returnFaceLandmarks como true.

// Note DetectionModel.Detection02 cannot be used with returnFaceLandmarks.
var response2 = await faceClient.DetectAsync(new Uri(imageUrl), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, returnFaceId: false, returnFaceLandmarks: true);
IReadOnlyList<FaceDetectionResult> faces2 = response2.Value;

Obter atributos de rosto

Além de retângulos faciais e pontos de referência, a API de deteção de rosto pode analisar vários atributos conceituais de um rosto. Para obter uma lista completa, consulte a seção conceitual Atributos do rosto.

Para analisar atributos de face, defina o parâmetro detectionModel como FaceDetectionModel.Detection03 e o parâmetro returnFaceAttributes como uma lista de valores Enum FaceAttributeType.

var requiredFaceAttributes = new FaceAttributeType[] {
    FaceAttributeType.Detection03.Blur,
    FaceAttributeType.Detection03.HeadPose,
    FaceAttributeType.Detection03.Mask,
    FaceAttributeType.Recognition04.QualityForRecognition
};
// Note DetectionModel.Detection02 cannot be used with returnFaceAttributes.
var response3 = await faceClient.DetectAsync(new Uri(imageUrl), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, returnFaceId: false, returnFaceAttributes: requiredFaceAttributes);
IReadOnlyList<FaceDetectionResult> faces3 = response3.Value;

Obter resultados do serviço

Resultados marcantes faciais

O código a seguir demonstra como você pode recuperar os locais 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;

Você também pode usar dados de marco facial para calcular com precisão a direção do rosto. Por exemplo, você pode definir a rotação do rosto como um vetor do centro da boca para o centro dos olhos. O código a seguir calcula esse vetor:

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

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

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

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

    var faceDirectionVectorX = centerOfTwoEyes.X - centerOfMouth.X;
    var faceDirectionVectorY = centerOfTwoEyes.Y - centerOfMouth.Y;
}

Quando você sabe a direção do rosto, você pode girar a moldura retangular do rosto para alinhá-lo mais corretamente. Para cortar rostos em uma imagem, você pode girá-la programaticamente para que os rostos sempre apareçam na vertical.

Resultados dos atributos faciais

O código a seguir mostra como você pode recuperar os dados do atributo face que você solicitou na chamada original.

foreach (var face in faces3)
{
    var attributes = face.FaceAttributes;
    var blur = attributes.Blur;
    var headPose = attributes.HeadPose;
    var mask = attributes.Mask;
    var qualityForRecognition = attributes.QualityForRecognition;
}

Para saber mais sobre cada um dos atributos, consulte o Guia conceitual de deteção de rosto e atributos .

Próximos passos

Neste guia, você aprendeu como usar as várias funcionalidades de deteção e análise facial. Em seguida, integre esses recursos em um aplicativo para adicionar dados faciais dos usuários.