Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Obtention de l’orientation d’une image et des coordonnées du cadre de délimitation
Il est courant que les applications qui utilisent Image Amazon Rekognition soient appelées à afficher les images détectées par les opérations Image Amazon Rekognition et les cadres entourant les visages détectés. Pour afficher correctement une image dans votre application, vous devez connaître son orientation. Vous devez peut-être corriger cette orientation. Pour certains fichiers .jpg, l’orientation de l’image est contenue dans ses métadonnées Exif (Exchangeable Image File Format).
Pour afficher un cadre autour d’un visage, vous avez besoin des coordonnées du cadre de délimitation du visage. Si la boîte n’est pas orientée correctement, vous devez peut-être ajuster ces coordonnées. Les opérations de détection de visages Image Amazon Rekognition renvoient les coordonnées du cadre de délimitation pour chaque visage détecté, mais elles n’estiment pas les coordonnées des fichiers .jpg sans métadonnées Exif.
Les exemples suivants montrent comment obtenir les coordonnées des cadres de délimitation des visages détectés dans une image.
Servez-vous de cet exemple pour déterminer si vos images sont correctement orientées et si les cadres de délimitation sont affichés à l’emplacement approprié dans votre application.
Comme le code permettant de faire pivoter et d’afficher les images et les cadres de délimitation dépend du langage et de l’environnement utilisés, nous n’expliquons pas comment afficher les images et les cadres de délimitation dans votre code ni comment obtenir les informations d’orientation à partir des métadonnées Exif.
Détermination de l’orientation d’une image
Pour qu’une image s’affiche correctement dans votre application, il peut être nécessaire de la faire pivoter. L’image suivante présente une orientation de 0 degré et est correctement affichée.
Cependant, l’image suivante a faire l’objet d’une rotation de 90 degrés dans le sens inverse des aiguilles d’une montre. Pour l’afficher correctement, vous devez déterminer l’orientation de l’image et utiliser ces informations dans votre code pour la faire pivoter à 0 degré.
Pour certaines images au format .jpg, les informations d’orientation sont contenues dans leurs métadonnées Exif. Si elles sont disponibles, les métadonnées Exif de l’image contiennent l’orientation. Dans les métadonnées Exif, l’orientation de l’image est indiquée dans le champ orientation
. Même si Image Amazon Rekognition identifie la présence d’informations sur l’orientation de l’image dans les métadonnées Exif, il n’y donne pas accès. Pour accéder aux métadonnées Exif d’une image, vous devez utiliser une bibliothèque tierce ou écrire votre propre code. Pour en savoir plus, consultez Exif Version 2.32.
Du moment où vous connaissez l’orientation d’une image, vous pouvez écrire du code pour la faire pivoter et l’afficher correctement.
Affichage de cadres de délimitation
Les opérations Image Amazon Rekognition qui analysent les visages dans une image renvoient également les coordonnées des cadres de délimitation qui entourent les visages. Pour de plus amples informations, veuillez consulter BoundingBox.
Pour afficher un cadre de délimitation autour d’un visage, à l’instar de celui figurant dans l’image suivante, dans votre application, utilisez les coordonnées de ce cadre dans votre code. Les coordonnées du cadre de délimitation renvoyées par une opération reflètent l’orientation de l’image. Si vous devez faire pivoter l’image pour l’afficher correctement, vous pouvez être amené à traduire les coordonnées du cadre de délimitation.
Si l’orientation d’une image est incluse dans les métadonnées Exif, les opérations Image Amazon Rekognition produisent les résultats suivants :
-
Retour de la valeur null dans le champ de correction de l’orientation dans la réponse de l’opération. Pour faire pivoter l’image, utilisez l’orientation fournie dans les métadonnées Exif dans votre code.
-
Retour des coordonnées du cadre de délimitation qui présente déjà une orientation de 0 degré. Pour afficher le cadre de délimitation à l’emplacement approprié, utilisez les coordonnées renvoyées. Vous n’avez pas besoin de les traduire.
Exemple : obtention de l’orientation d’une image et des coordonnées du cadre de délimitation associé
L’exemple suivant montre comment utiliser l’AWS SDK pour obtenir l’orientation d’une image Exif et les coordonnées des cadres de délimitation des célébrités détectées par l’opération RecognizeCelebrities
.
L’assistance pour estimer l’orientation de l’image à l’aide du champ OrientationCorrection
a cessé en août 2021. Toutes les valeurs renvoyées pour ce champ inclus dans une réponse d’API seront toujours NULL.
- Java
-
Cet exemple charge une image à partir du système de fichiers local, appelle l’opération RecognizeCelebrities
, détermine la hauteur et la largeur de l’image et calcule enfin les coordonnées du cadre de délimitation du visage pour l’image ayant fait l’objet d’une rotation. L’exemple ne montre pas comment traiter les informations d’orientation stockées dans les métadonnées Exif.
Dans la fonction main
, remplacez la valeur de photo
par le nom et le chemin d’une image stockée localement au format .png ou .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
-
Cet exemple utilise la bibliothèque d’images PIL/Pillow pour obtenir la largeur et la hauteur de l’image. Pour en savoir plus, consultez Pillow. Cet exemple conserve les métadonnées Exif, dont vous pourriez avoir besoin ailleurs dans votre application.
Dans la fonction main
, remplacez la valeur de photo
par le nom et le chemin d’une image stockée localement au format .png ou .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
-
Ce code est extrait du GitHub référentiel d'exemples du SDK de AWS documentation. Voir l’exemple complet ici.
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()));
}
}