Cvičení – nahrání dat

Dokončeno

Teď je čas nahrát obrázky, které použijeme k trénování modelu strojového učení. Obrázky můžete nahrát dvěma způsoby:

  • Na portálu Custom Vision vyberte, nahrajte a označte obrázky.
  • V nástroji, jako je Jupyter Notebook, použijte obrázky, které jsou součástí sady Custom Vision SDK.

Pokud máte k nahrání velké množství dat, tříd obrázků a značek, je rychlejší používat sadu Custom Vision SDK. Můžete ale zvolit jednu z možností popsaných v dalších částech. Dokončete kroky pro nahrání obrázků v datové sadě způsobem, který vám nejlépe vyhovuje.

Možnost 1: Nahrání a označování obrázků pomocí portálu Custom Vision

Obrázky musí být nahrané a označené jednotlivě jednotlivými podsložkami. V tomto cvičení můžete v závislosti na rychlosti nahrávání chtít nahrát obrázky jenom ve čtyřech nebo pěti podsložkách. Mějte na paměti, že při trénování modulu strojového učení získáte lepší výsledky.

  1. Vytvořte projekt na portálu Custom Vision:

    1. Přejděte a https://www.customvision.ai/projects přihlaste se. Vyberte Nový projekt.

    2. V okně Create new project (Vytvořit nový projekt):

      1. Jako Název zadejte název projektu podle vašeho výběru.

      2. Jako popis zadejte krátký popis modelu.

      3. V části Skupina prostředků vyberte skupinu prostředků, kterou jste vytvořili na webu Azure Portal.

      4. U typů projektů vyberte Klasifikaci.

      5. U typů klasifikace vyberte Vícetřídy (jedna značka na obrázek).

      6. V části Domény vyberte Obecné.

      7. Vyberte příkaz Vytvořit projekt.

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

    Poznámka:

    Pokud chcete model exportovat pro nasazení na mobilní zařízení nebo v TensorFlow.js nebo IoT, vyberte v části Domény možnost kompaktního modelu. Tuto možnost můžete změnit v nastaveních po vytvoření projektu.

  2. Přidejte obrázky a značky pro ptačí druhy:

    1. Ve svém projektu Custom Vision vyberte Přidat obrázky.

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

    2. V okně Otevřít přejděte do složky birds-photo , do které jste extrahovali soubory obrázků ze souboru ZIP datové sady.

    3. Otevřete složku ptačích druhů.

    4. Pokud chcete vybrat všechny obrázky ve složce druhů, vyberte Ctrl+A a pak vyberte Otevřít.

      Screenshot that shows selecting all images in a species folder.

    5. Nahrání obrázku přidejte do části Moje značky popis, který označuje druhy ptáků zobrazených na fotkách.

    6. Vyberte Nahrát <počet> souborů.

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

  3. Opakujte předchozí krok a nahrajte fotky do každé složky ptačích druhů ve stažené datové sadě.

Možnost 2: Použití Pythonu a sady Custom Vision SDK k nahrání a označování obrázků

Sada Custom Vision SDK je dostupná v následujících programovacích jazycích: Python, .NET, Node.js, Go a Java. Použijeme Python. Pokud ještě nemáte nainstalovaný Python, doporučujeme, abyste ho získali s instalací Anaconda. Python získáte při stahování Anaconda.

Pokud místo toho chcete stáhnout kód z GitHubu, můžete úložiště naklonovat pomocí následujícího příkazu:

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

Pomocí následujícího postupu vytvořte virtuální prostředí a vložte kód do prostředí:

  1. Otevřete integrované vývojové prostředí (IDE) podle svého výběru. Pak spusťte následující příkaz pro import balíčku:

    !pip install azure-cognitiveservices-vision-customvision
    
  2. Importujte balíčky, které potřebujete ke spuštění skriptu:

    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. Teď pomocí následujícího kódu vytvořte projekt Custom Vision. Před spuštěním kódu nahraďte <endpoint> a <key> zástupné symboly hodnotami prostředku Custom Vision.

    Získání hodnot prostředků Custom Vision:

    1. Na webu Azure Portal přejděte k prostředku Custom Vision.

    2. V nabídce prostředků v části Správa prostředků vyberte Klíče a koncový bod.

    3. Zkopírujte hodnotu z pole Koncový bod . V kódu nahraďte <endpoint> zástupný symbol touto hodnotou.

    4. Pro klíč 1 vyberte ikonu kopírování a zkopírujte klíč. V kódu nahraďte <key> zástupný symbol touto hodnotou.

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

    Váš kód bude vypadat jako v tomto příkladu:

    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. Rozbalte stažený soubor bird-photos.zip do stejného adresáře, do kterého jste uložili soubor Jupyter Notebook. Přidejte následující kód, který se má změnit do adresáře pro fotky ptáka v projektu.

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

    Upozorňující

    Kód v této buňce spusťte pouze jednou. Pokud se pokusíte buňku spustit vícekrát bez restartování jádra Pythonu, spuštění buňky se nezdaří.

  5. Přidejte následující kód, který získá seznam značek typu pták. Značky se vytvářejí na základě názvů složek v adresáři 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. Dále vytvoříme tři funkce, které budeme volat ve smyčce for :

    • Funkce createTag vytvoří v projektu Custom Vision značku třídy.
    • Funkce createImageList používá název značky a ID značky k vytvoření seznamu obrázků.
    • Funkce image_list nahraje obrázky v dávkách ze seznamu.

    Vytvoření tří funkcí:

    1. Do souboru Jupyter Notebook přidejte createTag kód funkce. Funkce vytvoří značku názvu obrázku v projektu 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. Dále přidejte kód funkce createImageList . Funkce má dva parametry: tag název ze seznamu názvů složek a tag_id značku, kterou jsme vytvořili v projektu Custom Vision. Funkce použije base_image_url hodnotu k nastavení adresáře na složku, která obsahuje obrázky vytvořené tag z názvů složek. Potom připojíme každý obrázek do seznamu, který použijeme k nahrání v dávkách do vytvořeného tagsouboru:

      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. Posledním kódem, který chcete přidat, je vytvoření uploadImageList funkce. Předáváme image_list soubor, který jsme vytvořili ze složky, a pak nahrajeme seznam do tagsložky :

      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. Teď přidáme kód pro naši hlavní metodu. Pro každou značku volá metoda tři funkce, které jsme vytvořili. Procházíme jednotlivé značky (název složky) v tags kolekci, kterou jsme vytvořili ze složek v adresáři bird-photos/custom-photos. Tady jsou kroky ve for smyčce:

    1. createTag Voláním funkce, kterou jste vytvořili dříve, vytvořte třídu tag v projektu Custom Vision.

    2. createImageList Volejte funkci, kterou jste vytvořili dříve, a s tag názvem a tag_id hodnotami vrácenými z Custom Vision. Funkce vrátí seznam obrázků k nahrání.

    3. imageList Voláním funkce, kterou jste vytvořili dříve, nahrajte obrázky z image_list dávek 25. Nahráváme v dávkách 25, protože při pokusu o nahrání celé datové sady najednou vyprší časový limit služby Custom Vision.

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

      Upozorňující

      Kód v této buňce spusťte pouze jednou. Pokud se pokusíte buňku spustit vícekrát bez odstranění projektu Custom Vision, spuštění buňky selže.