Erkennen von Labels in einem 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 Labels in einem Video

Amazon Rekognition Video kann Label (Objekte und Konzepte) und den Zeitpunkt, zu dem ein Label erkannt wird, in einem Video erkennen. Ein SDK-Codebeispiel finden Sie unter Analysieren eines in einem Amazon S3-Bucket gespeicherten Videos mit Java oder Python (SDK). Ein AWS CLI Beispiel finden Sie unter Analysieren eines Videos mit der AWS Command Line Interface.

Die Amazon-Rekognition-Video-Labelerkennung ist eine asynchrone Operation. Um die Erkennung von Labels in einem Video zu starten, rufen Sie aufStartLabelDetection.

Das Amazon-Simple-Notification-Service-Thema, zu dem Amazon Rekognition Video die Ergebnisse der Objekterkennung und den Abschlussstatus einer Videoanalyse-Operation veröffentlicht. Wenn die Videoanalyse erfolgreich ist, rufen Sie GetLabelDetection auf, um die erkannten Labels zu erhalten. Informationen zum Aufruf von API-Operationen der Videoanalyse finden Sie unter Amazon-Rekognition-Video-Operationen aufrufen.

StartLabelDetection Anforderung

Das folgende Beispiel ist eine Anforderung für die StartLabelDetection-Operation. Sie stellen für die StartLabelDetection-Operation ein Video bereit, das in einem Amazon-S3-Bucket gespeichert ist. In der JSON-Beispielanforderung werden der Amazon-S3-Bucket und der Videoname zusammen mit MinConfidence, Features, Settings und NotificationChannel angegeben.

MinConfidence ist das Mindestvertrauen, das Amazon Rekognition Video in die Genauigkeit des erkannten Labels oder eines Instance-Begrenzungsrahmens (falls erkannt) haben muss, damit es in der Antwort zurückgegeben wird.

Mit Features können Sie angeben, dass GENERAL_LABELS als Teil der Antwort zurückgegeben werden soll.

Mit Settings können Sie die zurückgegebenen Artikel nach GENERAL_LABELS filtern. Für Label können Sie inklusive und exklusive Filter verwenden. Sie können auch nach labelspezifischen, individuellen Labels oder Nach-Label-Kategorien filtern:

  • LabelInclusionFilters – Wird verwendet, um anzugeben, welche Label in der Antwort enthalten sein sollen

  • LabelExclusionFilters – Wird verwendet, um anzugeben, welche Label aus der Antwort ausgeschlossen werden sollen.

  • LabelCategoryInclusionFilters – Wird verwendet, um anzugeben, welche Labelkategorien in die Antwort aufgenommen werden sollen.

  • LabelCategoryExclusionFilters – Wird verwendet, um anzugeben, welche Labelkategorien aus der Antwort ausgeschlossen werden sollen.

Sie können je nach Bedarf auch inklusive und exklusive Filter kombinieren, wobei Sie einige Label oder Kategorien ausschließen und andere einbeziehen.

NotificationChannel ist der ARN des Amazon-SNS-Themas, für das Amazon Rekognition Video den Abschlussstatus des Labelerkennungsvorgangs veröffentlichen soll. Wenn Sie die AmazonRekognitionServiceRole-Berechtigungsrichtlinie verwenden, muss das Amazon-SNS-Thema einen Themennamen haben, der mit Rekognition beginnt.

Im Folgenden finden Sie eine StartLabelDetection-Beispielanforderung in JSON-Form, einschließlich Filtern:

