Recadrage automatique des images avec Amazon Rekognition

Recadrage automatique des images avec Amazon Rekognition

Les éditeurs numériques recherchent en permanence des moyens de rationaliser et d'automatiser leurs workflows multimédias afin de générer et de publier de nouveaux contenus aussi rapidement que possible.

De nombreux éditeurs disposent d'une grande bibliothèque d'images d'archives qu'ils utilisent pour leurs articles. Ces images peuvent être réutilisées plusieurs fois pour différentes histoires, en particulier lorsque l'éditeur a des images de célébrités. Très souvent, un journaliste peut avoir besoin de recadrer une célébrité souhaitée à partir d'une image à utiliser pour son prochain article. Il s'agit d'une tâche manuelle et répétitive qui devrait être automatisée. Parfois, un auteur peut vouloir utiliser une image d'une célébrité, mais elle contient deux personnes et la célébrité principale doit être coupée de l'image. D'autres fois, les images de célébrités peuvent avoir besoin d'être reformatées pour être publiées sur une variété de plates-formes telles que les mobiles, les médias sociaux ou les actualités numériques. De plus, un auteur peut avoir besoin de modifier le rapport d'aspect de l'image ou de mettre la célébrité au point.

Dans cet article, nous montrons comment utiliser Amazon Reconnaissance pour effectuer une analyse d'image. Amazon Rekognition facilite l'ajout de cette fonctionnalité à vos applications sans aucune expertise en machine learning (ML) et est fourni avec diverses API pour répondre à des cas d'utilisation tels que la détection d'objets, la modération de contenu, la détection et l'analyse de visages, et la reconnaissance de texte et de célébrités, que nous utiliser dans cet exemple.

La fonction de reconnaissance des célébrités in Amazon Reconnaissance reconnaît automatiquement des dizaines de milliers de personnalités bien connues dans des images et des vidéos à l'aide de ML. La reconnaissance de célébrité peut détecter non seulement la présence de la célébrité donnée, mais également l'emplacement dans l'image.

Présentation de la solution

Dans cet article, nous montrons comment nous pouvons transmettre une photo, un nom de célébrité et un rapport d'aspect pour l'image produite afin de pouvoir générer une image recadrée de la célébrité donnée capturant son visage au centre.

Lorsque vous travaillez avec le API de détection de célébrités Amazon Rekognition, de nombreux éléments sont renvoyés dans la réponse. Voici quelques éléments de réponse clés :

  • MatchConfiance – Un score de confiance de correspondance qui peut être utilisé pour contrôler le comportement de l'API. Nous vous recommandons d'appliquer un seuil approprié à ce score dans votre application pour choisir votre point de fonctionnement préféré. Par exemple, en définissant un seuil de 99 %, vous pouvez éliminer les faux positifs, mais vous risquez de manquer certaines correspondances potentielles.
  • Nom, identifiant et URL - Le nom de la célébrité, un identifiant Amazon Rekognition unique et une liste d'URL telles que le lien IMDb ou Wikipedia de la célébrité pour plus d'informations.
  • Boîte englobante - Coordonnées de l'emplacement de la boîte englobante rectangulaire pour chaque visage de célébrité reconnu.
  • Genre connu – Identité de genre connue pour chaque célébrité reconnue.
  • Les Émotions – Émotion exprimée sur le visage de la célébrité, par exemple, heureux, triste ou en colère.
  • pose – Pose du visage de la célébrité, en utilisant trois axes de roulis, de tangage et de lacet.
  • Smile – Que la célébrité soit souriante ou non.

Une partie de la réponse de l'API d'Amazon Rekognition inclut le code suivant :

{ "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,
...

Dans cet exercice, nous montrons comment utiliser l'élément de zone de délimitation pour identifier l'emplacement du visage, comme illustré dans l'exemple d'image suivant. Toutes les dimensions sont représentées sous forme de rapports de la taille globale de l'image, de sorte que les nombres dans la réponse sont compris entre 0 et 1. Par exemple, dans l'exemple de réponse de l'API, la largeur de la zone de délimitation est de 0.1, ce qui implique que la largeur du visage est de 10 % de la largeur totale de l'image.

Werner Vogels Boîte englobante

Avec cette boîte englobante, nous pouvons maintenant utiliser la logique pour nous assurer que le visage reste dans les bords de la nouvelle image que nous créons. Nous pouvons appliquer un rembourrage autour de cette boîte englobante pour garder le visage au centre.

Dans les sections suivantes, nous montrons comment créer la sortie d'image recadrée suivante avec Werner Vogels avec une mise au point nette.

Nous lançons une Amazon Sage Maker notebook, qui fournit un environnement Python dans lequel vous pouvez exécuter le code pour transmettre une image à Amazon Rekognition, puis modifier automatiquement l'image en mettant l'accent sur la célébrité.

Werner Vogels recadrée

Le code effectue les étapes de haut niveau suivantes :

  1. Faire une demande au recognize_celebrities API avec l'image et le nom de la célébrité donnés.
  2. Filtrez la réponse pour les informations de la zone de délimitation.
  3. Ajoutez un peu de rembourrage à la boîte englobante de sorte que nous capturions une partie de l'arrière-plan.

Pré-requis

Pour cette procédure pas à pas, vous devez disposer des prérequis suivants:

Télécharger l'exemple d'image

Téléchargez votre exemple d'image de célébrité dans votre compartiment S3.

Exécutez le code

Pour exécuter le code, nous utilisons un bloc-notes SageMaker, mais n'importe quel IDE fonctionnerait également après l'installation de Python, pillow et Boto3. Nous créons un cahier SageMaker ainsi que le Gestion des identités et des accès AWS (IAM) avec les autorisations requises. Effectuez les étapes suivantes :

  1. Créer le carnet et nommez-le automatic-cropping-celebrity.

La stratégie d'exécution par défaut, qui a été créée lors de la création du bloc-notes SageMaker, a une stratégie simple qui donne au rôle les autorisations d'interagir avec Amazon S3.

  1. Mettre à jour le Resource contrainte avec le nom du compartiment 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. Créez une autre stratégie à ajouter au rôle IAM du bloc-notes SageMaker pour pouvoir appeler le Reconnaître les célébrités API:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rekognition:RecognizeCelebrities", "Resource": "*" } ]
}

