Exercice - Charger les données

Effectué

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.

  1. Créez un projet dans le portail Custom Vision :

    1. Accédez à https://www.customvision.ai/projects et connectez-vous. Sélectionnez Nouveau projet.

    2. Dans Créer un projet :

      1. Dans Nom, entrez le nom de projet de votre choix.

      2. Dans Description, entrez une courte description du modèle.

      3. Dans Groupe de ressources, sélectionnez le groupe de ressources que vous avez créé dans le portail Azure.

      4. Dans Types de projets, sélectionnez Classification.

      5. Dans Types de classification, sélectionnez Multiclasse (une étiquette par image).

      6. Dans Domaines, sélectionnez Général.

      7. Sélectionnez Créer un projet.

        Capture d’écran montrant comment créer une ressource dans le portail Custom Vision.

    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.

  2. Ajouter des images et des étiquettes pour une espèce d’oiseau :

    1. Dans votre projet Custom Vision, sélectionnez Ajouter des images.

      Capture d’écran mettant en surbrillance le bouton Ajouter des images dans un projet Custom Vision.

    2. Dans Ouvrir, accédez au dossier birds-photo dans lequel vous avez extrait les images du fichier zip du jeu de données.

    3. Ouvrez un dossier d’espèce d’oiseau.

    4. Sélectionnez Ctrl+A pour sélectionner toutes les images du dossier d’espèce d’oiseau, puis choisissez Ouvrir.

      Capture d’écran montrant la sélection de toutes les images d’un dossier d’espèce.

    5. Pour Chargement de l’image, ajoutez une description dans Mes étiquettes pour indiquer l’espèce des oiseaux figurant dans les photos.

    6. Sélectionnez Charger <nombre> fichiers.

      Capture d’écran montrant comment ajouter une description d’étiquette aux photos chargées dans Custom Vision.

  3. 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 :

  1. Ouvrez l’IDE de votre choix. Exécutez ensuite la commande suivante pour importer le package :

    !pip install azure-cognitiveservices-vision-customvision
    
  2. 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
    
  3. 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 :

    1. Dans le portail Azure, accédez à votre ressource Custom Vision.

    2. Dans le menu de la ressource, sous Gestion des ressources, sélectionnez Clés et points de terminaison.

    3. Copiez la valeur de la zone Point de terminaison. Dans le code, remplacez l’espace réservé <endpoint> par cette valeur.

    4. 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.

      Capture d’écran mettant en surbrillance les valeurs des points de terminaison et des clés d’une ressource Custom Vision dans le portail Azure.

    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!")
    
  4. 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.

  5. 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)
    
  6. 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 :

    1. 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}")
      
    2. Ajoutez ensuite le code pour la fonction createImageList. La fonction utilise deux paramètres : un nom tag à partir de la liste des noms des dossiers, et l’élément tag_id de l’étiquette que nous avons créée dans le projet Custom Vision. La fonction utilise la valeur base_image_url pour définir le répertoire sur le dossier qui contient les images de l’étiquette pour l’élément tag 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ément tag 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
      
    3. Le dernier code à ajouter permet de créer la fonction uploadImageList. Nous transmettons l’élément image_list que nous avons créé à partir du dossier, puis chargeons la liste dans l’élément tag :

      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)
      
  7. À 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 boucle for :

    1. Appelez la fonction createTag, que vous avez précédemment créée, afin de créer la classe tag dans le projet Custom Vision.

    2. Appelez la fonction createImageList, que vous avez précédemment créée, avec le nom tag et les valeurs tag_id retournées à partir de Custom Vision. La fonction retourne la liste des images à charger.

    3. Appelez la fonction imageList, que vous avez précédemment créée, pour charger les images issues de image_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.