翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
保存済みビデオ内の顔の検出
Amazon Rekognition Video では、Amazon S3 バケットに保存されているビデオ内の顔を検出し、以下のような情報を提供できます。
保存済みビデオ内の Amazon Rekognition Video のテキスト検出は、非同期オペレーションです。ビデオ内の顔の検出を開始するには、 を呼び出しますStartFaceDetection。Amazon Rekognition Video は、動画分析の完了ステータスを Amazon Simple Notification Service (Amazon SNS) トピックに公開します。ビデオ分析が成功した場合は、 GetFaceDetectionを呼び出してビデオ分析の結果を取得できます。ビデオ分析の開始と結果の取得の詳細については、「Amazon Rekognition Video オペレーションを呼び出す」を参照してください。
この手順では、Amazon Simple Queue Service (Amazon SQS) のキューを使用してビデオ分析リクエストの完了ステータスを取得する Java または Python を使用して Amazon S3 バケットに保存されている動画を分析する (SDK) のコードを拡張します。
Amazon S3 バケット(SDK) に保存されたビデオ内のテキストを検出するには
-
「Java または Python を使用して Amazon S3 バケットに保存されている動画を分析する (SDK)」を実行します。
-
ステップ 1 で作成したクラス VideoDetect
に次のコードを追加します。
- AWS CLI
-
-
以下のコード例では、bucket-name
と video-name
を、ステップ 2 で指定した Amazon S3 バケットの名前およびファイル名に変更します。
-
region-name
を、使用している AWS リージョンに変更します。profile_name
の値を自分のデベロッパープロファイル名に置き換えます。
-
TopicARN
を、Amazon Rekognition Video の設定 のステップ 3 で作成した Amazon SNS トピックの ARN に変更します。
-
RoleARN
を、Amazon Rekognition Video の設定 のステップ 7 で作成した IAM サービスロールの ARN に変更します。
aws rekognition start-face-detection --video "{"S3Object":{"Bucket":"Bucket-Name","Name":"Video-Name"}}" --notification-channel \
"{"SNSTopicArn":"Topic-ARN","RoleArn":"Role-ARN"}" --region region-name --profile profile-name
Windows デバイスで CLI にアクセスする場合は、パーサーエラーの発生に対処するため、一重引用符の代わりに二重引用符を使用し、内側の二重引用符をバックスラッシュ (\) でエスケープします。例として以下を参照してください。
aws rekognition start-face-detection --video "{\"S3Object\":{\"Bucket\":\"Bucket-Name\",\"Name\":\"Video-Name\"}}" --notification-channel \
"{\"SNSTopicArn\":\"Topic-ARN\",\"RoleArn\":\"Role-ARN\"}" --region region-name --profile profile-name
StartFaceDetection
オペレーションを実行してジョブ ID 番号を取得したら、次の GetFaceDetection
オペレーションを実行してジョブ ID 番号を指定します。
aws rekognition get-face-detection --job-id job-id-number --profile profile-name
- 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 StartFaceDetection(String bucket, String video) throws Exception{
NotificationChannel channel= new NotificationChannel()
.withSNSTopicArn(snsTopicArn)
.withRoleArn(roleArn);
StartFaceDetectionRequest req = new StartFaceDetectionRequest()
.withVideo(new Video()
.withS3Object(new S3Object()
.withBucket(bucket)
.withName(video)))
.withNotificationChannel(channel);
StartFaceDetectionResult startLabelDetectionResult = rek.startFaceDetection(req);
startJobId=startLabelDetectionResult.getJobId();
}
private static void GetFaceDetectionResults() throws Exception{
int maxResults=10;
String paginationToken=null;
GetFaceDetectionResult faceDetectionResult=null;
do{
if (faceDetectionResult !=null){
paginationToken = faceDetectionResult.getNextToken();
}
faceDetectionResult = rek.getFaceDetection(new GetFaceDetectionRequest()
.withJobId(startJobId)
.withNextToken(paginationToken)
.withMaxResults(maxResults));
VideoMetadata videoMetaData=faceDetectionResult.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 faces, confidence and detection times
List<FaceDetection> faces= faceDetectionResult.getFaces();
for (FaceDetection face: faces) {
long seconds=face.getTimestamp()/1000;
System.out.print("Sec: " + Long.toString(seconds) + " ");
System.out.println(face.getFace().toString());
System.out.println();
}
} while (faceDetectionResult !=null && faceDetectionResult.getNextToken() != null);
}
関数 main
で、以下の行を置き換えます。
StartLabelDetection(bucket, video);
if (GetSQSMessageSuccess()==true)
GetLabelDetectionResults();
を:
StartFaceDetection(bucket, video);
if (GetSQSMessageSuccess()==true)
GetFaceDetectionResults();
- Java V2
-
このコードは AWS Documentation SDK サンプル GitHub リポジトリから取得されます。詳しい事例は [こちら] です。
//snippet-start:[rekognition.java2.recognize_video_faces.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.*;
import java.util.List;
//snippet-end:[rekognition.java2.recognize_video_faces.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 VideoDetectFaces {
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();
StartFaceDetection(rekClient, channel, bucket, video);
GetFaceResults(rekClient);
System.out.println("This example is done!");
rekClient.close();
}
// snippet-start:[rekognition.java2.recognize_video_faces.main]
public static void StartFaceDetection(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();
StartFaceDetectionRequest faceDetectionRequest = StartFaceDetectionRequest.builder()
.jobTag("Faces")
.faceAttributes(FaceAttributes.ALL)
.notificationChannel(channel)
.video(vidOb)
.build();
StartFaceDetectionResponse startLabelDetectionResult = rekClient.startFaceDetection(faceDetectionRequest);
startJobId=startLabelDetectionResult.jobId();
} catch(RekognitionException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
public static void GetFaceResults(RekognitionClient rekClient) {
try {
String paginationToken=null;
GetFaceDetectionResponse faceDetectionResponse=null;
boolean finished = false;
String status;
int yy=0 ;
do{
if (faceDetectionResponse !=null)
paginationToken = faceDetectionResponse.nextToken();
GetFaceDetectionRequest recognitionRequest = GetFaceDetectionRequest.builder()
.jobId(startJobId)
.nextToken(paginationToken)
.maxResults(10)
.build();
// Wait until the job succeeds
while (!finished) {
faceDetectionResponse = rekClient.getFaceDetection(recognitionRequest);
status = faceDetectionResponse.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=faceDetectionResponse.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");
// Show face information
List<FaceDetection> faces= faceDetectionResponse.faces();
for (FaceDetection face: faces) {
String age = face.face().ageRange().toString();
String smile = face.face().smile().toString();
System.out.println("The detected face is estimated to be"
+ age + " years old.");
System.out.println("There is a smile : "+smile);
}
} while (faceDetectionResponse !=null && faceDetectionResponse.nextToken() != null);
} catch(RekognitionException | InterruptedException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
// snippet-end:[rekognition.java2.recognize_video_faces.main]
}
- 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.)
# ============== Faces===============
def StartFaceDetection(self):
response=self.rek.start_face_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 GetFaceDetectionResults(self):
maxResults = 10
paginationToken = ''
finished = False
while finished == False:
response = self.rek.get_face_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 faceDetection in response['Faces']:
print('Face: ' + str(faceDetection['Face']))
print('Confidence: ' + str(faceDetection['Face']['Confidence']))
print('Timestamp: ' + str(faceDetection['Timestamp']))
print()
if 'NextToken' in response:
paginationToken = response['NextToken']
else:
finished = True
関数 main
で、以下の行を置き換えます。
analyzer.StartLabelDetection()
if analyzer.GetSQSMessageSuccess()==True:
analyzer.GetLabelDetectionResults()
を:
analyzer.StartFaceDetection()
if analyzer.GetSQSMessageSuccess()==True:
analyzer.GetFaceDetectionResults()
-
コードを実行します。ビデオ内で検出された顔に関する情報が表示されます。
GetFaceDetection オペレーションレスポンス
GetFaceDetection
は、ビデオ内で検出された顔に関する情報が含まれた配列 (Faces
) を返します。配列要素 はFaceDetection、ビデオ内で顔が検出されるたびに存在します。配列要素は、ビデオの開始時点からの経過時間 (ミリ秒単位) で並べ替えられて返されます。
次の例は、GetFaceDetection
からの JSON レスポンスの一部です。レスポンスで、以下の点に注意してください。
-
境界ボックス – 顔を囲む境界ボックスの座標。
-
信頼度 – 境界ボックス内に顔が含まれている信頼度。
-
顔のランドマーク – 顔のランドマークの配列。ランドマーク (左目、右目、口など) ごとに、x
座標と y
座標がレスポンスで返されます。
-
顔の属性 – 顔の属性のセット。、 AgeRange髭、感情、眼鏡、性別 EyesOpen、口ひげ MouthOpen、笑顔、サングラスが含まれます。値は、ブール値 (サングラスをしているかどうか) や文字列 (男性か女性か) など、さまざまな型で返される場合があります。また、ほとんどの属性では検出した値の信頼度も返されます。 FaceOccluded および EyeDirection 属性は の使用時にサポートされますがDetectFaces
、 StartFaceDetection
および で動画を分析する場合はサポートされませんGetFaceDetection
。
-
タイムスタンプ — ビデオ内で顔が検出された時間です。
-
ページング情報 – 例は 1 ページの顔検出情報を示しています。人物要素を返す数は、GetFaceDetection
の MaxResults
入力パラメータで指定できます。MaxResults
の数を超える結果が存在する場合、GetFaceDetection
から返されるトークン (NextToken
) を使用して次の結果ページを取得できます。詳細については、「Amazon Rekognition Video の分析結果を取得する」を参照してください。
-
ビデオ情報 – このレスポンスには、VideoMetadata
から返された各情報ページのビデオ形式 (GetFaceDetection
) に関する情報が含まれます。
-
Quality – 顔の明るさとシャープネスを示します。
-
ポーズ – イメージ内の顔の回転を示します。
{
"Faces": [
{
"Face": {
"BoundingBox": {
"Height": 0.23000000417232513,
"Left": 0.42500001192092896,
"Top": 0.16333332657814026,
"Width": 0.12937499582767487
},
"Confidence": 99.97504425048828,
"Landmarks": [
{
"Type": "eyeLeft",
"X": 0.46415066719055176,
"Y": 0.2572723925113678
},
{
"Type": "eyeRight",
"X": 0.5068183541297913,
"Y": 0.23705792427062988
},
{
"Type": "nose",
"X": 0.49765899777412415,
"Y": 0.28383663296699524
},
{
"Type": "mouthLeft",
"X": 0.487221896648407,
"Y": 0.3452930748462677
},
{
"Type": "mouthRight",
"X": 0.5142884850502014,
"Y": 0.33167609572410583
}
],
"Pose": {
"Pitch": 15.966927528381348,
"Roll": -15.547388076782227,
"Yaw": 11.34195613861084
},
"Quality": {
"Brightness": 44.80223083496094,
"Sharpness": 99.95819854736328
}
},
"Timestamp": 0
},
{
"Face": {
"BoundingBox": {
"Height": 0.20000000298023224,
"Left": 0.029999999329447746,
"Top": 0.2199999988079071,
"Width": 0.11249999701976776
},
"Confidence": 99.85971069335938,
"Landmarks": [
{
"Type": "eyeLeft",
"X": 0.06842322647571564,
"Y": 0.3010137975215912
},
{
"Type": "eyeRight",
"X": 0.10543643683195114,
"Y": 0.29697132110595703
},
{
"Type": "nose",
"X": 0.09569807350635529,
"Y": 0.33701086044311523
},
{
"Type": "mouthLeft",
"X": 0.0732642263174057,
"Y": 0.3757539987564087
},
{
"Type": "mouthRight",
"X": 0.10589495301246643,
"Y": 0.3722417950630188
}
],
"Pose": {
"Pitch": -0.5589138865470886,
"Roll": -5.1093974113464355,
"Yaw": 18.69594955444336
},
"Quality": {
"Brightness": 43.052337646484375,
"Sharpness": 99.68138885498047
}
},
"Timestamp": 0
},
{
"Face": {
"BoundingBox": {
"Height": 0.2177777737379074,
"Left": 0.7593749761581421,
"Top": 0.13333334028720856,
"Width": 0.12250000238418579
},
"Confidence": 99.63436889648438,
"Landmarks": [
{
"Type": "eyeLeft",
"X": 0.8005779385566711,
"Y": 0.20915353298187256
},
{
"Type": "eyeRight",
"X": 0.8391435146331787,
"Y": 0.21049551665782928
},
{
"Type": "nose",
"X": 0.8191410899162292,
"Y": 0.2523227035999298
},
{
"Type": "mouthLeft",
"X": 0.8093273043632507,
"Y": 0.29053622484207153
},
{
"Type": "mouthRight",
"X": 0.8366993069648743,
"Y": 0.29101791977882385
}
],
"Pose": {
"Pitch": 3.165884017944336,
"Roll": 1.4182015657424927,
"Yaw": -11.151537895202637
},
"Quality": {
"Brightness": 28.910892486572266,
"Sharpness": 97.61507415771484
}
},
"Timestamp": 0
}.......
],
"JobStatus": "SUCCEEDED",
"NextToken": "i7fj5XPV/fwviXqz0eag9Ow332Jd5G8ZGWf7hooirD/6V1qFmjKFOQZ6QPWUiqv29HbyuhMNqQ==",
"VideoMetadata": {
"Codec": "h264",
"DurationMillis": 67301,
"FileExtension": "mp4",
"Format": "QuickTime / MOV",
"FrameHeight": 1080,
"FrameRate": 29.970029830932617,
"FrameWidth": 1920
}
}