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


Руководство по обнаружению активности лиц

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

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

Решение обнаружения активности распознавания лиц Azure AI успешно защищает от различных типов спуфа, начиная от печати бумаги, 2D/3D-маски и спуфинга презентаций на телефонах и ноутбуках. Обнаружение активности является активной областью исследований, с непрерывными улучшениями, которые делаются для противодействия все более сложным спуфингом атак. Непрерывные улучшения развертываются клиенту и компонентам службы с течением времени, так как общее решение становится более надежным для новых типов атак.

Внимание

Пакеты SDK для клиента распознавания лиц для активности — это функция. Необходимо запросить доступ к функции активности, заполнив форму приема распознавания лиц. Когда подписка Azure предоставляет доступ, вы можете скачать пакет SDK для распознавания лиц.

Введение

Интеграция решения liveness включает два различных компонента: интерфейсное мобильное или веб-приложение и сервер приложений или оркестратор.

Схема рабочего процесса активности в Azure AI Face.

  • Интерфейсное приложение: интерфейсное приложение получает авторизацию с сервера приложений, чтобы инициировать обнаружение активности. Ее основной целью является активация камеры и точное руководство конечных пользователей с помощью процесса обнаружения активности.
  • Сервер приложений: сервер приложений служит сервером для создания сеансов обнаружения активности и получения маркера авторизации из службы распознавания лиц для определенного сеанса. Этот маркер разрешает интерфейсное приложение выполнять обнаружение активности. Цели сервера приложений — управлять сеансами, предоставлять авторизацию для интерфейсного приложения и просматривать результаты процесса обнаружения активности.

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

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

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

Необходимые компоненты

  • Подписка Azure — создайте бесплатную учетную запись.
  • У вашей учетной записи Azure должна быть назначена роль участника Cognitive Services, чтобы вы согласились с ответственными условиями ИИ и создайте ресурс. Чтобы назначить эту роль своей учетной записи, следуйте инструкциям, описанным в документации по назначению ролей, или обратитесь к администратору.
  • Получив подписку Azure, создайте ресурс Распознавания лиц на портале Azure, чтобы получить ключ и конечную точку. После развертывания ресурса выберите элемент Перейти к ресурсу.
    • Вам потребуется ключ и конечная точка из ресурса, создаваемого для подключения приложения к службе распознавания лиц.
    • Используйте бесплатную ценовую категорию (F0), чтобы опробовать службу, а затем выполните обновление до платного уровня для рабочей среды.
  • Доступ к клиентскому пакету SDK для распознавания лиц azure ai Vision для мобильных устройств (IOS и Android) и Интернету. Чтобы приступить к работе, необходимо применить функции ограниченного доступа распознавания лиц, чтобы получить доступ к пакету SDK. Дополнительные сведения см. на странице "Ограниченный доступ для лиц".

Настройка интерфейсных приложений и серверов приложений для обнаружения активности

Мы предоставляем пакеты SDK на разных языках для интерфейсных приложений и серверов приложений. См. следующие инструкции по настройке интерфейсных приложений и серверов приложений.

Скачивание пакета SDK для интерфейсного приложения

Получив доступ к пакету SDK, следуйте инструкциям в репозитории GitHub azure-ai-vision-sdk , чтобы интегрировать пользовательский интерфейс и код в собственное мобильное приложение. Пакет SDK liveness поддерживает java/Kotlin для мобильных приложений Android, Swift для мобильных приложений iOS и JavaScript для веб-приложений:

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

Скачивание клиентской библиотеки распознавания лиц Azure для сервера приложений

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

  • Для C# следуйте инструкциям в dotnet readme
  • Для Java следуйте инструкциям в средстве чтения Java
  • Для Python следуйте инструкциям в читаемом руководстве Python
  • Для JavaScript следуйте инструкциям в средстве чтения JavaScript

Создание переменной среды

В этом примере напишите учетные данные в переменные среды на локальном компьютере, на котором выполняется приложение.

Перейдите на портал Azure. Если ресурс, созданный в разделе "Предварительные требования ", развернут успешно, выберите "Перейти к ресурсу " в разделе "Дальнейшие действия". Вы можете найти ключ и конечную точку в разделе "Управление ресурсами" на странице "Ключи" и " Конечная точка ". Ключ ресурса не совпадает с идентификатором подписки Azure.

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

  • Чтобы задать FACE_APIKEY переменную среды, замените <your_key> одним из ключей ресурса.
  • Чтобы задать переменную среды, замените <your_endpoint> конечной FACE_ENDPOINT точкой ресурса.

Внимание

Если вы используете ключ API, сохраните его в другом месте, например в Azure Key Vault. Не включайте ключ API непосредственно в код и никогда не публикуйте его.

Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ Azure".

