翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
保存済みビデオ内のテキスト検出
保存済みビデオ内の Amazon Rekognition Video のテキスト検出は、非同期オペレーションです。テキストの検出を開始するには、StartTextDetection を呼び出します。Amazon Rekognition Video は、ビデオ分析の完了ステータスを Amazon SNS トピックに発行します。ビデオ分析が成功した場合は、 GetTextDetectionを呼び出して分析結果を取得します。ビデオ分析の開始と結果の取得の詳細については、「Amazon Rekognition Video オペレーションを呼び出す」を参照してください。
この手順では、「Java または Python を使用して Amazon S3 バケットに保存されている動画を分析する (SDK)」のコードを拡張します。Amazon SQS キューを使用して、ビデオ分析リクエストの完了ステータスを取得します。
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.)
private static void StartTextDetection(String bucket, String video) throws Exception{
NotificationChannel channel= new NotificationChannel()
.withSNSTopicArn(snsTopicArn)
.withRoleArn(roleArn);
StartTextDetectionRequest req = new StartTextDetectionRequest()
.withVideo(new Video()
.withS3Object(new S3Object()
.withBucket(bucket)
.withName(video)))
.withNotificationChannel(channel);
StartTextDetectionResult startTextDetectionResult = rek.startTextDetection(req);
startJobId=startTextDetectionResult.getJobId();
}
private static void GetTextDetectionResults() throws Exception{
int maxResults=10;
String paginationToken=null;
GetTextDetectionResult textDetectionResult=null;
do{
if (textDetectionResult !=null){
paginationToken = textDetectionResult.getNextToken();
}
textDetectionResult = rek.getTextDetection(new GetTextDetectionRequest()
.withJobId(startJobId)
.withNextToken(paginationToken)
.withMaxResults(maxResults));
VideoMetadata videoMetaData=textDetectionResult.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 text, confidence values
List<TextDetectionResult> textDetections = textDetectionResult.getTextDetections();
for (TextDetectionResult text: textDetections) {
long seconds=text.getTimestamp()/1000;
System.out.println("Sec: " + Long.toString(seconds) + " ");
TextDetection detectedText=text.getTextDetection();
System.out.println("Text Detected: " + detectedText.getDetectedText());
System.out.println("Confidence: " + detectedText.getConfidence().toString());
System.out.println("Id : " + detectedText.getId());
System.out.println("Parent Id: " + detectedText.getParentId());
System.out.println("Bounding Box" + detectedText.getGeometry().getBoundingBox().toString());
System.out.println("Type: " + detectedText.getType());
System.out.println();
}
} while (textDetectionResult !=null && textDetectionResult.getNextToken() != null);
}
関数 main
で、以下の行を置き換えます。
StartLabelDetection(bucket, video);
if (GetSQSMessageSuccess()==true)
GetLabelDetectionResults();
を:
StartTextDetection(bucket, video);
if (GetSQSMessageSuccess()==true)
GetTextDetectionResults();
- Java V2
-
このコードは AWS Documentation SDK サンプル GitHub リポジトリから取得されます。詳しい事例は [こちら] です。
//snippet-start:[rekognition.java2.recognize_video_text.import]
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rekognition.RekognitionClient;
import software.amazon.awssdk.services.rekognition.model.S3Object;
import software.amazon.awssdk.services.rekognition.model.NotificationChannel;
import software.amazon.awssdk.services.rekognition.model.Video;
import software.amazon.awssdk.services.rekognition.model.StartTextDetectionRequest;
import software.amazon.awssdk.services.rekognition.model.StartTextDetectionResponse;
import software.amazon.awssdk.services.rekognition.model.RekognitionException;
import software.amazon.awssdk.services.rekognition.model.GetTextDetectionResponse;
import software.amazon.awssdk.services.rekognition.model.GetTextDetectionRequest;
import software.amazon.awssdk.services.rekognition.model.VideoMetadata;
import software.amazon.awssdk.services.rekognition.model.TextDetectionResult;
import java.util.List;
//snippet-end:[rekognition.java2.recognize_video_text.import]
/**
* 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 DetectTextVideo {
private static String startJobId ="";
public static void main(String[] args) {
final String usage = "\n" +
"Usage: " +
" <bucket> <video> <topicArn> <roleArn>\n\n" +
"Where:\n" +
" bucket - The name of the bucket in which the video is located (for example, (for example, myBucket). \n\n"+
" video - The name of video (for example, people.mp4). \n\n" +
" topicArn - The ARN of the Amazon Simple Notification Service (Amazon SNS) topic. \n\n" +
" roleArn - The ARN of the AWS Identity and Access Management (IAM) role to use. \n\n" ;
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)
.credentialsProvider(ProfileCredentialsProvider.create("profile-name"))
.build();
NotificationChannel channel = NotificationChannel.builder()
.snsTopicArn(topicArn)
.roleArn(roleArn)
.build();
startTextLabels(rekClient, channel, bucket, video);
GetTextResults(rekClient);
System.out.println("This example is done!");
rekClient.close();
}
// snippet-start:[rekognition.java2.recognize_video_text.main]
public static void startTextLabels(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();
StartTextDetectionRequest labelDetectionRequest = StartTextDetectionRequest.builder()
.jobTag("DetectingLabels")
.notificationChannel(channel)
.video(vidOb)
.build();
StartTextDetectionResponse labelDetectionResponse = rekClient.startTextDetection(labelDetectionRequest);
startJobId = labelDetectionResponse.jobId();
} catch (RekognitionException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
public static void GetTextResults(RekognitionClient rekClient) {
try {
String paginationToken=null;
GetTextDetectionResponse textDetectionResponse=null;
boolean finished = false;
String status;
int yy=0 ;
do{
if (textDetectionResponse !=null)
paginationToken = textDetectionResponse.nextToken();
GetTextDetectionRequest recognitionRequest = GetTextDetectionRequest.builder()
.jobId(startJobId)
.nextToken(paginationToken)
.maxResults(10)
.build();
// Wait until the job succeeds.
while (!finished) {
textDetectionResponse = rekClient.getTextDetection(recognitionRequest);
status = textDetectionResponse.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=textDetectionResponse.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<TextDetectionResult> labels= textDetectionResponse.textDetections();
for (TextDetectionResult detectedText: labels) {
System.out.println("Confidence: " + detectedText.textDetection().confidence().toString());
System.out.println("Id : " + detectedText.textDetection().id());
System.out.println("Parent Id: " + detectedText.textDetection().parentId());
System.out.println("Type: " + detectedText.textDetection().type());
System.out.println("Text: " + detectedText.textDetection().detectedText());
System.out.println();
}
} while (textDetectionResponse !=null && textDetectionResponse.nextToken() != null);
} catch(RekognitionException | InterruptedException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
// snippet-end:[rekognition.java2.recognize_video_text.main]
}
- Python
-
#Copyright 2019 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.)
def StartTextDetection(self):
response=self.rek.start_text_detection(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 GetTextDetectionResults(self):
maxResults = 10
paginationToken = ''
finished = False
while finished == False:
response = self.rek.get_text_detection(JobId=self.startJobId,
MaxResults=maxResults,
NextToken=paginationToken)
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 textDetection in response['TextDetections']:
text=textDetection['TextDetection']
print("Timestamp: " + str(textDetection['Timestamp']))
print(" Text Detected: " + text['DetectedText'])
print(" Confidence: " + str(text['Confidence']))
print (" Bounding box")
print (" Top: " + str(text['Geometry']['BoundingBox']['Top']))
print (" Left: " + str(text['Geometry']['BoundingBox']['Left']))
print (" Width: " + str(text['Geometry']['BoundingBox']['Width']))
print (" Height: " + str(text['Geometry']['BoundingBox']['Height']))
print (" Type: " + str(text['Type']) )
print()
if 'NextToken' in response:
paginationToken = response['NextToken']
else:
finished = True
関数 main
で、以下の行を置き換えます。
analyzer.StartLabelDetection()
if analyzer.GetSQSMessageSuccess()==True:
analyzer.GetLabelDetectionResults()
を:
analyzer.StartTextDetection()
if analyzer.GetSQSMessageSuccess()==True:
analyzer.GetTextDetectionResults()
- CLI
-
次の AWS CLI コマンドを実行して、ビデオ内のテキストの検出を開始します。
aws rekognition start-text-detection --video "{"S3Object":{"Bucket":"bucket-name","Name":"video-name"}}"\
--notification-channel "{"SNSTopicArn":"topic-arn","RoleArn":"role-arn"}" \
--region region-name --profile profile-name
以下の値を更新します。
-
bucket-name
と video-name
を、ステップ 2 で指定した Amazon S3 バケット名とファイル名に変更します。
-
region-name
を、使用している AWS リージョンに変更します。
-
profile-name
の値を自分のデベロッパープロファイル名に置き換えます。
-
topic-ARN
を、Amazon Rekognition Video の設定 のステップ 3 で作成した Amazon SNS トピックの ARN に変更します。
-
role-ARN
を、Amazon Rekognition Video の設定 のステップ 7 で作成した IAM サービスロールの ARN に変更します。
Windows デバイスで CLI にアクセスする場合は、パーサーエラーの発生に対処するため、一重引用符の代わりに二重引用符を使用し、内側の二重引用符をバックスラッシュ (\) でエスケープします。次の例を参照してください。
aws rekognition start-text-detection --video \
"{\"S3Object\":{\"Bucket\":\"bucket-name\",\"Name\":\"video-name\"}}" \
--notification-channel "{\"SNSTopicArn\":\"topic-arn\",\"RoleArn\":\"role-arn\"}" \
--region region-name --profile profile-name
上記のコード例を実行した後、返された jobID
をコピーして以下の GetTextDetection
コマンドに渡すと、job-id-number
が以前に受け取った jobID
に置き換わっている結果が得られます。
aws rekognition get-text-detection --job-id job-id-number --profile profile-name
-
コードを実行します。ビデオで検出されたテキストがリストに表示されます。
フィルター
フィルタは、StartTextDetection
を呼び出すときに使用できるオプションのリクエストパラメータです。テキスト領域、サイズ、信頼スコアに基づくフィルタ処理により、テキスト検出出力をさらに柔軟に制御できるようになります。関心領域を使用することで、テキスト検出を関連する領域に簡単に制限できます。例えば、グラフィックスの下部 3 分の 1 の領域や、サッカーゲームのスコアボードを読むための左上隅の領域です。単語の境界ボックスサイズフィルタを使用すると、ノイズの多いテキストや無関係な小さな背景テキストを回避できます。最後に、単語信頼性フィルタを使用すると、ぼやけているか汚れているせいで信頼できない結果を削除できます。
フィルターの値については、「DetectTextFilters
」を参照してください。
以下のフィルタを使用できます。
-
MinConfidence - 単語検出の信頼度を設定します。検出の信頼性がこのレベルより低い単語は、結果から除外されます。値は 0 から 100 の間で指定する必要があります。
-
MinBoundingBoxWidth – 単語境界ボックスの最小幅を設定します。境界ボックスの幅がこの値より小さい単語は、結果から除外されます。値はビデオフレームの幅に対する相対値です。
-
MinBoundingBoxHeight – 単語境界ボックスの最小の高さを設定します。境界ボックスの高さがこの値より小さい単語は、結果から除外されます。値はビデオフレームの高さに対する相対値です。
-
RegionsOfInterest - フレームの特定リージョンの検出を制限します。値はフレームの寸法に対する相対値です。領域内に部分的にしか含まれていないオブジェクトの場合、レスポンスは不明となります。
GetTextDetection レスポンス
GetTextDetection
は、ビデオ内で検出されたテキストに関する情報が含まれた配列 (TextDetectionResults
) を返します。配列要素 (TextDetection) は、ビデオで単語や行が検出されるたびに生成されます。配列要素は、ビデオの開始時点からの経過時間 (ミリ秒単位) で並べ替えられます。
以下に示しているのは、GetTextDetection
からの JSON レスポンスの一部です。レスポンスで、以下の点に注意してください。
-
テキスト情報 – TextDetectionResult
配列要素には、検出されたテキスト (TextDetection) と、ビデオ内でテキストが検出された時間 () に関する情報が含まれますTimestamp
。
-
ページング情報 例は 1 ページのテキスト検出情報を示しています。テキスト要素を返す数は、GetTextDetection
の MaxResults
入力パラメータで指定できます。MaxResults
を超える結果が存在する場合、またはデフォルトの最大値を超える結果がある場合は、GetTextDetection
から返されるトークン (NextToken
) を使用して次の結果ページを取得できます。詳細については、「Amazon Rekognition Video の分析結果を取得する」を参照してください。
-
ビデオ情報 – このレスポンスには、VideoMetadata
から返された各情報ページのビデオ形式 (GetTextDetection
) に関する情報が含まれます。
{
"JobStatus": "SUCCEEDED",
"VideoMetadata": {
"Codec": "h264",
"DurationMillis": 174441,
"Format": "QuickTime / MOV",
"FrameRate": 29.970029830932617,
"FrameHeight": 480,
"FrameWidth": 854
},
"TextDetections": [
{
"Timestamp": 967,
"TextDetection": {
"DetectedText": "Twinkle Twinkle Little Star",
"Type": "LINE",
"Id": 0,
"Confidence": 99.91780090332031,
"Geometry": {
"BoundingBox": {
"Width": 0.8337579369544983,
"Height": 0.08365312218666077,
"Left": 0.08313830941915512,
"Top": 0.4663468301296234
},
"Polygon": [
{
"X": 0.08313830941915512,
"Y": 0.4663468301296234
},
{
"X": 0.9168962240219116,
"Y": 0.4674469828605652
},
{
"X": 0.916861355304718,
"Y": 0.5511001348495483
},
{
"X": 0.08310343325138092,
"Y": 0.5499999523162842
}
]
}
}
},
{
"Timestamp": 967,
"TextDetection": {
"DetectedText": "Twinkle",
"Type": "WORD",
"Id": 1,
"ParentId": 0,
"Confidence": 99.98338317871094,
"Geometry": {
"BoundingBox": {
"Width": 0.2423887550830841,
"Height": 0.0833333358168602,
"Left": 0.08313817530870438,
"Top": 0.46666666865348816
},
"Polygon": [
{
"X": 0.08313817530870438,
"Y": 0.46666666865348816
},
{
"X": 0.3255269229412079,
"Y": 0.46666666865348816
},
{
"X": 0.3255269229412079,
"Y": 0.550000011920929
},
{
"X": 0.08313817530870438,
"Y": 0.550000011920929
}
]
}
}
},
{
"Timestamp": 967,
"TextDetection": {
"DetectedText": "Twinkle",
"Type": "WORD",
"Id": 2,
"ParentId": 0,
"Confidence": 99.982666015625,
"Geometry": {
"BoundingBox": {
"Width": 0.2423887550830841,
"Height": 0.08124999701976776,
"Left": 0.3454332649707794,
"Top": 0.46875
},
"Polygon": [
{
"X": 0.3454332649707794,
"Y": 0.46875
},
{
"X": 0.5878220200538635,
"Y": 0.46875
},
{
"X": 0.5878220200538635,
"Y": 0.550000011920929
},
{
"X": 0.3454332649707794,
"Y": 0.550000011920929
}
]
}
}
},
{
"Timestamp": 967,
"TextDetection": {
"DetectedText": "Little",
"Type": "WORD",
"Id": 3,
"ParentId": 0,
"Confidence": 99.8787612915039,
"Geometry": {
"BoundingBox": {
"Width": 0.16627635061740875,
"Height": 0.08124999701976776,
"Left": 0.6053864359855652,
"Top": 0.46875
},
"Polygon": [
{
"X": 0.6053864359855652,
"Y": 0.46875
},
{
"X": 0.7716627717018127,
"Y": 0.46875
},
{
"X": 0.7716627717018127,
"Y": 0.550000011920929
},
{
"X": 0.6053864359855652,
"Y": 0.550000011920929
}
]
}
}
},
{
"Timestamp": 967,
"TextDetection": {
"DetectedText": "Star",
"Type": "WORD",
"Id": 4,
"ParentId": 0,
"Confidence": 99.82640075683594,
"Geometry": {
"BoundingBox": {
"Width": 0.12997658550739288,
"Height": 0.08124999701976776,
"Left": 0.7868852615356445,
"Top": 0.46875
},
"Polygon": [
{
"X": 0.7868852615356445,
"Y": 0.46875
},
{
"X": 0.9168618321418762,
"Y": 0.46875
},
{
"X": 0.9168618321418762,
"Y": 0.550000011920929
},
{
"X": 0.7868852615356445,
"Y": 0.550000011920929
}
]
}
}
}
],
"NextToken": "NiHpGbZFnkM/S8kLcukMni15wb05iKtquu/Mwc+Qg1LVlMjjKNOD0Z0GusSPg7TONLe+OZ3P",
"TextModelVersion": "3.0"
}