チュートリアル: 顔のライブネスを検出する
顔のライブネス検出を使用して、入力ビデオ ストリーム内の顔が実際の (ライブ) か偽の (スプーフィング) かを判断できます。 これは、写真、ビデオ、マスク、またはその他の手段を使用してシステムにアクセスしようとする詐欺師からスプーフィング攻撃を防ぐために、生体認証システムの重要な構成ブロックです。
ライブネス検出の目的は、認証時にシステムが物理的に存在するライブユーザーと対話していることを確認することです。 このようなシステムは、デジタル ファイナンス、リモート アクセスの制御、オンライン 本人確認プロセスの増加に伴ってますます重要になっています。
ライブネス検出ソリューションは、紙のプリントアウト、2d/3d マスク、スマートフォンやラップトップ上のスプーフィング プレゼンテーションなど、さまざまな種類のスプーフィングから正常に保護します。 ライブネス検出は、時間の経過と共にますます高度なスプーフィング攻撃に対抗するために継続的な改善が行われている研究のアクティブな領域です。 ソリューション全体が新しい型の攻撃に対してより堅牢になるにつれて、継続的な改善がクライアントとサービス コンポーネントにロールアウトされます。
重要
ライブネス用の Face クライアント SDK は、ゲートされたフィーチャーです。 顔認識の取り込みフォームにを入力して、ライブネスフィーチャーへのアクセスを要求する必要があります。 Azure サブスクリプションにアクセス権が付与されたら、Face ライブネスSDK をダウンロードできます。
前提条件
- Azure サブスクリプション - 無料アカウントを作成します
- 責任ある AI 用語に同意してリソースを作成するには、Azure アカウントに Cognitive Services 共同作成者 ロールが割り当てられている必要があります。 このロールをアカウントに割り当てるには、ロールの割り当てに関するドキュメントの手順に従うか、管理者にお問い合わせください。
- Azure サブスクリプションを入手したら、Azure portal で Face リソースを作成し、キーとエンドポイントを取得します。 デプロイされたら、 [リソースに移動] を選択します。
- アプリケーションを Face サービスに接続するには、作成したリソースのキーとエンドポイントが必要です。 このクイックスタートで後に示すコードに、自分のキーとエンドポイントを貼り付けます。
- Free 価格レベル (
F0
) を使用してサービスを試用し、後から運用環境用の有料レベルにアップグレードすることができます。
- モバイル用 (IOS、Android) および Web 用 Azure AI Vision Face Client SDK へのアクセス。 開始するには、SDK にアクセスするために 顔認識 の制限付きアクセスフィーチャー を申請する必要があります。 詳細については、「 Face Limited Access 」ページを参照してください。
ライブネス検出を実行する
ライブネス ソリューションの統合には、フロントエンド モバイル/Web アプリケーションとアプリ サーバー/オーケストレーターという 2 つの異なるコンポーネントが含まれます。
モバイル アプリケーションにライブネスを統合する
SDK にアクセスしたら、 azure-ai-vision-sdk GitHub リポジトリの指示に従って、UI とコードをネイティブ モバイル アプリケーションに統合します。 ライブネス SDK では、Android モバイル アプリケーションの場合は Java/Kotlin、iOS モバイル アプリケーションの場合は Swift、Web アプリケーションの場合は JavaScript がサポートされています。
- Swift iOS の場合は、 iOS サンプルの指示に従ってください
- Kotlin/Java Android の場合は、 Android サンプルの指示に従います
- JavaScript Web の場合は、Web サンプルの指示に従ってください
アプリケーションにコードを追加すると、SDK はカメラの起動を処理し、エンドユーザーに位置を調整するよう誘導し、ライブネス ペイロードを作成し、Azure AI Face クラウド サービスを呼び出してライブネス ペイロードを処理します。
liveness ソリューションを調整する
ライブネス オーケストレーションに関連する大まかなステップを次に示します:
フロントエンド アプリケーションがライブネス チェックを開始し、アプリ サーバーに通知します。
アプリ サーバーは、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> }
アプリ サーバーは、フロントエンド アプリケーションに session-authorization-token を返します。
フロントエンド アプリケーションは、Azure AI Vision SDK の初期化時に session-authorization-token を提示します。
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>"
azureAIVisionFaceAnalyzer.token = "<INSERT_TOKEN_HERE>"
その後、SDK はカメラを起動し、ユーザーが正しく配置するようにガイドした後、ライブネス検出サービス エンドポイントを呼び出すペイロードを準備します。
SDK は、Azure AI Vision Face サービスを呼び出して、ライブネス検出を実行します。 サービスが応答すると、SDK は、ライブネス チェックが完了したことをモバイル アプリケーションに通知します。
フロントエンド アプリケーションは、ライブネス チェックの完了をアプリ サーバーに中継します。
アプリ サーバーは、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": "" }, "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 }
顔検証を使用してライブネス検出を実行する
顔検証とライブネス検出を組み合わせることで、特定の関心のあるユーザーの生体認証検証が可能になり、ユーザーがシステムに物理的に存在することが保証されます。 ライブネスと検証の統合には、次の 2 つの部分があります:
- 適切な参照イメージを選択します。
- 検証を使用して、ライブネスのオーケストレーションを設定します。
適切な参照イメージを選択する
次のヒントを使用して、入力画像が最も正確な認識結果を得られるようにします。
技術的な要件:
- サポートされている入力画像形式は、JPEG、PNG、GIF (最初のフレーム)、BMP です。
- 画像ファイル サイズは 6 MB 以内であることが必要です。
- 画像が顔認識を試行するのに十分な品質である可能性が高いかどうかを示す一般的なガイドラインとして、適用可能な検出モデルを使用する場合は、
qualityForRecognition
属性がある 顔検出 操作を利用できます。"high"
品質イメージのみが、個人の登録で、"medium"
以上の品質が 識別シナリオに推奨されます。
構成要件:
- 写真は鮮明で鮮明で、ぼやけていない、ピクセル化された、歪んでいる、または損傷している。
- 顔の傷や顔の外観を取り除くために写真は変更されません。
- 写真は RGB カラーでサポートされている形式 (JPEG、PNG、WEBP、BMP) である必要があります。 推奨される顔サイズは 200 ピクセル x 200 ピクセルです。 顔のサイズが 200 ピクセル x 200 ピクセルを超える場合、AI 品質は向上せず、サイズは 6 MB 以下になります。
- ユーザーは、眼鏡、マスク、帽子、ヘッドフォン、ヘッドカバー、またはフェイスカバーを着用していません。 顔は障害物を含まない必要があります。
- あなたの顔を隠さない限り、顔の宝石類は許可されています。
- 写真に表示する顔は 1 つだけです。
- 顔は、両目を開き、口を閉じ、極端な表情や頭の傾きをしてない、中立的な正面向きのポーズである必要があります。
- 顔は影や赤目を含まない必要があります。 これらのいずれかが発生した場合は、写真を再撮影してください。
- 背景は均一でプレーンで、影を含まない必要があります。
- 顔はイメージ内の中央に配置し、画像の少なくとも 50% を塗りつぶしている必要があります。
検証を使用して、ライブネスのオーケストレーションを設定します。
検証オーケストレーションでのライブネスに関連する大まかなステップを次に示します:
次の 2 つのメソッドのいずれかで検証参照イメージを指定します:
アプリ サーバーは、ライブネス セッションの作成時に参照イメージを提供します。 検証を伴うライブネス セッションの作成に関連する各要求パラメーターの詳細については、検証を伴うライブネス セッションの作成操作に関する情報を参照してください。
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 の初期化時に参照イメージを提供します。 このシナリオは、Web ソリューションのサポート対象ではありません。
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)) }
アプリ サーバーは、ライブネスの結果に加えて、検証結果のクエリを実行できるようになりました。
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=@"content.bin"' \ --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": "" }, "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 }
リソースをクリーンアップする
Azure AI サービス サブスクリプションをクリーンアップして削除したい場合は、リソースまたはリソース グループを削除することができます。 リソース グループを削除すると、それに関連付けられている他のリソースも削除されます。
次のステップ
ライブネス API の他のオプションについては、Azure AI Vision SDK 参照をご覧ください。
liveness ソリューションのオーケストレーションを行うために使用できる機能の詳細については、Session REST API リファレンスを参照してください。