Erkennen von Gesichtern in einem gespeicherten Video - Amazon Rekognition

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erkennen von Gesichtern in einem gespeicherten Video

Amazon Rekognition Video kann Gesichter in Videos, die in einem Amazon-S3-Bucket gespeichert sind, erkennen und Informationen bereitstellen wie:

  • Die Zeit(en), wann die Gesichter in einem Video erkannt werden.

  • Die Position von Gesichtern im Videobild zum Zeitpunkt der Erkennung.

  • Gesichtsmarken wie z. B. die Position des linken Auges.

  • Zusätzliche Attribute, wie auf der Seite Richtlinien zu Gesichtsattributen erklärt.

Die Gesichtserkennung von Amazon Rekognition Video in gespeicherten Videos ist eine asynchrone Operation. Rufen Sie an, um die Erkennung von Gesichtern in Videos zu starten. StartFaceDetection Amazon Rekognition Video veröffentlicht den Abschlussstatus der Videoanalyse in einem Amazon-Simple-Notification-Service-Thema (Amazon SNS). Wenn die Videoanalyse erfolgreich ist, können Sie anrufen, GetFaceDetectionum die Ergebnisse der Videoanalyse zu erhalten. Weitere Informationen zum Starten der Videoanalyse und zum Abrufen der Ergebnisse finden Sie unter Amazon-Rekognition-Video-Operationen aufrufen.

Dieses Verfahren erweitert den Code in Analysieren eines in einem Amazon S3 S3-Bucket gespeicherten Videos mit Java oder Python (SDK), der eine Amazon-Simple-Queue-Service-Warteschlange (Amazon SQS) verwendet, um den Abschlussstatus einer Videoanalyseanforderung zu erhalten.

