Detectar vídeos almacenados inapropiados - Amazon Rekognition

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Detectar vídeos almacenados inapropiados

La detección de contenido ofensivo o inapropiado en los vídeos almacenados por Amazon Rekognition Video es una operación asíncrona. Para empezar a detectar contenido inapropiado u ofensivo, llama StartContentModeration. Amazon Rekognition Video publica el estado de finalización de una operación de análisis de video en un tema de Amazon Simple Notification Service. Si el análisis de vídeo es correcto, llame a GetContentModeration para obtener los resultados del análisis. Para obtener más información sobre cómo iniciar el análisis de vídeo y obtener los resultados, consulte Cómo llamar a las operaciones de Amazon Rekognition Video. Para ver una lista de etiquetas de moderación en Amazon Rekognition, consulte Using the image and video moderation APIs.

Este procedimiento amplía el código de Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK), que utiliza una cola de Amazon Simple Queue Service para obtener el estado de realización de una solicitud de análisis de vídeo.

Para detectar contenido inapropiado u ofensivo en un vídeo almacenado en un bucket de Amazon S3 (SDK)
  1. Realice Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK).

  2. Añada el código siguiente a la clase VideoDetect que ha creado en el paso 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); }

    En la función main, reemplace las líneas:

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

    por:

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

    Este código se ha tomado del GitHub repositorio de ejemplos del SDK de AWS documentación. Consulte el ejemplo completo aquí.

    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, SortyBy="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

    En la función main, reemplace las líneas:

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

    por:

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

    Si ya ha ejecutado un ejemplo de vídeo distinto de Análisis de un vídeo almacenado en un bucket de Amazon S3 con Java o Python (SDK), el código que se va a reemplazar podría ser diferente.

  3. Ejecute el código. Se muestra una lista de etiquetas de contenido inapropiado detectadas en el vídeo.

GetContentModeration respuesta de operación

La respuesta de GetContentModeration es una matriz, ModerationLabels de objetos ContentModerationDetection. La matriz contiene un elemento por cada vez que se detecta una etiqueta de contenido inapropiado. Dentro de un ContentModerationDetectionObject objeto, ModerationLabelcontiene información sobre un elemento detectado con contenido inapropiado u ofensivo. Timestampes el tiempo, en milisegundos desde el inicio del vídeo, en el que se detectó la etiqueta. Las etiquetas se organizan jerárquicamente de la misma forma que las etiquetas detectadas durante los análisis de la imagen de contenido inapropiado. Para obtener más información, consulte Moderación del contenido.

El siguiente es un ejemplo de respuesta de GetContentModeration, ordenada por NAME y agregada por TIMESTAMPS.

{ "JobStatus": "SUCCEEDED", "ModerationModelVersion": "6.1", "ModerationLabels": [ { "Timestamp": 1500, "ModerationLabel": { "Confidence": 71.88196563720703, "Name": "Male Swimwear Or Underwear", "ParentName": "Suggestive" } }, { "Timestamp": 2000, "ModerationLabel": { "Confidence": 71.88196563720703, "Name": "Male Swimwear Or Underwear", "ParentName": "Suggestive" } }, { "Timestamp": 1500, "ModerationLabel": { "Confidence": 71.88196563720703, "Name": "Suggestive", "ParentName": "" } }, { "Timestamp": 2000, "ModerationLabel": { "Confidence": 71.88196563720703, "Name": "Suggestive", "ParentName": "" } }, { "Timestamp": 500, "ModerationLabel": { "Confidence": 90.84736633300781, "Name": "Tobacco", "ParentName": "", } } ], "VideoMetadata": { "ColorRange": "FULL", "DurationMillis": 5000, "Format": "MP4", "FrameWidth": 1280, "FrameHeight": 720, "FrameRate": 24 }, "JobId": "123", "Video": { "S3Object": { "Bucket": "s3Bucket", "Name": "s3bucketpath/testfile.mp4" } }, "JobTag": "ContentModerationSet1", "GetRequestMetadata": { "AggregatedBy": "TIMESTAMPS", "SortBy": "TIMESTAMP" } }