컬렉션에 얼굴 추가 - Amazon Rekognition

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

컬렉션에 얼굴 추가

IndexFaces작업을 사용하여 이미지에서 얼굴을 감지하고 컬렉션에 추가할 수 있습니다. Amazon Rekognition은 감지된 각 얼굴에서 얼굴 특성을 추출하여 데이터베이스에 이 특성 정보를 저장합니다. 또한 이 명령은 감지된 각 얼굴의 메타데이터를 지정된 얼굴 컬렉션에 저장합니다. Amazon Rekognition은 실제 이미지 바이트를 저장하지 않습니다.

인덱싱에 적합한 얼굴 제공에 대한 자세한 내용은 얼굴 비교 입력 이미지에 대한 권장 사항 단원을 참조하십시오.

IndexFaces 작업은 각 얼굴에 대해 다음의 정보를 유지합니다.

  • 다차원 얼굴 특성 - IndexFaces는 얼굴 분석을 사용하여 얼굴 특성에 대한 다차원 정보를 추출하고, 이 정보를 얼굴 컬렉션에 저장합니다. 이 정보를 직접 액세스할 수는 없습니다. 그러나 Amazon Rekognition은 얼굴 컬렉션에서 얼굴 일치를 검색할 때 이 정보를 사용합니다.

     

  • 메타데이터 – 각 얼굴의 메타데이터에는 경계 상자, 신뢰도 수준(경계 상자에 얼굴이 포함될 신뢰도 수준), Amazon Rekognition이 할당한 ID(얼굴 ID 및 이미지 ID), 요청 내 외부 이미지 ID(제공한 경우)가 포함됩니다. 이 정보는 IndexFaces API 호출에 대한 응답으로 반환됩니다. 관련 예제는 다음 응답 예의 face 요소를 참조하십시오.

    이 서비스는 다음 API 호출에 대한 응답으로 이 메타데이터를 반환합니다.

     

    • ListFaces

    • 얼굴 검색 작업 — 일치하는 얼굴의 메타데이터와 함께 일치하는 각 얼굴에 대한 SearchFaces응답과 일치하는 얼굴의 신뢰도를 SearchFacesByImage반환합니다.

IndexFaces에서 인덱스를 생성하는 얼굴 수는 입력 모음과 연결된 얼굴 감지 모델의 버전에 따라 다릅니다. 자세한 정보는 모델 버전 관리을 참조하세요.

인덱싱된 얼굴에 대한 정보는 FaceRecord객체 배열로 반환됩니다.

감지된 이미지와 인덱싱된 얼굴을 연결해야 합니다. 예를 들어 이미지와 이미지의 얼굴에서 클라이언트 측 인덱스를 유지해야 합니다. 얼굴을 이미지와 연결하려면, ExternalImageId 요청 파라미터에서 이미지 ID를 지정합니다. 이미지 ID는 만드는 파일 이름이나 다른 ID일 수 있습니다.

이 API는 얼굴 모음에서 유지하는 위의 정보 외에, 모음에 유지되지 않는 얼굴 세부 정보도 반환합니다. 다음 예제 응답에서 faceDetail 요소를 참조하십시오.

참고

DetectFaces는 동일한 정보를 반환하므로 같은 이미지에 대해 DetectFacesIndexFaces를 모두 호출할 필요는 없습니다.

얼굴 필터링

이 IndexFaces 작업을 통해 이미지에서 인덱싱된 얼굴을 필터링할 수 있습니다. IndexFaces를 통해 최대 얼굴 수를 인덱스로 지정하거나, 고화질로 감지된 얼굴만 인덱싱하도록 선택할 수 있습니다.

MaxFaces 입력 파라미터를 사용하여 IndexFaces로 인덱싱되는 최대 얼굴 수를 지정할 수 있습니다. 이는 이미지에서 가장 큰 얼굴을 인덱싱하고자 하며 작은 얼굴(예: 배경에 서 있는 사람들의 얼굴)은 인덱싱하지 않고자 할 때 유용합니다.