Autorisations IAM

  1. Sur la console SageMaker, choisissez Instances de bloc-notes dans le volet de navigation.
  2. Localisez le automatic-cropping-celebrity cahier et choisissez Ouvrez Jupyter.
  3. Selectionnez Nouveauté et les conda_python3 comme noyau pour votre ordinateur portable.

Carnet Jupyter

Pour les étapes suivantes, copiez les blocs de code dans votre notebook Jupyter et exécutez-les en choisissant Courir.

  1. Tout d'abord, nous importons des fonctions d'assistance et des bibliothèques :
import boto3
from PIL import Image

  1. Définir des variables
bucket = '<YOUR_BUCKET_NAME>' file = '<YOUR_FILE_NAME>'
celeb = '<CELEBRITY_NAME>'
aspect_ratio = <ASPECT_RATIO_OF_OUTPUT_IMAGE, e.g. 1 for square>

  1. Créer un client de service
rek = boto3.client('rekognition')
s3 = boto3.client('s3')

  1. Fonction pour reconnaître les célébrités
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. Fonction pour obtenir la boîte englobante de la célébrité donnée :
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. Fonction pour ajouter du rembourrage à la boîte englobante, nous capturons donc un arrière-plan autour du visage
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. Fonction pour enregistrer l'image dans le stockage de l'ordinateur portable et dans 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. Utiliser le Python main() fonction pour combiner les fonctions précédentes pour compléter le flux de travail d'enregistrement d'une nouvelle image recadrée de notre célébrité :
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()

Lorsque vous exécutez ce bloc de code, vous pouvez voir que nous avons trouvé Werner Vogels et créé une nouvelle image avec son visage au centre.

Werner Vogels recadrée

L'image sera enregistrée dans le bloc-notes et également téléchargée dans le compartiment S3.

Sortie du bloc-notes Jupyter

Vous pouvez inclure cette solution dans un flux de travail plus important; par exemple, une maison d'édition peut souhaiter publier cette capacité en tant que point final pour reformater et redimensionner les images à la volée lors de la publication d'articles de célébrités sur plusieurs plates-formes.

Nettoyer

Pour éviter d'encourir des frais futurs, supprimez les ressources :

  1. Sur la console SageMaker, sélectionnez votre bloc-notes et sur la Actions menu, choisissez Arrêter.
  2. Après l'arrêt du notebook, sur le Actions menu, choisissez Supprimer.
  3. Sur la console IAM, supprimez le rôle d'exécution SageMaker que vous avez créé.
  4. Sur la console Amazon S3, supprimez l'image d'entrée et tous les fichiers de sortie de votre compartiment S3.

Conclusion

Dans cet article, nous avons montré comment nous pouvons utiliser Amazon Rekognition pour automatiser une tâche autrement manuelle de modification d'images pour prendre en charge les workflows multimédias. Ceci est particulièrement important dans le secteur de l'édition où la vitesse est importante pour diffuser rapidement du nouveau contenu et sur plusieurs plates-formes.

Pour plus d'informations sur l'utilisation des ressources multimédias, reportez-vous à L'intelligence des médias est devenue plus intelligente avec Media2Cloud 3.0


À propos de l’auteur

Recadrage automatique des images avec Amazon Rekognition PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Marc Watkins est un architecte de solutions au sein de l'équipe des médias et du divertissement. Il aide les clients à créer des solutions AI/ML qui résolvent leurs défis commerciaux à l'aide d'AWS. Il a travaillé sur plusieurs projets d'IA/ML liés à la vision par ordinateur, au traitement du langage naturel, à la personnalisation, au ML à la périphérie, etc. Loin de la vie professionnelle, il aime passer du temps avec sa famille et voir ses deux petits grandir.

Horodatage:

Plus de Apprentissage automatique AWS