setx FACE_APIKEY <your_key>
setx FACE_ENDPOINT <your_endpoint>

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

Обнаружение активности

Ниже приведены высокоуровневые шаги, участвующие в оркестрации активности:

Схема рабочего процесса активности в Azure AI Face.

  1. Интерфейсное приложение запускает проверку активности и уведомляет сервер приложений.

  2. Сервер приложений создает новый сеанс активности с помощью Службы распознавания лиц Azure. Служба создает сеанс liveness-session и отвечает обратно с помощью маркера авторизации сеанса. Дополнительные сведения о каждом параметре запроса, связанном с созданием сеанса liveness, ссылаются на операцию создания сеанса Liveness.

    var endpoint = new Uri(System.Environment.GetEnvironmentVariable("FACE_ENDPOINT"));
    var credential = new AzureKeyCredential(System.Environment.GetEnvironmentVariable("FACE_APIKEY"));
    
    var sessionClient = new FaceSessionClient(endpoint, credential);
    
    var createContent = new CreateLivenessSessionContent(LivenessOperationMode.Passive)
    {
        DeviceCorrelationId = "723d6d03-ef33-40a8-9682-23a1feb7bccd",
        SendResultsToClient = false,
    };
    
    var createResponse = await sessionClient.CreateLivenessSessionAsync(createContent);
    var sessionId = createResponse.Value.SessionId;
    Console.WriteLine($"Session created.");
    Console.WriteLine($"Session id: {sessionId}");
    Console.WriteLine($"Auth token: {createResponse.Value.AuthToken}");
    

    Пример текста ответа:

    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": "<session-authorization-token>"
    }
    
  3. Сервер приложений предоставляет маркер авторизации сеанса обратно в интерфейсное приложение.

  4. Интерфейсное приложение предоставляет маркер авторизации сеанса во время инициализации пакета SDK визуального распознавания Azure.

    mServiceOptions?.setTokenCredential(com.azure.android.core.credential.TokenCredential { _, callback ->
        callback.onSuccess(com.azure.android.core.credential.AccessToken("<INSERT_TOKEN_HERE>", org.threeten.bp.OffsetDateTime.MAX))
    })
    
  5. Затем пакет SDK запускает камеру, направляет пользователя на правильное расположение, а затем подготавливает полезные данные для вызова конечной точки службы обнаружения активности.

  6. Пакет SDK вызывает службу распознавания лиц Azure AI для обнаружения активности. После ответа службы пакет SDK уведомляет интерфейсное приложение о завершении проверки активности.

  7. Интерфейсное приложение передает завершение проверки активности серверу приложений.

  8. Сервер приложений теперь может запрашивать результат обнаружения активности из службы распознавания искусственного интеллекта Azure.

    var getResultResponse = await sessionClient.GetLivenessSessionResultAsync(sessionId);
    
    var sessionResult = getResultResponse.Value;
    Console.WriteLine($"Session id: {sessionResult.Id}");
    Console.WriteLine($"Session status: {sessionResult.Status}");
    Console.WriteLine($"Liveness detection request id: {sessionResult.Result?.RequestId}");
    Console.WriteLine($"Liveness detection received datetime: {sessionResult.Result?.ReceivedDateTime}");
    Console.WriteLine($"Liveness detection decision: {sessionResult.Result?.Response.Body.LivenessDecision}");
    Console.WriteLine($"Session created datetime: {sessionResult.CreatedDateTime}");
    Console.WriteLine($"Auth token TTL (seconds): {sessionResult.AuthTokenTimeToLiveInSeconds}");
    Console.WriteLine($"Session expired: {sessionResult.SessionExpired}");
    Console.WriteLine($"Device correlation id: {sessionResult.DeviceCorrelationId}");
    

    Пример текста ответа:

    {
        "status": "ResultAvailable",
        "result": {
            "id": 1,
            "sessionId": "a3dc62a3-49d5-45a1-886c-36e7df97499a",
            "requestId": "cb2b47dc-b2dd-49e8-bdf9-9b854c7ba843",
            "receivedDateTime": "2023-10-31T16:50:15.6311565+00:00",
            "request": {
                "url": "/face/v1.1-preview.1/detectliveness/singlemodal",
                "method": "POST",
                "contentLength": 352568,
                "contentType": "multipart/form-data; boundary=--------------------------482763481579020783621915",
                "userAgent": ""
            },
            "response": {
                "body": {
                    "livenessDecision": "realface",
                    "target": {
                        "faceRectangle": {
                            "top": 59,
                            "left": 121,
                            "width": 409,
                            "height": 395
                        },
                        "fileName": "content.bin",
                        "timeOffsetWithinFile": 0,
                        "imageType": "Color"
                    },
                    "modelVersionUsed": "2022-10-15-preview.04"
                },
                "statusCode": 200,
                "latencyInMilliseconds": 1098
            },
            "digest": "537F5CFCD8D0A7C7C909C1E0F0906BF27375C8E1B5B58A6914991C101E0B6BFC"
        },
        "id": "a3dc62a3-49d5-45a1-886c-36e7df97499a",
        "createdDateTime": "2023-10-31T16:49:33.6534925+00:00",
        "authTokenTimeToLiveInSeconds": 600,
        "deviceCorrelationId": "723d6d03-ef33-40a8-9682-23a1feb7bccd",
        "sessionExpired": false
    }
    
  9. Сервер приложений может удалить сеанс, если вы больше не запрашиваете его результат.

    await sessionClient.DeleteLivenessSessionAsync(sessionId);
    Console.WriteLine($"The session {sessionId} is deleted.");
    

