자습서: 얼굴의 활동성 감지

얼굴 활동성 감지를 사용하여 입력 비디오 스트림의 얼굴이 실제(라이브) 또는 가짜(스푸핑)인지 확인할 수 있습니다. 이는 사진, 비디오, 마스크 또는 다른 사람을 가장하는 다른 수단을 사용하여 시스템에 액세스하려는 사기꾼의 스푸핑 공격을 방지하기 위한 바이오 메트릭 인증 시스템의 중요한 구성 요소입니다.

활동성 검색의 목표는 시스템이 인증 시 실제로 존재하는 라이브 사용자와 상호 작용하도록 하는 것입니다. 이러한 시스템은 디지털 금융, 원격 액세스 제어 및 온라인 ID 확인 프로세스의 증가와 함께 점점 더 중요해지고 있습니다.

활동성 감지 솔루션은 종이 인쇄물, 2d/3d 마스크 및 휴대폰 및 노트북의 스푸핑 프레젠테이션에 이르기까지 다양한 스푸핑 유형으로부터 성공적으로 방어합니다. 활동성 탐지는 연구의 활성 영역으로, 시간이 지남에 따라 점점 더 정교한 스푸핑 공격에 대응하기 위해 지속적으로 개선되고 있습니다. 전체 솔루션이 새로운 유형의 공격에 더 강력해짐에 따라 시간이 지남에 따라 클라이언트 및 서비스 구성 요소에 지속적인 개선이 롤아웃됩니다.

Important

활동성을 위한 Face 클라이언트 SDK는 제어된 기능입니다. 얼굴 인식 유입 양식을 작성하여 활동성 기능에 대한 액세스를 요청해야 합니다. Azure 구독에 액세스 권한이 부여되면 Face Liveness SDK를 다운로드할 수 있습니다.

필수 조건

  • 책임 있는 AI 조건에 동의하고 리소스를 만들려면 Azure 계정에 Cognitive Services 기여자 역할이 할당되어 있어야 합니다. 이 역할을 계정에 할당하려면 역할 할당의 단계를 수행하거나 관리자에게 문의하세요.
  • Azure 구독 이 있으면 Azure Portal에서 Face 리소스 를 만들어 키와 엔드포인트를 가져옵니다. 배포한 후 리소스로 이동을 선택합니다.
    • 애플리케이션을 Face 서비스에 연결하려면 만든 리소스의 키와 엔드포인트가 필요합니다. 키와 엔드포인트는 이 빠른 시작의 뒷부분에서 코드에 붙여넣습니다.
    • 무료 가격 책정 계층(F0)을 사용하여 서비스를 사용해 볼 수 있으며 나중에 프로덕션용 유료 계층으로 업그레이드할 수 있습니다.
  • 모바일(IOS 및 Android)용 Azure AI Vision Face 클라이언트 SDK에 액세스합니다. 시작하려면 얼굴 인식 제한 액세스 기능을 신청하여 SDK에 액세스해야 합니다. 자세한 내용은 얼굴 제한 액세스 페이지를 참조하세요.

활동성 검색 수행

활동성 솔루션 통합에는 모바일 애플리케이션과 앱 서버/오케스트레이터의 두 가지 구성 요소가 포함됩니다.

모바일 애플리케이션에 활동성 통합

SDK에 액세스할 수 있게 되면 azure-ai-vision-sdk GitHub 리포지토리의 지침에 따라 UI와 코드를 네이티브 모바일 애플리케이션에 통합합니다. 활동성 SDK는 Android용 Java/Kotlin과 iOS 모바일 애플리케이션용 Swift를 모두 지원합니다.

애플리케이션에 코드를 추가하면 SDK에서 카메라 시작을 처리하고, 최종 사용자가 위치를 조정하도록 안내하고, 활동성 페이로드를 구성하고, Azure AI Face 클라우드 서비스를 호출하여 활동성 페이로드를 처리합니다.

활동성 솔루션 오케스트레이션

활동성 오케스트레이션과 관련된 개략적인 단계는 다음과 같습니다.

