分析存储在 Amazon S3 存储桶中的图像 - Amazon Rekognition

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

分析存储在 Amazon S3 存储桶中的图像

Amazon Rekognition Image 可以分析存储在 Amazon S3 存储桶中的图像或作为图像字节提供的图像。

在本主题中,您将使用 DetectLabelsAPI 操作来检测存储在 Amazon S3 存储桶中的图像(JPEG 或 PNG)中的对象、概念和场景。使用图像输入参数将图像传递给 Amazon Rekognition Image API 操作。在 Image 中,您指定 S3Object 对象属性来引用存储在 S3 存储桶中的图像。存储在 Amazon S3 存储桶中的图像的图像字节不需要 base64 编码。有关更多信息,请参阅 图像规格

示例请求

DetectLabels 的示例 JSON 请求中,源图像(input.jpg)从名为 MyBucket 的 Amazon S3 存储桶加载。请注意,包含 S3 对象的 S3 存储桶的区域必须与您用于 Amazon Rekognition Image 操作的区域匹配。

{ "Image": { "S3Object": { "Bucket": "MyBucket", "Name": "input.jpg" } }, "MaxLabels": 10, "MinConfidence": 75 }

以下示例使用了各种 AWS SDK 和 to call AWS CLI DetectLabels。有关 DetectLabels 操作响应的信息,请参阅DetectLabels 响应

