Détection des étiquettes dans une vidéo - Amazon Rekognition

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Détection des étiquettes dans une vidéo

Vidéo Amazon Rekognition peut détecter les étiquettes (objets et concepts), ainsi que l’heure à laquelle une étiquette est détectée, dans une vidéo. Pour un exemple de SDK code, voirAnalyse d'une vidéo stockée dans un compartiment Amazon S3 avec Java ou Python (SDK). Pour un AWS CLI exemple, voirAnalyse d'une vidéo à l'aide du AWS Command Line Interface.

La détection d’étiquettes Vidéo Amazon Rekognition est une opération asynchrone. Pour démarrer la détection d'étiquettes dans une vidéo, appelez StartLabelDetection.

Vidéo Amazon Rekognition publie l’état d’achèvement de l’opération d’analyse vidéo dans une rubrique Amazon Simple Notification Service. Si l'analyse vidéo est réussie, appelez GetLabelDetectionpour obtenir les étiquettes détectées. Pour plus d'informations sur l'appel des API opérations d'analyse vidéo, voirAppeler les opérations de Vidéo Amazon Rekognition.

StartLabelDetectionDemande

L’exemple suivant est un exemple JSON de requête StartLabelDetection. Vous fournissez l’opération StartLabelDetection avec une vidéo stockée dans un compartiment Amazon S3. Dans l'exemple de demandeJSON, le compartiment Amazon S3 et le nom de la vidéo sont spécifiés, ainsi que MinConfidenceFeatures,Settings, etNotificationChannel.

MinConfidence est le niveau de fiabilité minimum que doit avoir Vidéo Amazon Rekognition en ce qui concerne la précision de l’étiquette détectée ou une instance de cadre de délimitation (en cas de détection) pour que celle-ci soit renvoyée dans la réponse.

AvecFeatures, vous pouvez spécifier que vous souhaitez que GENERAL _ soit LABELS renvoyé dans le cadre de la réponse.

AvecSettings, vous pouvez filtrer les articles retournés pour GENERAL _LABELS. Pour les étiquettes, vous pouvez utiliser des filtres inclusifs et exclusifs. Vous pouvez également filtrer par étiquette spécifique, par étiquette individuelle ou par catégorie d’étiquette :

  • LabelInclusionFilters : utilisé pour spécifier les étiquettes que vous souhaitez inclure dans la réponse.

  • LabelExclusionFilters : utilisé pour spécifier les étiquettes que vous souhaitez exclure de la réponse.

  • LabelCategoryInclusionFilters : utilisé pour spécifier les catégories d’étiquettes que vous souhaitez inclure dans la réponse.

  • LabelCategoryExclusionFilters : utilisé pour spécifier les catégories d’étiquettes que vous souhaitez exclure de la réponse.

Vous pouvez également combiner des filtres inclusifs et exclusifs en fonction de vos besoins, en excluant certaines étiquettes ou catégories et en incluant d’autres.

NotificationChannelest le ARN SNS sujet Amazon sur lequel vous souhaitez qu'Amazon Rekognition Video publie l'état d'achèvement de l'opération de détection d'étiquettes. Si vous utilisez la politique AmazonRekognitionServiceRole d'autorisation, le nom du SNS sujet Amazon doit commencer par Rekognition.

Voici un exemple de JSON formulaire de StartLabelDetection demande, y compris des filtres :

{ "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 Réponse à l'opération

GetLabelDetection renvoie un tableau (Labels) comprenant des informations sur les étiquettes détectées dans la vidéo. Le tableau peut être trié en fonction de l’heure ou de l’étiquette détectée lors de la spécification du paramètre SortBy. Vous pouvez également sélectionner la manière dont les éléments de réponse sont agrégés à l’aide du paramètre AggregateBy.

L'exemple suivant est la JSON réponse duGetLabelDetection. Dans la réponse, notez les points suivants :

  • Ordre de tri : le tableau d’étiquettes renvoyé est trié en fonction de l’heure. Pour trier par étiquette, spécifiez NAME dans le paramètre d’entrée SortBy pour GetLabelDetection. Si l'étiquette apparaît plusieurs fois dans la vidéo, il y aura plusieurs instances de l'élément (LabelDetection). L’ordre de tri par défaut est TIMESTAMP, tandis que l’ordre de tri secondaire est NAME.

  • Informations de l’étiquette :l’élément du tableau LabelDetection contient un objet (étiquette) qui contient quant à lui le nom de l’étiquette et le niveau de confiance d’Amazon Rekognition dans l’exactitude de l’étiquette détectée. Un objet Label comprend également une taxonomie hiérarchique des étiquettes et des informations sur le cadre de délimitation pour les étiquettes communes. Timestamp est le temps, en millisecondes, qui s’est écoulé entre le début de la vidéo et le moment où l’étiquette a été détectée.

    Les informations relatives aux catégories ou alias associés à une étiquette sont également renvoyées. Pour les résultats agrégés par vidéo SEGMENTS, les structures StartTimestampMillis, EndTimestampMillis et DurationMillis sont renvoyées, qui définissent respectivement l’heure de début, l’heure de fin et la durée d’un segment.

  • Agrégation : spécifie la manière dont les résultats sont agrégés lorsqu’ils sont renvoyés. La valeur par défaut est d’agréger par TIMESTAMPS. Vous pouvez également choisir d’agréger par SEGMENTS, ce qui permet d’agréger les résultats sur une période donnée. En cas d’agrégation par SEGMENTS, les informations sur les instances détectées avec des cadres de délimitation ne sont pas renvoyées. Seules les étiquettes détectées lors des segments sont renvoyées.

  • Informations sur la pagination :l’exemple montre une page d’informations de détection d’étiquette. Vous pouvez spécifier le nombre d’objets LabelDetection à renvoyer dans le paramètre d’entrée MaxResults de GetLabelDetection. Si le nombre de résultats est supérieur à MaxResults, GetLabelDetection renvoie un jeton (NextToken) utilisé pour obtenir la page de résultats suivante. Pour de plus amples informations, veuillez consulter Obtenir les résultats de l’analyse de Vidéo Amazon Rekognition.

  • Informations sur la vidéo – La réponse comprend des informations sur le format de la vidéo (VideoMetadata) dans chaque page d’informations renvoyée par GetLabelDetection.

Voici un exemple de GetLabelDetection réponse sous JSON forme agrégée par 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 } }

Voici un exemple de GetLabelDetection réponse sous JSON forme agrégée par 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 } }

Transformation de la GetLabelDetection réponse

Lorsque vous récupérez les résultats de l' GetLabelDetection APIopération, vous aurez peut-être besoin de la structure de réponse pour imiter l'ancienne structure de API réponse, dans laquelle les étiquettes principales et les alias figuraient dans la même liste.

L'exemple de JSON réponse présenté dans la section précédente affiche la forme actuelle de la API réponse de GetLabelDetection.

L'exemple suivant montre la réponse précédente du 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 } }

Si nécessaire, vous pouvez transformer la réponse actuelle pour qu’elle suive le format de l’ancienne réponse. Vous pouvez utiliser l'exemple de code suivant pour transformer la dernière API réponse en structure de API réponse précédente :

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