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 obtenir un exemple de code SDK, consultez Analyse d’une vidéo stockée dans un compartiment Amazon S3 avec Java or 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 GetLabelDetection pour obtenir les étiquettes détectées. Pour en savoir plus sur l’appel des opérations d’API d’analyse dans les vidéos, consultez Appeler les opérations de Vidéo Amazon Rekognition.

StartLabelDemande de détection

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 demande JSON, le compartiment Amazon S3 et le nom de la vidéo sont spécifiés, ainsi que MinConfidence, Features, Settings, et NotificationChannel.

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.

Avec Features, vous pouvez spécifier que vous souhaitez que GENERAL_LABELS soit renvoyé dans le cadre de la réponse.

Avec Settings, 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.

NotificationChannel est l’ARN de la rubrique Amazon SNS sur laquelle vous souhaitez que Vidéo Amazon Rekognition publie l’état d’achèvement de l’opération de détection d’étiquettes. Si vous utilisez la politique d’autorisation AmazonRekognitionServiceRole, le nom de la rubrique Amazon SNS doit commencer par Rekognition.

Voici un exemple de demande StartLabelDetection au format JSON, 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 constitue la réponse JSON de GetLabelDetection. 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 plus d’informations, consultez 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 au format JSON avec agrégation 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 au format JSON avec agrégation 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 des résultats avec l'opération d' GetLabelDetection API, vous aurez peut-être besoin de la structure de réponse pour imiter l'ancienne structure de réponse d'API, où les étiquettes principales et les alias figuraient dans la même liste.

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

L'exemple suivant montre la réponse précédente de l' 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 réponse d’API en structure de réponse d’API 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