Stockage des données Amazon Rekognition avec Amazon RDS et DynamoDB - Amazon Rekognition

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.

Stockage des données Amazon Rekognition avec Amazon RDS et DynamoDB

Lorsque vous utilisez Amazon Rekognition APIs, il est important de se rappeler que les opérations d'API n'enregistrent aucune des étiquettes générées. Vous pouvez enregistrer ces étiquettes en les plaçant dans la base de données, avec les identifiants des images respectives.

Ce didacticiel explique comment détecter les étiquettes et enregistrer les étiquettes détectées dans une base de données. L'exemple d'application développé dans ce didacticiel lira les images d'un compartiment Amazon S3, appellera l'DetectLabelsopération sur ces images et stockera les étiquettes obtenues dans une base de données. L'application stocke les données dans une instance de base de données Amazon RDS, ou dans une base de données DynamoDB, selon le type de base de données que vous souhaitez utiliser.

Vous allez utiliser l’AWS SDK pour Python ou ce didacticiel. Vous pouvez également consulter le GitHub référentiel d'exemples du SDK de AWS documentation pour d'autres didacticiels Python.

Prérequis

Avant de commencer ce didacticiel, vous devez installer Python et suivre les étapes requises pour configurer le AWS SDK Python. En outre, vérifiez que vous avez effectué les opérations suivantes :

Création d’un compte AWS et d’un rôle IAM

Installation de SDK Python (Boto3)

Configurez correctement vos informations d' AWS accès

Compartiment Amazon S3 créé rempli d'images

Création d'une instance de base de données RDS, si vous utilisez RDS pour stocker des données

Obtenir des étiquettes pour les images dans un compartiment Amazon S3

Commencez par écrire une fonction qui prend le nom d'une image dans votre compartiment Amazon S3 et récupére cette image. Cette image sera affichée pour confirmer que les images correctes sont transmises à un appel DetectLabelsqui figure également dans la fonction.

  1. Trouvez le compartiment Amazon S3 que vous souhaitez utiliser et notez son nom. Appelez ce compartiment Amazon S3 et lisez les images qu'il contient. Assurez-vous que votre bucket contient des images à transmettre à l'DetectLabelsopération.

  2. Écrivez le code pour la connexion à votre compartiment Amazon S3. Vous pouvez vous connecter à la ressource Amazon S3 à l'aide de Boto3 pour récupérer une image à partir d'un compartiment Amazon S3. Une fois connecté à la ressource Amazon S3, vous pouvez accéder à votre compartiment en fournissant à la méthode Bucket le nom de votre compartiment Amazon S3. Une fois connecté au compartiment Amazon S3, vous pouvez récupérer des images du compartiment à l'aide de la méthode Object. En utilisant Matplotlib, vous pouvez utiliser cette connexion pour visualiser vos images au fur et à mesure de leur traitement. Boto3 est également utilisé pour la connexion au client Rekognition.

    Dans le code suivant, indiquez votre région dans le paramètre region_name. Vous allez transmettre le nom du compartiment Amazon S3 et le nom de l'image à DetectLabels, qui renvoie les étiquettes de l'image correspondante. Après avoir sélectionné uniquement les étiquettes dans la réponse, le nom de l'image et les étiquettes sont renvoyés.

    import boto3 from io import BytesIO from matplotlib import pyplot as plt from matplotlib import image as mp_img boto3 = boto3.Session() def read_image_from_s3(bucket_name, image_name): # Connect to the S3 resource with Boto 3 # get bucket and find object matching image name s3 = boto3.resource('s3') bucket = s3.Bucket(name=bucket_name) Object = bucket.Object(image_name) # Downloading the image for display purposes, not necessary for detection of labels # You can comment this code out if you don't want to visualize the images file_name = Object.key file_stream = BytesIO() Object.download_fileobj(file_stream) img = mp_img.imread(file_stream, format="jpeg") plt.imshow(img) plt.show() # get the labels for the image by calling DetectLabels from Rekognition client = boto3.client('rekognition', region_name="region-name") response = client.detect_labels(Image={'S3Object': {'Bucket': bucket_name, 'Name': image_name}}, MaxLabels=10) print('Detected labels for ' + image_name) full_labels = response['Labels'] return file_name, full_labels
  3. Enregistrez ce code dans un fichier appelé get_images.py.

Création d'un tableau Amazon DynamoDB

Le code suivant utilise Boto3 pour se connecter à DynamoDB et il utilise la méthode DynamoDB CreateTable pour créer un tableau nommé Images. Le tableau possède une clé primaire composite comprenant une clé de partition appelée Image, et une clé de tri appelée Étiquettes. La clé Image contient le nom de l'image, tandis que la clé Étiquettes stocke les étiquettes attribuées à cette image.

