Displaying Bounding Boxes - Amazon Rekognition

英語の翻訳が提供されている場合で、内容が矛盾する場合には、英語版がオリジナルとして取り扱われます。翻訳は機械翻訳により提供されています。

Displaying Bounding Boxes

Amazon Rekognition Image オペレーションは、画像内で検出されたアイテムの境界ボックス座標を返すことができます。たとえば、DetectFaces オペレーションは、画像内で検出された各顔に境界ボックス (BoundingBox) を返します。境界ボックス座標を使用して、検出されたアイテムの周囲にボックスを表示できます。たとえば、次の図は、顔を囲む境界ボックスを示しています。

BoundingBox には以下のプロパティがあります。

  • Height – The height of the bounding box as a ratio of the overall image height.

  • Left – The left coordinate of the bounding box as a ratio of overall image width.

  • Top – The top coordinate of the bounding box as a ratio of overall image height.

  • Width – The width of the bounding box as a ratio of the overall image width.

各 BoundingBox プロパティには、0 から 1 の値があります。各プロパティ値は全体の画像幅 (Left および Width) または高さ (Height および Top) の比率です。たとえば、入力イメージが 700 x 200 ピクセルの場合、境界ボックスの 左上の座標は 350 x 50 ピクセルで、 API は Left 値 0.5 (350/700) および Top 値 0.25 (50/200) を返します。

次の図は、各境界ボックスのプロパティがカバーする画像の範囲を示しています。

適切な場所に適切なサイズで境界ボックスを表示するには、ピクセル値を取得するには、BoundingBox 値にイメージの幅または高さ (必要な値に応じて) を掛ける必要があります。境界ボックスを表示するには、ピクセル値を使用します。たとえば、前の画像のピクセルのディメンションは、幅 608x 高さ 588 です。顔の境界ボックスの値は次のとおりです。

BoundingBox.Left: 0.3922065 Bounding.Top: 0.15567766 BoundingBox.Width: 0.284666 BoundingBox.Height: 0.2930403

顔の境界ボックスの位置 (ピクセル) は次のように計算されます。

Left coordinate = BoundingBox.Left (0.3922065) * image width (608) = 238

Top coordinate = BoundingBox.Top (0.15567766) * image height (588) = 91

Face width = BoundingBox.Width (0.284666) * image width (608) = 173

Face height = BoundingBox.Height (0.2930403) * image height (588) = 172

これらの値を使用して、面の周囲に境界ボックスを表示します。

注記

画像の向きはさまざまです。アプリケーションのなかには、画像を回転させて補正方向で表示する必要がある場合があります。境界ボックスの座標は、画像の向きに影響されます。正しい位置に境界ボックスを表示する前に、座標を変換する必要があるかもしれません。詳細については、「Getting Image Orientation and Bounding Box Coordinates」を参照してください。

次の例は、DetectFaces を呼び出すことによって検出された顔の周囲に境界ボックスを表示する方法を示しています。例では、画像が 0 度に向けられていると仮定する。この例では、Amazon S3 バケットから画像をダウンロードする方法も示しています。

