Obter a orientação e as coordenadas da caixa delimitadora da imagem - Amazon Rekognition

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Obter a orientação e as coordenadas da caixa delimitadora da imagem

Os aplicativos que usam o Amazon Rekognition Image geralmente precisam exibir as imagens detectadas pelas operações do Amazon Rekognition Image e as caixas em torno das faces detectadas. Para exibir uma imagem corretamente em seu aplicativo, é necessário saber a orientação da imagem. Talvez seja necessário corrigir essa orientação. Para alguns arquivos .jpg, a orientação da imagem está contida nos metadados do formato Exif.

Para exibir uma caixa em torno de uma face, você precisa das coordenadas da caixa delimitadora. Se a caixa não estiver orientada corretamente, talvez seja necessário ajustar essas coordenadas. As operações de detecção de faces do Amazon Rekognition Image retornam coordenadas de caixa delimitadora para cada face detectada, mas não estimam coordenadas para arquivos .jpg sem metadados Exif.

Os exemplos a seguir mostram como obter as coordenadas da caixa delimitadora para as faces detectadas em uma imagem.

Use as informações deste exemplo para garantir que suas imagens estejam orientadas corretamente e que as caixas delimitadoras estejam exibidas no local correto em seu aplicativo.

Como o código usado para girar e exibir imagens e caixas delimitadoras depende do idioma e do ambiente que você usa, não explicamos como exibir imagens e caixas delimitadoras em seu código ou como obter informações de orientação de metadados do Exif.

Descobrir a orientação de uma imagem

Para exibir uma imagem corretamente em seu aplicativo, poder ser necessário girá-la. A imagem a seguir está orientada para 0 grau e é exibida corretamente.

Ícone de perfil genérico representando uma conta de usuário ou imagem de perfil.

No entanto, a imagem a seguir está girada 90 graus no sentido anti-horário. Para exibi-la corretamente, você precisa encontrar a orientação da imagem e usar essas informações em seu código para girar a imagem para 0 grau.

Ícone de perfil genérico representando uma conta de usuário ou imagem de perfil, girado 90 graus no sentido anti-horário.

Algumas imagens em formato .jpg contêm informações de orientação nos metadados do Exif. Se disponíveis, os metadados Exif da imagem contêm a orientação. Nos metadados do Exif, você pode encontrar a orientação da imagem no campo orientation. Embora o Amazon Rekognition Image identifique a presença de informações da orientação da imagem nos metadados do Exif, ele não fornece acesso a eles. Para acessar os metadados do Exif em uma imagem, use uma biblioteca de terceiros ou escreva seu próprio código. Para obter mais informações, consulte Exif Versão 2.32.

Quando você sabe a orientação de uma imagem, você pode escrever código para girar e exibi-la corretamente.

Exibir caixas delimitadoras

As operações do Amazon Rekognition Image que analisam faces em uma imagem também retornam as coordenadas das caixas delimitadoras que circundam as faces. Para obter mais informações, consulte BoundingBox.

Para exibir uma caixa delimitadora em torno de uma face semelhante à caixa mostrada na imagem a seguir em seu aplicativo, use as coordenadas da caixa delimitadora em seu código. As coordenadas da caixa delimitadora retornadas por uma operação refletem a orientação da imagem. Se for necessário girar a imagem para exibi-la corretamente, você poderá converter as coordenadas da caixa delimitadora.

Ícone de perfil com o rosto destacado no quadrado vermelho.

Exibir caixas delimitadoras quando as informações de orientação estão presentes nos metadados do Exif

Se a orientação de uma imagem estiver incluída nos metadados do Exif, as operações do Amazon Rekognition Image farão o seguinte:

  • Retornarão nulo no campo de correção da orientação na resposta da operação. Para girar a imagem, use a orientação fornecida nos metadados do Exif em seu código.

  • Retornarão as coordenadas da caixa delimitadora já orientadas para 0 grau. Para mostrar a caixa delimitadora na posição correta, use as coordenadas que foram retornadas. Você não precisa convertê-las.

Exemplo: obter a orientação e as coordenadas da caixa delimitadora de uma imagem

Os exemplos a seguir mostram como usar o AWS SDK para obter os dados Exif de orientação da imagem e as coordenadas da caixa delimitadora para as celebridades detectadas pela operação RecognizeCelebrities.

nota

O suporte para estimar a orientação da imagem usando o campo OrientationCorrection foi interrompido a partir de agosto de 2021. Todos os valores retornados para esse campo incluídos em uma resposta da API sempre serão NULL.

Java

O exemplo carrega uma imagem do sistema de arquivos local, chama a operação RecognizeCelebrities, determina a altura e a largura da imagem e calcula as coordenadas da caixa delimitadora da face para a imagem girada. O exemplo não mostra como processar as informações de orientação que estão armazenadas nos metadados do Exif.

Na função main, substitua o valor de photo pelo nome e o caminho de uma imagem armazenada localmente no formato .jpg ou .png.

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

Este exemplo usa a biblioteca de imagens PIL/Pillow para obter a largura e a altura da imagem. Para obter mais informações, consulte Pillow. Este exemplo preserva metadados do exif que você talvez precise em outros lugares no aplicativo.

Na função main, substitua o valor de photo pelo nome e o caminho de uma imagem armazenada localmente no formato .jpg ou .png.

#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

Esse código foi retirado do GitHub repositório de exemplos do SDK de AWS documentação. Veja o exemplo completo aqui.

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