{ "ClientRequestToken": "5a6e690e-c750-460a-9d59-c992e0ec8638", "JobTag": "5a6e690e-c750-460a-9d59-c992e0ec8638", "Video": { "S3Object": { "Bucket": "bucket", "Name": "video.mp4" } }, "Features": ["GENERAL_LABELS"], "MinConfidence": 75, "Settings": { "GeneralLabels": { "LabelInclusionFilters": ["Cat", "Dog"], "LabelExclusionFilters": ["Tiger"], "LabelCategoryInclusionFilters": ["Animals and Pets"], "LabelCategoryExclusionFilters": ["Popular Landmark"] } }, "NotificationChannel": { "RoleArn": "arn:aws:iam::012345678910:role/SNSAccessRole", "SNSTopicArn": "arn:aws:sns:us-east-1:012345678910:notification-topic", } }

GetLabelDetection Operationsantwort

GetLabelDetection gibt ein Array (Labels) zurück, das Informationen über die erkannten Labels im Video enthält. Das Array kann entweder nach Zeit oder nach dem Label sortiert werden, das bei der Angabe des SortBy-Parameters erkannt wurde. Mithilfe des Parameters können Sie auch auswählen, wie Antwortelemente mit AggregateBy aggregiert werden.

Nachfolgend finden Sie ein Beispiel einer JSON-Antwort von GetLabelDetection. In der Antwort ist Folgendes zu beachten:

  • Sortierreihenfolge – Das Array der zurückgegebenen Labels wird nach der Zeit sortiert. Um nach dem Label zu sortieren, geben Sie NAME im Eingabeparameter SortBy für GetLabelDetection an. Wenn das Label mehrfach im Video erscheint, gibt es mehrere Instanzen des Elements (LabelDetection). Die Standardsortierreihenfolge ist TIMESTAMP, die sekundäre Sortierreihenfolge ist NAME.

  • Label-Informationen – Das LabelDetection-Arrayelement enthält ein (Label)-Objekt, das wiederum den Namen des Labels und das Vertrauen, das Amazon Rekognition in die Genauigkeit des erkannten Labels hat, enthält. Ein Label-Objekt enthält auch eine hierarchische Taxonomie der Labels und Begrenzungsrahmen-Informationen für gängige Labels. Timestamp ist die Zeit, zu der das Label erkannt wurde, definiert als die Anzahl der seit dem Start des Videos verstrichenen Millisekunden.

    Informationen zu allen Kategorien oder Aliasnamen, die einem Label zugeordnet sind, werden ebenfalls zurückgegeben. Bei nach Video SEGMENTS aggregierten Ergebnissen werden die StartTimestampMillis-, EndTimestampMillis- und DurationMillis-Strukturen zurückgegeben, die jeweils die Startzeit, die Endzeit und die Dauer eines Segments definieren.

  • Aggregation: Gibt an, wie Ergebnisse aggregiert werden, wenn sie zurückgegeben werden. Standardmäßig wird nach TIMESTAMPS aggregiert. Sie können sich auch für die Aggregation nach SEGMENTS entscheiden, wodurch die Ergebnisse über ein Zeitfenster aggregiert werden. Bei der Aggregation nach SEGMENTS werden Informationen über erkannte Instances mit Begrenzungsrahmen nicht zurückgegeben. Es werden nur Label zurückgegeben, die während der Segmente erkannt wurden.

  • Seiteninformationen – Das Beispiel zeigt eine Seite mit Informationen der Label-Erkennung. Sie können festlegen, wie viele LabelDetection-Objekte zurückgegeben werden sollen, durch den Eingabeparameter MaxResults von GetLabelDetection. Wenn mehr Ergebnisse als MaxResults vorhanden sind, gibt GetLabelDetection einen Token zurück (NextToken), der dazu verwendet wird, die nächste Seite mit Ergebnissen zu erhalten. Weitere Informationen finden Sie unter Analyseergebnisse von Amazon Rekognition Video abrufen.

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

Im Folgenden finden Sie eine GetLabelDetection Beispielantwort in JSON-Form mit Aggregation durch TIMESTAMPS:

{ "JobStatus": "SUCCEEDED", "LabelModelVersion": "3.0", "Labels": [ { "Timestamp": 1000, "Label": { "Name": "Car", "Categories": [ { "Name": "Vehicles and Automotive" } ], "Aliases": [ { "Name": "Automobile" } ], "Parents": [ { "Name": "Vehicle" } ], "Confidence": 99.9364013671875, // Classification confidence "Instances": [ { "BoundingBox": { "Width": 0.26779675483703613, "Height": 0.8562285900115967, "Left": 0.3604024350643158, "Top": 0.09245597571134567 }, "Confidence": 99.9364013671875 // Detection confidence } ] } }, { "Timestamp": 1000, "Label": { "Name": "Cup", "Categories": [ { "Name": "Kitchen and Dining" } ], "Aliases": [ { "Name": "Mug" } ], "Parents": [], "Confidence": 99.9364013671875, // Classification confidence "Instances": [ { "BoundingBox": { "Width": 0.26779675483703613, "Height": 0.8562285900115967, "Left": 0.3604024350643158, "Top": 0.09245597571134567 }, "Confidence": 99.9364013671875 // Detection confidence } ] } }, { "Timestamp": 2000, "Label": { "Name": "Kangaroo", "Categories": [ { "Name": "Animals and Pets" } ], "Aliases": [ { "Name": "Wallaby" } ], "Parents": [ { "Name": "Mammal" } ], "Confidence": 99.9364013671875, "Instances": [ { "BoundingBox": { "Width": 0.26779675483703613, "Height": 0.8562285900115967, "Left": 0.3604024350643158, "Top": 0.09245597571134567, }, "Confidence": 99.9364013671875 } ] } }, { "Timestamp": 4000, "Label": { "Name": "Bicycle", "Categories": [ { "Name": "Hobbies and Interests" } ], "Aliases": [ { "Name": "Bike" } ], "Parents": [ { "Name": "Vehicle" } ], "Confidence": 99.9364013671875, "Instances": [ { "BoundingBox": { "Width": 0.26779675483703613, "Height": 0.8562285900115967, "Left": 0.3604024350643158, "Top": 0.09245597571134567 }, "Confidence": 99.9364013671875 } ] } } ], "VideoMetadata": { "ColorRange": "FULL", "DurationMillis": 5000, "Format": "MP4", "FrameWidth": 1280, "FrameHeight": 720, "FrameRate": 24 } }

Im Folgenden finden Sie eine GetLabelDetection Beispielantwort in JSON-Form mit Aggregation nach SEGMENTS:

{ "JobStatus": "SUCCEEDED", "LabelModelVersion": "3.0", "Labels": [ { "StartTimestampMillis": 225, "EndTimestampMillis": 3578, "DurationMillis": 3353, "Label": { "Name": "Car", "Categories": [ { "Name": "Vehicles and Automotive" } ], "Aliases": [ { "Name": "Automobile" } ], "Parents": [ { "Name": "Vehicle" } ], "Confidence": 99.9364013671875 // Maximum confidence score for Segment mode } }, { "StartTimestampMillis": 7578, "EndTimestampMillis": 12371, "DurationMillis": 4793, "Label": { "Name": "Kangaroo", "Categories": [ { "Name": "Animals and Pets" } ], "Aliases": [ { "Name": "Wallaby" } ], "Parents": [ { "Name": "Mammal" } ], "Confidence": 99.9364013671875 } }, { "StartTimestampMillis": 22225, "EndTimestampMillis": 22578, "DurationMillis": 2353, "Label": { "Name": "Bicycle", "Categories": [ { "Name": "Hobbies and Interests" } ], "Aliases": [ { "Name": "Bike" } ], "Parents": [ { "Name": "Vehicle" } ], "Confidence": 99.9364013671875 } } ], "VideoMetadata": { "ColorRange": "FULL", "DurationMillis": 5000, "Format": "MP4", "FrameWidth": 1280, "FrameHeight": 720, "FrameRate": 24 } }

Transformieren der GetLabelDetection Antwort

Beim Abrufen von Ergebnissen mit der GetLabelDetection -API-Operation benötigen Sie möglicherweise die Antwortstruktur, um die ältere API-Antwortstruktur nachzuahmen, bei der sowohl primäre Labels als auch Aliase in derselben Liste enthalten waren.

Die JSON-Beispielantwort im vorherigen Abschnitt zeigt die aktuelle Form der API-Antwort von GetLabelDetection.

Das folgende Beispiel zeigt die vorherige Antwort der GetLabelDetection API:

{ "Labels": [ { "Timestamp": 0, "Label": { "Instances": [], "Confidence": 60.51791763305664, "Parents": [], "Name": "Leaf" } }, { "Timestamp": 0, "Label": { "Instances": [], "Confidence": 99.53411102294922, "Parents": [], "Name": "Human" } }, { "Timestamp": 0, "Label": { "Instances": [ { "BoundingBox": { "Width": 0.11109819263219833, "Top": 0.08098889887332916, "Left": 0.8881205320358276, "Height": 0.9073750972747803 }, "Confidence": 99.5831298828125 }, { "BoundingBox": { "Width": 0.1268676072359085, "Top": 0.14018426835536957, "Left": 0.0003282368124928324, "Height": 0.7993982434272766 }, "Confidence": 99.46029663085938 } ], "Confidence": 99.63411102294922, "Parents": [], "Name": "Person" } }, . . . { "Timestamp": 166, "Label": { "Instances": [], "Confidence": 73.6471176147461, "Parents": [ { "Name": "Clothing" } ], "Name": "Sleeve" } } ], "LabelModelVersion": "2.0", "JobStatus": "SUCCEEDED", "VideoMetadata": { "Format": "QuickTime / MOV", "FrameRate": 23.976024627685547, "Codec": "h264", "DurationMillis": 5005, "FrameHeight": 674, "FrameWidth": 1280 } }

Bei Bedarf können Sie die aktuelle Antwort so transformieren, dass sie dem Format der älteren Antwort folgt. Sie können den folgenden Beispielcode verwenden, um die neueste API-Antwort in die vorherige API-Antwortstruktur umzuwandeln:

from copy import deepcopy VIDEO_LABEL_KEY = "Labels" LABEL_KEY = "Label" ALIASES_KEY = "Aliases" INSTANCE_KEY = "Instances" NAME_KEY = "Name" #Latest API response sample for AggregatedBy SEGMENTS EXAMPLE_SEGMENT_OUTPUT = { "Labels": [ { "Timestamp": 0, "Label":{ "Name": "Person", "Confidence": 97.530106, "Parents": [], "Aliases": [ { "Name": "Human" }, ], "Categories": [ { "Name": "Person Description" } ], }, "StartTimestampMillis": 0, "EndTimestampMillis": 500666, "DurationMillis": 500666 }, { "Timestamp": 6400, "Label": { "Name": "Leaf", "Confidence": 89.77790069580078, "Parents": [ { "Name": "Plant" } ], "Aliases": [], "Categories": [ { "Name": "Plants and Flowers" } ], }, "StartTimestampMillis": 6400, "EndTimestampMillis": 8200, "DurationMillis": 1800 }, ] } #Output example after the transformation for AggregatedBy SEGMENTS EXPECTED_EXPANDED_SEGMENT_OUTPUT = { "Labels": [ { "Timestamp": 0, "Label":{ "Name": "Person", "Confidence": 97.530106, "Parents": [], "Aliases": [ { "Name": "Human" }, ], "Categories": [ { "Name": "Person Description" } ], }, "StartTimestampMillis": 0, "EndTimestampMillis": 500666, "DurationMillis": 500666 }, { "Timestamp": 6400, "Label": { "Name": "Leaf", "Confidence": 89.77790069580078, "Parents": [ { "Name": "Plant" } ], "Aliases": [], "Categories": [ { "Name": "Plants and Flowers" } ], }, "StartTimestampMillis": 6400, "EndTimestampMillis": 8200, "DurationMillis": 1800 }, { "Timestamp": 0, "Label":{ "Name": "Human", "Confidence": 97.530106, "Parents": [], "Categories": [ { "Name": "Person Description" } ], }, "StartTimestampMillis": 0, "EndTimestampMillis": 500666, "DurationMillis": 500666 }, ] } #Latest API response sample for AggregatedBy TIMESTAMPS EXAMPLE_TIMESTAMP_OUTPUT = { "Labels": [ { "Timestamp": 0, "Label": { "Name": "Person", "Confidence": 97.530106, "Instances": [ { "BoundingBox": { "Height": 0.1549897, "Width": 0.07747964, "Top": 0.50858885, "Left": 0.00018205095 }, "Confidence": 97.530106 }, ], "Parents": [], "Aliases": [ { "Name": "Human" }, ], "Categories": [ { "Name": "Person Description" } ], }, }, { "Timestamp": 6400, "Label": { "Name": "Leaf", "Confidence": 89.77790069580078, "Instances": [], "Parents": [ { "Name": "Plant" } ], "Aliases": [], "Categories": [ { "Name": "Plants and Flowers" } ], }, }, ] } #Output example after the transformation for AggregatedBy TIMESTAMPS EXPECTED_EXPANDED_TIMESTAMP_OUTPUT = { "Labels": [ { "Timestamp": 0, "Label": { "Name": "Person", "Confidence": 97.530106, "Instances": [ { "BoundingBox": { "Height": 0.1549897, "Width": 0.07747964, "Top": 0.50858885, "Left": 0.00018205095 }, "Confidence": 97.530106 }, ], "Parents": [], "Aliases": [ { "Name": "Human" }, ], "Categories": [ { "Name": "Person Description" } ], }, }, { "Timestamp": 6400, "Label": { "Name": "Leaf", "Confidence": 89.77790069580078, "Instances": [], "Parents": [ { "Name": "Plant" } ], "Aliases": [], "Categories": [ { "Name": "Plants and Flowers" } ], }, }, { "Timestamp": 0, "Label": { "Name": "Human", "Confidence": 97.530106, "Parents": [], "Categories": [ { "Name": "Person Description" } ], }, }, ] } def expand_aliases(inferenceOutputsWithAliases): if VIDEO_LABEL_KEY in inferenceOutputsWithAliases: expandInferenceOutputs = [] for segmentLabelDict in inferenceOutputsWithAliases[VIDEO_LABEL_KEY]: primaryLabelDict = segmentLabelDict[LABEL_KEY] if ALIASES_KEY in primaryLabelDict: for alias in primaryLabelDict[ALIASES_KEY]: aliasLabelDict = deepcopy(segmentLabelDict) aliasLabelDict[LABEL_KEY][NAME_KEY] = alias[NAME_KEY] del aliasLabelDict[LABEL_KEY][ALIASES_KEY] if INSTANCE_KEY in aliasLabelDict[LABEL_KEY]: del aliasLabelDict[LABEL_KEY][INSTANCE_KEY] expandInferenceOutputs.append(aliasLabelDict) inferenceOutputsWithAliases[VIDEO_LABEL_KEY].extend(expandInferenceOutputs) return inferenceOutputsWithAliases if __name__ == "__main__": segmentOutputWithExpandAliases = expand_aliases(EXAMPLE_SEGMENT_OUTPUT) assert segmentOutputWithExpandAliases == EXPECTED_EXPANDED_SEGMENT_OUTPUT timestampOutputWithExpandAliases = expand_aliases(EXAMPLE_TIMESTAMP_OUTPUT) assert timestampOutputWithExpandAliases == EXPECTED_EXPANDED_TIMESTAMP_OUTPUT