기본적으로 IndexFaces는 얼굴을 필터링하는 데 사용되는 화질 막대를 선택합니다. QualityFilter 입력 파라미터를 사용하여 화질 막대를 명시적으로 설정할 수 있습니다. 값은 다음과 같습니다.

  • AUTO - Amazon Rekognition이 얼굴을 필터링하는 데 사용되는 화질 막대를 선택합니다(기본값).

  • LOW - 가장 낮은 화질의 얼굴을 제외한 모든 얼굴이 인덱싱됩니다.

  • MEDIUM

  • HIGH - 가장 높은 화질의 얼굴만 인덱싱됩니다.

  • NONE - 화질에 따라 얼굴이 필터링되지 않습니다.

IndexFaces는 다음과 같은 이유로 얼굴을 필터링합니다.

  • 얼굴이 이미지 크기와 비교하여 너무 작습니다.

  • 얼굴이 너무 흐릿합니다.

  • 이미지가 너무 어둡습니다.

  • 얼굴이 극단적인 포즈입니다.

  • 얼굴에는 얼굴 검색에 적합한 세부 정보가 충분하지 않습니다.

참고

화질 필터링을 사용하려면 얼굴 모델 버전 3 이상과 연결된 모음이 필요합니다. 컬렉션과 관련된 얼굴 모델 버전을 가져오려면 를 호출하십시오 DescribeCollection.

인덱싱되지 않은 얼굴에 대한 정보는 UnindexedFace객체 배열로 IndexFaces 반환됩니다. Reasons 배열에는 얼굴이 인덱싱되지 않은 이유 목록이 포함되어 있습니다. 예를 들어 MaxFaces로 지정된 얼굴 수가 이미 감지되었으므로 EXCEEDS_MAX_FACES 값은 인덱싱되지 않은 얼굴입니다.

자세한 정보는 컬렉션에서 얼굴 관리을 참조하세요.

