Поделиться через


Вызов 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;
}

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

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

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