Вызов API распознавания

Предостережение

Доступ к службе распознавания лиц ограничен на основе критериев соответствия и использования для поддержки наших принципов ответственного искусственного интеллекта. Служба "Распознавание лиц" доступна только для клиентов и партнеров, управляемых корпорацией Майкрософт. Используйте форму подачи заявки на распознавание лиц для получения доступа. Для получения дополнительной информации см. страницу Face limited access.

Предостережение

Корпорация Майкрософт отставила или ограничила возможности распознавания лиц, которые могут быть использованы для вывода эмоциональных состояний и атрибутов личности и, если они используются неправильно, могут подвергать людей стереотипам, дискриминации или несправедливому отказу в обслуживании. Устаревшие функции — это эмоции и пол. Ограниченные возможности: возраст, улыбка, лицевые волосы, волосы и макияж. Отправьте электронное письмо команде Azure Face, если у вас есть обоснованный случай использования, который может воспользоваться любой из ограниченных возможностей. Дополнительные сведения об этом решении см. здесь.

В этом руководстве показано, как использовать API обнаружения лиц для извлечения атрибутов из заданного изображения. Вы узнаете о различных способах настройки поведения этого API в соответствии с вашими потребностями.

Фрагменты кода в этом руководстве написаны на C# с помощью клиентской библиотеки Распознавания лиц Azure. Те же функции можно реализовать с помощью REST API.

Необходимые условия

  • В этом руководстве предполагается, что вы уже создали объект FaceClient с именем faceClient, используя ключ лица и URL-адрес конечной точки. Для получения инструкций по настройке этой функции следуйте одному из кратких руководств.

Отправка данных на сервис

Чтобы найти лица и получить их расположения в изображении, вызовите DetectAsync. Он принимает строку URL-адреса или двоичный файл изображения в качестве входных данных.

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

Служба возвращает объект FaceDetectionResult , который можно запрашивать для различных типов сведений, указанных ниже.

Сведения о том, как анализировать данные о расположении и размерах лица, см. в разделе FaceRectangle. Как правило, в этом прямоугольнике заключены глаза, брови, нос и рот. Верхняя часть головы, уши и подбородок не обязательно включены. Чтобы использовать прямоугольник лица для обрезки полной головы или получения портрета среднего плана, следует расширить прямоугольник в каждом направлении.

Определение способа обработки данных

В этом разделе рассматриваются особенности вызова метода Detect, в том числе передаваемые аргументы и операции, которые можно выполнять с возвращаемыми данными. Рекомендуется запрашивать только необходимые функции. Для выполнения каждой операции требуется дополнительное время.

Получение идентификатора лица

Если задать параметр returnFaceIdtrue (только утвержденным клиентам), вы можете получить уникальный идентификатор для каждого лица, который можно использовать в последующих задачах распознавания лиц.

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

Необязательный параметр faceIdTimeToLive указывает, сколько времени (в секундах) идентификатор лица должен храниться на сервере. После истечения срока действия идентификатор лица удаляется. Значение по умолчанию — 86400 (24 часа).

Получение ключевых точек лица

Ключевые точки на лице — это набор легко обнаруживаемых точек на лице, таких как зрачки или кончик носа. Чтобы получить данные ориентиров лица, установите для параметра detectionModel значение FaceDetectionModel.Detection03, а для параметра returnFaceLandmarks — значение 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;

Получение характеристик лица

Помимо прямоугольников и опорных точек лица, API для распознавания лиц может анализировать несколько концептуальных атрибутов лица. Полный их список см. в разделе Атрибуты лица концептуального руководства.

Чтобы анализировать атрибуты лиц, задайте для параметра detectionModel значение FaceDetectionModel.Detection03, а для параметра returnFaceAttributes — список значений FaceAttributeType Enum.

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;

Получите результаты от сервиса

Результаты ориентиров для лиц

В следующем коде показано, как можно получить сведения о расположении носа и зрачков:

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

Если известно направление лица, вы можете повернуть прямоугольную рамку для более точной ее подгонки. Для обрезки лиц на изображении можно программно повернуть его так, чтобы лица всегда располагались в правильном положении.

Результаты атрибутов лица

Следующий код показывает, как можно получить данные атрибутов лица, которые вы запросили в исходном вызове.

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

Дополнительные сведения о каждом из этих атрибутов см. в концептуальном руководстве по определению лиц и их атрибутам.

Следующий шаг

Из этого руководства вы узнали, как использовать различные функции определения и анализа лиц. Далее вы можете интегрировать эти функции в приложение и добавить данные о лицах, полученные от пользователей.