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éeSortBy
pourGetLabelDetection
. 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 estTIMESTAMP
, tandis que l’ordre de tri secondaire estNAME
. -
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 objetLabel
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 structuresStartTimestampMillis
,EndTimestampMillis
etDurationMillis
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 parSEGMENTS
, ce qui permet d’agréger les résultats sur une période donnée. En cas d’agrégation parSEGMENTS
, 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éeMaxResults
deGetLabelDetection
. 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 parGetLabelDetection
.
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