Övning – Ladda upp data

Slutförd

Nu är det dags att ladda upp de bilder som vi ska använda för att träna maskininlärningsmodellen. Det finns två sätt att ladda upp bilder:

  • I Custom Vision-portalen väljer du, laddar upp och taggar sedan bilder.
  • I ett verktyg som Jupyter Notebook använder du de bilder som ingår i Custom Vision SDK.

När du har en stor mängd data, bildklasser och taggar att ladda upp är det snabbare att använda Custom Vision SDK. Du kan dock välja något av de alternativ som beskrivs i nästa avsnitt. Slutför stegen för att ladda upp bilderna i datauppsättningen på det sätt som passar dig bäst.

Alternativ 1: Använd Custom Vision-portalen för att ladda upp och tagga bilder

Bilderna måste laddas upp och taggas individuellt av varje undermapp. I den här övningen kanske du bara vill ladda upp bilder i fyra eller fem av undermapparna beroende på din uppladdningshastighet. Tänk på att fler och varierande exempel ger bättre resultat när du tränar en maskininlärningsmodul.

  1. Skapa ett projekt i Custom Vision-portalen:

    1. Gå till https://www.customvision.ai/projects och logga in. Välj Nytt projekt.

    2. I Skapa nytt projekt:

      1. Som Namn anger du ett valfritt projektnamn.

      2. Som Beskrivning anger du en kort beskrivning av modellen.

      3. För Resursgrupp väljer du den resursgrupp som du skapade i Azure-portalen.

      4. För Projekttyper väljer du Klassificering.

      5. För Klassificeringstyper väljer du Multiclass (Enkel tagg per bild).

      6. För Domäner väljer du Allmänt.

      7. Välj Skapa projekt.

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

    Kommentar

    Om du vill exportera modellen och distribuera den på en mobil enhet eller i TensorFlow.js eller IoT, går du till Domäneroch väljer ett kompakt modellalternativ. Du kan ändra det här alternativet i inställningarna när projektet har skapats.

  2. Lägg till bilder och taggar för en fågelart:

    1. Välj Lägg till bilder i Custom Vision-projektet.

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

    2. I Öppna går du till mappen birds-photo där du extraherade bildfilerna från zip-filen för datauppsättningen.

    3. Öppna en mapp för fågelarter.

    4. Välj Ctrl + A för att markera alla bilder i artmappen och välj sedan Öppna.

      Screenshot that shows selecting all images in a species folder.

    5. I Bilduppladdning lägger du till en beskrivning i Mina taggar för att ange arten för fåglarna som visas i bilderna.

    6. Välj Ladda upp <antal> filer.

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

  3. Upprepa föregående steg för att ladda upp bilderna i varje mapp för fågelarter i den nedladdade datamängden.

Alternativ 2: Använd Python och Custom Vision SDK för att ladda upp och tagga bilder

Custom Vision SDK är tillgängligt på följande programmeringsspråk: Python, .NET, Node.js, Go och Java. Vi använder Python. Om du inte redan har Python installerat rekommenderar vi att du hämtar det med en Anaconda-installation. Du får Python när du laddar ned Anaconda.

Om du föredrar att i stället ladda ned koden från GitHub kan du klona lagringsplatsen med hjälp av följande kommando:

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

Följ dessa steg för att skapa den virtuella miljön och klistra in kod i miljön:

  1. Öppna valfri IDE. Kör sedan följande kommando för att importera paketet:

    !pip install azure-cognitiveservices-vision-customvision
    
  2. Importera de paket som du behöver för att köra skriptet:

    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. Använd nu följande kod för att skapa Custom Vision-projektet. Innan du kör koden ersätter du <endpoint> platshållarna och <key> med värdena för din Custom Vision-resurs.

    Så här hämtar du Custom Vision-resursvärdena:

    1. I Azure-portalen går du till din Custom Vision-resurs.

    2. I resursmenyn går du till Resurshantering och väljer Nycklar och Slutpunkt.

    3. Kopiera värdet från rutan Slutpunkt . Ersätt platshållaren med det här värdet i koden <endpoint> .

    4. För NYCKEL 1 väljer du kopieringsikonen för att kopiera nyckeln. Ersätt platshållaren med det här värdet i koden <key> .

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

    Koden ser ut så här:

    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. Packa upp din nedladdade bird-photos.zip-fil till samma katalog där du sparade Jupyter Notebook-filen. Lägg till följande kod för att ändra till katalogen för fågelfoton i projektet.

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

    Varning

    Kör koden i den här cellen bara en gång. Om du försöker köra cellen mer än en gång utan att starta om Python-kerneln misslyckas cellkörningen.

  5. Lägg till följande kod för att hämta listan över taggar av fågeltyp. Taggarna skapas baserat på mappnamnen i katalogen 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. Sedan skapar vi tre funktioner som vi anropar i en for loop:

    • Funktionen createTag skapar en klasstagg i Custom Vision-projektet.
    • Funktionen createImageList använder taggnamnet och tagg-ID:t för att skapa en bildlista.
    • Funktionen image_list laddar upp bilder i batchar från listan.

    Så här skapar du de tre funktionerna:

    1. Lägg till funktionskoden createTag i Jupyter Notebook-filen. Funktionen skapar en tagg för avbildningsnamn i Custom Vision-projektet.

      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. Lägg sedan till koden för createImageList funktionen. Funktionen tar två parametrar: ett tag namn från listan med mappnamn och tag_id från taggen vi skapade i Custom Vision-projektet. Funktionen använder base_image_url värdet för att ange katalogen till den mapp som innehåller avbildningarna för de tag vi skapade från mappnamnen. Sedan lägger vi till varje bild i listan, som vi ska använda för att ladda upp i batchar till den skapade tag:

      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. Den sista koden som ska läggas till är att skapa uploadImageList funktionen. Vi skickar det image_list som vi skapade från mappen och laddar sedan upp listan till 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. Nu ska vi lägga till koden för vår huvudmetod. För varje tagg anropar metoden de tre funktioner som vi skapade. Vi loopar igenom varje tagg (mappnamn) i samlingen tags som vi skapade från mapparna i katalogen bird-photos/custom-photos. Här är stegen i loopen for :

    1. Anropa funktionen createTag , som du skapade tidigare, för att skapa klassen tag i Custom Vision-projektet.

    2. Anropa funktionen createImageList , som du skapade tidigare, och med namnet tag och tag_id värdena som returneras från Custom Vision. Funktionen returnerar listan över bilder som ska laddas upp.

    3. imageList Anropa funktionen, som du skapade tidigare, för att ladda upp bilderna från image_list i batchar med 25. Vi laddar upp i batchar med 25 eftersom Custom Vision överskrider tidsgränsen om vi försöker ladda upp hela datauppsättningen på en gång.

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

      Varning

      Kör koden i den här cellen bara en gång. Om du försöker köra cellen mer än en gång utan att även ta bort ditt Custom Vision-projekt misslyckas cellkörningen.