境界ボックスを表示するには

  1. まだ実行していない場合:

    1. AmazonRekognitionFullAccessAmazonS3ReadOnlyAccess のアクセス権限を持つ IAM ユーザーを作成または更新します。詳細については、「Step 1: Set Up an AWS Account and Create an IAM User」を参照してください。

    2. AWS CLI と AWS SDK をインストールして設定します。詳細については、「Step 2: Set Up the AWS CLI and AWS SDKs」を参照してください。

  2. 以下の例を使用して、DetectFaces オペレーションを呼び出します。bucket の値を、イメージファイルが保存される Amazon S3 バケットに変更します。photo の値は、イメージファイル (.jpg 形式または .png 形式) のファイル名に変更します。

    Java
    //Loads images, detects faces and draws bounding boxes.Determines exif orientation, if necessary. package com.amazonaws.samples; //Import the basic graphics classes. import java.awt.*; import java.awt.image.BufferedImage; import java.util.List; import javax.imageio.ImageIO; import javax.swing.*; import com.amazonaws.services.rekognition.AmazonRekognition; import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder; import com.amazonaws.services.rekognition.model.BoundingBox; import com.amazonaws.services.rekognition.model.DetectFacesRequest; import com.amazonaws.services.rekognition.model.DetectFacesResult; import com.amazonaws.services.rekognition.model.FaceDetail; import com.amazonaws.services.rekognition.model.Image; import com.amazonaws.services.rekognition.model.S3Object; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.S3ObjectInputStream; // Calls DetectFaces and displays a bounding box around each detected image. public class DisplayFaces extends JPanel { private static final long serialVersionUID = 1L; BufferedImage image; static int scale; DetectFacesResult result; public DisplayFaces(DetectFacesResult facesResult, BufferedImage bufImage) throws Exception { super(); scale = 1; // increase to shrink image size. result = facesResult; image = bufImage; } // Draws the bounding box around the detected faces. public void paintComponent(Graphics g) { float left = 0; float top = 0; int height = image.getHeight(this); int width = image.getWidth(this); Graphics2D g2d = (Graphics2D) g; // Create a Java2D version of g. // Draw the image. g2d.drawImage(image, 0, 0, width / scale, height / scale, this); g2d.setColor(new Color(0, 212, 0)); // Iterate through faces and display bounding boxes. List<FaceDetail> faceDetails = result.getFaceDetails(); for (FaceDetail face : faceDetails) { BoundingBox box = face.getBoundingBox(); left = width * box.getLeft(); top = height * box.getTop(); g2d.drawRect(Math.round(left / scale), Math.round(top / scale), Math.round((width * box.getWidth()) / scale), Math.round((height * box.getHeight())) / scale); } } public static void main(String arg[]) throws Exception { String photo = "photo.png"; String bucket = "bucket"; int height = 0; int width = 0; // Get the image from an S3 Bucket AmazonS3 s3client = AmazonS3ClientBuilder.defaultClient(); com.amazonaws.services.s3.model.S3Object s3object = s3client.getObject(bucket, photo); S3ObjectInputStream inputStream = s3object.getObjectContent(); BufferedImage image = ImageIO.read(inputStream); DetectFacesRequest request = new DetectFacesRequest() .withImage(new Image().withS3Object(new S3Object().withName(photo).withBucket(bucket))); width = image.getWidth(); height = image.getHeight(); // Call DetectFaces AmazonRekognition amazonRekognition = AmazonRekognitionClientBuilder.defaultClient(); DetectFacesResult result = amazonRekognition.detectFaces(request); //Show the bounding box info for each face. List<FaceDetail> faceDetails = result.getFaceDetails(); for (FaceDetail face : faceDetails) { BoundingBox box = face.getBoundingBox(); float left = width * box.getLeft(); float top = height * box.getTop(); System.out.println("Face:"); System.out.println("Left: " + String.valueOf((int) left)); System.out.println("Top: " + String.valueOf((int) top)); System.out.println("Face Width: " + String.valueOf((int) (width * box.getWidth()))); System.out.println("Face Height: " + String.valueOf((int) (height * box.getHeight()))); System.out.println(); } // Create frame and panel. JFrame frame = new JFrame("RotateImage"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DisplayFaces panel = new DisplayFaces(result, image); panel.setPreferredSize(new Dimension(image.getWidth() / scale, image.getHeight() / scale)); frame.setContentPane(panel); frame.pack(); frame.setVisible(true); } }
    Python
    import boto3 import io from PIL import Image, ImageDraw, ExifTags, ImageColor def show_faces(photo,bucket): client=boto3.client('rekognition') # Load image from S3 bucket s3_connection = boto3.resource('s3') s3_object = s3_connection.Object(bucket,photo) s3_response = s3_object.get() stream = io.BytesIO(s3_response['Body'].read()) image=Image.open(stream) #Call DetectFaces response = client.detect_faces(Image={'S3Object': {'Bucket': bucket, 'Name': photo}}, Attributes=['ALL']) imgWidth, imgHeight = image.size draw = ImageDraw.Draw(image) # calculate and display bounding boxes for each detected face print('Detected faces for ' + photo) for faceDetail in response['FaceDetails']: print('The detected face is between ' + str(faceDetail['AgeRange']['Low']) + ' and ' + str(faceDetail['AgeRange']['High']) + ' years old') box = faceDetail['BoundingBox'] left = imgWidth * box['Left'] top = imgHeight * box['Top'] width = imgWidth * box['Width'] height = imgHeight * box['Height'] print('Left: ' + '{0:.0f}'.format(left)) print('Top: ' + '{0:.0f}'.format(top)) print('Face Width: ' + "{0:.0f}".format(width)) print('Face Height: ' + "{0:.0f}".format(height)) points = ( (left,top), (left + width, top), (left + width, top + height), (left , top + height), (left, top) ) draw.line(points, fill='#00d400', width=2) # Alternatively can draw rectangle. However you can't set line width. #draw.rectangle([left,top, left + width, top + height], outline='#00d400') image.show() return len(response['FaceDetails']) def main(): bucket="bucket" photo="photo" faces_count=show_faces(photo,bucket) print("faces detected: " + str(faces_count)) if __name__ == "__main__": main()