Exercice - Charger les données
Il est maintenant temps de charger les images que nous allons utiliser pour former le modèle Machine Learning. Il existe deux manières de charger des images :
- Dans le portail Custom Vision, sélectionnez, chargez, puis étiquetez des images.
- Dans un outil comme Jupyter Notebook, utilisez les images incluses dans le Kit de développement logiciel (SDK) Custom Vision.
Lorsque vous disposez d’une grande quantité de données, de classes d’images et d’étiquettes à charger, il est plus rapide d’utiliser le SDK Custom Vision. Toutefois, vous pouvez choisir l’une des options décrites dans les sections suivantes. Effectuez les étapes pour charger les images dans le jeu de données de la manière qui vous convient le mieux.
Option 1 : utiliser le portail Custom Vision pour charger et étiqueter des images
Les images doivent être chargées et étiquetées individuellement pour chaque sous-dossier. Pour cet exercice, vous pouvez charger des images dans seulement quatre ou cinq des sous-dossiers en fonction de la vitesse de chargement. Gardez à l’esprit que lors de l’apprentissage d’un module de Machine Learning, l’utilisation d’exemples plus nombreux et variés permet d’obtenir de meilleurs résultats.
Créez un projet dans le portail Custom Vision :
Accédez à https://www.customvision.ai/projects et connectez-vous. Sélectionnez Nouveau projet.
Dans Créer un projet :
Dans Nom, entrez le nom de projet de votre choix.
Dans Description, entrez une courte description du modèle.
Dans Groupe de ressources, sélectionnez le groupe de ressources que vous avez créé dans le portail Azure.
Dans Types de projets, sélectionnez Classification.
Dans Types de classification, sélectionnez Multiclasse (une étiquette par image).
Dans Domaines, sélectionnez Général.
Sélectionnez Créer un projet.
Notes
Si vous souhaitez exporter le modèle pour le déployer sur un appareil mobile ou dans TensorFlow.js ou IoT, sous Domaines, sélectionnez une option de modèle compact. Vous pouvez modifier cette option dans les paramètres après la création du projet.
Ajouter des images et des étiquettes pour une espèce d’oiseau :
Dans votre projet Custom Vision, sélectionnez Ajouter des images.
Dans Ouvrir, accédez au dossier birds-photo dans lequel vous avez extrait les images du fichier zip du jeu de données.
Ouvrez un dossier d’espèce d’oiseau.
Sélectionnez Ctrl+A pour sélectionner toutes les images du dossier d’espèce d’oiseau, puis choisissez Ouvrir.
Pour Chargement de l’image, ajoutez une description dans Mes étiquettes pour indiquer l’espèce des oiseaux figurant dans les photos.
Sélectionnez Charger <nombre> fichiers.
Répétez l’étape précédente pour charger les photos de chaque dossier d’espèces d’oiseaux dans le jeu de données téléchargé.
Option 2 : Utiliser Python et le SDK Custom Vision pour charger et étiqueter des images
Le SDK Custom Vision est disponible dans les langages de programmation suivants : Python, .NET, Node.js, Go et Java. Nous allons utiliser Python. Si Python n’est pas déjà installé, nous vous recommandons de l’obtenir avec une installation Anaconda. Vous obtenez Python quand vous téléchargez Anaconda.
Si vous préférez télécharger le code à partir de GitHub, vous pouvez cloner le dépôt à l’aide de la commande suivante :
git clone https://github.com/MicrosoftDocs/mslearn-cv-classify-bird-species.git
Effectuez les étapes suivantes pour créer l’environnement virtuel et coller le code dans l’environnement :
Ouvrez l’IDE de votre choix. Exécutez ensuite la commande suivante pour importer le package :
!pip install azure-cognitiveservices-vision-customvision
Importez les packages nécessaires pour exécuter le script :
from azure.cognitiveservices.vision.customvision.training import CustomVisionTrainingClient from azure.cognitiveservices.vision.customvision.training.models import ImageFileCreateEntry from azure.cognitiveservices.vision.customvision.training.models import ImageFileCreateBatch from msrest.authentication import ApiKeyCredentials import numpy as np
Utilisez à présent le code suivant pour créer le projet Custom Vision. Avant d’exécuter le code, remplacez les espaces réservés
<endpoint>
et<key>
par les valeurs de votre ressource Custom Vision.Pour obtenir les valeurs de ressources Custom Vision :
Dans le portail Azure, accédez à votre ressource Custom Vision.
Dans le menu de la ressource, sous Gestion des ressources, sélectionnez Clés et points de terminaison.
Copiez la valeur de la zone Point de terminaison. Dans le code, remplacez l’espace réservé
<endpoint>
par cette valeur.Pour CLÉ 1, sélectionnez l’icône de copie afin de copier la clé. Dans le code, remplacez l’espace réservé
<key>
par cette valeur.
Votre code doit ressembler à l’exemple suivant :
ENDPOINT = "<endpoint>" # Replace with a valid key training_key = "<key>" credentials = ApiKeyCredentials(in_headers={"Training-key": training_key}) publish_iteration_name = "classifyBirdModel" trainer = CustomVisionTrainingClient(ENDPOINT, credentials) # Create a new project print ("Creating project...") project = trainer.create_project("Bird Classification") print("Project created!")
Décompressez votre fichier bird-photos.zip dans le même répertoire où vous avez enregistré votre fichier Jupyter Notebook. Ajoutez le code suivant pour passer au répertoire des photos d’oiseau dans votre projet.
# Change to the directory for the bird photos import os os.chdir('./bird-photos/custom-photos')
Avertissement
Exécutez une seule fois le code dans cette cellule. Si vous tentez d’exécuter la cellule plusieurs fois sans redémarrer également votre noyau Python, l’exécution de la cellule échoue.
Ajoutez le code suivant pour obtenir la liste des étiquettes de types d’oiseaux. Les étiquettes sont créées en fonction des noms de dossiers dans le répertoire bird-photos/custom-photos :
# Create a tag list from folders in bird directory tags = [name for name in os.listdir('.') if os.path.isdir(name)] print(tags)
Créons ensuite trois fonctions que nous appellerons dans une boucle
for
:- La fonction
createTag
crée une étiquette de classe dans le projet Custom Vision. - La fonction
createImageList
utilise le nom et l’ID de l’étiquette pour créer une liste d’images. - La fonction
image_list
charge les images par lots à partir de la liste.
Pour créer les trois fonctions :
Dans votre fichier Jupyter Notebook, ajoutez le code de fonction
createTag
. La fonction crée une étiquette de nom d’image dans le projet Custom Vision.tag_id = createTag(tag) print(f"tag creation done with tag id {tag_id}") image_list = createImageList(tag, tag_id) print("image_list created with length " + str(len(image_list))) # Break list into lists of 25 and upload in batches for i in range(0, len(image_list), 25): batch = ImageFileCreateBatch(images=image_list[i:i + 25]) print(f'Upload started for batch {i} total items {len(image_list)} for tag {tag}...') uploadImageList(batch) print(f"Batch {i} Image upload completed. Total uploaded {len(image_list)} for tag {tag}")
Ajoutez ensuite le code pour la fonction
createImageList
. La fonction utilise deux paramètres : un nomtag
à partir de la liste des noms des dossiers, et l’élémenttag_id
de l’étiquette que nous avons créée dans le projet Custom Vision. La fonction utilise la valeurbase_image_url
pour définir le répertoire sur le dossier qui contient les images de l’étiquette pour l’élémenttag
que nous avons créé à partir des noms des dossiers. Ensuite, nous ajoutons chaque image à la liste, que nous utiliserons pour le chargement par lots dans l’élémenttag
créé :def createImageList(tag, tag_id): # Set directory to current tag. base_image_url = f"./{tag}/" photo_name_list = os.listdir(base_image_url) image_list = [] for file_name in photo_name_list: with open(base_image_url+file_name, "rb") as image_contents: image_list.append(ImageFileCreateEntry(name=base_image_url+file_name, contents=image_contents.read(), tag_ids=[tag_id])) return image_list
Le dernier code à ajouter permet de créer la fonction
uploadImageList
. Nous transmettons l’élémentimage_list
que nous avons créé à partir du dossier, puis chargeons la liste dans l’élémenttag
:def uploadImageList(image_list): upload_result = trainer.create_images_from_files(project_id=project.id, batch=image_list) if not upload_result.is_batch_successful: print("Image batch upload failed.") for image in upload_result.images: print("Image status: ", image.status) exit(-1)
- La fonction
À présent, nous allons ajouter le code pour notre méthode principale. Pour chaque étiquette, la méthode appelle les trois fonctions que nous avons créées. Nous effectuons une boucle sur chaque étiquette (nom de dossier) dans le regroupement
tags
que nous avons créé à partir des dossiers dans le répertoire bird-photos/custom-photos. Voici les étapes de la bouclefor
:Appelez la fonction
createTag
, que vous avez précédemment créée, afin de créer la classetag
dans le projet Custom Vision.Appelez la fonction
createImageList
, que vous avez précédemment créée, avec le nomtag
et les valeurstag_id
retournées à partir de Custom Vision. La fonction retourne la liste des images à charger.Appelez la fonction
imageList
, que vous avez précédemment créée, pour charger les images issues deimage_list
par lots de 25. Nous chargeons par lots de 25 car le délai d’attente de Custom Vision expire si nous essayons de charger la totalité du jeu de données en une seule fois.for tag in tags: tag_id = createTag(tag) print(f"tag creation done with tag id {tag_id}") image_list = createImageList(tag, tag_id) print("image_list created with length " + str(len(image_list))) # Break list into lists of 25 and upload in batches. for i in range(0, len(image_list), 25): batch = ImageFileCreateBatch(images=image_list[i:i + 25]) print(f'Upload started for batch {i} total items {len (image_list)} for tag {tag}...') uploadImageList(batch) print(f"Batch {i} Image upload completed. Total uploaded {len(image_list)} for tag {tag}")
Avertissement
Exécutez une seule fois le code dans cette cellule. Si vous tentez d’exécuter la cellule plusieurs fois sans supprimer également votre projet Custom Vision, l’exécution de la cellule échoue.