So erkennen Sie Gesichter in einem Video, das in einem Amazon-S3-Bucket gespeichert ist (SDK)
  1. Führen Sie Analysieren eines in einem Amazon S3 S3-Bucket gespeicherten Videos mit Java oder Python (SDK) aus.

  2. Fügen Sie den folgenden Code in der Klasse VideoDetect ein, die Sie in Schritt 1 erstellt haben.

    AWS CLI
    • Ändern Sie im folgenden Codebeispiel bucket-name und video-name in den Amazon-S3-Bucket-Namen und den Dateinamen, die Sie in Schritt 2 angegeben haben.

    • Ändern Sie region-name in die von Ihnen verwendete AWS-Region. Ersetzen Sie den Wert von profile_name mit dem Namen Ihres Entwicklerprofils.

    • Ändern Sie TopicARN in den ARN des Amazon-SNS-Themas, das Sie in Schritt 3 von Amazon Rekognition Video konfigurieren erstellt haben.

    • Ändern Sie RoleARN in den ARN der IAM-Servicerolle, die Sie in Schritt 7 von Amazon Rekognition Video konfigurieren erstellt haben.

    aws rekognition start-face-detection --video "{"S3Object":{"Bucket":"Bucket-Name","Name":"Video-Name"}}" --notification-channel \ "{"SNSTopicArn":"Topic-ARN","RoleArn":"Role-ARN"}" --region region-name --profile profile-name

    Wenn Sie auf einem Windows-Gerät auf die CLI zugreifen, verwenden Sie doppelte Anführungszeichen anstelle von einfachen Anführungszeichen und maskieren Sie die inneren doppelten Anführungszeichen durch einen Backslash (d. h. \), um eventuell auftretende Parserfehler zu beheben. Sehen Sie sich zum Beispiel Folgendes an:

    aws rekognition start-face-detection --video "{\"S3Object\":{\"Bucket\":\"Bucket-Name\",\"Name\":\"Video-Name\"}}" --notification-channel \ "{\"SNSTopicArn\":\"Topic-ARN\",\"RoleArn\":\"Role-ARN\"}" --region region-name --profile profile-name

    Nachdem Sie die StartFaceDetection-Operation ausgeführt und die Auftrags-ID-Nummer abgerufen haben, führen Sie die folgende GetFaceDetection-Operation aus und geben Sie die Auftrags-ID-Nummer ein:

    aws rekognition get-face-detection --job-id job-id-number --profile profile-name
    Java
    //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.) private static void StartFaceDetection(String bucket, String video) throws Exception{ NotificationChannel channel= new NotificationChannel() .withSNSTopicArn(snsTopicArn) .withRoleArn(roleArn); StartFaceDetectionRequest req = new StartFaceDetectionRequest() .withVideo(new Video() .withS3Object(new S3Object() .withBucket(bucket) .withName(video))) .withNotificationChannel(channel); StartFaceDetectionResult startLabelDetectionResult = rek.startFaceDetection(req); startJobId=startLabelDetectionResult.getJobId(); } private static void GetFaceDetectionResults() throws Exception{ int maxResults=10; String paginationToken=null; GetFaceDetectionResult faceDetectionResult=null; do{ if (faceDetectionResult !=null){ paginationToken = faceDetectionResult.getNextToken(); } faceDetectionResult = rek.getFaceDetection(new GetFaceDetectionRequest() .withJobId(startJobId) .withNextToken(paginationToken) .withMaxResults(maxResults)); VideoMetadata videoMetaData=faceDetectionResult.getVideoMetadata(); System.out.println("Format: " + videoMetaData.getFormat()); System.out.println("Codec: " + videoMetaData.getCodec()); System.out.println("Duration: " + videoMetaData.getDurationMillis()); System.out.println("FrameRate: " + videoMetaData.getFrameRate()); //Show faces, confidence and detection times List<FaceDetection> faces= faceDetectionResult.getFaces(); for (FaceDetection face: faces) { long seconds=face.getTimestamp()/1000; System.out.print("Sec: " + Long.toString(seconds) + " "); System.out.println(face.getFace().toString()); System.out.println(); } } while (faceDetectionResult !=null && faceDetectionResult.getNextToken() != null); }

    Ersetzen Sie in der Funktion main die folgenden Zeilen:

    StartLabelDetection(bucket, video); if (GetSQSMessageSuccess()==true) GetLabelDetectionResults();

    mit:

    StartFaceDetection(bucket, video); if (GetSQSMessageSuccess()==true) GetFaceDetectionResults();
    Java V2

    Dieser Code stammt aus dem AWS Documentation SDK Examples GitHub Repository. Das vollständige Beispiel finden Sie hier.

    //snippet-start:[rekognition.java2.recognize_video_faces.import] import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.rekognition.RekognitionClient; import software.amazon.awssdk.services.rekognition.model.*; import java.util.List; //snippet-end:[rekognition.java2.recognize_video_faces.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 VideoDetectFaces { private static String startJobId =""; public static void main(String[] args) { final String usage = "\n" + "Usage: " + " <bucket> <video> <topicArn> <roleArn>\n\n" + "Where:\n" + " bucket - The name of the bucket in which the video is located (for example, (for example, myBucket). \n\n"+ " video - The name of video (for example, people.mp4). \n\n" + " topicArn - The ARN of the Amazon Simple Notification Service (Amazon SNS) topic. \n\n" + " roleArn - The ARN of the AWS Identity and Access Management (IAM) role to use. \n\n" ; if (args.length != 4) { System.out.println(usage); System.exit(1); } String bucket = args[0]; String video = args[1]; String topicArn = args[2]; String roleArn = args[3]; Region region = Region.US_EAST_1; RekognitionClient rekClient = RekognitionClient.builder() .region(region) .credentialsProvider(ProfileCredentialsProvider.create("profile-name")) .build(); NotificationChannel channel = NotificationChannel.builder() .snsTopicArn(topicArn) .roleArn(roleArn) .build(); StartFaceDetection(rekClient, channel, bucket, video); GetFaceResults(rekClient); System.out.println("This example is done!"); rekClient.close(); } // snippet-start:[rekognition.java2.recognize_video_faces.main] public static void StartFaceDetection(RekognitionClient rekClient, NotificationChannel channel, String bucket, String video) { try { S3Object s3Obj = S3Object.builder() .bucket(bucket) .name(video) .build(); Video vidOb = Video.builder() .s3Object(s3Obj) .build(); StartFaceDetectionRequest faceDetectionRequest = StartFaceDetectionRequest.builder() .jobTag("Faces") .faceAttributes(FaceAttributes.ALL) .notificationChannel(channel) .video(vidOb) .build(); StartFaceDetectionResponse startLabelDetectionResult = rekClient.startFaceDetection(faceDetectionRequest); startJobId=startLabelDetectionResult.jobId(); } catch(RekognitionException e) { System.out.println(e.getMessage()); System.exit(1); } } public static void GetFaceResults(RekognitionClient rekClient) { try { String paginationToken=null; GetFaceDetectionResponse faceDetectionResponse=null; boolean finished = false; String status; int yy=0 ; do{ if (faceDetectionResponse !=null) paginationToken = faceDetectionResponse.nextToken(); GetFaceDetectionRequest recognitionRequest = GetFaceDetectionRequest.builder() .jobId(startJobId) .nextToken(paginationToken) .maxResults(10) .build(); // Wait until the job succeeds while (!finished) { faceDetectionResponse = rekClient.getFaceDetection(recognitionRequest); status = faceDetectionResponse.jobStatusAsString(); if (status.compareTo("SUCCEEDED") == 0) finished = true; else { System.out.println(yy + " status is: " + status); Thread.sleep(1000); } yy++; } finished = false; // Proceed when the job is done - otherwise VideoMetadata is null VideoMetadata videoMetaData=faceDetectionResponse.videoMetadata(); System.out.println("Format: " + videoMetaData.format()); System.out.println("Codec: " + videoMetaData.codec()); System.out.println("Duration: " + videoMetaData.durationMillis()); System.out.println("FrameRate: " + videoMetaData.frameRate()); System.out.println("Job"); // Show face information List<FaceDetection> faces= faceDetectionResponse.faces(); for (FaceDetection face: faces) { String age = face.face().ageRange().toString(); String smile = face.face().smile().toString(); System.out.println("The detected face is estimated to be" + age + " years old."); System.out.println("There is a smile : "+smile); } } while (faceDetectionResponse !=null && faceDetectionResponse.nextToken() != null); } catch(RekognitionException | InterruptedException e) { System.out.println(e.getMessage()); System.exit(1); } } // snippet-end:[rekognition.java2.recognize_video_faces.main] }
    Python
    #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.) # ============== Faces=============== def StartFaceDetection(self): response=self.rek.start_face_detection(Video={'S3Object': {'Bucket': self.bucket, 'Name': self.video}}, NotificationChannel={'RoleArn': self.roleArn, 'SNSTopicArn': self.snsTopicArn}) self.startJobId=response['JobId'] print('Start Job Id: ' + self.startJobId) def GetFaceDetectionResults(self): maxResults = 10 paginationToken = '' finished = False while finished == False: response = self.rek.get_face_detection(JobId=self.startJobId, MaxResults=maxResults, NextToken=paginationToken) print('Codec: ' + response['VideoMetadata']['Codec']) print('Duration: ' + str(response['VideoMetadata']['DurationMillis'])) print('Format: ' + response['VideoMetadata']['Format']) print('Frame rate: ' + str(response['VideoMetadata']['FrameRate'])) print() for faceDetection in response['Faces']: print('Face: ' + str(faceDetection['Face'])) print('Confidence: ' + str(faceDetection['Face']['Confidence'])) print('Timestamp: ' + str(faceDetection['Timestamp'])) print() if 'NextToken' in response: paginationToken = response['NextToken'] else: finished = True

    Ersetzen Sie in der Funktion main die folgenden Zeilen:

    analyzer.StartLabelDetection() if analyzer.GetSQSMessageSuccess()==True: analyzer.GetLabelDetectionResults()

    mit:

    analyzer.StartFaceDetection() if analyzer.GetSQSMessageSuccess()==True: analyzer.GetFaceDetectionResults()
    Anmerkung

    Wenn Sie bereits ein anderes Video-Beispiel als Analysieren eines in einem Amazon S3 S3-Bucket gespeicherten Videos mit Java oder Python (SDK) ausgeführt haben, ist der zu ersetzende Name der Funktion anders.

  3. Führen Sie den Code aus. Die Informationen zu den erkannten Gesichtern im Video werden angezeigt.

