[PYTHON] J'ai essayé d'utiliser l'API Detect Labels d'AWS Rekognition

introduction

J'ai essayé d'utiliser l'API Detect Labels d'AWS Rekognition, un service d'apprentissage automatique AWS. Il semble que vous puissiez facilement identifier les objets et les scènes, j'ai donc créé et utilisé une simple application d'extraction d'images.

Qu'est-ce qu'AWS Rekognition?

Avec le service d'apprentissage automatique fourni par AWS, la reconnaissance d'image telle que l'analyse d'image et l'analyse vidéo peut être facilement effectuée. Plus précisément, les API suivantes sont fournies.

Qu'est-ce que l'API DetectLabels?

L'API DetectLabels vous permet d'étiqueter des milliers d'objets, tels que des voitures, des animaux domestiques et des meubles identifiés à partir d'images, et d'obtenir un score de confiance. Le score de confiance est indiqué par une valeur comprise entre 0 et 100, indiquant la possibilité que le résultat de l'identification soit correct. Extrait de AWS Rekognitoion Black belt

Comme indiqué ci-dessus, il s'agit d'une API qui vous permet d'étiqueter à partir de l'image d'entrée, et vous pouvez également vérifier le résultat d'étiquetage à partir de la console de gestion comme indiqué ci-dessous. Vous pouvez voir que les trois chats sont bien identifiés! demo.png

La demande à l'API DetectLabels est la suivante, en utilisant l'image de chat ci-dessus comme exemple d'entrée.

{
    "Image": {
        "Bytes": "(Chaîne d'octets de l'image d'entrée)"
    }
}

En réponse, le JSON suivant est renvoyé. La structure est un tableau d'informations d'étiquette, et les informations d'étiquette comportent les éléments suivants.

{
    "Labels": [
        {
            "Name": "Cat",
            "Confidence": 99.57831573486328,
            "Instances": [
                {
                    "BoundingBox": {
                        "Width": 0.369978129863739,
                        "Height": 0.7246906161308289,
                        "Left": 0.17922087013721466,
                        "Top": 0.06359343975782394
                    },
                    "Confidence": 92.53639221191406
                },
                {
                    "BoundingBox": {
                        "Width": 0.3405080735683441,
                        "Height": 0.7218159437179565,
                        "Left": 0.31681257486343384,
                        "Top": 0.14111439883708954
                    },
                    "Confidence": 90.89508056640625
                },
                {
                    "BoundingBox": {
                        "Width": 0.27936506271362305,
                        "Height": 0.7497209906578064,
                        "Left": 0.5879912376403809,
                        "Top": 0.10250711441040039
                    },
                    "Confidence": 90.0565414428711
                }
            ],
            "Parents": [
                {
                    "Name": "Mammal"
                },
                {
                    "Name": "Animal"
                },
                {
                    "Name": "Pet"
                }
            ]
        },
        {
            "Name": "Pet",
            "Confidence": 99.57831573486328,
            "Instances": [],
            "Parents": [
                {
                    "Name": "Animal"
                }
            ]
        },
        {
            "Name": "Kitten",
            "Confidence": 99.57831573486328,
            "Instances": [],
            "Parents": [
                {
                    "Name": "Mammal"
                },
                {
                    "Name": "Cat"
                },
                {
                    "Name": "Animal"
                },
                {
                    "Name": "Pet"
                }
            ]
        },
        {
            "Name": "Animal",
            "Confidence": 99.57831573486328,
            "Instances": [],
            "Parents": []
        },
        {
            "Name": "Mammal",
            "Confidence": 99.57831573486328,
            "Instances": [],
            "Parents": [
                {
                    "Name": "Animal"
                }
            ]
        }
    ],
    "LabelModelVersion": "2.0"
}

Essayer de faire

Quoi faire

L'étiquetage est effectué à partir de l'image téléchargée dans le compartiment S3, la plage étiquetée dans l'image est extraite et l'image extraite est sortie vers un autre compartiment S3 avec l'étiquette «nom d'étiquette» = «fiabilité». vient de le faire.

Diagramme

flow.jpg ①. Téléchargez le fichier image dans le bucket "rekognition-test-20200530" ②. Le "Test de reconnaissance" Lambda démarre déclenché par l'événement de création de fichier de compartiment ③. Lambda "Recognition Test" appelle l'API DetectLabel en saisissant le fichier image téléchargé sur S3 ④ Le «test de reconnaissance» Lambda est basé sur la réponse de l'API Detect Label.

  1. Pour les éléments avec une plage cible spécifiée sur l'étiquette, extrayez la plage cible de l'image téléchargée.
  2. Ajoutez la balise S3 "label name" = "label confidence value" à l'image extraite
  3. Sortie vers le bucket "rekognition-test-20200530-output"

Paramètres pour chaque ressource AWS

S3

Nom du godet Réglage
rekognition-test-20200530 ・ Création d'un seau
- Paramètre de déclenchement pour Lambda "Test de reconnaissance" au moment de l'événement de création de fichier dans S3
rekognition-test-20200530-output ・ Création d'un seau
-Ajout d'une stratégie de compartiment pour donner l'autorisation d'écriture au rôle IAM de Lambda "Test de reconnaissance"

Lambda Layer Puisque Pillow est utilisé pour extraire des images, j'ai enregistré Lambda Layer en me référant à ce blog.

  1. Démarrez EC2 d'Amazon Linux
  2. Installez Pillow sur EC2
  3. Compressez le dossier dans lequel Pillow est installé
  4. Téléchargez le fichier zip et enregistrez le fichier zip avec Lambda Layer