모음에 얼굴을 추가하려면(SDK)
  1. 아직 설정하지 않았다면 다음과 같이 하세요.

    1. AmazonRekognitionFullAccess 권한과 AmazonS3ReadOnlyAccess 권한을 가진 사용자를 생성하거나 업데이트합니다. 자세한 정보는 1단계: AWS 계정 설정 및 사용자 생성을 참조하세요.

    2. 및 AWS SDK를 AWS CLI 설치하고 구성합니다. 자세한 정보는 2단계: AWS CLI 및 AWS SDK 설정을 참조하세요.

  2. (하나 이상의 얼굴이 포함된) 이미지를 Amazon S3 버킷에 업로드합니다.

    이에 관한 지침은 Amazon Simple Storage Service 사용 설명서에서 Amazon S3에 객체 업로드를 참조하세요.

  3. 다음 예제를 사용하여 IndexFaces 작업을 호출합니다.

    Java

    이 예제는 모음에 추가된 얼굴의 얼굴 식별자를 표시합니다.

    collectionId의 값을, 얼굴을 추가하려는 모음의 이름으로 변경합니다. bucketphoto의 값을 2단계에서 사용한 Amazon S3 버킷과 이미지의 이름으로 바꿉니다. .withMaxFaces(1) 파라미터는 인덱싱되는 얼굴 수를 1로 제한합니다. 요구에 맞게 값을 제거하거나 변경합니다.

    //Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. //PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) package aws.example.rekognition.image; import com.amazonaws.services.rekognition.AmazonRekognition; import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder; import com.amazonaws.services.rekognition.model.FaceRecord; import com.amazonaws.services.rekognition.model.Image; import com.amazonaws.services.rekognition.model.IndexFacesRequest; import com.amazonaws.services.rekognition.model.IndexFacesResult; import com.amazonaws.services.rekognition.model.QualityFilter; import com.amazonaws.services.rekognition.model.S3Object; import com.amazonaws.services.rekognition.model.UnindexedFace; import java.util.List; public class AddFacesToCollection { public static final String collectionId = "MyCollection"; public static final String bucket = "bucket"; public static final String photo = "input.jpg"; public static void main(String[] args) throws Exception { AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder.defaultClient(); Image image = new Image() .withS3Object(new S3Object() .withBucket(bucket) .withName(photo)); IndexFacesRequest indexFacesRequest = new IndexFacesRequest() .withImage(image) .withQualityFilter(QualityFilter.AUTO) .withMaxFaces(1) .withCollectionId(collectionId) .withExternalImageId(photo) .withDetectionAttributes("DEFAULT"); IndexFacesResult indexFacesResult = rekognitionClient.indexFaces(indexFacesRequest); System.out.println("Results for " + photo); System.out.println("Faces indexed:"); List<FaceRecord> faceRecords = indexFacesResult.getFaceRecords(); for (FaceRecord faceRecord : faceRecords) { System.out.println(" Face ID: " + faceRecord.getFace().getFaceId()); System.out.println(" Location:" + faceRecord.getFaceDetail().getBoundingBox().toString()); } List<UnindexedFace> unindexedFaces = indexFacesResult.getUnindexedFaces(); System.out.println("Faces not indexed:"); for (UnindexedFace unindexedFace : unindexedFaces) { System.out.println(" Location:" + unindexedFace.getFaceDetail().getBoundingBox().toString()); System.out.println(" Reasons:"); for (String reason : unindexedFace.getReasons()) { System.out.println(" " + reason); } } } }
    Java V2

    이 코드는 AWS 문서 SDK 예제 GitHub 저장소에서 가져왔습니다. 전체 예제는 여기에서 확인하세요.

    //snippet-start:[rekognition.java2.add_faces_collection.import] import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.rekognition.RekognitionClient; import software.amazon.awssdk.services.rekognition.model.IndexFacesResponse; import software.amazon.awssdk.services.rekognition.model.IndexFacesRequest; import software.amazon.awssdk.services.rekognition.model.Image; import software.amazon.awssdk.services.rekognition.model.QualityFilter; import software.amazon.awssdk.services.rekognition.model.Attribute; import software.amazon.awssdk.services.rekognition.model.FaceRecord; import software.amazon.awssdk.services.rekognition.model.UnindexedFace; import software.amazon.awssdk.services.rekognition.model.RekognitionException; import software.amazon.awssdk.services.rekognition.model.Reason; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.List; //snippet-end:[rekognition.java2.add_faces_collection.import] /** * Before running this Java V2 code example, set up your development environment, including your credentials. * * For more information, see the following documentation topic: * * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html */ public class AddFacesToCollection { public static void main(String[] args) { final String usage = "\n" + "Usage: " + " <collectionId> <sourceImage>\n\n" + "Where:\n" + " collectionName - The name of the collection.\n" + " sourceImage - The path to the image (for example, C:\\AWS\\pic1.png). \n\n"; if (args.length != 2) { System.out.println(usage); System.exit(1); } String collectionId = args[0]; String sourceImage = args[1]; Region region = Region.US_EAST_1; RekognitionClient rekClient = RekognitionClient.builder() .region(region) .credentialsProvider(ProfileCredentialsProvider.create("profile-name")) .build(); addToCollection(rekClient, collectionId, sourceImage); rekClient.close(); } // snippet-start:[rekognition.java2.add_faces_collection.main] public static void addToCollection(RekognitionClient rekClient, String collectionId, String sourceImage) { try { InputStream sourceStream = new FileInputStream(sourceImage); SdkBytes sourceBytes = SdkBytes.fromInputStream(sourceStream); Image souImage = Image.builder() .bytes(sourceBytes) .build(); IndexFacesRequest facesRequest = IndexFacesRequest.builder() .collectionId(collectionId) .image(souImage) .maxFaces(1) .qualityFilter(QualityFilter.AUTO) .detectionAttributes(Attribute.DEFAULT) .build(); IndexFacesResponse facesResponse = rekClient.indexFaces(facesRequest); System.out.println("Results for the image"); System.out.println("\n Faces indexed:"); List<FaceRecord> faceRecords = facesResponse.faceRecords(); for (FaceRecord faceRecord : faceRecords) { System.out.println(" Face ID: " + faceRecord.face().faceId()); System.out.println(" Location:" + faceRecord.faceDetail().boundingBox().toString()); } List<UnindexedFace> unindexedFaces = facesResponse.unindexedFaces(); System.out.println("Faces not indexed:"); for (UnindexedFace unindexedFace : unindexedFaces) { System.out.println(" Location:" + unindexedFace.faceDetail().boundingBox().toString()); System.out.println(" Reasons:"); for (Reason reason : unindexedFace.reasons()) { System.out.println("Reason: " + reason); } } } catch (RekognitionException | FileNotFoundException e) { System.out.println(e.getMessage()); System.exit(1); } } // snippet-end:[rekognition.java2.add_faces_collection.main] }
    AWS CLI

    이 AWS CLI 명령은 index-faces CLI 작업에 대한 JSON 출력을 표시합니다.

    collection-id의 값을, 얼굴을 저장할 모음 이름으로 바꿉니다. BucketName의 값을, 2단계에서 사용한 Amazon S3 버킷과 이미지 파일로 바꿉니다. max-faces 파라미터는 인덱싱되는 얼굴 수를 1로 제한합니다. 요구에 맞게 값을 제거하거나 변경합니다. Rekognition 세션을 생성하는 라인에서 profile_name의 값을 개발자 프로필의 이름으로 대체합니다.

    aws rekognition index-faces --image '{"S3Object":{"Bucket":"bucket-name","Name":"file-name"}}' --collection-id "collection-id" \ --max-faces 1 --quality-filter "AUTO" --detection-attributes "ALL" \ --external-image-id "example-image.jpg" --profile profile-name

    Windows 디바이스에서 CLI에 액세스하는 경우 작은따옴표 대신 큰따옴표를 사용하고 내부 큰따옴표는 백슬래시(즉 \)로 이스케이프 처리하여 발생할 수 있는 구문 분석 오류를 해결합니다. 예를 들어 다음을 참조하세요.

    aws rekognition index-faces --image "{\"S3Object\":{\"Bucket\":\"bucket-name\",\"Name\":\"image-name\"}}" \ --collection-id "collection-id" --max-faces 1 --quality-filter "AUTO" --detection-attributes "ALL" \ --external-image-id "example-image.jpg" --profile profile-name
    Python

    이 예제는 모음에 추가된 얼굴의 얼굴 식별자를 표시합니다.

    collectionId의 값을, 얼굴을 추가하려는 모음의 이름으로 변경합니다. bucketphoto의 값을 2단계에서 사용한 Amazon S3 버킷과 이미지의 이름으로 바꿉니다. MaxFaces 입력 파라미터는 인덱싱되는 얼굴 수를 1로 제한합니다. 요구에 맞게 값을 제거하거나 변경합니다. Rekognition 세션을 생성하는 라인에서 profile_name의 값을 개발자 프로필의 이름으로 대체합니다.

    # Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. # PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) import boto3 def add_faces_to_collection(bucket, photo, collection_id): session = boto3.Session(profile_name='profile-name') client = session.client('rekognition') response = client.index_faces(CollectionId=collection_id, Image={'S3Object': {'Bucket': bucket, 'Name': photo}}, ExternalImageId=photo, MaxFaces=1, QualityFilter="AUTO", DetectionAttributes=['ALL']) print('Results for ' + photo) print('Faces indexed:') for faceRecord in response['FaceRecords']: print(' Face ID: ' + faceRecord['Face']['FaceId']) print(' Location: {}'.format(faceRecord['Face']['BoundingBox'])) print('Faces not indexed:') for unindexedFace in response['UnindexedFaces']: print(' Location: {}'.format(unindexedFace['FaceDetail']['BoundingBox'])) print(' Reasons:') for reason in unindexedFace['Reasons']: print(' ' + reason) return len(response['FaceRecords']) def main(): bucket = 'bucket-name' collection_id = 'collection-id' photo = 'photo-name' indexed_faces_count = add_faces_to_collection(bucket, photo, collection_id) print("Faces indexed count: " + str(indexed_faces_count)) if __name__ == "__main__": main()
    .NET

    이 예제는 모음에 추가된 얼굴의 얼굴 식별자를 표시합니다.

    collectionId의 값을, 얼굴을 추가하려는 모음의 이름으로 변경합니다. bucketphoto의 값을 2단계에서 사용한 Amazon S3 버킷과 이미지의 이름으로 바꿉니다.

    //Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. //PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) using System; using System.Collections.Generic; using Amazon.Rekognition; using Amazon.Rekognition.Model; public class AddFaces { public static void Example() { String collectionId = "MyCollection"; String bucket = "bucket"; String photo = "input.jpg"; AmazonRekognitionClient rekognitionClient = new AmazonRekognitionClient(); Image image = new Image() { S3Object = new S3Object() { Bucket = bucket, Name = photo } }; IndexFacesRequest indexFacesRequest = new IndexFacesRequest() { Image = image, CollectionId = collectionId, ExternalImageId = photo, DetectionAttributes = new List<String>(){ "ALL" } }; IndexFacesResponse indexFacesResponse = rekognitionClient.IndexFaces(indexFacesRequest); Console.WriteLine(photo + " added"); foreach (FaceRecord faceRecord in indexFacesResponse.FaceRecords) Console.WriteLine("Face detected: Faceid is " + faceRecord.Face.FaceId); } }