GetFaceDetection Antwort auf den Vorgang

GetFaceDetection gibt ein Array (Faces) zurück, das Informationen über die erkannten Gesichter im Video enthält. Ein Array-Element FaceDetection,, existiert für jedes Mal, wenn ein Gesicht im Video erkannt wird. Die Array-Elemente werden nach Zeit sortiert zurückgegeben, in Millisekunden ab dem Start des Videos.

Das folgende Beispiel ist ein Teil einer JSON-Antwort von GetFaceDetection. In der Antwort ist Folgendes zu beachten:

  • Begrenzungsrahmen – Koordinaten des Begrenzungsrahmens, der das Gesicht umgibt.

  • Zuverlässigkeit – Maß an Sicherheit, dass der Begrenzungsrahmen ein Gesicht enthält.

  • Wichtige Gesichtsmerkmale – Eine Vielzahl von wichtigen Gesichtsmerkmalen. Für jedes wichtige Merkmal (wie beispielsweise das linke Auge, das rechte Auge oder den Mund) liefert die Antwort die x- und y-Koordinaten.

  • Gesichtsattribute — Eine Reihe von Gesichtsattributen, zu denen Bart AgeRange, Emotionen, Brille, Geschlecht, EyesOpen Schnurrbart MouthOpen, Lächeln und Sonnenbrille gehören. Für diesen Wert gibt es unterschiedliche Typen, beispielsweise einen booleschen Typ (ob eine Person eine Sonnenbrille trägt oder nicht) oder eine String (ob die Person männlich oder weiblich ist). Außerdem enthält die Antwort für die meisten Attribute einen Zuverlässigkeitswert für den erkannten Wert. Beachten Sie, dass EyeDirection Attribute FaceOccluded und zwar bei der Verwendung unterstützt werdenDetectFaces, bei der Analyse von Videos mit und jedoch nicht. StartFaceDetection GetFaceDetection

  • Zeitstempel: Der Zeitpunkt, zu dem das Gesicht im Video erkannt wurde.

  • Seiteninformationen – Das Beispiel zeigt eine Seite mit Informationen der Gesichtererkennung. Sie können festlegen, wie viele Personenelemente zurückgegeben werden sollen, durch den Eingabeparameter MaxResults von GetFaceDetection. Wenn mehr Ergebnisse als MaxResults vorhanden sind, gibt GetFaceDetection ein Token zurück (NextToken), mit dem die nächste Seite von Ergebnissen angefordert wird. Weitere Informationen finden Sie unter Analyseergebnisse von Amazon Rekognition Video abrufen.

  • Video-Informationen – Die Antwort enthält Informationen über das Videoformat (VideoMetadata) auf jeder Seite mit Informationen, die von GetFaceDetection zurückgegeben werden.

  • Qualität – Beschreibt die Helligkeit und die Schärfe des Gesichts.

  • Pose – Beschreibt die Drehung des Gesichts.