Обнаружение активности с помощью проверки лиц

Объединение проверки лиц с обнаружением активности обеспечивает биометрическую проверку определенного пользователя, интересующегося, с добавленной гарантией, что человек физически присутствует в системе. Существует две части интеграции активности с проверкой подлинности:

  1. Выберите хороший эталонный образ.
  2. Настройте оркестрацию активности с проверкой.

Схема рабочего процесса liveness-with-face-authentication в Azure AI Face.

Выбор эталонного изображения

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

Технические требования

  • Поддерживаемые форматы входных изображений: JPEG, PNG, GIF (первый кадр), BMP.
  • Размер изображения не должен превышать 6 МБ.
  • Атрибут можно использовать qualityForRecognition в операции обнаружения лиц при использовании применимых моделей обнаружения в качестве общего руководства о том, является ли изображение достаточным качеством для попытки распознавания лиц. Для сценариев идентификации рекомендуется использовать только "high" качественные изображения для регистрации пользователей и качества "medium" .

Требования к композиции

  • Фотография четкая и резкая, а не размытая, пиксельная, искаженная или поврежденная.
  • Фотография не изменяется, чтобы удалить пятна лица или внешний вид лица.
  • Фотография должна быть в поддерживаемом формате RGB (JPEG, PNG, WEBP, BMP). Рекомендуемый размер лица составляет 200 пикселей x 200 пикселей. Размер лица размером более 200 пикселей x 200 пикселей не приведет к улучшению качества ИИ, а размер не превышает 6 МБ.
  • Пользователь не носит очки, маски, шляпы, наушники, головные покрытия или покрытия лиц. Лицо должно быть свободно от каких-либо препятствий.
  • Лица ювелирные изделия разрешены, если они не скрывают ваше лицо.
  • Только одно лицо должно быть видно на фотографии.
  • Лицо должно быть в нейтральной передней позе с обоими глазами открытыми, рот закрытыми, без экстремальных выражений лица или наклона головы.
  • Лицо должно быть свободно от каких-либо теней или красных глаз. Перезадайте фотографию, если одно из этих случаев происходит.
  • Фон должен быть однородным и простым, без каких-либо теней.
  • Лицо должно быть центрировано в пределах изображения и заполнять по крайней мере 50 % изображения.

Настройте оркестрацию активности с проверкой.