Lambda Exécution: python2.7

lambda_function.py


# coding: utf-8
import json
import boto3
from PIL import Image
import uuid
from io import BytesIO


def lambda_handler(event, context):
    #Événement S3 et acquisition d'objets
    s3 = boto3.client('s3')
    #Nom du bucket où l'événement s'est produit
    bucket = event['Records'][0]['s3']['bucket']['name']
    #Clé d'objet où l'événement s'est produit
    photo = event['Records'][0]['s3']['object']['key']
    try:
        #Acquisition du fichier image où l'événement S3 s'est produit
        target_file_byte_string = s3.get_object(Bucket=bucket, Key=event['Records'][0]['s3']['object']['key'])['Body'].read()
        target_img = Image.open(BytesIO(target_file_byte_string))
        #Obtenir la largeur et la hauteur du fichier image
        img_width, img_height = target_img.size
        #Client de reconnaissance
        rekognition_client=boto3.client('rekognition')
        #Appel d'API DetectLabels et acquisition des résultats d'étiquetage
        response = rekognition_client.detect_labels(Image={'S3Object':{'Bucket':bucket,'Name':photo}}, MaxLabels=10)
        for label in response['Labels']:
            #Extrait une image et la renvoie vers S3 pour une étiquette avec une plage spécifiée.
            for bounds in label['Instances']:
                box = bounds['BoundingBox']
                #Déterminez la plage d'extraction d'image
                target_bounds = (box['Left'] * img_width, 
                                box['Top'] * img_height,
                                (box['Left'] + box['Width']) * img_width,
                                (box['Top'] + box['Height']) * img_height)
                #Extraction d'images
                img_crop = target_img.crop(target_bounds)
                imgByteArr = BytesIO()
                img_crop.save(imgByteArr, format=target_img.format)
                #Spécification de la balise d'objet S3
                tag = '{0}={1}'.format(label['Name'], str(label['Confidence']))
                #Sortie vers S3
                s3.put_object(Key='{0}.jpg'.format(uuid.uuid1()), 
                            Bucket='rekognition-test-20200530-output', 
                            Body=imgByteArr.getvalue(),
                            Tagging=tag)
    except Exception as e:
        print(e)
    return True

J'ai essayé de l'utiliser!

animal5.jpg

Essayez de télécharger l'image d'entrée ci-dessus (le nom du fichier est animal5.jpg) vers S3. demo2.png Le téléchargement est terminé. demo3.png Après avoir attendu un moment, l'image extraite a été sortie vers S3! image.png Vérifions une balise de l'image. image.png C'est bien étiqueté. Vérifions le contenu de chaque image sortie vers S3.

J'ai pu l'extraire en toute sécurité!

Matériel de référence

Présentation d'AWS Rekognitoion AWS Rekognitoion Black belt

Recommended Posts

J'ai essayé d'utiliser l'API Detect Labels d'AWS Rekognition
J'ai essayé d'utiliser AWS Chalice
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'utiliser l'API de données YOUTUBE V3
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
J'ai essayé d'utiliser l'API BigQuery Storage
J'ai essayé de marquer un concours de travesti en utilisant l'API Detect de Face ++
J'ai essayé d'utiliser paramétré
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser l'API à distance avec GAE / J
J'ai essayé d'utiliser anytree
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser Summpy
J'ai essayé d'utiliser coturn
J'ai essayé d'utiliser Pipenv
J'ai essayé d'utiliser l'API Google Cloud Vision
J'ai essayé d'utiliser matplotlib
J'ai essayé d'utiliser "Anvil".
J'ai essayé d'utiliser Hubot
J'ai essayé d'utiliser ESPCN
J'ai essayé d'utiliser openpyxl
J'ai essayé AWS CDK!
J'ai essayé d'utiliser Ipython
J'ai essayé d'utiliser PyCaret
J'ai essayé d'utiliser cron
J'ai essayé d'utiliser ngrok
J'ai essayé d'utiliser face_recognition
J'ai essayé d'utiliser Jupyter
J'ai essayé d'utiliser doctest
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser jinja2
J'ai essayé AWS Iot
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser la fenêtre de temps
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
J'ai essayé APN (notification à distance) à l'aide de l'API REST Parse.com
J'ai essayé d'utiliser l'API de Sakenowa Data Project
[J'ai essayé d'utiliser Pythonista 3] Introduction
J'ai essayé d'utiliser easydict (mémo).
J'ai essayé la reconnaissance faciale avec Face ++
J'ai essayé d'utiliser RandomForest
J'ai essayé d'utiliser BigQuery ML
J'ai essayé d'utiliser Amazon Glacier
J'ai essayé d'utiliser git inspector
J'ai essayé d'utiliser magenta / TensorFlow
J'ai essayé d'utiliser l'émojinateur Slack
[AWS] J'ai essayé d'utiliser EC2, RDS, Django. Construction de l'environnement à partir de 1
J'ai essayé de rechercher des vidéos à l'aide de l'API de données Youtube (débutant)
J'ai essayé d'utiliser l'API de reconnaissance faciale des services cognitifs de Microsoft
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
[Pour les débutants] J'ai essayé d'utiliser l'API Tensorflow Object Detection
J'ai essayé d'utiliser Rotrics Dex Arm # 2
J'ai essayé de créer l'API Quip
J'ai essayé le roman Naro API 2
J'ai essayé d'utiliser Rotrics Dex Arm
J'ai essayé d'utiliser GrabCut d'OpenCV