Détection des vidéos stockées inappropriées - 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 vidéos stockées inappropriées

La détection de contenus inappropriés ou offensants dans les vidéos stockées par Vidéo Amazon Rekognition est une opération asynchrone. Pour commencer à détecter les contenus inappropriés ou offensants, appelez StartContentModération. 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 GetContentModération pour obtenir les résultats de l'analyse. Pour plus d’informations sur le démarrage de l’analyse vidéo et l’obtention des résultats, consultez Appeler les opérations de Vidéo Amazon Rekognition. Pour obtenir la liste des étiquettes de modération dans Amazon Rekognition consultez Utilisation des API de modération d’images et de vidéos.

Cette procédure s’appuie sur le code figurant dans Analyse d’une vidéo stockée dans un compartiment Amazon S3 avec Java or Python (SDK), qui utilise une file d’attente Amazon Simple Queue Service pour obtenir l’état d’achèvement d’une demande d’analyse vidéo.

Pour détecter le contenu inapproprié ou offensant d’une vidéo stockée dans un compartiment Amazon S3 (SDK)
  1. Effectuez une Analyse d’une vidéo stockée dans un compartiment Amazon S3 avec Java or Python (SDK).

  2. Ajoutez le code suivant à la classe VideoDetect que vous avez créée à l’étape 1.

    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.) //Content moderation ================================================================== private static void StartUnsafeContentDetection(String bucket, String video) throws Exception{ NotificationChannel channel= new NotificationChannel() .withSNSTopicArn(snsTopicArn) .withRoleArn(roleArn); StartContentModerationRequest req = new StartContentModerationRequest() .withVideo(new Video() .withS3Object(new S3Object() .withBucket(bucket) .withName(video))) .withNotificationChannel(channel); StartContentModerationResult startModerationLabelDetectionResult = rek.startContentModeration(req); startJobId=startModerationLabelDetectionResult.getJobId(); } private static void GetUnsafeContentDetectionResults() throws Exception{ int maxResults=10; String paginationToken=null; GetContentModerationResult moderationLabelDetectionResult =null; do{ if (moderationLabelDetectionResult !=null){ paginationToken = moderationLabelDetectionResult.getNextToken(); } moderationLabelDetectionResult = rek.getContentModeration( new GetContentModerationRequest() .withJobId(startJobId) .withNextToken(paginationToken) .withSortBy(ContentModerationSortBy.TIMESTAMP) .withMaxResults(maxResults)); VideoMetadata videoMetaData=moderationLabelDetectionResult.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 moderated content labels, confidence and detection times List<ContentModerationDetection> moderationLabelsInFrames= moderationLabelDetectionResult.getModerationLabels(); for (ContentModerationDetection label: moderationLabelsInFrames) { long seconds=label.getTimestamp()/1000; System.out.print("Sec: " + Long.toString(seconds)); System.out.println(label.getModerationLabel().toString()); System.out.println(); } } while (moderationLabelDetectionResult !=null && moderationLabelDetectionResult.getNextToken() != null); }

    Dans la fonction main, remplacez les lignes :

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

    avec :

    StartUnsafeContentDetection(bucket, video); if (GetSQSMessageSuccess()==true) GetUnsafeContentDetectionResults();
    Java V2

    Ce code est extrait du GitHub référentiel d'exemples du SDK de AWS documentation. Voir l’exemple complet ici.

    import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.rekognition.RekognitionClient; import software.amazon.awssdk.services.rekognition.model.NotificationChannel; import software.amazon.awssdk.services.rekognition.model.S3Object; import software.amazon.awssdk.services.rekognition.model.Video; import software.amazon.awssdk.services.rekognition.model.StartContentModerationRequest; import software.amazon.awssdk.services.rekognition.model.StartContentModerationResponse; import software.amazon.awssdk.services.rekognition.model.RekognitionException; import software.amazon.awssdk.services.rekognition.model.GetContentModerationResponse; import software.amazon.awssdk.services.rekognition.model.GetContentModerationRequest; import software.amazon.awssdk.services.rekognition.model.VideoMetadata; import software.amazon.awssdk.services.rekognition.model.ContentModerationDetection; import java.util.List; /** * 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 VideoDetectInappropriate { private static String startJobId = ""; public static void main(String[] args) { final String usage = """ Usage: <bucket> <video> <topicArn> <roleArn> Where: bucket - The name of the bucket in which the video is located (for example, (for example, myBucket).\s video - The name of video (for example, people.mp4).\s topicArn - The ARN of the Amazon Simple Notification Service (Amazon SNS) topic.\s roleArn - The ARN of the AWS Identity and Access Management (IAM) role to use.\s """; 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) .build(); NotificationChannel channel = NotificationChannel.builder() .snsTopicArn(topicArn) .roleArn(roleArn) .build(); startModerationDetection(rekClient, channel, bucket, video); getModResults(rekClient); System.out.println("This example is done!"); rekClient.close(); } public static void startModerationDetection(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(); StartContentModerationRequest modDetectionRequest = StartContentModerationRequest.builder() .jobTag("Moderation") .notificationChannel(channel) .video(vidOb) .build(); StartContentModerationResponse startModDetectionResult = rekClient .startContentModeration(modDetectionRequest); startJobId = startModDetectionResult.jobId(); } catch (RekognitionException e) { System.out.println(e.getMessage()); System.exit(1); } } public static void getModResults(RekognitionClient rekClient) { try { String paginationToken = null; GetContentModerationResponse modDetectionResponse = null; boolean finished = false; String status; int yy = 0; do { if (modDetectionResponse != null) paginationToken = modDetectionResponse.nextToken(); GetContentModerationRequest modRequest = GetContentModerationRequest.builder() .jobId(startJobId) .nextToken(paginationToken) .maxResults(10) .build(); // Wait until the job succeeds. while (!finished) { modDetectionResponse = rekClient.getContentModeration(modRequest); status = modDetectionResponse.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 = modDetectionResponse.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"); List<ContentModerationDetection> mods = modDetectionResponse.moderationLabels(); for (ContentModerationDetection mod : mods) { long seconds = mod.timestamp() / 1000; System.out.print("Mod label: " + seconds + " "); System.out.println(mod.moderationLabel().toString()); System.out.println(); } } while (modDetectionResponse != null && modDetectionResponse.nextToken() != null); } catch (RekognitionException | InterruptedException e) { System.out.println(e.getMessage()); System.exit(1); } } }
    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.) # ============== Unsafe content =============== def StartUnsafeContent(self): response=self.rek.start_content_moderation(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 GetUnsafeContentResults(self): maxResults = 10 paginationToken = '' finished = False while finished == False: response = self.rek.get_content_moderation(JobId=self.startJobId, MaxResults=maxResults, NextToken=paginationToken, SortBy="NAME", AggregateBy="TIMESTAMPS") 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 contentModerationDetection in response['ModerationLabels']: print('Label: ' + str(contentModerationDetection['ModerationLabel']['Name'])) print('Confidence: ' + str(contentModerationDetection['ModerationLabel']['Confidence'])) print('Parent category: ' + str(contentModerationDetection['ModerationLabel']['ParentName'])) print('Timestamp: ' + str(contentModerationDetection['Timestamp'])) print() if 'NextToken' in response: paginationToken = response['NextToken'] else: finished = True

    Dans la fonction main, remplacez les lignes :

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

    avec :

    analyzer.StartUnsafeContent() if analyzer.GetSQSMessageSuccess()==True: analyzer.GetUnsafeContentResults()
    Note

    Si vous avez déjà exécuté un exemple vidéo autre que Analyse d’une vidéo stockée dans un compartiment Amazon S3 avec Java or Python (SDK), le code à remplacer peut être différent.

  3. Exécutez le code. Une liste d’étiquettes de contenu inapproprié détectées dans la vidéo s’affiche à l’écran.

GetContentModeration réponse à l'opération

La réponse de GetContentModeration est un tableauModerationLabels, d'objets de ContentModerationdétection. Le tableau contient un élément pour chaque fois qu’une étiquette de contenu inapproprié est détectée. Dans un ContentModerationDetectionObject objet, ModerationLabelcontient des informations relatives à un élément détecté présentant un contenu inapproprié ou offensant. Timestampest le temps, en millisecondes à compter du début de la vidéo, auquel l'étiquette a été détectée. Les étiquettes sont hiérarchisées de la même façon que les étiquettes de contenu inapproprié détectées par l’analyse d’image. Pour plus d’informations, consultez Modération du contenu.

Voici un exemple de réponse provenant de GetContentModeration, triée par NAME et agrégée par TIMESTAMPS.

{ "JobStatus": "SUCCEEDED", "VideoMetadata": { "Codec": "h264", "DurationMillis": 54100, "Format": "QuickTime / MOV", "FrameRate": 30.0, "FrameHeight": 462, "FrameWidth": 884, "ColorRange": "LIMITED" }, "ModerationLabels": [ { "Timestamp": 36000, "ModerationLabel": { "Confidence": 52.451576232910156, "Name": "Alcohol", "ParentName": "", "TaxonomyLevel": 1 }, "ContentTypes": [ { "Confidence": 99.9999008178711, "Name": "Animated" } ] }, { "Timestamp": 36000, "ModerationLabel": { "Confidence": 52.451576232910156, "Name": "Alcoholic Beverages", "ParentName": "Alcohol", "TaxonomyLevel": 2 }, "ContentTypes": [ { "Confidence": 99.9999008178711, "Name": "Animated" } ] } ], "ModerationModelVersion": "7.0", "JobId": "a1b2c3d4...", "Video": { "S3Object": { "Bucket": "bucket-name", "Name": "video-name.mp4" } }, "GetRequestMetadata": { "SortBy": "TIMESTAMP", "AggregateBy": "TIMESTAMPS" } }

Voici un exemple de réponse provenant de GetContentModeration, triée par NAME et agrégée par SEGMENTS.

{ "JobStatus": "SUCCEEDED", "VideoMetadata": { "Codec": "h264", "DurationMillis": 54100, "Format": "QuickTime / MOV", "FrameRate": 30.0, "FrameHeight": 462, "FrameWidth": 884, "ColorRange": "LIMITED" }, "ModerationLabels": [ { "Timestamp": 0, "ModerationLabel": { "Confidence": 0.0003000000142492354, "Name": "Alcohol Use", "ParentName": "Alcohol", "TaxonomyLevel": 2 }, "StartTimestampMillis": 0, "EndTimestampMillis": 29520, "DurationMillis": 29520, "ContentTypes": [ { "Confidence": 99.9999008178711, "Name": "Illustrated" }, { "Confidence": 99.9999008178711, "Name": "Animated" } ] } ], "ModerationModelVersion": "7.0", "JobId": "a1b2c3d4...", "Video": { "S3Object": { "Bucket": "bucket-name", "Name": "video-name.mp4" } }, "GetRequestMetadata": { "SortBy": "TIMESTAMP", "AggregateBy": "SEGMENTS" } }