import boto3 def create_new_table(dynamodb=None): dynamodb = boto3.resource( 'dynamodb',) # Table defination table = dynamodb.create_table( TableName='Images', KeySchema=[ { 'AttributeName': 'Image', 'KeyType': 'HASH' # Partition key }, { 'AttributeName': 'Labels', 'KeyType': 'RANGE' # Sort key } ], AttributeDefinitions=[ { 'AttributeName': 'Image', 'AttributeType': 'S' }, { 'AttributeName': 'Labels', 'AttributeType': 'S' }, ], ProvisionedThroughput={ 'ReadCapacityUnits': 10, 'WriteCapacityUnits': 10 } ) return table if __name__ == '__main__': device_table = create_new_table() print("Status:", device_table.table_status)

Enregistrez ce code dans un éditeur et exécutez-le une fois pour créer un tableau DynamoDB.

Chargement de données vers DynamoDB

Maintenant que la base de données DynamoDB a été créée et que vous disposez d'une fonction permettant d'obtenir des étiquettes pour les images, vous pouvez stocker les étiquettes dans DynamoDB. Le code suivant récupère toutes les images d'un compartiment S3, obtient leurs étiquettes et stocke les données dans DynamoDB.

  1. Vous devez écrire le code permettant de télécharger les données vers DynamoDB. Une fonction appelée get_image_names est utilisée pour se connecter à votre compartiment Amazon S3 et renvoie les noms de toutes les images du compartiment sous forme de liste. Vous allez transmettre cette liste à la fonction read_image_from_S3, qui est importée à partir du fichier get_images.py que vous avez créé.

    import boto3 import json from get_images import read_image_from_s3 boto3 = boto3.Session() def get_image_names(name_of_bucket): s3_resource = boto3.resource('s3') my_bucket = s3_resource.Bucket(name_of_bucket) file_list = [] for file in my_bucket.objects.all(): file_list.append(file.key) return file_list
  2. La fonction read_image_from_S3 que nous avons créée précédemment renvoie le nom de l'image en cours de traitement et le dictionnaire des libellés associés à cette image. Une fonction appelée find_values est utilisée pour obtenir uniquement les étiquettes de la réponse. Le nom de l'image et ses étiquettes sont alors prêts à être téléchargés dans votre tableau DynamoDB.

    def find_values(id, json_repr): results = [] def _decode_dict(a_dict): try: results.append(a_dict[id]) except KeyError: pass return a_dict json.loads(json_repr, object_hook=_decode_dict) # Return value ignored. return results
  3. Vous allez utiliser une troisième fonction appelée load_data, pour charger réellement les images et les étiquettes dans le tableau DynamoDB que vous avez créé.

    def load_data(image_labels, dynamodb=None): if not dynamodb: dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('Images') print("Adding image details:", image_labels) table.put_item(Item=image_labels) print("Success!!")
  4. C'est ici que les trois fonctions que nous avons définies précédemment sont appelées et que les opérations sont effectuées. Ajoutez les trois fonctions définies ci-dessus, ainsi que le code ci-dessous, à un fichier Python. Exécutez le code.

    bucket = "bucket_name" file_list = get_image_names(bucket) for file in file_list: file_name = file print("Getting labels for " + file_name) image_name, image_labels = read_image_from_s3(bucket, file_name) image_json_string = json.dumps(image_labels, indent=4) labels=set(find_values("Name", image_json_string)) print("Labels found: " + str(labels)) labels_dict = {} print("Saving label data to database") labels_dict["Image"] = str(image_name) labels_dict["Labels"] = str(labels) print(labels_dict) load_data(labels_dict) print("Success!")

Vous venez de générer des étiquettes pour vos images et de les stocker dans une instance DynamoDB. DetectLabels Assurez-vous de supprimer toutes les ressources que vous avez créées pendant que vous suivez ce didacticiel. Vous évitez ainsi d'être facturé pour des ressources que vous n'utilisez pas.

Création d'une base de données MySQL dans Amazon RDS

Avant d'aller plus loin, assurez-vous d'avoir terminé la procédure de configurationpour Amazon RDS et d’avoir créé une instance de base de données MySQL à l'aide d'Amazon RDS.