检测图像中的标签
  1. 如果您尚未执行以下操作,请:

    1. 使用 AmazonRekognitionFullAccessAmazonS3ReadOnlyAccess 权限创建或更新用户。有关更多信息,请参阅 步骤 1:设置 AWS 账户并创建用户

    2. 安装和配置 AWS CLI 和 AWS SDK。有关更多信息,请参阅 第 2 步:设置 AWS CLI 和 AWS 软件开发工具包。确保您已为调用 API 操作的用户授予适当的编程访问权限,有关如何执行此操作的说明,请参阅授予编程式访问权限

  2. 将其中包含一个或多个对象(如树木、房屋和船)的图像上传到您的 S3 存储桶。图像的格式必须为 .jpg.png

    有关说明,请参阅《Amazon Simple Storage Service 用户指南》中的将对象上传到 Amazon S3

  3. 使用以下示例调用 DetectLabels 操作。

    Java

    此示例显示在输入图像中检测到的标签的列表。将bucketphoto的值替换为您在步骤 2 中使用的 Amazon S3 存储桶和图像的名称。

    //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.) package com.amazonaws.samples; import com.amazonaws.services.rekognition.AmazonRekognition; import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder; import com.amazonaws.services.rekognition.model.AmazonRekognitionException; import com.amazonaws.services.rekognition.model.DetectLabelsRequest; import com.amazonaws.services.rekognition.model.DetectLabelsResult; import com.amazonaws.services.rekognition.model.Image; import com.amazonaws.services.rekognition.model.Label; import com.amazonaws.services.rekognition.model.S3Object; import java.util.List; public class DetectLabels { public static void main(String[] args) throws Exception { String photo = "input.jpg"; String bucket = "bucket"; AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder.defaultClient(); DetectLabelsRequest request = new DetectLabelsRequest() .withImage(new Image() .withS3Object(new S3Object() .withName(photo).withBucket(bucket))) .withMaxLabels(10) .withMinConfidence(75F); try { DetectLabelsResult result = rekognitionClient.detectLabels(request); List <Label> labels = result.getLabels(); System.out.println("Detected labels for " + photo); for (Label label: labels) { System.out.println(label.getName() + ": " + label.getConfidence().toString()); } } catch(AmazonRekognitionException e) { e.printStackTrace(); } } }
    AWS CLI

    此示例显示 detect-labels CLI 操作的 JSON 输出。将bucketphoto的值替换为您在步骤 2 中使用的 Amazon S3 存储桶和图像的名称。将创建 Rekognition 会话的行中的profile_name值替换为您的开发人员资料的名称。

    aws rekognition detect-labels --image '{ "S3Object": { "Bucket": "bucket-name", "Name": "file-name" } }' \ --features GENERAL_LABELS IMAGE_PROPERTIES \ --settings '{"ImageProperties": {"MaxDominantColors":1}, {"GeneralLabels":{"LabelInclusionFilters":["Cat"]}}}' \ --profile profile-name \ --region us-east-1

    如果您使用的是 Windows,则可能需要转义引号,如下例所示。

    aws rekognition detect-labels --image "{\"S3Object\":{\"Bucket\":\"bucket-name\",\"Name\":\"file-name\"}}" --features GENERAL_LABELS IMAGE_PROPERTIES --settings "{\"GeneralLabels\":{\"LabelInclusionFilters\":[\"Car\"]}}" --profile profile-name --region us-east-1
    Java V2

    此代码取自 AWS 文档 SDK 示例 GitHub 存储库。请在此处查看完整示例。

    //snippet-start:[rekognition.java2.detect_labels.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.Image; import software.amazon.awssdk.services.rekognition.model.DetectLabelsRequest; import software.amazon.awssdk.services.rekognition.model.DetectLabelsResponse; import software.amazon.awssdk.services.rekognition.model.Label; import software.amazon.awssdk.services.rekognition.model.RekognitionException; import software.amazon.awssdk.services.rekognition.model.S3Object; import java.util.List; /** * 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 DetectLabels { public static void main(String[] args) { final String usage = "\n" + "Usage: " + " <bucket> <image>\n\n" + "Where:\n" + " bucket - The name of the Amazon S3 bucket that contains the image (for example, ,ImageBucket)." + " image - The name of the image located in the Amazon S3 bucket (for example, Lake.png). \n\n"; if (args.length != 2) { System.out.println(usage); System.exit(1); } String bucket = args[0]; String image = args[1]; Region region = Region.US_WEST_2; RekognitionClient rekClient = RekognitionClient.builder() .region(region) .credentialsProvider(ProfileCredentialsProvider.create("profile-name")) .build(); getLabelsfromImage(rekClient, bucket, image); rekClient.close(); } // snippet-start:[rekognition.java2.detect_labels_s3.main] public static void getLabelsfromImage(RekognitionClient rekClient, String bucket, String image) { try { S3Object s3Object = S3Object.builder() .bucket(bucket) .name(image) .build() ; Image myImage = Image.builder() .s3Object(s3Object) .build(); DetectLabelsRequest detectLabelsRequest = DetectLabelsRequest.builder() .image(myImage) .maxLabels(10) .build(); DetectLabelsResponse labelsResponse = rekClient.detectLabels(detectLabelsRequest); List<Label> labels = labelsResponse.labels(); System.out.println("Detected labels for the given photo"); for (Label label: labels) { System.out.println(label.name() + ": " + label.confidence().toString()); } } catch (RekognitionException e) { System.out.println(e.getMessage()); System.exit(1); } } // snippet-end:[rekognition.java2.detect_labels.main] }
    Python

    此示例显示在输入图像中检测到的标签。将bucketphoto的值替换为您在步骤 2 中使用的 Amazon S3 存储桶和图像的名称。将创建 Rekognition 会话的行中的profile_name值替换为您的开发人员资料的名称。

    #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.) import boto3 def detect_labels(photo, bucket): session = boto3.Session(profile_name='profile-name') client = session.client('rekognition') response = client.detect_labels(Image={'S3Object':{'Bucket':bucket,'Name':photo}}, MaxLabels=10, # Uncomment to use image properties and filtration settings #Features=["GENERAL_LABELS", "IMAGE_PROPERTIES"], #Settings={"GeneralLabels": {"LabelInclusionFilters":["Cat"]}, # "ImageProperties": {"MaxDominantColors":10}} ) print('Detected labels for ' + photo) print() for label in response['Labels']: print("Label: " + label['Name']) print("Confidence: " + str(label['Confidence'])) print("Instances:") for instance in label['Instances']: print(" Bounding box") print(" Top: " + str(instance['BoundingBox']['Top'])) print(" Left: " + str(instance['BoundingBox']['Left'])) print(" Width: " + str(instance['BoundingBox']['Width'])) print(" Height: " + str(instance['BoundingBox']['Height'])) print(" Confidence: " + str(instance['Confidence'])) print() print("Parents:") for parent in label['Parents']: print(" " + parent['Name']) print("Aliases:") for alias in label['Aliases']: print(" " + alias['Name']) print("Categories:") for category in label['Categories']: print(" " + category['Name']) print("----------") print() if "ImageProperties" in str(response): print("Background:") print(response["ImageProperties"]["Background"]) print() print("Foreground:") print(response["ImageProperties"]["Foreground"]) print() print("Quality:") print(response["ImageProperties"]["Quality"]) print() return len(response['Labels']) def main(): photo = 'photo-name' bucket = 'bucket-name' label_count = detect_labels(photo, bucket) print("Labels detected: " + str(label_count)) if __name__ == "__main__": main()
    Node.Js

    此示例显示与图像中检测到的标签相关的信息。

    photo 的值更改为包含一张或多张名人人脸的图像的路径和文件名。将bucket的值更改为包含所提供图像文件的 S3 存储桶的名称。将REGION的值更改为与您的账户关联的区域名称。将创建 Rekognition 会话的行中的profile_name值替换为您的开发人员资料的名称。

    // Import required AWS SDK clients and commands for Node.js import { DetectLabelsCommand } from "@aws-sdk/client-rekognition"; import { RekognitionClient } from "@aws-sdk/client-rekognition"; import {fromIni} from '@aws-sdk/credential-providers'; // Set the AWS Region. const REGION = "region-name"; //e.g. "us-east-1" // Create SNS service object. const rekogClient = new RekognitionClient({ region: REGION, credentials: fromIni({ profile: 'profile-name', }), }); const bucket = 'bucket-name' const photo = 'photo-name' // Set params const params = {For example, to grant Image: { S3Object: { Bucket: bucket, Name: photo }, }, } const detect_labels = async () => { try { const response = await rekogClient.send(new DetectLabelsCommand(params)); console.log(response.Labels) response.Labels.forEach(label =>{ console.log(`Confidence: ${label.Confidence}`) console.log(`Name: ${label.Name}`) console.log('Instances:') label.Instances.forEach(instance => { console.log(instance) }) console.log('Parents:') label.Parents.forEach(name => { console.log(name) }) console.log("-------") }) return response; // For unit tests. } catch (err) { console.log("Error", err); } }; detect_labels();
    .NET

    此示例显示在输入图像中检测到的标签的列表。将bucketphoto的值替换为您在步骤 2 中使用的 Amazon S3 存储桶和图像的名称。

    //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.) using System; using Amazon.Rekognition; using Amazon.Rekognition.Model; public class DetectLabels { public static void Example() { String photo = "input.jpg"; String bucket = "bucket"; AmazonRekognitionClient rekognitionClient = new AmazonRekognitionClient(); DetectLabelsRequest detectlabelsRequest = new DetectLabelsRequest() { Image = new Image() { S3Object = new S3Object() { Name = photo, Bucket = bucket }, }, MaxLabels = 10, MinConfidence = 75F }; try { DetectLabelsResponse detectLabelsResponse = rekognitionClient.DetectLabels(detectlabelsRequest); Console.WriteLine("Detected labels for " + photo); foreach (Label label in detectLabelsResponse.Labels) Console.WriteLine("{0}: {1}", label.Name, label.Confidence); } catch (Exception e) { Console.WriteLine(e.Message); } } }
    Ruby

    此示例显示在输入图像中检测到的标签的列表。将bucketphoto的值替换为您在步骤 2 中使用的 Amazon S3 存储桶和图像的名称。

    # Add to your Gemfile # gem 'aws-sdk-rekognition' require 'aws-sdk-rekognition' credentials = Aws::Credentials.new( ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'] ) bucket = 'bucket' # the bucket name without s3:// photo = 'photo' # the name of file client = Aws::Rekognition::Client.new credentials: credentials attrs = { image: { s3_object: { bucket: bucket, name: photo }, }, max_labels: 10 } response = client.detect_labels attrs puts "Detected labels for: #{photo}" response.labels.each do |label| puts "Label: #{label.name}" puts "Confidence: #{label.confidence}" puts "Instances:" label['instances'].each do |instance| box = instance['bounding_box'] puts " Bounding box:" puts " Top: #{box.top}" puts " Left: #{box.left}" puts " Width: #{box.width}" puts " Height: #{box.height}" puts " Confidence: #{instance.confidence}" end puts "Parents:" label.parents.each do |parent| puts " #{parent.name}" end puts "------------" puts "" end