Ниже приведены высокоуровневые шаги, участвующие в активности с оркестрацией проверки:

  1. Предоставление эталонного образа проверки двумя способами:

    • Сервер приложений предоставляет эталонный образ при создании сеанса активности. Дополнительные сведения о каждом параметре запроса, связанном с созданием сеанса активности с проверкой подлинности, ссылаются на liveness With Verify Create Session Operation.

      var endpoint = new Uri(System.Environment.GetEnvironmentVariable("FACE_ENDPOINT"));
      var credential = new AzureKeyCredential(System.Environment.GetEnvironmentVariable("FACE_APIKEY"));
      
      var sessionClient = new FaceSessionClient(endpoint, credential);
      
      var createContent = new CreateLivenessSessionContent(LivenessOperationMode.Passive)
      {
          DeviceCorrelationId = "723d6d03-ef33-40a8-9682-23a1feb7bccd"
      };
      using var fileStream = new FileStream("test.png", FileMode.Open, FileAccess.Read);
      
      var createResponse = await sessionClient.CreateLivenessWithVerifySessionAsync(createContent, fileStream);
      
      var sessionId = createResponse.Value.SessionId;
      Console.WriteLine("Session created.");
      Console.WriteLine($"Session id: {sessionId}");
      Console.WriteLine($"Auth token: {createResponse.Value.AuthToken}");
      Console.WriteLine("The reference image:");
      Console.WriteLine($"  Face rectangle: {createResponse.Value.VerifyImage.FaceRectangle.Top}, {createResponse.Value.VerifyImage.FaceRectangle.Left}, {createResponse.Value.VerifyImage.FaceRectangle.Width}, {createResponse.Value.VerifyImage.FaceRectangle.Height}");
      Console.WriteLine($"  The quality for recognition: {createResponse.Value.VerifyImage.QualityForRecognition}");
      

      Пример текста ответа:

      {
          "verifyImage": {
              "faceRectangle": {
                  "top": 506,
                  "left": 51,
                  "width": 680,
                  "height": 475
              },
              "qualityForRecognition": "high"
          },
          "sessionId": "3847ffd3-4657-4e6c-870c-8e20de52f567",
          "authToken": "<session-authorization-token>"
      }
      
    • Интерфейсное приложение предоставляет эталонное изображение при инициализации пакета SDK. Этот сценарий не поддерживается в веб-решении.

      val singleFaceImageSource = VisionSource.fromFile("/path/to/image.jpg")
      mFaceAnalysisOptions?.setRecognitionMode(RecognitionMode.valueOfVerifyingMatchToFaceInSingleFaceImage(singleFaceImageSource))
      
  2. Теперь сервер приложений может запрашивать результат проверки в дополнение к результату активности.

    var getResultResponse = await sessionClient.GetLivenessWithVerifySessionResultAsync(sessionId);
    var sessionResult = getResultResponse.Value;
    Console.WriteLine($"Session id: {sessionResult.Id}");
    Console.WriteLine($"Session status: {sessionResult.Status}");
    Console.WriteLine($"Liveness detection request id: {sessionResult.Result?.RequestId}");
    Console.WriteLine($"Liveness detection received datetime: {sessionResult.Result?.ReceivedDateTime}");
    Console.WriteLine($"Liveness detection decision: {sessionResult.Result?.Response.Body.LivenessDecision}");
    Console.WriteLine($"Verification result: {sessionResult.Result?.Response.Body.VerifyResult.IsIdentical}");
    Console.WriteLine($"Verification confidence: {sessionResult.Result?.Response.Body.VerifyResult.MatchConfidence}");
    Console.WriteLine($"Session created datetime: {sessionResult.CreatedDateTime}");
    Console.WriteLine($"Auth token TTL (seconds): {sessionResult.AuthTokenTimeToLiveInSeconds}");
    Console.WriteLine($"Session expired: {sessionResult.SessionExpired}");
    Console.WriteLine($"Device correlation id: {sessionResult.DeviceCorrelationId}");
    

    Пример текста ответа:

    {
        "status": "ResultAvailable",
        "result": {
            "id": 1,
            "sessionId": "3847ffd3-4657-4e6c-870c-8e20de52f567",
            "requestId": "f71b855f-5bba-48f3-a441-5dbce35df291",
            "receivedDateTime": "2023-10-31T17:03:51.5859307+00:00",
            "request": {
                "url": "/face/v1.1-preview.1/detectlivenesswithverify/singlemodal",
                "method": "POST",
                "contentLength": 352568,
                "contentType": "multipart/form-data; boundary=--------------------------590588908656854647226496",
                "userAgent": ""
            },
            "response": {
                "body": {
                    "livenessDecision": "realface",
                    "target": {
                        "faceRectangle": {
                            "top": 59,
                            "left": 121,
                            "width": 409,
                            "height": 395
                        },
                        "fileName": "content.bin",
                        "timeOffsetWithinFile": 0,
                        "imageType": "Color"
                    },
                    "modelVersionUsed": "2022-10-15-preview.04",
                    "verifyResult": {
                        "matchConfidence": 0.9304124,
                        "isIdentical": true
                    }
                },
                "statusCode": 200,
                "latencyInMilliseconds": 1306
            },
            "digest": "2B39F2E0EFDFDBFB9B079908498A583545EBED38D8ACA800FF0B8E770799F3BF"
        },
        "id": "3847ffd3-4657-4e6c-870c-8e20de52f567",
        "createdDateTime": "2023-10-31T16:58:19.8942961+00:00",
        "authTokenTimeToLiveInSeconds": 600,
        "deviceCorrelationId": "723d6d03-ef33-40a8-9682-23a1feb7bccd",
        "sessionExpired": true
    }
    
  3. Сервер приложений может удалить сеанс, если вы больше не запрашиваете его результат.

    await sessionClient.DeleteLivenessWithVerifySessionAsync(sessionId);
    Console.WriteLine($"The session {sessionId} is deleted.");
    

Очистка ресурсов

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

Дополнительные сведения о других вариантах в API активности см. в справочнике по пакету SDK azure AI Vision.

Дополнительные сведения о функциях, доступных для оркестрации решения liveness, см. в справочнике по REST API сеанса.