Mendapatkan orientasi citra dan koordinat kotak pembatas - Amazon Rekognition

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mendapatkan orientasi citra dan koordinat kotak pembatas

Aplikasi yang menggunakan Amazon Rekognition Image umumnya perlu menampilkan citra yang terdeteksi oleh operasi Amazon Rekognition Image dan kotak di sekitar wajah yang terdeteksi. Untuk menampilkan gambar dengan benar di aplikasi Anda, Anda perlu mengetahui orientasi gambar. Anda mungkin perlu memperbaiki orientasi ini. Untuk beberapa file .jpg, orientasi citra terdapat dalam metadata format file citra yang Tidak Dapat Diubah (Exif).

Untuk menampilkan kotak di sekitar wajah, Anda memerlukan koordinat untuk kotak pembatas wajah. Jika kotak tidak berorientasi dengan benar, Anda mungkin perlu menyesuaikan koordinat tersebut. Amazon Rekognition Operasi deteksi wajah gambar mengembalikan koordinat kotak pembatas untuk setiap wajah yang terdeteksi, tetapi tidak memperkirakan koordinat untuk file.jpg tanpa metadata Exif.

Contoh berikut menunjukkan cara mendapatkan koordinat kotak pembatas untuk wajah yang terdeteksi dalam gambar.

Gunakan informasi dalam contoh ini untuk memastikan bahwa citra Anda berorientasi dengan benar dan kotak pembatas ditampilkan di lokasi yang benar dalam aplikasi Anda.

Karena kode yang digunakan untuk memutar dan menampilkan citra dan kotak pembatas tergantung pada bahasa dan lingkungan yang Anda gunakan, kami tidak menjelaskan cara menampilkan citra dan kotak pembatas dalam kode Anda, atau cara mendapatkan informasi orientasi dari metadata Exif.

Menemukan orientasi citra

Untuk menampilkan citra dengan benar dalam aplikasi Anda, Anda mungkin perlu memutar itu. Citra berikut berorientasi pada 0 derajat dan ditampilkan dengan benar.

Ikon profil generik yang mewakili akun pengguna atau gambar profil.

Namun, citra berikut diputar 90 derajat berlawanan arah jarum jam. Untuk menampilkannya dengan benar, Anda perlu menemukan orientasi citra dan menggunakan informasi tersebut dalam kode Anda untuk memutar citra menjadi 0 derajat.

Ikon profil generik yang mewakili akun pengguna atau gambar profil, diputar 90 derajat berlawanan arah jarum jam.

Beberapa citra dalam format .jpg berisi informasi orientasi dalam metadata Exif. Jika tersedia, metadata Exif untuk gambar berisi orientasi. Dalam metadata Exif, Anda dapat menemukan orientasi citra di bidang orientation. Meskipun Amazon Rekognition Image mengidentifikasi adanya informasi orientasi citra dalam metadata Exif, namun tidak menyediakan akses untuk itu. Untuk mengakses metadata Exif di citra, gunakan perpustakaan pihak ke tiga atau tulis kode Anda sendiri. Untuk informasi selengkapnya, lihat Exif Versi 2.32.

Ketika Anda mengetahui orientasi citra, Anda dapat menulis kode untuk memutar dan menampilkannya dengan benar.

Menampilkan kotak pembatas

Operasi Amazon Rekognition Image yang menganalisis wajah dalam citra juga mengembalikan koordinat kotak pembatas yang mengelilingi wajah. Untuk informasi lebih lanjut, lihat BoundingBox.

Untuk menampilkan kotak pembatas di sekitar wajah, mirip dengan kotak yang ditunjukkan pada gambar berikut, dalam aplikasi Anda, gunakan koordinat kotak pembatas dalam kode Anda. Koordinat kotak pembatas yang dikembalikan oleh operasi mencerminkan orientasi citra. Jika Anda harus memutar citra untuk menampilkannya dengan benar, Anda mungkin perlu menerjemahkan koordinat kotak pembatas.

Ikon profil dengan wajah disorot dalam kotak merah.

Menampilkan kotak pembatas ketika informasi orientasi ada dalam metadata Exif

Jika orientasi citra disertakan dalam metadata Exif, operasi Amazon Rekognition Image melakukan hal berikut:

  • Kirimkan nilai nol di bidang koreksi orientasi dalam respons operasi. Untuk memutar citra, gunakan orientasi yang disediakan dalam metadata Exif dalam kode Anda.

  • Kembalikan koordinat kotak pembatas yang sudah berorientasi pada 0 derajat. Untuk menunjukkan kotak pembatas pada posisi yang benar, gunakan koordinat yang dikembalikan. Anda tidak perlu menerjemahkannya.

Contoh: Mendeteksi orientasi citra dan koordinat kotak pembatas untuk citra

Contoh berikut menunjukkan cara menggunakan AWS SDK untuk mendapatkan data orientasi gambar Exif dan koordinat kotak pembatas untuk selebriti yang terdeteksi oleh operasi. RecognizeCelebrities

catatan

