Übung: Hochladen der Daten

Abgeschlossen

Jetzt sollten die zum Trainieren des Machine Learning-Modells verwendeten Bilder hochgeladen werden. Die Bilder können auf zwei Arten hochgeladen werden:

  • Wählen Sie im Custom Vision-Portal die Bilder aus, laden Sie sie hoch, und markieren Sie sie.
  • Verwenden Sie in einem Tool wie Jupyter Notebook die Bilder, die im Custom Vision SDK enthalten sind.

Wenn Sie über eine große Menge hochzuladender Daten, Bildklassen und Tags verfügen, ist es schneller, das Custom Vision SDK zu verwenden. Sie können jedoch eine der Optionen auswählen, die in den nächsten Abschnitten beschrieben werden. Führen Sie die Schritte zum Hochladen der Bilder im Dataset so aus, wie es für Sie am besten passt.

Option 1: Verwenden des Custom Vision-Portals zum Hochladen und Markieren von Bildern

Die Bilder müssen von jedem Unterordner einzeln hochgeladen und markiert werden. Für diese Übung können Sie Bilder nur in vier oder fünf unterordnern hochladen, je nach Uploadgeschwindigkeit. Denken Sie daran, dass beim Training eines maschinellen Lernmoduls mehr und vielfältigere Beispiele bessere Ergebnisse liefern.

  1. Erstellen Sie ein Projekt im Custom Vision-Portal:

    1. Gehen Sie zu https://www.customvision.ai/projects, und melden Sie sich an. Wählen Sie Neues Projekt aus.

    2. Gehen Sie unter Neues Projekt erstellen folgendermaßen vor:

      1. Geben Sie für Name den gewünschten Projektnamen ein.

      2. Geben Sie unter Beschreibung eine Kurzbeschreibung des Modells ein.

      3. Wählen Sie für Ressourcengruppe die Ressourcengruppe aus, die Sie im Azure-Portal erstellt haben.

      4. Wählen Sie für Projekttypen die Option Klassifizierung aus.

      5. Wählen Sie für Klassifizierungstypen die Option Multiklassen-Klassifizierung (ein einzelnes Tag pro Bild) aus.

      6. Wählen Sie für Domänen die Option Allgemein aus.

      7. Wählen Sie Projekt erstellen aus.

        Screenshot that shows how to create a new resource in the Custom Vision portal.

    Hinweis

    Wenn Sie das Modell zum Bereitstellen auf einem mobilen Gerät, in TensorFlow.js oder IoT exportieren möchten, wählen Sie unter Domänen eine kompakte Modelloption aus. Sie können diese Option nach dem Erstellen des Projekts in den Einstellungen ändern.

  2. Hinzufügen von Bildern und Tags für eine Vogelart:

    1. Klicken Sie in Ihrem Custom Vision-Projekt auf Bilder hinzufügen.

      Screenshot that highlights the Add images button in a Custom Vision project.

    2. Wechseln Sie unter Öffnen zum Ordner birds-photo, in dem Sie die Bilddateien aus der Dataset-ZIP-Datei extrahiert haben.

    3. Öffnen Sie einen Vogelartenordner.

    4. Drücken Sie STRG+A, um alle Bilder im Artenordner auszuwählen, und wählen Sie Öffnen.

      Screenshot that shows selecting all images in a species folder.

    5. Fügen Sie in Bild hochladen in Meine Tags eine Beschreibung hinzu, um die Art der in den Fotos gezeigten Vögel anzugeben.

    6. Klicken Sie auf <Anzahl> Dateien hochladen.

      Screenshot that shows how to add a tag description to uploaded photos in Custom Vision.

  3. Wiederholen Sie den vorherigen Schritt, um die Fotos in jedem Vogelartenordner im heruntergeladenen Dataset hochzuladen.

Option 2: Verwenden von Python und dem Custom Vision-SDK zum Hochladen und Markieren von Bildern

Das Custom Vision SDK steht in den folgenden Programmiersprachen zur Verfügung: Python, .NET, Node.js, Go und Java. Sie verwenden Python. Wenn Sie Python noch nicht installiert haben, sollten Sie eine Anaconda-Installation dafür verwenden. Sie erhalten Python, wenn Sie Anaconda herunterladen.

Wenn Sie stattdessen lieber den Code von GitHub herunterladen, können Sie das Repository mithilfe des folgenden Befehls klonen:

git clone https://github.com/MicrosoftDocs/mslearn-cv-classify-bird-species.git

