Gyakorlat – Adatok feltöltése

Befejeződött

Most itt az ideje, hogy feltöltsük a gépi tanulási modell betanítása során használt képeket. A képek feltöltésének két módja van:

  • A Custom Vision portálon válassza ki, töltse fel és címkézze fel a képeket.
  • Egy olyan eszközben, mint a Jupyter Notebook, használja a Custom Vision SDK-ban található képeket.

Ha nagy mennyiségű adatot, képosztályt és címkét kell feltöltenie, gyorsabban használhatja a Custom Vision SDK-t. A következő szakaszokban ismertetett lehetőségek közül azonban választhat. Végezze el a képek adathalmazba való feltöltésének lépéseit az Ön számára legjobban megfelelő módon.

1. lehetőség: Képek feltöltése és címkézése a Custom Vision portálon

A képeket minden almappának külön-külön kell feltöltenie és címkéznie. Ebben a gyakorlatban előfordulhat, hogy a feltöltés sebességétől függően csak négy vagy öt almappában szeretne képeket feltölteni. Ne feledje, hogy egy gépi tanulási modul betanításakor több és változatosabb példa jobb eredményeket fog eredményezni.

  1. Hozzon létre egy projektet a Custom Vision portálon:

    1. Lépjen, https://www.customvision.ai/projects és jelentkezzen be. Válassza az Új projekt lehetőséget.

    2. Az Új projekt létrehozása területen:

      1. A Név mezőben adjon meg egy tetszőleges projektnevet.

      2. Leírásként adja meg a modell rövid leírását.

      3. Erőforráscsoport esetén válassza ki az Azure Portalon létrehozott erőforráscsoportot.

      4. Projekttípusok esetén válassza a Besorolás lehetőséget.

      5. Besorolási típusok esetén válassza a Többosztályos (egyetlen címke képenként) lehetőséget.

      6. Tartományok esetén válassza az Általános lehetőséget.

      7. Válassza a Create project (Projekt létrehozása) lehetőséget.

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

    Megjegyzés:

    Ha a modellt mobileszközön, TensorFlow.js-ben vagy IoT-eszközökön szeretné üzembe helyezni, akkor a Tartományokterületen válassza a kompakt modellbeállítást. Ezt a beállítást a projekt létrehozása után módosíthatja a beállításokban.

  2. Képek és címkék hozzáadása madárfajokhoz:

    1. A Custom Vision-projektben válassza a Képek hozzáadásalehetőséget.

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

    2. A Megnyitás nézetben nyissa meg a birds-photo mappát, ahol kinyerte a képfájlokat az adathalmaz zip-fájljából.

    3. Nyisson meg egy madárfaj mappát.

    4. A Ctrl +A billentyűkombinációval jelölje ki a fajmappában lévő összes képet, majd válassza a Megnyitás lehetőséget.

      Screenshot that shows selecting all images in a species folder.

    5. A Képek feltöltése területen adjon meg egy leírást a Saját címkékben, hogy jelezze a képeken látható madarak faját.

    6. Válassza ki a <darabszám> fájl feltöltése lehetőséget.

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

  3. Ismételje meg az előző lépést, hogy feltöltse a fényképeket a letöltött adatkészlet minden madárfaj mappájába.

2. lehetőség: Képek feltöltése és címkézése a Python és a Custom Vision SDK használatával

A Custom Vision SDK a következő programozási nyelveken érhető el: Python, .NET, Node.js, Go és Java. Pythont fogunk használni. Ha még nincs telepítve a Python, javasoljuk, hogy egy Anaconda-telepítéssel szerezze be. Az Anaconda letöltésekor pythont kap.

Ha inkább a GitHubról szeretné letölteni a kódot, klónozhatja az adattárat a következő paranccsal:

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