响应示例

来自 DetectLabels 的响应是在图像中检测到的一组标签和检测标签时所依据的置信度级别。

当您对图像执行 DetectLabels 操作时,Amazon Rekognition 会返回与以下示例响应类似的输出。

响应显示操作检测到了多个标签,包括“人”、“交通工具”和“汽车”。每个标签均有一个关联的置信度级别。例如,检测算法对图像包含人的置信度为 98.991432%。

响应还包括了 Parents 数组中一个标签的原级标签。例如,标签“汽车”有两个父标签,分别名为“车辆”和“运输”。

常见对象标签的响应包括边界框信息,针对输入图像上标签的位置。例如,“人”标签有包含两个边界框的实例数组。这两个边界框是在图像中检测到的两个人的位置。

字段 LabelModelVersion 包含由 DetectLabels 使用的检测模型的版本号。

有关使用 DetectLabels 操作的更多信息,请参阅检测对象和概念

{ { "Labels": [ { "Name": "Vehicle", "Confidence": 99.15271759033203, "Instances": [], "Parents": [ { "Name": "Transportation" } ] }, { "Name": "Transportation", "Confidence": 99.15271759033203, "Instances": [], "Parents": [] }, { "Name": "Automobile", "Confidence": 99.15271759033203, "Instances": [], "Parents": [ { "Name": "Vehicle" }, { "Name": "Transportation" } ] }, { "Name": "Car", "Confidence": 99.15271759033203, "Instances": [ { "BoundingBox": { "Width": 0.10616336017847061, "Height": 0.18528179824352264, "Left": 0.0037978808395564556, "Top": 0.5039216876029968 }, "Confidence": 99.15271759033203 }, { "BoundingBox": { "Width": 0.2429988533258438, "Height": 0.21577216684818268, "Left": 0.7309805154800415, "Top": 0.5251884460449219 }, "Confidence": 99.1286392211914 }, { "BoundingBox": { "Width": 0.14233611524105072, "Height": 0.15528248250484467, "Left": 0.6494812965393066, "Top": 0.5333095788955688 }, "Confidence": 98.48368072509766 }, { "BoundingBox": { "Width": 0.11086395382881165, "Height": 0.10271988064050674, "Left": 0.10355594009160995, "Top": 0.5354844927787781 }, "Confidence": 96.45606231689453 }, { "BoundingBox": { "Width": 0.06254628300666809, "Height": 0.053911514580249786, "Left": 0.46083059906959534, "Top": 0.5573825240135193 }, "Confidence": 93.65448760986328 }, { "BoundingBox": { "Width": 0.10105438530445099, "Height": 0.12226245552301407, "Left": 0.5743985772132874, "Top": 0.534368634223938 }, "Confidence": 93.06217193603516 }, { "BoundingBox": { "Width": 0.056389667093753815, "Height": 0.17163699865341187, "Left": 0.9427769780158997, "Top": 0.5235804319381714 }, "Confidence": 92.6864013671875 }, { "BoundingBox": { "Width": 0.06003860384225845, "Height": 0.06737709045410156, "Left": 0.22409997880458832, "Top": 0.5441341400146484 }, "Confidence": 90.4227066040039 }, { "BoundingBox": { "Width": 0.02848697081208229, "Height": 0.19150497019290924, "Left": 0.0, "Top": 0.5107086896896362 }, "Confidence": 86.65286254882812 }, { "BoundingBox": { "Width": 0.04067881405353546, "Height": 0.03428703173995018, "Left": 0.316415935754776, "Top": 0.5566273927688599 }, "Confidence": 85.36471557617188 }, { "BoundingBox": { "Width": 0.043411049991846085, "Height": 0.0893595889210701, "Left": 0.18293385207653046, "Top": 0.5394920110702515 }, "Confidence": 82.21705627441406 }, { "BoundingBox": { "Width": 0.031183116137981415, "Height": 0.03989990055561066, "Left": 0.2853088080883026, "Top": 0.5579366683959961 }, "Confidence": 81.0157470703125 }, { "BoundingBox": { "Width": 0.031113790348172188, "Height": 0.056484755128622055, "Left": 0.2580395042896271, "Top": 0.5504819750785828 }, "Confidence": 56.13441467285156 }, { "BoundingBox": { "Width": 0.08586374670267105, "Height": 0.08550430089235306, "Left": 0.5128012895584106, "Top": 0.5438792705535889 }, "Confidence": 52.37760925292969 } ], "Parents": [ { "Name": "Vehicle" }, { "Name": "Transportation" } ] }, { "Name": "Human", "Confidence": 98.9914321899414, "Instances": [], "Parents": [] }, { "Name": "Person", "Confidence": 98.9914321899414, "Instances": [ { "BoundingBox": { "Width": 0.19360728561878204, "Height": 0.2742200493812561, "Left": 0.43734854459762573, "Top": 0.35072067379951477 }, "Confidence": 98.9914321899414 }, { "BoundingBox": { "Width": 0.03801717236638069, "Height": 0.06597328186035156, "Left": 0.9155802130699158, "Top": 0.5010883808135986 }, "Confidence": 85.02790832519531 } ], "Parents": [] } ], "LabelModelVersion": "2.0" } }