Corte automático de imagens com o Amazon Rekognition

Corte automático de imagens com o Amazon Rekognition

Os editores digitais estão continuamente procurando maneiras de simplificar e automatizar seus fluxos de trabalho de mídia para gerar e publicar novos conteúdos o mais rápido possível.

Muitos editores têm uma grande biblioteca de imagens que usam para seus artigos. Essas imagens podem ser reutilizadas muitas vezes para diferentes histórias, especialmente quando o editor tem imagens de celebridades. Muitas vezes, um jornalista pode precisar cortar uma celebridade desejada de uma imagem para usar em sua próxima história. Esta é uma tarefa manual e repetitiva que deve ser automatizada. Às vezes, um autor pode querer usar a imagem de uma celebridade, mas contém duas pessoas e a celebridade principal precisa ser cortada da imagem. Outras vezes, as imagens de celebridades podem precisar ser reformatadas para publicação em uma variedade de plataformas, como celular, mídia social ou notícias digitais. Além disso, um autor pode precisar alterar a proporção da imagem ou colocar a celebridade em foco nítido.

Neste post, mostramos como usar Reconhecimento da Amazônia para realizar a análise de imagem. O Amazon Rekognition facilita a adição desse recurso aos seus aplicativos sem qualquer experiência em aprendizado de máquina (ML) e vem com várias APIs para atender a casos de uso, como detecção de objetos, moderação de conteúdo, detecção e análise de face e reconhecimento de texto e celebridade, que nós usar neste exemplo.

A recurso de reconhecimento de celebridades in Reconhecimento da Amazônia reconhece automaticamente dezenas de milhares de personalidades conhecidas em imagens e vídeos usando ML. O reconhecimento de celebridade pode detectar não apenas a presença da celebridade em questão, mas também a localização dentro da imagem.

Visão geral da solução

Neste post, demonstramos como podemos passar uma foto, um nome de celebridade e uma proporção da imagem de saída para poder gerar uma imagem recortada da celebridade em questão capturando seu rosto no centro.

Ao trabalhar com o API de detecção de celebridades do Amazon Rekognition, muitos elementos são retornados na resposta. A seguir estão alguns elementos-chave de resposta:

  • Match Confidence – Uma pontuação de confiança de correspondência que pode ser usada para controlar o comportamento da API. Recomendamos aplicar um limite adequado a essa pontuação em sua aplicação para escolher seu ponto de operação preferido. Por exemplo, ao definir um limite de 99%, você pode eliminar falsos positivos, mas pode perder algumas possíveis correspondências.
  • Nome, ID e URLs – O nome da celebridade, um ID exclusivo do Amazon Rekognition e uma lista de URLs, como o IMDb da celebridade ou o link da Wikipedia para obter mais informações.
  • Caixa Delimitadora – Coordenadas da localização da caixa delimitadora retangular para cada rosto de celebridade reconhecido.
  • Sexo Conhecido – Identidade de gênero conhecida para cada celebridade reconhecida.
  • Emoções – Emoção expressa no rosto da celebridade, por exemplo, feliz, triste ou com raiva.
  • pose – Pose do rosto da celebridade, usando três eixos de rolagem, inclinação e guinada.
  • Sorrir – Se a celebridade está sorrindo ou não.

Parte da resposta da API do Amazon Rekognition inclui o seguinte código:

{ "CelebrityFaces": [ { "Urls": [ "www.wikidata.org/wiki/Q2536951" ], "Name": "Werner Vogels", "Id": "23iZ1oP", "Face": { "BoundingBox": { "Width": 0.10331031680107117, "Height": 0.20054641366004944, "Left": 0.5003396272659302, "Top": 0.07391933351755142 }, "Confidence": 99.99765014648438,
...

Neste exercício, demonstramos como usar o elemento de caixa delimitadora para identificar a localização da face, conforme mostrado na imagem de exemplo a seguir. Todas as dimensões são representadas como proporções do tamanho geral da imagem, portanto, os números na resposta estão entre 0–1. Por exemplo, no exemplo de resposta da API, a largura da caixa delimitadora é 0.1, o que implica que a largura da face é 10% da largura total da imagem.

Caixa delimitadora de Werner Vogels

Com essa caixa delimitadora, agora podemos usar a lógica para garantir que o rosto permaneça dentro das bordas da nova imagem que criamos. Podemos aplicar algum preenchimento ao redor dessa caixa delimitadora para manter a face no centro.

Nas seções a seguir, mostramos como criar a seguinte saída de imagem cortada com Werner Vogels em foco nítido.

Lançamos um Amazon Sage Maker notebook, que fornece um ambiente Python onde você pode executar o código para passar uma imagem para o Amazon Rekognition e modificar automaticamente a imagem com a celebridade em foco.

Werner Vogels recortado

O código executa as seguintes etapas de alto nível:

  1. Faça um pedido ao recognize_celebrities API com a imagem fornecida e o nome da celebridade.
  2. Filtre a resposta para as informações da caixa delimitadora.
  3. Adicione um pouco de preenchimento à caixa delimitadora de forma que capturemos parte do plano de fundo.

Pré-requisitos

Para este passo a passo, você deve ter os seguintes pré-requisitos:

Carregue a imagem de amostra

Carregue sua amostra de imagem de celebridade em seu balde S3.

Execute o código

Para executar o código, usamos um notebook SageMaker, porém qualquer IDE também funcionaria após a instalação do Python, pillow e Boto3. Criamos um notebook SageMaker, bem como o Gerenciamento de acesso e identidade da AWS (IAM) com as permissões necessárias. Conclua as seguintes etapas:

  1. Criar o bloco de notas e nomeie automatic-cropping-celebrity.

A política de execução padrão, que foi criada durante a criação do notebook SageMaker, tem uma política simples que concede à função permissões para interagir com o Amazon S3.

  1. Atualize o Resource restrição com o nome do bucket S3:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3::: # your-s3-bucket-name " ] } ]
}

  1. Crie outra política para adicionar à função IAM do notebook SageMaker para poder chamar o Reconhecer Celebridades API:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rekognition:RecognizeCelebrities", "Resource": "*" } ]
}

Permissões do IAM

  1. No console SageMaker, escolha Instâncias de notebook no painel de navegação.
  2. Localize o automatic-cropping-celebrity caderno e escolha Abra o Jupyter.
  3. Escolha Novo e conda_python3 como o kernel do seu notebook.

Caderno Jupyter

Para as etapas a seguir, copie os blocos de código em seu notebook Jupyter e execute-os escolhendo Execute.

  1. Primeiro, importamos funções auxiliares e bibliotecas:
import boto3
from PIL import Image

  1. Definir variáveis
bucket = '<YOUR_BUCKET_NAME>' file = '<YOUR_FILE_NAME>'
celeb = '<CELEBRITY_NAME>'
aspect_ratio = <ASPECT_RATIO_OF_OUTPUT_IMAGE, e.g. 1 for square>

  1. Criar um cliente de serviço
rek = boto3.client('rekognition')
s3 = boto3.client('s3')

  1. Função para reconhecer as celebridades
def recognize_celebrity(photo): with open(photo, 'rb') as image: response = rek.recognize_celebrities(Image={'Bytes': image.read()}) image=Image.open(photo) file_type=image.format.lower() path, ext=image.filename.rsplit(".", 1) celeb_faces = response['CelebrityFaces'] print(f'Detected {len(celeb_faces)} faces for {photo}') return celeb_faces, image, path, file_type 

  1. Função para obter a caixa delimitadora da celebridade fornecida:
def get_bounding_box(celeb_faces, img_width, img_height, celeb): bbox = None for celebrity in celeb_faces: if celebrity['Name'] == celeb: box = celebrity['Face']['BoundingBox'] left = img_width * box['Left'] top = img_height * box['Top'] width = img_width * box['Width'] height = img_height * 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)) #dimenions of famous face inside the bounding boxes x1=left y1=top x2=left+width y2=top+height bbox = [x1,y1,x2,y2] print(f'Bbox coordinates: {bbox}') if bbox == None: raise ValueError(f"{celeb} not found in results") return bbox

  1. Função para adicionar algum preenchimento à caixa delimitadora, para que possamos capturar algum plano de fundo ao redor do rosto
