翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
不適切な保存動画の検出
保存済みビデオ内の Amazon Rekognition Video のテキスト検出は、非同期オペレーションです。不適切または不快なコンテンツの検出を開始するには、 を呼び出しますStartContentModeration。Amazon Rekognition Video は、ビデオ分析の完了ステータスを Amazon Simple Notification Service トピックに発行します。ビデオ分析が成功した場合は、 GetContentModerationを呼び出して分析結果を取得します。ビデオ分析の開始と結果の取得の詳細については、「Amazon Rekognition Video オペレーションを呼び出す」を参照してください。Amazon Rekognition のモデレーションラベルのリストについては、「イメージとビデオのモデレーションの使用APIs」を参照してください。
この手順では、Amazon Simple Queue Service キューを使用してビデオ分析リクエストの完了ステータスを取得する「Java または Python を使用して Amazon S3 バケットに保存されている動画を分析する (SDK)」のコードを拡張します。
Amazon S3 バケットに保存されているビデオ内の不適切または不快なコンテンツを検出するには (SDK)
「Java または Python を使用して Amazon S3 バケットに保存されている動画を分析する (SDK)」を実行します。
ステップ 1 で作成したクラス VideoDetect
に次のコードを追加します。
- 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);
}
関数 main
で、以下の行を置き換えます。
StartLabelDetection(bucket, video);
if (GetSQSMessageSuccess()==true)
GetLabelDetectionResults();
を:
StartUnsafeContentDetection(bucket, video);
if (GetSQSMessageSuccess()==true)
GetUnsafeContentDetectionResults();
- Java V2
-
このコードは、 AWS ドキュメントSDKサンプル GitHub リポジトリから取得されます。詳しい事例は [こちら] です。
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
関数 main
で、以下の行を置き換えます。
analyzer.StartLabelDetection()
if analyzer.GetSQSMessageSuccess()==True:
analyzer.GetLabelDetectionResults()
を:
analyzer.StartUnsafeContent()
if analyzer.GetSQSMessageSuccess()==True:
analyzer.GetUnsafeContentResults()
コードを実行します。ビデオで検出された、安全でないコンテンツのラベルのリストが表示されます。
GetContentModeration オペレーションレスポンス
からのレスポンスは、 ContentModerationDetection オブジェクトの配列 ModerationLabels
GetContentModeration
です。配列には、安全でないコンテンツラベルが検出されるたびに要素が追加されます。ContentModerationDetectionObject
オブジェクト内で、 には、検出された不適切または不快なコンテンツのアイテムに関する情報ModerationLabelが含まれます。 Timestamp
は、ラベルが検出されたビデオの開始からのミリ秒単位の時間です。ラベルは、安全でないコンテンツイメージの分析で検出されたラベルと同じ方法で階層的に編成されています。詳細については、「コンテンツのモデレーション」を参照してください。
以下は GetContentModeration
からのレスポンスの例です。NAME
別に並べ替えられ、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"
}
}
以下は GetContentModeration
からのレスポンスの例です。NAME
別に並べ替えられ、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"
}
}