aws 亚马逊
1.简介
Amazon Rekognition是提供图像和视频分析服务的Amazon Web Service(AWS)。 您可以提供图像或视频,该服务将检测物体,人物和场景。 检测到的面部也可以与一组已知面部进行匹配。 这允许实现用例,例如用户验证,人数统计或公共安全。
该服务基于亚马逊的深度学习技术,该技术也在其他服务中使用。 要使用该服务,不需要有关基础技术的知识,就可以简单地调用现有的API并处理调用的结果。
有两种不同的API集:一种用于分析图像,另一种用于视频分析。 两者都可以执行您的应用程序可以使用的对象检测和识别。 例如,您可以开发一个应用程序,使用户可以通过脸部或某些对象搜索他们的照片集。 因此,您将让您的应用程序将图像或视频数据发送到Amazon Rekognition,并使其返回有关上传资料的元数据。 您的应用程序使用此元数据管理数据库,并允许用户在其中进行搜索。
通过视频API,您可以跟踪存储的视频中或来自实时摄像机的视频流中的人。 通过这种方式,可以通知您是否在存储的视频中或在实时摄像机的前面检测到已知人物。
2.基础知识
在开始之前,我们必须学习一些有关图像检测和识别的概念。
label
可以引用图像或视频中的不同项目:
- 对象:花,树,桌子等
- 事件:婚礼,生日聚会等
- 概念:景观,傍晚,自然等
- 活动:下车等。
Amazon Rekognition具有专门的操作,可将所有检测到的标签返回到图像或视频上。
Rekognition服务还将返回其在图像或视频中检测到的面部以及地标信息(例如眼位和检测到的情绪)。 您可以将人员注册到集合中,并让Amazon在提交的图像上搜索这些人员。 后一个功能称为“面部搜索”。
在视频上,可以通过不同的帧跟踪一个人。 该服务提供有关检测的面部和框内位置的信息。
作为一项特殊功能,Amazon Rekognition还可以识别图像和视频中的数千名名人。 跟踪信息告诉您某个演员出现在电影的哪个部分。
一个有趣的选项是检测图像中的文本并将其转换为机器可读的文本。 这样,您就可以检测图像中的车牌号或开发可帮助残障人士识别餐厅中路牌或菜单卡的应用程序。
最后但并非最不重要的一点是,Amazon Rekognition Service还可以帮助检测图像和视频上的不安全内容,例如裸露,泳装或内衣。
图像分析的API是同步的,并且将JSON文档作为输入并返回JSON响应。 图像可以是Amazon S3存储桶中提供的jpeg或png文件,也可以是byte64编码的图像。
随着视频分析花费更多时间,视频API是异步的。 这意味着您通过通过Amazon S3存储桶提供视频来开始处理,后端通过向SNS主题发送消息来通知您有关结果。 Amazon SNS是一种消息服务,用于使用发布/订阅范式进行通知。
如果您想分析流视频内容,则视频是通过Amazon Kinesis提供的,后端通过必须实现的流处理器通知您有关识别的信息。
要搜索面部,您必须创建一个包含要检测的面部的集合。 由于这些面Kong存储在Amazon Rekognition服务中,因此对这些集合的操作也称为“存储操作”。 与这些“存储操作”相反,可以在不将任何信息存储在Amazon服务器上的情况下调用“非存储操作”。 这些“非存储操作”包括检测标签和面Kong,识别名人或检测文本的操作。
“存储操作”将有关检测到的面部的信息存储在Amazon Rekognition服务中。 此信息也称为模板。 由深度学习算法的特定版本计算出的模板可能与新版本不兼容。 因此,必须使用新版本的算法使用相同的图像数据再次计算模板。 正如亚马逊所说,“模型版本”与带有面Kong的集合有关。 由于无法将现有集合升级到新的“模型版本”,因此必须创建一个新集合(对于新的“模型版本”)并再次添加所有图像。 否则,随着时间的推移,您可能会遇到兼容性问题。
3.项目设置
在本教程中,我们将使用Java作为编程语言,并使用maven作为构建工具。 我们将创建一个小示例应用程序,以演示Amazon Rekognition的基本功能。
它要求您已安装Java> = 1.8和Maven> = 3.0。
第一步,我们将在命令行上创建一个简单的maven项目:
mvn archetype:generate -DgroupId=com.javacodegeeks.aws -DartifactId=rekognition -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
此命令将在文件系统中创建以下结构:
|-- src
| |-- main
| | `-- java
| | `-- com
| | `-- javacodegeeks
| | `-- aws
| `-- test
| | `-- java
| | `-- com
| | `-- javacodegeeks
| | `-- aws
`-- pom.xml
pom.xml
定义了我们将用作依赖项的库:
<properties>
<aws.version>1.11.401</aws.version>
</properties>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-rekognition</artifactId>
<version>${aws.version}</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-core</artifactId>
<version>${aws.version}</version>
</dependency>
</dependencies>
工件aws-java-sdk-rekognition
包含用于Amazon Rekognition Web服务的即用型Java API,而工件aws-java-sdk-core
包含一组较大的Amazon AWS开发工具包使用的代码。 由于aws-java-sdk-core
是aws-java-sdk-rekognition
的可传递依赖aws-java-sdk-rekognition
; 因此,您也可以忽略它,因为maven会自动获取它。
我们的Maven工件的结果应该是一个包含所有依赖项的jar文件,以便我们可以在命令行上轻松执行它。 因此,我们将maven-assembly-plugin
添加到我们的构建中,并告诉它哪个类包含我们要执行的main()
方法:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.javacodegeeks.aws.App</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
由于com.javacodegeeks.aws.App
类是之前由maven原型插件创建的,因此我们现在可以构建模块:
mvn clean package
成功构建之后,我们可以通过以下方式启动应用程序:
java -jar target\rekognition-1.0-SNAPSHOT-jar-with-dependencies.jar
现在,我们拥有一个运行中的构建,我们必须创建一个Amazon AWS账户。 因此,打开https://aws.amazon.com/ ,选择“创建一个AWS账户”并按照说明进行操作。 在此注册过程中,您将收到一个电话,并使用电话的键盘输入PIN。
一旦可以访问您的AWS账户,就应该创建一个有权访问Amazon Rekognition API的用户。 例如, 在此说明如何执行此操作。
在这两个步骤的最后,您应该拥有一个带ID和密钥的AWS访问密钥。 这些凭证可以存储在本地系统上的AWS凭证配置文件中:
- 在Linux,macOS或Unix上:〜/ .aws / credentials
- 在Windows上:C:\ Users \ USERNAME \ .aws \ credentials(其中USERNAME是您的用户名)
该文件包含以下几行:
aws_access_key_id =
aws_secret_access_key =
用您的帐户的实际值替换右侧的占位符。
此外,您还可以在AWS配置文件中设置要使用的默认AWS区域:
- 在Linux,macOS或Unix上:〜/ .aws / config
- 在Windows上:C:\ Users \ USERNAME \ .aws \ config(其中USERNAME是您的用户名)
配置文件具有以下内容:
region =
在右侧的占位符替换为您的AWS区域(例如us-east-1或eu-west-1)。
4.图像操作
在本章中,我们将仔细研究可用的图像操作。
4.1检测标签
首先,我们让Amazon Rekognition在提供的图像上检测标签。
因此,我们通过一些简单的代码通过main()
方法扩展了App
类,这些代码通过命令行参数调用我们的新类DetectLabels
:
public class App {
public static void main(String[] args) {
if (args.length == 0) {
System.err.println("Please provide at least one argument.");
return;
}
switch (args[0]) {
case "detect-labels":
DetectLabels detectLabels = new DetectLabels();
detectLabels.run(args);
break;
default:
System.err.println("Unknown argument: " + args[0]);
return;
}
}
}
在下一步中,我们创建一个简单的工厂类来实例化AmazonRekognition
对象。 此实例提供对Amazon Rekognition的所有API方法的访问:
public class ClientFactory {
public static AmazonRekognition createClient() {
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setConnectionTimeout(30000);
clientConfig.setRequestTimeout(60000);
clientConfig.setProtocol(Protocol.HTTPS);
AWSCredentialsProvider credentialsProvider = new ProfileCredentialsProvider();
return AmazonRekognitionClientBuilder
.standard()
.withClientConfiguration(clientConfig)
.withCredentials(credentialsProvider)
.withRegion("eu-west-1")
.build();
}
}
Amazon AWS开发工具包使用构建器模式来创建合适的配置。 方法standard()
将所有选项初始化为默认值。 之后,我们提供特定的客户端配置。 这应该演示如何调整例如连接超时和请求超时。 除此之外,我们还将HTTPS
设置为传输协议。 可以为客户端设置许多其他选项。
正如我们之前创建的credentials
文件一样,我们可以使用ProfileCredentialsProvider
将AWS凭证传递给应用程序。 这将使代码检查credentials
文件并从那里获取凭据。
由于我们已将此信息存储在config
文件中,因此可以省略代码中提供的区域。 在这里,它仅显示我们使用构建器API可以完全控制所有选项。
在实现代码以创建Amazon Rekognition客户端之后,我们可以进一步了解如何检测提供的图像上的标签:
public class DetectLabels {
public void run(String[] args) {
if (args.length < 2) {
System.err.println("Please provide an image.");
return;
}
String imgPath = args[1];
byte[] bytes;
try {
bytes = Files.readAllBytes(Paths.get(imgPath));
} catch (IOException e) {
System.err.println("Failed to load image: " + e.getMessage());
return;
}
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
AmazonRekognition rekognition = ClientFactory.createClient();
DetectLabelsRequest request = new DetectLabelsRequest()
.withImage(new Image().withBytes(byteBuffer))
.withMaxLabels(10);
DetectLabelsResult result = rekognition.detectLabels(request);
List
我们传递给run()
方法的String
数组由命令行中的参数填充。 第一个参数用于调用上面的DetectLabels
类(请参阅App
类)。 因此,我们可以使用第二个参数来提供图像。 然后使用两个参数调用该应用程序:
java -jar target/rekognition-1.0-SNAPSHOT-jar-with-dependencies.jar detect-labels img/work.jpg
当第一行检查命令行参数是否存在时,接下来的几行将图像文件的内容读取到byte
数组中,并将其包装到