Support untuk memperkirakan orientasi gambar menggunakan OrientationCorrection lapangan telah berhenti per Agustus 2021. Setiap nilai yang dikembalikan untuk bidang ini yang disertakan dalam respons API akan selalu NULL.

Java

Contoh ini memuat gambar dari sistem file lokal, memanggil RecognizeCelebrities operasi, menentukan tinggi dan lebar gambar, dan menghitung koordinat kotak pembatas wajah untuk gambar yang diputar. Contoh tidak menunjukkan cara memproses informasi orientasi yang disimpan dalam metadata Exif.

Dalam fungsi main, ganti nilai photo dengan nama dan jalur dari citra yang disimpan secara lokal baik dalam format .png atau .jpg.

//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 java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.nio.ByteBuffer; import java.util.List; import javax.imageio.ImageIO; import com.amazonaws.services.rekognition.AmazonRekognition; import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder; import com.amazonaws.services.rekognition.model.Image; import com.amazonaws.services.rekognition.model.RecognizeCelebritiesRequest; import com.amazonaws.services.rekognition.model.RecognizeCelebritiesResult; import com.amazonaws.util.IOUtils; import com.amazonaws.services.rekognition.model.AmazonRekognitionException; import com.amazonaws.services.rekognition.model.BoundingBox; import com.amazonaws.services.rekognition.model.Celebrity; import com.amazonaws.services.rekognition.model.ComparedFace; public class RotateImage { public static void main(String[] args) throws Exception { String photo = "photo.png"; //Get Rekognition client AmazonRekognition amazonRekognition = AmazonRekognitionClientBuilder.defaultClient(); // Load image ByteBuffer imageBytes=null; BufferedImage image = null; try (InputStream inputStream = new FileInputStream(new File(photo))) { imageBytes = ByteBuffer.wrap(IOUtils.toByteArray(inputStream)); } catch(Exception e) { System.out.println("Failed to load file " + photo); System.exit(1); } //Get image width and height InputStream imageBytesStream; imageBytesStream = new ByteArrayInputStream(imageBytes.array()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); image=ImageIO.read(imageBytesStream); ImageIO.write(image, "jpg", baos); int height = image.getHeight(); int width = image.getWidth(); System.out.println("Image Information:"); System.out.println(photo); System.out.println("Image Height: " + Integer.toString(height)); System.out.println("Image Width: " + Integer.toString(width)); //Call GetCelebrities try{ RecognizeCelebritiesRequest request = new RecognizeCelebritiesRequest() .withImage(new Image() .withBytes((imageBytes))); RecognizeCelebritiesResult result = amazonRekognition.recognizeCelebrities(request); // The returned value of OrientationCorrection will always be null System.out.println("Orientation: " + result.getOrientationCorrection() + "\n"); List <Celebrity> celebs = result.getCelebrityFaces(); for (Celebrity celebrity: celebs) { System.out.println("Celebrity recognized: " + celebrity.getName()); System.out.println("Celebrity ID: " + celebrity.getId()); ComparedFace face = celebrity.getFace() ; ShowBoundingBoxPositions(height, width, face.getBoundingBox(), result.getOrientationCorrection()); System.out.println(); } } catch (AmazonRekognitionException e) { e.printStackTrace(); } } public static void ShowBoundingBoxPositions(int imageHeight, int imageWidth, BoundingBox box, String rotation) { float left = 0; float top = 0; if(rotation==null){ System.out.println("No estimated estimated orientation. Check Exif data."); return; } //Calculate face position based on image orientation. switch (rotation) { case "ROTATE_0": left = imageWidth * box.getLeft(); top = imageHeight * box.getTop(); break; case "ROTATE_90": left = imageHeight * (1 - (box.getTop() + box.getHeight())); top = imageWidth * box.getLeft(); break; case "ROTATE_180": left = imageWidth - (imageWidth * (box.getLeft() + box.getWidth())); top = imageHeight * (1 - (box.getTop() + box.getHeight())); break; case "ROTATE_270": left = imageHeight * box.getTop(); top = imageWidth * (1 - box.getLeft() - box.getWidth()); break; default: System.out.println("No estimated orientation information. Check Exif data."); return; } //Display face location information. System.out.println("Left: " + String.valueOf((int) left)); System.out.println("Top: " + String.valueOf((int) top)); System.out.println("Face Width: " + String.valueOf((int)(imageWidth * box.getWidth()))); System.out.println("Face Height: " + String.valueOf((int)(imageHeight * box.getHeight()))); } }
Python

Contoh ini menggunakan perpustakaan citra PIL/Pillow untuk mendapatkan lebar dan tinggi citra. Untuk informasi selengkapnya, lihat Pillow. Contoh ini mempertahankan metadata exif yang mungkin Anda perlukan di tempat lain dalam aplikasi Anda.

Dalam fungsi main, ganti nilai photo dengan nama dan jalur dari citra yang disimpan secara lokal baik dalam format .png atau .jpg.

