本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
注意
终止支持通知:2025 年 10 月 31 日,AWS 将停止对 Amazon Rekognition 人物轨迹跟踪的支持。2025 年 10 月 31 日之后,您将无法再使用 Rekognition 人物轨迹跟踪功能。有关更多信息,请访问此博客文章
Amazon Rekognition Video 可以创建视频中的人物轨迹并提供如下信息:
在跟踪人物的轨迹时人物在视频帧中的位置。
人脸标记,如左眼的位置(如果检测到)。
存储视频中的 Amazon Rekognition Video 人物轨迹跟踪是一个异步操作。要开始在视频中寻找人物路径,请致电StartPersonTracking。Amazon Rekognition Video 会将视频分析的完成状态发布到 Amazon Simple Notification Service 主题。如果视频分析成功,请致电GetPersonTracking以获取视频分析的结果。有关调用 Amazon Rekognition Video API 操作的更多信息,请参阅 调用 Amazon Rekognition Video 操作。
以下过程说明如何通过存储在 Amazon S3 存储桶内的视频跟踪人物轨迹。此示例扩展了 使用 Java 或 Python 分析存储在 Amazon S3 存储桶中的视频 (SDK)(使用 Amazon Simple Queue Service 队列获取视频分析请求的完成状态)中的代码。
检测存储在 Amazon S3 存储桶内的视频中的人员 (SDK)
将以下代码添加到您在步骤 1 中创建的类
VideoDetect
。//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.) //Persons======================================================================== private static void StartPersonDetection(String bucket, String video) throws Exception{ NotificationChannel channel= new NotificationChannel() .withSNSTopicArn(snsTopicArn) .withRoleArn(roleArn); StartPersonTrackingRequest req = new StartPersonTrackingRequest() .withVideo(new Video() .withS3Object(new S3Object() .withBucket(bucket) .withName(video))) .withNotificationChannel(channel); StartPersonTrackingResult startPersonDetectionResult = rek.startPersonTracking(req); startJobId=startPersonDetectionResult.getJobId(); } private static void GetPersonDetectionResults() throws Exception{ int maxResults=10; String paginationToken=null; GetPersonTrackingResult personTrackingResult=null; do{ if (personTrackingResult !=null){ paginationToken = personTrackingResult.getNextToken(); } personTrackingResult = rek.getPersonTracking(new GetPersonTrackingRequest() .withJobId(startJobId) .withNextToken(paginationToken) .withSortBy(PersonTrackingSortBy.TIMESTAMP) .withMaxResults(maxResults)); VideoMetadata videoMetaData=personTrackingResult.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 persons, confidence and detection times List<PersonDetection> detectedPersons= personTrackingResult.getPersons(); for (PersonDetection detectedPerson: detectedPersons) { long seconds=detectedPerson.getTimestamp()/1000; System.out.print("Sec: " + Long.toString(seconds) + " "); System.out.println("Person Identifier: " + detectedPerson.getPerson().getIndex()); System.out.println(); } } while (personTrackingResult !=null && personTrackingResult.getNextToken() != null); }
在函数
main
中,将以下行:StartLabelDetection(amzn-s3-demo-bucket, video); if (GetSQSMessageSuccess()==true) GetLabelDetectionResults();
替换为:
StartPersonDetection(amzn-s3-demo-bucket, video); if (GetSQSMessageSuccess()==true) GetPersonDetectionResults();
注意
如果您已经运行了除 使用 Java 或 Python 分析存储在 Amazon S3 存储桶中的视频 (SDK) 之外的视频示例,则要替换的代码可能会有所不同。
运行该代码。将显示被跟踪人员的唯一标识符以及跟踪人物轨迹的时间(秒)。
GetPersonTracking 操作响应
GetPersonTracking
将返回一个数组 Persons
,其中包括 PersonDetection 对象,这些对象包含有关所检测人物的详细信息以及跟踪人物轨迹的时间。
您可通过使用 SortBy
输入参数来为 Persons
排序。指定 TIMESTAMP
以按在视频中检测人物轨迹的时间为元素排序。指定 INDEX
以按在视频中跟踪的人员排序。在每组人物的结果中,元素是按人物轨迹跟踪的准确性的置信度的降序顺序排序的。默认情况下,Persons
将按 TIMESTAMP
返回/排序。以下示例是 GetPersonDetection
的 JSON 响应。结果按在视频中跟踪人物轨迹的时间(播放视频的毫秒数)排序。在响应中,请注意以下内容:
-
人员信息 –
PersonDetection
数组元素包含有关检测到的人员的信息。例如,检测到人员的时间(Timestamp
)、检测到时人员在视频帧中的位置(BoundingBox
)以及 Amazon Rekognition Video 对正确检测到人员的置信度(Confidence
)。跟踪人物轨迹的每个时间戳不会返回面部特征。而且,在被跟踪人员的身体可能不可见的某些情况下,仅返回其脸部位置。
-
分页信息 – 此示例显示一页的人员检测信息。您可以在
GetPersonTracking
的MaxResults
输入参数中指定要返回的人员元素数量。如果存在的结果的数量超过了MaxResults
,则GetPersonTracking
会返回一个令牌 (NextToken
),用于获取下一页的结果。有关更多信息,请参阅 获取 Amazon Rekognition Video 分析结果。 -
索引 – 用于在整个视频中识别人物的唯一标识符。
-
视频信息 – 此响应包含有关由
GetPersonDetection
返回的每页信息中的视频格式(VideoMetadata
)的信息。
{
"JobStatus": "SUCCEEDED",
"NextToken": "AcDymG0fSSoaI6+BBYpka5wVlqttysSPP8VvWcujMDluj1QpFo/vf+mrMoqBGk8eUEiFlllR6g==",
"Persons": [
{
"Person": {
"BoundingBox": {
"Height": 0.8787037134170532,
"Left": 0.00572916679084301,
"Top": 0.12129629403352737,
"Width": 0.21666666865348816
},
"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
}
},
"Index": 0
},
"Timestamp": 0
},
{
"Person": {
"BoundingBox": {
"Height": 0.9074074029922485,
"Left": 0.24791666865348816,
"Top": 0.09259258955717087,
"Width": 0.375
},
"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
}
},
"Index": 1
},
"Timestamp": 0
}.....
],
"VideoMetadata": {
"Codec": "h264",
"DurationMillis": 67301,
"FileExtension": "mp4",
"Format": "QuickTime / MOV",
"FrameHeight": 1080,
"FrameRate": 29.970029830932617,
"FrameWidth": 1920
}
}