Erhalten der Bildausrichtung und der Koordinaten von Begrenzungsrahmen - Amazon Rekognition

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erhalten der Bildausrichtung und der Koordinaten von Begrenzungsrahmen

Anwendungen, die Amazon Rekognition Image verwenden, müssen in der Regel die von Amazon Rekognition Image erkannten Bilder und die Rahmen um die erkannten Gesichter anzeigen. Um ein Bild in Ihrer Anwendung korrekt anzuzeigen, müssen Sie die Ausrichtung des Bildes kennen. Möglicherweise müssen Sie diese Ausrichtung anpassen. Bei einigen JPG-Dateien ist die Orientierung des Bildes in den Metadaten des Exchangeable Image File Format (Exif) des Bildes enthalten.

Um einen Rahmen um ein Gesicht herum anzuzeigen, benötigen Sie die Koordinaten für den Begrenzungsrahmen des Gesichts. Wenn das Feld nicht richtig ausgerichtet ist, müssen Sie diese Koordinaten möglicherweise anpassen. Die Gesichtserkennungsoperationen von Amazon Rekognition Image geben die Bounding-Box-Koordinaten für jedes erkannte Gesicht zurück, aber die Koordinaten für JPG-Dateien ohne Exif-Metadaten werden nicht geschätzt.

Die folgenden Beispiele zeigen, wie Sie die Bounding-Box-Koordinaten für die in einem Bild erkannten Gesichter erhalten.

Verwenden Sie die Informationen in diesem Beispiel, um sicherzustellen, dass Ihre Bilder richtig ausgerichtet sind, und dass die Begrenzungsrahmen an der richtigen Stelle in Ihrer Anwendung angezeigt werden.

Da der Code, der zum Drehen und Anzeigen von Bildern und Begrenzungsrahmen verwendet wird, von der Sprache und Umgebung abhängt, die Sie verwenden, erklären wir nicht, wie Sie Bilder und Begrenzungsrahmen in Ihrem Code darstellen oder wie Sie Orientierungsinformationen aus den Exif-Metadaten erhalten.

Ermitteln der Ausrichtung eines Bildes

Um ein Bild in Ihrer Anwendung korrekt darzustellen, müssen Sie es möglicherweise drehen. Das folgende Bild ist auf 0 Grad ausgerichtet und wird korrekt dargestellt.

Generisches Profilsymbol, das ein Benutzerkonto oder ein Profilbild darstellt.

Das folgende Bild ist jedoch um 90 Grad gegen den Uhrzeigersinn gedreht. Um es korrekt darzustellen, müssen Sie die Ausrichtung des Bildes ermitteln und diese Information in Ihrem Code verwenden, um das Bild auf 0 Grad zu drehen.

Generisches Profilsymbol, das ein Benutzerkonto oder ein Profilbild darstellt und um 90 Grad gegen den Uhrzeigersinn gedreht ist.

Einige Bilder im JPG-Format enthalten Orientierungsinformationen in den Exif-Metadaten. Falls verfügbar, enthalten die Exif-Metadaten für das Bild die Ausrichtung. In den Exif-Metadaten finden Sie die Ausrichtung des Bildes im Feld orientation. Obwohl Amazon Rekognition Image das Vorhandensein von Bildausrichtungsinformationen in Exif-Metadaten identifiziert, bietet es keinen Zugriff darauf. Um auf die Exif-Metadaten in einem Bild zuzugreifen, verwenden Sie eine Bibliothek eines Drittanbieters oder schreiben Sie Ihren eigenen Code. Weitere Informationen finden Sie unter Exif Version 2.32.

Wenn Sie die Ausrichtung eines Bildes kennen, können Sie Code schreiben, um es zu drehen und korrekt darzustellen.

Anzeigen von Begrenzungsrahmen

Die Amazon-Rekognition-Image-Operationen, die Gesichter in einem Bild analysieren, geben auch die Koordinaten der Begrenzungsrahmen zurück, die die Gesichter umgeben. Weitere Informationen finden Sie unter. BoundingBox

Um in Ihrer Anwendung einen Begrenzungsrahmen um ein Gesicht herum anzuzeigen, das dem im folgenden Bild ähnlich ist, verwenden Sie die Begrenzungsrahmenkoordinaten in Ihrem Code. Die Koordinaten des Begrenzungsrahmens, die von einer Operation zurückgegeben werden, spiegeln die Ausrichtung des Bildes wider. Wenn Sie das Bild drehen müssen, um es korrekt darzustellen, müssen Sie die Koordinaten des Begrenzungsrahmens entsprechend übertragen.

Profilsymbol, bei dem das Gesicht in einem roten Quadrat hervorgehoben ist.

Anzeigen von Begrenzungsrahmen, wenn die Orientierungsinformationen in Exif-Metadaten vorhanden sind

Wenn die Ausrichtung eines Bildes in den Exif-Metadaten enthalten ist, machen die Amazon-Rekognition-Image-Operationen folgendes:

  • Geben Null im Feld für die Orientierungskorrektur in der Antwort der Operation zurück. Um das Bild zu drehen, verwenden Sie die Orientierung, die in den Exif-Metadaten in Ihrem Code angegeben ist.

  • Geben Koordinaten für Begrenzungsrahmen bereits auf 0 Grad orientiert zurück. Um den Begrenzungsrahmen an der richtigen Position anzuzeigen, verwenden Sie die zurückgegebenen Koordinaten. Sie müssen sie nicht übertragen.

Beispiel: Erhalten der Bildausrichtung und der Koordinaten von Begrenzungsrahmen für ein Bild

Die folgenden Beispiele zeigen, wie Sie das AWS-SDK verwenden, um die Exif-Bildausrichtungsdaten und die Bounding-Box-Koordinaten für die von der RecognizeCelebrities-Operation erkannten Berühmtheiten zu erhalten.

Anmerkung

Die Unterstützung für die Schätzung der Bildausrichtung anhand des OrientationCorrection-Feldes wurde im August 2021 eingestellt. Alle zurückgegebenen Werte für dieses Feld, die in einer API-Antwort enthalten sind, sind immer NULL.

Java

Dieses Beispiel lädt ein Bild aus dem lokalen Dateisystem, ruft die RecognizeCelebrities-Operation auf, bestimmt die Höhe und Breite des Bildes und berechnet die Koordinaten des Begrenzungsrahmens des Gesichts für das gedrehte Bild. Das Beispiel zeigt nicht, wie Orientierungsinformationen, die in Exif-Metadaten gespeichert sind, verarbeitet werden können.

Ersetzen Sie in der main-Funktion den Wert von photo durch den Namen und Pfad eines Bildes, das lokal im PNG- oder JPG-Format gespeichert ist.

//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

Dieses Beispiel verwendet die PIL/Pillow-Bildbibliothek, um Bildbreite und -höhe zu erhalten. Weitere Informationen finden Sie unter Pillow. Dieses Beispiel bewahrt die Exif-Metadaten auf, die Sie möglicherweise an anderer Stelle in Ihrer Anwendung benötigen.

Ersetzen Sie in der main-Funktion den Wert von photo durch den Namen und Pfad eines Bildes, das lokal im PNG- oder JPG-Format gespeichert ist.

#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

Dieser Code stammt aus dem AWS Documentation SDK Examples GitHub Repository. Das vollständige Beispiel finden Sie hier.

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())); } }