IndexFaces 작업 요청

IndexFaces에 대한 입력은 인덱스를 생성할 이미지와, 얼굴을 추가할 모음입니다.

{ "CollectionId": "MyCollection", "Image": { "S3Object": { "Bucket": "bucket", "Name": "input.jpg" } }, "ExternalImageId": "input.jpg", "DetectionAttributes": [ "DEFAULT" ], "MaxFaces": 1, "QualityFilter": "AUTO" }

IndexFaces 운영 응답

IndexFaces는 이미지에서 감지된 얼굴에 대한 정보를 반환합니다. 예를 들어 다음 JSON 응답에는 입력 이미지에서 감지된 얼굴의 기본 감지 속성이 포함됩니다. 이 예제에서는 MaxFaces 입력 파라미터의 값이 초과되어 인덱싱되지 않은 얼굴도 보여줍니다. Reasons 배열에는 EXCEEDS_MAX_FACES가 포함되어 있습니다. 화질로 인해 얼굴이 인덱싱되지 않은 경우 Reasons에는 LOW_SHARPNESS 또는 LOW_BRIGHTNESS 등의 값이 포함되어 있습니다. 자세한 내용은 을 참조하십시오 UnindexedFace.

{ "FaceModelVersion": "3.0", "FaceRecords": [ { "Face": { "BoundingBox": { "Height": 0.3247932195663452, "Left": 0.5055555701255798, "Top": 0.2743072211742401, "Width": 0.21444444358348846 }, "Confidence": 99.99998474121094, "ExternalImageId": "input.jpg", "FaceId": "b86e2392-9da1-459b-af68-49118dc16f87", "ImageId": "09f43d92-02b6-5cea-8fbd-9f187db2050d" }, "FaceDetail": { "BoundingBox": { "Height": 0.3247932195663452, "Left": 0.5055555701255798, "Top": 0.2743072211742401, "Width": 0.21444444358348846 }, "Confidence": 99.99998474121094, "Landmarks": [ { "Type": "eyeLeft", "X": 0.5751981735229492, "Y": 0.4010535478591919 }, { "Type": "eyeRight", "X": 0.6511467099189758, "Y": 0.4017036259174347 }, { "Type": "nose", "X": 0.6314528584480286, "Y": 0.4710812568664551 }, { "Type": "mouthLeft", "X": 0.5879443287849426, "Y": 0.5171778798103333 }, { "Type": "mouthRight", "X": 0.6444502472877502, "Y": 0.5164633989334106 } ], "Pose": { "Pitch": -10.313642501831055, "Roll": -1.0316886901855469, "Yaw": 18.079818725585938 }, "Quality": { "Brightness": 71.2919921875, "Sharpness": 78.74752044677734 } } } ], "OrientationCorrection": "", "UnindexedFaces": [ { "FaceDetail": { "BoundingBox": { "Height": 0.1329464465379715, "Left": 0.5611110925674438, "Top": 0.6832437515258789, "Width": 0.08777777850627899 }, "Confidence": 92.37225341796875, "Landmarks": [ { "Type": "eyeLeft", "X": 0.5796897411346436, "Y": 0.7452847957611084 }, { "Type": "eyeRight", "X": 0.6078574657440186, "Y": 0.742687463760376 }, { "Type": "nose", "X": 0.597953200340271, "Y": 0.7620673179626465 }, { "Type": "mouthLeft", "X": 0.5884202122688293, "Y": 0.7920381426811218 }, { "Type": "mouthRight", "X": 0.60627681016922, "Y": 0.7919750809669495 } ], "Pose": { "Pitch": 15.658954620361328, "Roll": -4.583454608917236, "Yaw": 10.558992385864258 }, "Quality": { "Brightness": 42.54612350463867, "Sharpness": 86.93206024169922 } }, "Reasons": [ "EXCEEDS_MAX_FACES" ] } ] }