Diagram of the liveness workflow in Azure AI Face.

  1. 모바일 애플리케이션은 활동성 검사 시작하고 앱 서버에 알깁니다.

  2. 앱 서버는 Azure AI Face Service를 사용하여 새 활동 세션을 만듭니다. 서비스는 활동성 세션을 만들고 세션 권한 부여 토큰으로 다시 응답합니다.

    Request:
    curl --location '<insert-api-endpoint>/face/v1.1-preview.1/detectliveness/singlemodal/sessions' \
    --header 'Ocp-Apim-Subscription-Key:<insert-api-key>
    --header 'Content-Type: application/json' \
    --data '{
      "livenessOperationMode": "passive",
      "deviceCorrelationId": "723d6d03-ef33-40a8-9682-23a1feb7bccd",
      "sendResultsToClient": "false"
    }'
     
    Response:
    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": <session-authorization-token>
    }
    
  3. 앱 서버는 세션 권한 부여 토큰을 모바일 애플리케이션에 다시 제공합니다.

  4. 모바일 애플리케이션은 Azure AI Vision SDK를 초기화하는 동안 세션 권한 부여 토큰을 제공합니다.

    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))
    })
    
    serviceOptions?.authorizationToken = "<INSERT_TOKEN_HERE>"
    
  5. 그런 다음 SDK는 카메라를 시작하고 사용자에게 올바른 위치를 지정하도록 안내한 다음, 활동성 검색 서비스 엔드포인트를 호출하도록 페이로드를 준비합니다.

  6. SDK는 Azure AI Vision Face 서비스를 호출하여 활동성 검색을 수행합니다. 서비스가 응답하면 SDK는 모바일 애플리케이션에 활동성 검사 완료되었음을 알립니다.

  7. 모바일 애플리케이션은 활동성 검사 완료를 앱 서버에 릴레이합니다.

  8. 이제 앱 서버는 Azure AI Vision Face 서비스의 활동성 검색 결과를 쿼리할 수 있습니다.

    Request:
    curl --location '<insert-api-endpoint>/face/v1.1-preview.1/detectliveness/singlemodal/sessions/a3dc62a3-49d5-45a1-886c-36e7df97499a' \
    --header 'Ocp-Apim-Subscription-Key: <insert-api-key>
    
    Response:
    {
        "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": "PostmanRuntime/7.34.0"
            },
            "response": {
                "body": {
                    "livenessDecision": "realface",
                    "target": {
                        "faceRectangle": {
                            "top": 59,
                            "left": 121,
                            "width": 409,
                            "height": 395
                        },
                        "fileName": "video.webp",
                        "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
    }
    
    

얼굴 확인을 사용하여 활동성 감지 수행

얼굴 확인을 활동성 감지와 결합하면 특정 사용자의 바이오 메트릭 확인을 통해 해당 사용자가 시스템에 물리적으로 존재함을 추가로 보장할 수 있습니다. 활동성을 검증과 통합하는 데는 다음 두 가지 부분이 있습니다.

  1. 적절한 참조 이미지를 선택합니다.
  2. 확인을 사용하여 활동성 오케스트레이션을 설정합니다.

Diagram of the liveness-with-verify workflow of Azure AI Face.

적절한 참조 이미지 선택

다음 팁을 사용하여 입력 이미지가 가장 정확한 인식 결과를 제공하는지 확인합니다.

기술 요구 사항:

  • 지원되는 입력 이미지 형식은 JPEG, PNG, GIF(첫 번째 프레임), BMP입니다.
  • 이미지 파일 크기는 6MB 이하여야 합니다.
  • 이미지에서 얼굴 인식을 시도할 수 있는 품질이 충분한지 여부에 대한 일반적인 지침으로 적용 가능한 검색 모델을 사용할 때 얼굴 감지 작업에서 특성을 활용할 qualityForRecognition 수 있습니다. 식별 시나리오에는 사람 등록 및 품질 이상을 "medium" 위해 품질 이미지만 "high" 권장됩니다.

컴퍼지션 요구 사항:

  • 사진은 선명하고 선명하며 흐릿하거나 픽셀화되거나 왜곡되거나 손상되지 않습니다.
  • 사진은 얼굴 흠이나 얼굴 모양을 제거하기 위해 변경되지 않습니다.
  • 사진은 RGB 색 지원 형식(JPEG, PNG, WEBP, BMP)이어야 합니다. 권장되는 얼굴 크기는 200픽셀 x 200픽셀입니다. 얼굴 크기가 200픽셀 x 200픽셀보다 크면 AI 품질이 향상되지 않으며 크기는 6MB를 넘지 않습니다.
  • 사용자는 안경, 마스크, 모자, 헤드폰, 머리 덮개 또는 얼굴 덮개를 착용하지 않습니다. 얼굴은 장애물이 없어야 합니다.
  • 얼굴 보석은 얼굴을 숨기지 않는 한 허용됩니다.
  • 사진에는 한 얼굴만 표시되어야 합니다.
  • 얼굴은 두 눈을 뜨고, 입을 닫고, 극단적인 얼굴 표정이나 머리 기울기 없이 중립 전면 포즈를 취해야 합니다.
  • 얼굴은 그림자나 빨간 눈이 없어야 합니다. 이 중 하나가 발생하면 사진을 다시 촬영하십시오.
  • 배경은 균일하고 평범해야 하며 그림자가 없어야 합니다.
  • 얼굴은 이미지 가운데에 배치되어야 하며 이미지의 50% 이상을 채워야 합니다.

확인을 사용하여 활동성 오케스트레이션을 설정합니다.

확인 오케스트레이션을 사용하는 활동성과 관련된 개략적인 단계는 다음과 같습니다.

  1. 다음 두 가지 방법 중 하나를 사용하여 확인 참조 이미지를 제공합니다.

    • 앱 서버는 활동성 세션을 만들 때 참조 이미지를 제공합니다.

      Request:
      curl --location '<insert-api-endpoint>/face/v1.1-preview.1/detectlivenesswithverify/singlemodal/sessions' \
      --header 'Ocp-Apim-Subscription-Key: <api_key>' \
      --form 'Parameters="{
        \"livenessOperationMode\": \"passive\",
        \"deviceCorrelationId\": \"723d6d03-ef33-40a8-9682-23a1feb7bccd\"
      }"' \
      --form 'VerifyImage=@"test.png"'
      
      Response:
      {
          "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))
      
      if let path = Bundle.main.path(forResource: "<IMAGE_RESOURCE_NAME>", ofType: "<IMAGE_RESOURCE_TYPE>"),
         let image = UIImage(contentsOfFile: path),
         let singleFaceImageSource = try? VisionSource(uiImage: image) {
          try methodOptions.setRecognitionMode(.verifyMatchToFaceIn(singleFaceImage: singleFaceImageSource))
      }
      
  2. 이제 앱 서버는 활동성 결과 외에도 확인 결과를 쿼리할 수 있습니다.

    Request:
    curl --location '<insert-api-endpoint>/face/v1.1-preview.1/detectlivenesswithverify/singlemodal/sessions/3847ffd3-4657-4e6c-870c-8e20de52f567' \
    --header 'Content-Type: multipart/form-data' \
    --header 'apim-recognition-model-preview-1904: true' \
    --header 'Authorization: Bearer.<session-authorization-token> \
    --form 'Content=@"video.webp"' \
    --form 'Metadata="<insert-metadata>"
    
    Response:
    {
        "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": "PostmanRuntime/7.34.0"
            },
            "response": {
                "body": {
                    "livenessDecision": "realface",
                    "target": {
                        "faceRectangle": {
                            "top": 59,
                            "left": 121,
                            "width": 409,
                            "height": 395
                        },
                        "fileName": "video.webp",
                        "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
    }
    

리소스 정리

Azure AI 서비스 구독을 정리하고 제거하려면 리소스 또는 리소스 그룹을 삭제할 수 있습니다. 리소스 그룹을 삭제하면 해당 리소스 그룹에 연결된 다른 모든 리소스가 함께 삭제됩니다.

다음 단계

활동성 API의 다른 옵션에 대한 자세한 내용은 Azure AI Vision SDK 참조를 참조하세요.

활동성 솔루션을 오케스트레이션하는 데 사용할 수 있는 기능에 대한 자세한 내용은 세션 REST API 참조를 참조하세요.