#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 import io from PIL import Image # Calculate positions from from estimated rotation def show_bounding_box_positions(imageHeight, imageWidth, box): left = 0 top = 0 print('Left: ' + '{0:.0f}'.format(left)) print('Top: ' + '{0:.0f}'.format(top)) print('Face Width: ' + "{0:.0f}".format(imageWidth * box['Width'])) print('Face Height: ' + "{0:.0f}".format(imageHeight * box['Height'])) def celebrity_image_information(photo): client = boto3.client('rekognition') # Get image width and height image = Image.open(open(photo, 'rb')) width, height = image.size print('Image information: ') print(photo) print('Image Height: ' + str(height)) print('Image Width: ' + str(width)) # call detect faces and show face age and placement # if found, preserve exif info stream = io.BytesIO() if 'exif' in image.info: exif = image.info['exif'] image.save(stream, format=image.format, exif=exif) else: image.save(stream, format=image.format) image_binary = stream.getvalue() response = client.recognize_celebrities(Image={'Bytes': image_binary}) print() print('Detected celebrities for ' + photo) for celebrity in response['CelebrityFaces']: print('Name: ' + celebrity['Name']) print('Id: ' + celebrity['Id']) # Value of "orientation correction" will always be null if 'OrientationCorrection' in response: show_bounding_box_positions(height, width, celebrity['Face']['BoundingBox']) print() return len(response['CelebrityFaces']) def main(): photo = 'photo' celebrity_count = celebrity_image_information(photo) print("celebrities detected: " + str(celebrity_count)) if __name__ == "__main__": main()
Java V2

Kode ini diambil dari GitHub repositori contoh SDK AWS Dokumentasi. Lihat contoh lengkapnya di sini.

import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.rekognition.RekognitionClient; import software.amazon.awssdk.services.rekognition.model.RecognizeCelebritiesRequest; import software.amazon.awssdk.services.rekognition.model.Image; import software.amazon.awssdk.services.rekognition.model.RecognizeCelebritiesResponse; import software.amazon.awssdk.services.rekognition.model.Celebrity; import software.amazon.awssdk.services.rekognition.model.ComparedFace; import software.amazon.awssdk.services.rekognition.model.RekognitionException; import software.amazon.awssdk.services.rekognition.model.BoundingBox; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.*; 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 RotateImage { public static void main(String[] args) { final String usage = """ Usage: <sourceImage> Where: sourceImage - The path to the image (for example, C:\\AWS\\pic1.png).\s """; if (args.length != 1) { System.out.println(usage); System.exit(1); } String sourceImage = args[0]; Region region = Region.US_EAST_1; RekognitionClient rekClient = RekognitionClient.builder() .region(region) .build(); System.out.println("Locating celebrities in " + sourceImage); recognizeAllCelebrities(rekClient, sourceImage); rekClient.close(); } public static void recognizeAllCelebrities(RekognitionClient rekClient, String sourceImage) { try { BufferedImage image; InputStream sourceStream = new FileInputStream(sourceImage); SdkBytes sourceBytes = SdkBytes.fromInputStream(sourceStream); image = ImageIO.read(sourceBytes.asInputStream()); int height = image.getHeight(); int width = image.getWidth(); Image souImage = Image.builder() .bytes(sourceBytes) .build(); RecognizeCelebritiesRequest request = RecognizeCelebritiesRequest.builder() .image(souImage) .build(); RecognizeCelebritiesResponse result = rekClient.recognizeCelebrities(request); List<Celebrity> celebs = result.celebrityFaces(); System.out.println(celebs.size() + " celebrity(s) were recognized.\n"); for (Celebrity celebrity : celebs) { System.out.println("Celebrity recognized: " + celebrity.name()); System.out.println("Celebrity ID: " + celebrity.id()); ComparedFace face = celebrity.face(); ShowBoundingBoxPositions(height, width, face.boundingBox(), result.orientationCorrectionAsString()); } } catch (RekognitionException | FileNotFoundException e) { System.out.println(e.getMessage()); System.exit(1); } catch (IOException e) { e.printStackTrace(); } } public static void ShowBoundingBoxPositions(int imageHeight, int imageWidth, BoundingBox box, String rotation) { float left; float top; if (rotation == null) { System.out.println("No estimated estimated orientation."); return; } // Calculate face position based on the image orientation. switch (rotation) { case "ROTATE_0" -> { left = imageWidth * box.left(); top = imageHeight * box.top(); } case "ROTATE_90" -> { left = imageHeight * (1 - (box.top() + box.height())); top = imageWidth * box.left(); } case "ROTATE_180" -> { left = imageWidth - (imageWidth * (box.left() + box.width())); top = imageHeight * (1 - (box.top() + box.height())); } case "ROTATE_270" -> { left = imageHeight * box.top(); top = imageWidth * (1 - box.left() - box.width()); } default -> { System.out.println("No estimated orientation information. Check Exif data."); return; } } System.out.println("Left: " + (int) left); System.out.println("Top: " + (int) top); System.out.println("Face Width: " + (int) (imageWidth * box.width())); System.out.println("Face Height: " + (int) (imageHeight * box.height())); } }