Le code suivant utilise la bibliothèque PyMySQL et votre instance de base de données Amazon RDS. Il crée un tableau contenant les noms de vos images et les étiquettes associées à ces images. Amazon RDS reçoit des commandes pour créer des tableaux et insérer des données dans des tableaux. Pour utiliser Amazon RDS, vous devez vous connecter à l'hôte Amazon RDS à l'aide de votre nom d'hôte, de votre nom d'utilisateur et de votre mot de passe. Vous allez vous connecter à Amazon RDS en fournissant ces arguments à la connect fonction PyMy SQL et en créant une instance de curseur.

  1. Dans le code suivant, remplacez la valeur d'hôte par le point de terminaison de votre hôte Amazon RDS, et remplacez la valeur d'utilisateur par le nom d'utilisateur principal associé à votre instance Amazon RDS. Vous devez également remplacer le mot de passe par le mot de passe principal de votre utilisateur principal.

    import pymysql host = "host-endpoint" user = "username" password = "master-password"
  2. Créez une base de données et un tableau dans lesquels insérer les données de votre image et de votre étiquette. Pour ce faire, exécutez et validez une requête de création. Le code suivant crée une base de données. N'exécutez ce code qu'une seule fois.

    conn = pymysql.connect(host=host, user=user, passwd=password) print(conn) cursor = conn.cursor() print("Connection successful") # run once create_query = "create database rekogDB1" print("Creation successful!") cursor.execute(create_query) cursor.connection.commit()
  3. Une fois la base de données créée, vous devez créer un tableau dans lequel insérer les noms et les étiquettes de vos images. Pour créer un tableau, vous devez d'abord transmettre la commande d’utilisation SQL, ainsi que le nom de votre base de données, à la fonction execute. Une fois la connexion établie, une requête pour créer un tableau est exécutée. Le code suivant se connecte à la base de données, puis crée un tableau contenant à la fois une clé primaire, appelée image_id, et un attribut de texte stockant les étiquettes. Utilisez les importations et les variables que vous avez définies précédemment, puis exécutez ce code pour créer un tableau dans votre base de données.

    # connect to existing DB cursor.execute("use rekogDB1") cursor.execute("CREATE TABLE IF NOT EXISTS test_table(image_id VARCHAR (255) PRIMARY KEY, image_labels TEXT)") conn.commit() print("Table creation - Successful creation!")

Téléchargement de données vers un tableau MySQL Amazon RDS

Après avoir créé la base de données Amazon RDS et un tableau dans la base de données, vous pouvez obtenir des étiquettes pour vos images et les stocker dans la base de données Amazon RDS.

  1. Connectez-vous à votre compartiment Amazon S3 et récupérez les noms de toutes les images qu'il contient. Ces noms d'images seront transmis à la fonction read_image_from_s3 que vous avez créée précédemment pour obtenir les étiquettes de toutes vos images. Le code suivant se connecte à votre compartiment Amazon S3 et renvoie une liste de toutes les images qu'il contient.

    import pymysql from get_images import read_image_from_s3 import json import boto3 host = "host-endpoint" user = "username" password = "master-password" conn = pymysql.connect(host=host, user=user, passwd=password) print(conn) cursor = conn.cursor() print("Connection successful") def get_image_names(name_of_bucket): s3_resource = boto3.resource('s3') my_bucket = s3_resource.Bucket(name_of_bucket) file_list = [] for file in my_bucket.objects.all(): file_list.append(file.key) return file_list
  2. La réponse de l'DetectLabelsAPI ne contient pas que les étiquettes. Écrivez donc une fonction pour extraire uniquement les valeurs des étiquettes. La fonction suivante renvoie une liste contenant uniquement les étiquettes.

    def find_values(id, json_repr): results = [] def _decode_dict(a_dict): try: results.append(a_dict[id]) except KeyError: pass return a_dict json.loads(json_repr, object_hook=_decode_dict) # Return value ignored. return results
  3. Vous avez besoin d'une fonction pour insérer les noms et les étiquettes des images dans votre tableau. La fonction suivante exécute une requête d'insertion et insère une paire donnée de nom d'image et d'étiquettes.

    def upload_data(image_id, image_labels): # insert into db cursor.execute("use rekogDB1") query = "INSERT IGNORE INTO test_table(image_id, image_labels) VALUES (%s, %s)" values = (image_id, image_labels) cursor.execute(query, values) conn.commit() print("Insert successful!")
  4. Enfin, vous devez exécuter les fonctions que vous avez définies ci-dessus. Dans le code suivant, les noms de toutes les images de votre bucket sont collectés et fournis à la fonction qui appelle DetectLabels. Les étiquettes et le nom de l'image à laquelle elles s'appliquent sont ensuite chargés dans votre base de données Amazon RDS. Ajoutez les trois fonctions définies ci-dessus, ainsi que le code ci-dessous, à un fichier Python. Exécutez le fichier Python.

    bucket = "bucket-name" file_list = get_image_names(bucket) for file in file_list: file_name = file print("Getting labels for " + file_name) image_name, image_labels = read_image_from_s3(bucket, file_name) image_json = json.dumps(image_labels, indent=4) labels=set(find_values("Name", image_json)) print("Labels found: " + str(labels)) unique_labels=set(find_values("Name", image_json)) print(unique_labels) image_name_string = str(image_name) labels_string = str(unique_labels) upload_data(image_name_string, labels_string) print("Success!")

Vous avez réussi DetectLabels à générer des étiquettes pour vos images et à les stocker dans une base de données MySQL à l'aide d'Amazon RDS. Assurez-vous de supprimer toutes les ressources que vous avez créées pendant que vous suivez ce didacticiel. Vous évitez ainsi d'être facturé pour des ressources que vous n'utilisez pas.

Pour d'autres exemples AWS multiservices, consultez le référentiel d'exemples GitHub du SDK de AWS documentation.