{ "Faces": [ { "Face": { "BoundingBox": { "Height": 0.23000000417232513, "Left": 0.42500001192092896, "Top": 0.16333332657814026, "Width": 0.12937499582767487 }, "Confidence": 99.97504425048828, "Landmarks": [ { "Type": "eyeLeft", "X": 0.46415066719055176, "Y": 0.2572723925113678 }, { "Type": "eyeRight", "X": 0.5068183541297913, "Y": 0.23705792427062988 }, { "Type": "nose", "X": 0.49765899777412415, "Y": 0.28383663296699524 }, { "Type": "mouthLeft", "X": 0.487221896648407, "Y": 0.3452930748462677 }, { "Type": "mouthRight", "X": 0.5142884850502014, "Y": 0.33167609572410583 } ], "Pose": { "Pitch": 15.966927528381348, "Roll": -15.547388076782227, "Yaw": 11.34195613861084 }, "Quality": { "Brightness": 44.80223083496094, "Sharpness": 99.95819854736328 } }, "Timestamp": 0 }, { "Face": { "BoundingBox": { "Height": 0.20000000298023224, "Left": 0.029999999329447746, "Top": 0.2199999988079071, "Width": 0.11249999701976776 }, "Confidence": 99.85971069335938, "Landmarks": [ { "Type": "eyeLeft", "X": 0.06842322647571564, "Y": 0.3010137975215912 }, { "Type": "eyeRight", "X": 0.10543643683195114, "Y": 0.29697132110595703 }, { "Type": "nose", "X": 0.09569807350635529, "Y": 0.33701086044311523 }, { "Type": "mouthLeft", "X": 0.0732642263174057, "Y": 0.3757539987564087 }, { "Type": "mouthRight", "X": 0.10589495301246643, "Y": 0.3722417950630188 } ], "Pose": { "Pitch": -0.5589138865470886, "Roll": -5.1093974113464355, "Yaw": 18.69594955444336 }, "Quality": { "Brightness": 43.052337646484375, "Sharpness": 99.68138885498047 } }, "Timestamp": 0 }, { "Face": { "BoundingBox": { "Height": 0.2177777737379074, "Left": 0.7593749761581421, "Top": 0.13333334028720856, "Width": 0.12250000238418579 }, "Confidence": 99.63436889648438, "Landmarks": [ { "Type": "eyeLeft", "X": 0.8005779385566711, "Y": 0.20915353298187256 }, { "Type": "eyeRight", "X": 0.8391435146331787, "Y": 0.21049551665782928 }, { "Type": "nose", "X": 0.8191410899162292, "Y": 0.2523227035999298 }, { "Type": "mouthLeft", "X": 0.8093273043632507, "Y": 0.29053622484207153 }, { "Type": "mouthRight", "X": 0.8366993069648743, "Y": 0.29101791977882385 } ], "Pose": { "Pitch": 3.165884017944336, "Roll": 1.4182015657424927, "Yaw": -11.151537895202637 }, "Quality": { "Brightness": 28.910892486572266, "Sharpness": 97.61507415771484 } }, "Timestamp": 0 }....... ], "JobStatus": "SUCCEEDED", "NextToken": "i7fj5XPV/fwviXqz0eag9Ow332Jd5G8ZGWf7hooirD/6V1qFmjKFOQZ6QPWUiqv29HbyuhMNqQ==", "VideoMetadata": { "Codec": "h264", "DurationMillis": 67301, "FileExtension": "mp4", "Format": "QuickTime / MOV", "FrameHeight": 1080, "FrameRate": 29.970029830932617, "FrameWidth": 1920 } }