def pad_bbox(bbox, pad_width=0.5, pad_height=0.3): x1, y1, x2, y2 = bbox width = x2 - x1 height = y2 - y1 #dimenions of new image with padding x1= max(x1 - (pad_width * width),0) y1= max(y1 - (pad_height * height),0) x2= max(x2 + (pad_width * width),0) y2= max(y2 + (pad_height * height),0) #dimenions of new image with aspect ratio, 1 is square, 1.5 is 6:4, 0.66 is 4:6 x1= max(x1-(max((y2-y1)*max(aspect_ratio,1)-(x2-x1),0)/2),0) y1= max(y1-(max((x2-x1)*1/(min((aspect_ratio),1))-(y2-y1),0)/2),0) x2= max(x2+(max((y2-y1)*max((aspect_ratio),1)-(x2-x1),0)/2),0) y2= max(y2+(max((x2-x1)*1/(min((aspect_ratio),1))-(y2-y1),0)/2),0) print('x1-coordinate after padding: ' + '{0:.0f}'.format(x1)) print('y1-coordinate after padding: ' + '{0:.0f}'.format(y1)) print('x2-coordinate after padding: ' + "{0:.0f}".format(x2)) print('y2-coordinate after padding: ' + "{0:.0f}".format(y2)) return [x1,y1,x2,y2]

  1. Função para salvar a imagem no armazenamento do notebook e no Amazon S3
def save_image(roi, image, path, file_type): x1, y1, x2, y2 = roi image = image.crop((x1,y1,x2,y2)) image.save(f'{path}-cropped.{file_type}') s3.upload_file(f'{path}-cropped.{file_type}', bucket, f'{path}-cropped.{file_type}') return image

  1. Use o Python main() função para combinar as funções anteriores para concluir o fluxo de trabalho de salvar uma nova imagem recortada de nossa celebridade:
def main(): # Download S3 image to local s3.download_file(bucket, file, './'+file) #Load photo and recognize celebrity celeb_faces, img, file_name, file_type = recognize_celebrity(file) width, height = img.size #Get bounding box bbox = get_bounding_box(celeb_faces, width, height, celeb) #Get padded bounding box padded_bbox = pad_bbox(bbox) #Save result and display result = save_image(padded_bbox, img, file_name, file_type) display(result) if __name__ == "__main__": main()

Ao executar esse bloco de código, você pode ver que encontramos Werner Vogels e criamos uma nova imagem com o rosto dele no centro.

Werner Vogels recortado

A imagem será salva no notebook e também carregada no bucket S3.

Saída do notebook Jupyter

Você pode incluir esta solução em um fluxo de trabalho maior; por exemplo, uma editora pode querer publicar esse recurso como um terminal para reformatar e redimensionar imagens em tempo real ao publicar artigos de celebridades em várias plataformas.

Limpando

Para evitar incorrer em cobranças futuras, exclua os recursos:

  1. No console do SageMaker, selecione seu notebook e no Opções menu, escolha Dê um basta.
  2. Depois que o notebook é parado, no Opções menu, escolha Apagar.
  3. No console do IAM, exclua a função de execução do SageMaker que você criou.
  4. No console do Amazon S3, exclua a imagem de entrada e todos os arquivos de saída do seu bucket do S3.

Conclusão

Nesta postagem, mostramos como podemos usar o Amazon Rekognition para automatizar uma tarefa manual de modificação de imagens para dar suporte a fluxos de trabalho de mídia. Isso é particularmente importante na indústria editorial, onde a velocidade é importante para obter novos conteúdos rapidamente e para várias plataformas.

Para obter mais informações sobre como trabalhar com ativos de mídia, consulte A inteligência de mídia ficou mais inteligente com o Media2Cloud 3.0


Sobre o autor

Corte automático de imagens com Amazon Rekognition PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Marcos Watkins é arquiteto de soluções da equipe de mídia e entretenimento. Ele ajuda os clientes a criar soluções de IA/ML que resolvem seus desafios de negócios usando a AWS. Ele tem trabalhado em vários projetos de IA/ML relacionados à visão computacional, processamento de linguagem natural, personalização, ML na borda e muito mais. Longe da vida profissional, adora estar com a família e acompanhar o crescimento dos seus dois filhos.

Carimbo de hora:

Mais de Aprendizado de máquina da AWS