Führen Sie die folgenden Schritte aus, um die virtuelle Umgebung zu erstellen und Code in die Umgebung einzufügen:

  1. Öffnen Sie die IDE Ihrer Wahl. Führen Sie dann den folgenden Befehl zum Importieren des Pakets aus:

    !pip install azure-cognitiveservices-vision-customvision
    
  2. Importieren Sie die Pakete, die Sie zum Ausführen des Skripts benötigen:

    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. Verwenden Sie nun den folgenden Code, um das Custom Vision-Projekt zu erstellen. Bevor Sie den Code ausführen, ersetzen Sie die Platzhalter <endpoint> und <key> durch die Werte für Ihre Custom Vision-Ressource.

    So erhalten Sie die Custom Vision-Ressourcenwerte:

    1. Navigieren Sie im Azure-Portal zu ihrer Custom Vision-Ressource.

    2. Wählen Sie im Ressourcenmenü unter Ressourcenverwaltung die Option Schlüssel und Endpunkt aus.

    3. Kopieren Sie den Wert aus dem Feld Endpunkt. Ersetzen Sie im Code den <endpoint>-Platzhalter durch diesen Wert.

    4. Wählen Sie für KEY 1 das Kopiersymbol aus, um den Schlüssel zu kopieren. Ersetzen Sie im Code den <key>-Platzhalter durch diesen Wert.

      Screenshot that highlights the endpoint and key values for a Custom Vision resource in the Azure portal.

    Ihr Code sieht dann wie im folgenden Beispiel aus:

    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. Entpacken Sie die heruntergeladene Datei bird-photos.zip in dasselbe Verzeichnis, in dem Sie Ihre Jupyter Notebook-Datei gespeichert haben. Fügen Sie den folgenden Code hinzu, um zum Verzeichnis für die Vogelfotos in Ihrem Projekt zu wechseln.

    # Change to the directory for the bird photos
    import os
    os.chdir('./bird-photos/custom-photos')
    

    Warnung

    Führen Sie den Code in dieser Zelle nur einmal aus. Wenn Sie versuchen, die Zelle mehrmals auszuführen, ohne auch den Python-Kernel neu zu starten, tritt bei der Zellenausführung ein Fehler auf.

  5. Fügen Sie den folgenden Code hinzu, um die Liste der Vogelartentags zu erhalten. Die Tags werden auf den Ordnernamen im Verzeichnis „bird-photos/custom-photos“ basierend erstellt:

    # Create a tag list from folders in bird directory
    tags = [name for name in os.listdir('.') if os.path.isdir(name)]
    print(tags)
    
  6. Im nächsten Schritt erstellen wir drei Funktionen, die in einer for-Schleife aufgerufen werden:

    • Die createTag-Funktion erstellt ein Klassentag im Custom Vision-Projekt.
    • Die createImageList-Funktion verwendet den Tagnamen und die Tag-ID, um eine Bildliste zu erstellen.
    • Die image_list-Funktion lädt Bilder in Batches aus der Liste hoch.

    So erstellen Sie die drei Funktionen:

    1. Fügen Sie in der Jupyter Notebook-Datei den createTag-Funktionscode hinzu. Die Funktion erstellt ein Bildnamenstag im Custom Vision-Projekt.

      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. Fügen Sie nun den Code für die Funktion createImageList hinzu. Die Funktion übernimmt zwei Parameter: einen tag-Namen aus der Liste der Ordnernamen und die tag_id des Tags, das wir im Custom Vision-Projekt erstellt haben. Die Funktion legt mit dem base_image_url-Wert den Ordner als Verzeichnis fest, der die Bilder für das tag enthält, das wir anhand der Ordnernamen erstellt haben. Dann fügen wir alle Bilder der Liste an, die wir in Batches in das erstellte tag hochladen:

      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. Der letzte hinzuzufügende Code dient zum Erstellen der uploadImageList-Funktion. Wir übergeben die image_list, die wir anhand des Ordners erstellt haben, und laden diese Liste dann in das tag hoch:

      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. Nun fügen wir den Code für die Main-Methode hinzu. Für jedes Tag ruft die Methode die drei von uns erstellten Funktionen auf. Wir führen eine Schleife für jedes Tag (Ordnername) in der tags-Sammlung aus, das wir auf Basis der Ordner im Verzeichnis „bird-photos/custom-photos“ erstellt haben. Dies sind die Schritte in der for-Schleife:

    1. Rufen Sie die createTag-Funktion auf, die Sie zuvor erstellt haben, um die Klasse tag im Custom Vision-Projekt zu erstellen.

    2. Rufen Sie die createImageList-Funktion mit dem tag-Namen und den von Custom Vision zurückgegebenen tag_id-Werten auf, die Sie zuvor erstellt haben. Die Funktion gibt die Liste der hochzuladenden Bilder zurück.

    3. Rufen Sie die imageList-Funktion auf, die Sie zuvor erstellt haben, um die Bilder aus der image_list in Batches mit je 25 Stück hochzuladen. Sie laden sie in Batches mit je 25 Stück hoch, da bei Custom Vision ein Timeout auftritt, wenn Sie versuchen, das gesamte Dataset auf einmal hochzuladen.

      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}")
      

      Warnung

      Führen Sie den Code in dieser Zelle nur einmal aus. Wenn Sie versuchen, die Zelle mehrmals auszuführen, ohne auch das Custom Vision-Projekt zu löschen, tritt bei der Zellenausführung ein Fehler auf.