Az alábbi lépéseket követve hozza létre a virtuális környezetet, és illessze be a kódot a környezetbe:

  1. Nyissa meg a választott IDE-t. Ezután futtassa a következő parancsot a csomag importálásához:

    !pip install azure-cognitiveservices-vision-customvision
    
  2. Importálja a szkript futtatásához szükséges csomagokat:

    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. Most használja az alábbi kódot a Custom Vision-projekt létrehozásához. A kód futtatása előtt cserélje le a <endpoint> helyőrzőket a <key> Custom Vision-erőforrás értékeire.

    A Custom Vision-erőforrásértékek lekérése:

    1. Az Azure Portalon nyissa meg a Custom Vision-erőforrást.

    2. Az erőforrás menü Erőforrás-kezelés területén válassza a Kulcsok és végpont lehetőséget.

    3. Másolja ki az értéket a Végpont mezőből. A kódban cserélje le a <endpoint> helyőrzőt erre az értékre.

    4. AZ 1. KULCS esetében válassza a másolás ikont a kulcs másolásához. A kódban cserélje le a <key> helyőrzőt erre az értékre.

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

    A kód a következő példához hasonlóan fog kinézni:

    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. Bontsa ki a letöltött bird-photos.zip fájlt ugyanarra a könyvtárra, ahová a Jupyter Notebook-fájlt mentette. Adja hozzá a következő kódot a projekt madárfényképeinek könyvtárára való váltáshoz.

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

    Figyelmeztetés

    A kódot csak egyszer futtassa ebben a cellában. Ha többször is megpróbálja futtatni a cellát a Python-kernel újraindítása nélkül, a cella futtatása meghiúsul.

  5. Adja hozzá a következő kódot a madártípus-címkék listájának lekéréséhez. A címkék a bird-photos/custom-photos könyvtárban található mappanevek alapján jönnek létre:

    # Create a tag list from folders in bird directory
    tags = [name for name in os.listdir('.') if os.path.isdir(name)]
    print(tags)
    
  6. Ezután létrehozunk három függvényt, amelyeket egy for ciklusban fogunk meghívni:

    • A createTag függvény létrehoz egy osztálycímkét a Custom Vision-projektben.
    • A createImageList függvény a címke nevét és a címkeazonosítót használja képlista készítéséhez.
    • A image_list függvény kötegekben tölti fel a képeket a listából.

    A három függvény létrehozása:

    1. A Jupyter Notebook fájlban adja hozzá a createTag függvénykódot. A függvény létrehoz egy képnévcímkét a Custom Vision-projektben.

      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. Ezután adja hozzá a függvény kódját createImageList . A függvény két paramétert használ: egy tag nevet a mappanevek listájából és a tag_id Custom Vision projektben létrehozott címkéből. A függvény az base_image_url érték használatával állítja be a könyvtárat arra a mappára tag , amely a mappanevekből létrehozott képeket tartalmazza. Ezután hozzáfűzünk minden képet a listához, amelyet kötegekben fogunk feltölteni a létrehozott 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. Az utolsó hozzáadandó kód a uploadImageList függvény létrehozása. Átadjuk a image_list mappából létrehozott listát, majd feltöltjük a listát a tagkövetkezőre:

      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. Most hozzáadjuk a fő metódus kódját. Minden címke esetében a metódus meghívja a létrehozott három függvényt. Végigfuttatjuk az egyes címkéket (mappanevet) a tags gyűjteményben, amelyet a bird-photos/custom-photos könyvtár mappáiból hoztunk létre. A ciklus lépései a for következők:

    1. Hívja meg a createTag korábban létrehozott függvényt, hogy létrehozza az osztályt tag a Custom Vision projektben.

    2. Hívja meg a createImageList korábban létrehozott függvényt a Custom Visionből visszaadott névvel és tag_id értékekkeltag. A függvény visszaadja a feltöltendő képek listáját.

    3. Hívja meg a imageList korábban létrehozott függvényt, hogy feltöltse a képeket a image_list 25-ös kötegekből. 25-ös kötegekben töltjük fel, mert a Custom Vision időtúllépést ér el, ha egyszerre próbáljuk feltölteni a teljes adathalmazt.

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

      Figyelmeztetés

      A kódot csak egyszer futtassa ebben a cellában. Ha többször is megkísérli futtatni a cellát a Custom Vision-projekt törlése nélkül, a cella futtatása sikertelen lesz.