本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon Rekognition Video 可以搜索集合中与在流视频中检测到的人脸匹配的人脸。有关集合的更多信息,请参阅在集合中搜索人脸。
主题
下图显示了 Amazon Rekognition Video 如何检测和识别流视频中的人脸。

创建 Amazon Rekognition Video 人脸搜索流处理器
在分析流媒体视频之前,您需要先创建一个 Amazon Rekognition Video 流处理器 ()。CreateStreamProcessor流处理器包含有关 Kinesis 数据流和 Kinesis 视频流的信息。它还包含含有您要在输入流视频中识别的人脸的集合的标识符。您还可为流处理器指定名称。以下是 CreateStreamProcessor
请求的 JSON 示例。
{
"Name": "streamProcessorForCam",
"Input": {
"KinesisVideoStream": {
"Arn": "arn:aws:kinesisvideo:us-east-1:nnnnnnnnnnnn:stream/inputVideo"
}
},
"Output": {
"KinesisDataStream": {
"Arn": "arn:aws:kinesis:us-east-1:nnnnnnnnnnnn:stream/outputData"
}
},
"RoleArn": "arn:aws:iam::nnnnnnnnnnn:role/roleWithKinesisPermission",
"Settings": {
"FaceSearch": {
"CollectionId": "collection-with-100-faces",
"FaceMatchThreshold": 85.5
}
}
}
以下是来自 CreateStreamProcessor
的示例响应。
{
“StreamProcessorArn”: “arn:aws:rekognition:us-east-1:nnnnnnnnnnnn:streamprocessor/streamProcessorForCam”
}
启动 Amazon Rekognition Video 人脸搜索流处理器
您可使用在 CreateStreamProcessor
中指定的流处理器名称来调用 StartStreamProcessor,由此开始分析流视频。以下是 StartStreamProcessor
请求的 JSON 示例。
{
"Name": "streamProcessorForCam"
}
如果流处理器成功启动,则会返回 HTTP 200 响应以及空白的 JSON 正文。
使用流处理器搜索人脸(Java V2 示例)
以下示例代码展示了如何使用适用于 Java 的 AWS SDK 版本 2 调用各种流处理器操作 StartStreamProcessor,例如CreateStreamProcessor和。
此代码取自 AWS 文档 SDK 示例 GitHub 存储库。请在此处
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rekognition.RekognitionClient;
import software.amazon.awssdk.services.rekognition.model.CreateStreamProcessorRequest;
import software.amazon.awssdk.services.rekognition.model.CreateStreamProcessorResponse;
import software.amazon.awssdk.services.rekognition.model.FaceSearchSettings;
import software.amazon.awssdk.services.rekognition.model.KinesisDataStream;
import software.amazon.awssdk.services.rekognition.model.KinesisVideoStream;
import software.amazon.awssdk.services.rekognition.model.ListStreamProcessorsRequest;
import software.amazon.awssdk.services.rekognition.model.ListStreamProcessorsResponse;
import software.amazon.awssdk.services.rekognition.model.RekognitionException;
import software.amazon.awssdk.services.rekognition.model.StreamProcessor;
import software.amazon.awssdk.services.rekognition.model.StreamProcessorInput;
import software.amazon.awssdk.services.rekognition.model.StreamProcessorSettings;
import software.amazon.awssdk.services.rekognition.model.StreamProcessorOutput;
import software.amazon.awssdk.services.rekognition.model.StartStreamProcessorRequest;
import software.amazon.awssdk.services.rekognition.model.DescribeStreamProcessorRequest;
import software.amazon.awssdk.services.rekognition.model.DescribeStreamProcessorResponse;
/**
* 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 CreateStreamProcessor {
public static void main(String[] args) {
final String usage = """
Usage: <role> <kinInputStream> <kinOutputStream> <collectionName> <StreamProcessorName>
Where:
role - The ARN of the AWS Identity and Access Management (IAM) role to use. \s
kinInputStream - The ARN of the Kinesis video stream.\s
kinOutputStream - The ARN of the Kinesis data stream.\s
collectionName - The name of the collection to use that contains content. \s
StreamProcessorName - The name of the Stream Processor. \s
""";
if (args.length != 5) {
System.out.println(usage);
System.exit(1);
}
String role = args[0];
String kinInputStream = args[1];
String kinOutputStream = args[2];
String collectionName = args[3];
String streamProcessorName = args[4];
Region region = Region.US_EAST_1;
RekognitionClient rekClient = RekognitionClient.builder()
.region(region)
.build();
processCollection(rekClient, streamProcessorName, kinInputStream, kinOutputStream, collectionName,
role);
startSpecificStreamProcessor(rekClient, streamProcessorName);
listStreamProcessors(rekClient);
describeStreamProcessor(rekClient, streamProcessorName);
deleteSpecificStreamProcessor(rekClient, streamProcessorName);
}
public static void listStreamProcessors(RekognitionClient rekClient) {
ListStreamProcessorsRequest request = ListStreamProcessorsRequest.builder()
.maxResults(15)
.build();
ListStreamProcessorsResponse listStreamProcessorsResult = rekClient.listStreamProcessors(request);
for (StreamProcessor streamProcessor : listStreamProcessorsResult.streamProcessors()) {
System.out.println("StreamProcessor name - " + streamProcessor.name());
System.out.println("Status - " + streamProcessor.status());
}
}
private static void describeStreamProcessor(RekognitionClient rekClient, String StreamProcessorName) {
DescribeStreamProcessorRequest streamProcessorRequest = DescribeStreamProcessorRequest.builder()
.name(StreamProcessorName)
.build();
DescribeStreamProcessorResponse describeStreamProcessorResult = rekClient
.describeStreamProcessor(streamProcessorRequest);
System.out.println("Arn - " + describeStreamProcessorResult.streamProcessorArn());
System.out.println("Input kinesisVideo stream - "
+ describeStreamProcessorResult.input().kinesisVideoStream().arn());
System.out.println("Output kinesisData stream - "
+ describeStreamProcessorResult.output().kinesisDataStream().arn());
System.out.println("RoleArn - " + describeStreamProcessorResult.roleArn());
System.out.println(
"CollectionId - "
+ describeStreamProcessorResult.settings().faceSearch().collectionId());
System.out.println("Status - " + describeStreamProcessorResult.status());
System.out.println("Status message - " + describeStreamProcessorResult.statusMessage());
System.out.println("Creation timestamp - " + describeStreamProcessorResult.creationTimestamp());
System.out.println("Last update timestamp - " + describeStreamProcessorResult.lastUpdateTimestamp());
}
private static void startSpecificStreamProcessor(RekognitionClient rekClient, String StreamProcessorName) {
try {
StartStreamProcessorRequest streamProcessorRequest = StartStreamProcessorRequest.builder()
.name(StreamProcessorName)
.build();
rekClient.startStreamProcessor(streamProcessorRequest);
System.out.println("Stream Processor " + StreamProcessorName + " started.");
} catch (RekognitionException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
private static void processCollection(RekognitionClient rekClient, String StreamProcessorName,
String kinInputStream, String kinOutputStream, String collectionName, String role) {
try {
KinesisVideoStream videoStream = KinesisVideoStream.builder()
.arn(kinInputStream)
.build();
KinesisDataStream dataStream = KinesisDataStream.builder()
.arn(kinOutputStream)
.build();
StreamProcessorOutput processorOutput = StreamProcessorOutput.builder()
.kinesisDataStream(dataStream)
.build();
StreamProcessorInput processorInput = StreamProcessorInput.builder()
.kinesisVideoStream(videoStream)
.build();
FaceSearchSettings searchSettings = FaceSearchSettings.builder()
.faceMatchThreshold(75f)
.collectionId(collectionName)
.build();
StreamProcessorSettings processorSettings = StreamProcessorSettings.builder()
.faceSearch(searchSettings)
.build();
CreateStreamProcessorRequest processorRequest = CreateStreamProcessorRequest.builder()
.name(StreamProcessorName)
.input(processorInput)
.output(processorOutput)
.roleArn(role)
.settings(processorSettings)
.build();
CreateStreamProcessorResponse response = rekClient.createStreamProcessor(processorRequest);
System.out.println("The ARN for the newly create stream processor is "
+ response.streamProcessorArn());
} catch (RekognitionException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
private static void deleteSpecificStreamProcessor(RekognitionClient rekClient, String StreamProcessorName) {
rekClient.stopStreamProcessor(a -> a.name(StreamProcessorName));
rekClient.deleteStreamProcessor(a -> a.name(StreamProcessorName));
System.out.println("Stream Processor " + StreamProcessorName + " deleted.");
}
}
使用流处理器搜索人脸(Java V1 示例)
以下示例代码显示如何使用 Java V1 调用各种流处理器操作 StartStreamProcessor,例如CreateStreamProcessor和。该示例包括一个流处理器管理器类 (StreamManager),该类提供调用流处理器操作的方法。入门类(Starter)创建一个 StreamManager 对象并调用各种操作。
配置示例:
将 Starter 类成员字段的值设置为所需值。
在 Starter 类函数
main
中,取消注释所需的函数调用。
Starter 类
//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.)
// Starter class. Use to create a StreamManager class
// and call stream processor operations.
package com.amazonaws.samples;
import com.amazonaws.samples.*;
public class Starter {
public static void main(String[] args) {
String streamProcessorName="Stream Processor Name";
String kinesisVideoStreamArn="Kinesis Video Stream Arn";
String kinesisDataStreamArn="Kinesis Data Stream Arn";
String roleArn="Role Arn";
String collectionId="Collection ID";
Float matchThreshold=50F;
try {
StreamManager sm= new StreamManager(streamProcessorName,
kinesisVideoStreamArn,
kinesisDataStreamArn,
roleArn,
collectionId,
matchThreshold);
//sm.createStreamProcessor();
//sm.startStreamProcessor();
//sm.deleteStreamProcessor();
//sm.deleteStreamProcessor();
//sm.stopStreamProcessor();
//sm.listStreamProcessors();
//sm.describeStreamProcessor();
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
StreamManager 班级
//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.)
// Stream manager class. Provides methods for calling
// Stream Processor operations.
package com.amazonaws.samples;
import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder;
import com.amazonaws.services.rekognition.model.CreateStreamProcessorRequest;
import com.amazonaws.services.rekognition.model.CreateStreamProcessorResult;
import com.amazonaws.services.rekognition.model.DeleteStreamProcessorRequest;
import com.amazonaws.services.rekognition.model.DeleteStreamProcessorResult;
import com.amazonaws.services.rekognition.model.DescribeStreamProcessorRequest;
import com.amazonaws.services.rekognition.model.DescribeStreamProcessorResult;
import com.amazonaws.services.rekognition.model.FaceSearchSettings;
import com.amazonaws.services.rekognition.model.KinesisDataStream;
import com.amazonaws.services.rekognition.model.KinesisVideoStream;
import com.amazonaws.services.rekognition.model.ListStreamProcessorsRequest;
import com.amazonaws.services.rekognition.model.ListStreamProcessorsResult;
import com.amazonaws.services.rekognition.model.StartStreamProcessorRequest;
import com.amazonaws.services.rekognition.model.StartStreamProcessorResult;
import com.amazonaws.services.rekognition.model.StopStreamProcessorRequest;
import com.amazonaws.services.rekognition.model.StopStreamProcessorResult;
import com.amazonaws.services.rekognition.model.StreamProcessor;
import com.amazonaws.services.rekognition.model.StreamProcessorInput;
import com.amazonaws.services.rekognition.model.StreamProcessorOutput;
import com.amazonaws.services.rekognition.model.StreamProcessorSettings;
public class StreamManager {
private String streamProcessorName;
private String kinesisVideoStreamArn;
private String kinesisDataStreamArn;
private String roleArn;
private String collectionId;
private float matchThreshold;
private AmazonRekognition rekognitionClient;
public StreamManager(String spName,
String kvStreamArn,
String kdStreamArn,
String iamRoleArn,
String collId,
Float threshold){
streamProcessorName=spName;
kinesisVideoStreamArn=kvStreamArn;
kinesisDataStreamArn=kdStreamArn;
roleArn=iamRoleArn;
collectionId=collId;
matchThreshold=threshold;
rekognitionClient=AmazonRekognitionClientBuilder.defaultClient();
}
public void createStreamProcessor() {
//Setup input parameters
KinesisVideoStream kinesisVideoStream = new KinesisVideoStream().withArn(kinesisVideoStreamArn);
StreamProcessorInput streamProcessorInput =
new StreamProcessorInput().withKinesisVideoStream(kinesisVideoStream);
KinesisDataStream kinesisDataStream = new KinesisDataStream().withArn(kinesisDataStreamArn);
StreamProcessorOutput streamProcessorOutput =
new StreamProcessorOutput().withKinesisDataStream(kinesisDataStream);
FaceSearchSettings faceSearchSettings =
new FaceSearchSettings().withCollectionId(collectionId).withFaceMatchThreshold(matchThreshold);
StreamProcessorSettings streamProcessorSettings =
new StreamProcessorSettings().withFaceSearch(faceSearchSettings);
//Create the stream processor
CreateStreamProcessorResult createStreamProcessorResult = rekognitionClient.createStreamProcessor(
new CreateStreamProcessorRequest().withInput(streamProcessorInput).withOutput(streamProcessorOutput)
.withSettings(streamProcessorSettings).withRoleArn(roleArn).withName(streamProcessorName));
//Display result
System.out.println("Stream Processor " + streamProcessorName + " created.");
System.out.println("StreamProcessorArn - " + createStreamProcessorResult.getStreamProcessorArn());
}
public void startStreamProcessor() {
StartStreamProcessorResult startStreamProcessorResult =
rekognitionClient.startStreamProcessor(new StartStreamProcessorRequest().withName(streamProcessorName));
System.out.println("Stream Processor " + streamProcessorName + " started.");
}
public void stopStreamProcessor() {
StopStreamProcessorResult stopStreamProcessorResult =
rekognitionClient.stopStreamProcessor(new StopStreamProcessorRequest().withName(streamProcessorName));
System.out.println("Stream Processor " + streamProcessorName + " stopped.");
}
public void deleteStreamProcessor() {
DeleteStreamProcessorResult deleteStreamProcessorResult = rekognitionClient
.deleteStreamProcessor(new DeleteStreamProcessorRequest().withName(streamProcessorName));
System.out.println("Stream Processor " + streamProcessorName + " deleted.");
}
public void describeStreamProcessor() {
DescribeStreamProcessorResult describeStreamProcessorResult = rekognitionClient
.describeStreamProcessor(new DescribeStreamProcessorRequest().withName(streamProcessorName));
//Display various stream processor attributes.
System.out.println("Arn - " + describeStreamProcessorResult.getStreamProcessorArn());
System.out.println("Input kinesisVideo stream - "
+ describeStreamProcessorResult.getInput().getKinesisVideoStream().getArn());
System.out.println("Output kinesisData stream - "
+ describeStreamProcessorResult.getOutput().getKinesisDataStream().getArn());
System.out.println("RoleArn - " + describeStreamProcessorResult.getRoleArn());
System.out.println(
"CollectionId - " + describeStreamProcessorResult.getSettings().getFaceSearch().getCollectionId());
System.out.println("Status - " + describeStreamProcessorResult.getStatus());
System.out.println("Status message - " + describeStreamProcessorResult.getStatusMessage());
System.out.println("Creation timestamp - " + describeStreamProcessorResult.getCreationTimestamp());
System.out.println("Last update timestamp - " + describeStreamProcessorResult.getLastUpdateTimestamp());
}
public void listStreamProcessors() {
ListStreamProcessorsResult listStreamProcessorsResult =
rekognitionClient.listStreamProcessors(new ListStreamProcessorsRequest().withMaxResults(100));
//List all stream processors (and state) returned from Rekognition
for (StreamProcessor streamProcessor : listStreamProcessorsResult.getStreamProcessors()) {
System.out.println("StreamProcessor name - " + streamProcessor.getName());
System.out.println("Status - " + streamProcessor.getStatus());
}
}
}