모든 얼굴 정보를 가져오려면 DetectionAttributes 요청 파라미터에서 'ALL'을 지정합니다. 예를 들어 다음 예제 응답에서 faceDetail 요소의 추가 정보에 유의해야 하며 이것은 서버에서 지속되지 않습니다.

  • 25개의 얼굴 표식(앞의 예의 단 5개와 비교)

  • 10개의 얼굴 속성(안경, 수염, 오클루전, 시선 방향 등)

  • 감정(emotion 요소 참조)

face 요소는 서버에서 유지되는 메타데이터를 제공합니다.

FaceModelVersion은 모음과 연결된 얼굴 모델의 버전입니다. 자세한 정보는 모델 버전 관리을 참조하세요.

OrientationCorrection은 이미지의 예상 방향입니다. 버전 3보다 높은 얼굴 감지 모델을 사용하는 경우 방향 보정 정보가 반환되지 않습니다. 자세한 정보는 이미지 방향 및 경계 상자 좌표 가져오기을 참조하세요.

다음 샘플 응답은 ["ALL"] 을 지정할 때 반환된 JSON을 보여줍니다.

{ "FaceModelVersion": "3.0", "FaceRecords": [ { "Face": { "BoundingBox": { "Height": 0.06333333253860474, "Left": 0.17185185849666595, "Top": 0.7366666793823242, "Width": 0.11061728745698929 }, "Confidence": 99.99999237060547, "ExternalImageId": "input.jpg", "FaceId": "578e2e1b-d0b0-493c-aa39-ba476a421a34", "ImageId": "9ba38e68-35b6-5509-9d2e-fcffa75d1653" }, "FaceDetail": { "AgeRange": { "High": 25, "Low": 15 }, "Beard": { "Confidence": 99.98077392578125, "Value": false }, "BoundingBox": { "Height": 0.06333333253860474, "Left": 0.17185185849666595, "Top": 0.7366666793823242, "Width": 0.11061728745698929 }, "Confidence": 99.99999237060547, "Emotions": [ { "Confidence": 95.40877532958984, "Type": "HAPPY" }, { "Confidence": 6.6088080406188965, "Type": "CALM" }, { "Confidence": 0.7385611534118652, "Type": "SAD" } ], "EyeDirection": { "yaw": 16.299732, "pitch": -6.407457, "confidence": 99.968704 } "Eyeglasses": { "Confidence": 99.96795654296875, "Value": false }, "EyesOpen": { "Confidence": 64.0671157836914, "Value": true }, "Gender": { "Confidence": 100, "Value": "Female" }, "Landmarks": [ { "Type": "eyeLeft", "X": 0.21361233294010162, "Y": 0.757106363773346 }, { "Type": "eyeRight", "X": 0.2518567442893982, "Y": 0.7599404454231262 }, { "Type": "nose", "X": 0.2262365221977234, "Y": 0.7711842060089111 }, { "Type": "mouthLeft", "X": 0.2050037682056427, "Y": 0.7801263332366943 }, { "Type": "mouthRight", "X": 0.2430567592382431, "Y": 0.7836716771125793 }, { "Type": "leftPupil", "X": 0.2161938101053238, "Y": 0.756662905216217 }, { "Type": "rightPupil", "X": 0.2523181438446045, "Y": 0.7603650689125061 }, { "Type": "leftEyeBrowLeft", "X": 0.20066319406032562, "Y": 0.7501518130302429 }, { "Type": "leftEyeBrowUp", "X": 0.2130996286869049, "Y": 0.7480520606040955 }, { "Type": "leftEyeBrowRight", "X": 0.22584207355976105, "Y": 0.7504606246948242 }, { "Type": "rightEyeBrowLeft", "X": 0.24509544670581818, "Y": 0.7526801824569702 }, { "Type": "rightEyeBrowUp", "X": 0.2582615911960602, "Y": 0.7516844868659973 }, { "Type": "rightEyeBrowRight", "X": 0.26881539821624756, "Y": 0.7554477453231812 }, { "Type": "leftEyeLeft", "X": 0.20624476671218872, "Y": 0.7568746209144592 }, { "Type": "leftEyeRight", "X": 0.22105035185813904, "Y": 0.7582521438598633 }, { "Type": "leftEyeUp", "X": 0.21401576697826385, "Y": 0.7553104162216187 }, { "Type": "leftEyeDown", "X": 0.21317370235919952, "Y": 0.7584449648857117 }, { "Type": "rightEyeLeft", "X": 0.24393919110298157, "Y": 0.7600628137588501 }, { "Type": "rightEyeRight", "X": 0.2598416209220886, "Y": 0.7605880498886108 }, { "Type": "rightEyeUp", "X": 0.2519053518772125, "Y": 0.7582084536552429 }, { "Type": "rightEyeDown", "X": 0.25177454948425293, "Y": 0.7612871527671814 }, { "Type": "noseLeft", "X": 0.2185886949300766, "Y": 0.774715781211853 }, { "Type": "noseRight", "X": 0.23328955471515656, "Y": 0.7759330868721008 }, { "Type": "mouthUp", "X": 0.22446128726005554, "Y": 0.7805567383766174 }, { "Type": "mouthDown", "X": 0.22087252140045166, "Y": 0.7891407608985901 } ], "MouthOpen": { "Confidence": 95.87068939208984, "Value": false }, "Mustache": { "Confidence": 99.9828109741211, "Value": false }, "Pose": { "Pitch": -0.9409101605415344, "Roll": 7.233824253082275, "Yaw": -2.3602254390716553 }, "Quality": { "Brightness": 32.01998519897461, "Sharpness": 93.67259216308594 }, "Smile": { "Confidence": 86.7142105102539, "Value": true }, "Sunglasses": { "Confidence": 97.38925170898438, "Value": false } } } ], "OrientationCorrection": "ROTATE_0" "UnindexedFaces": [] }