Ćwiczenie — przekazywanie danych

Ukończone

Teraz nadszedł czas na przekazanie obrazów, których użyjemy do wytrenowania modelu uczenia maszynowego. Istnieją dwa sposoby przekazywania obrazów:

  • W portalu usługi Custom Vision wybierz pozycję, przekaż, a następnie oznacz obrazy tagami.
  • W narzędziu takim jak Jupyter Notebook użyj obrazów zawartych w zestawie Custom Vision SDK.

Jeśli masz dużą ilość danych, klas obrazów i tagów do przekazania, szybsze jest użycie zestawu Custom Vision SDK. Można jednak wybrać jedną z opcji opisanych w następnych sekcjach. Wykonaj kroki przekazywania obrazów w zestawie danych w sposób, który najlepiej ci odpowiada.

Opcja 1. Przekazywanie obrazów i tagowanie obrazów przy użyciu portalu Custom Vision

Obrazy muszą być przekazywane i oznaczane indywidualnie przez każdy podfolder. W tym ćwiczeniu możesz chcieć przekazać obrazy tylko w czterech lub pięciu podfolderach w zależności od szybkości przekazywania. Należy pamiętać, że w przypadku trenowania modułu uczenia maszynowego więcej i zróżnicowanych przykładów przyniesie lepsze wyniki.

  1. Utwórz projekt w portalu Custom Vision:

    1. Przejdź do https://www.customvision.ai/projects strony i zaloguj się. Wybierz pozycję Nowy projekt.

    2. W oknie Create new project (Utwórz nowy projekt):

      1. W polu Nazwa wprowadź wybraną nazwę projektu.

      2. W polu Opis wprowadź krótki opis modelu.

      3. W obszarze Grupa zasobów wybierz grupę zasobów utworzoną w witrynie Azure Portal.

      4. W obszarze Typy projektów wybierz pozycję Klasyfikacja.

      5. W obszarze Typy klasyfikacji wybierz pozycję Multiclass (pojedynczy tag na obraz).

      6. W obszarze Domeny wybierz pozycję Ogólne.

      7. Wybierz pozycję Utwórz projekt.

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

    Uwaga

    Jeśli chcesz wyeksportować model do wdrożenia na urządzeniu przenośnym, w pliku TensorFlow.js lub w Internecie rzeczy, w obszarze Domenywybierz opcję Kompaktowy. Tę opcję można zmienić w ustawieniach po utworzeniu projektu.

  2. Dodaj obrazy i tagi dla gatunków ptaków:

    1. W projekcie usługi Custom Vision wybierz pozycję Dodaj obrazy.

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

    2. W obszarze Otwórz przejdź do folderu birds-photo , w którym wyodrębniono pliki obrazów z pliku zip zestawu danych.

    3. Otwórz folder gatunków ptaków.

    4. Wybierz klawisze Ctrl + A, aby zaznaczyć wszystkie obrazy w folderze gatunek, a następnie wybierz pozycję Otwórz.

      Screenshot that shows selecting all images in a species folder.

    5. W obszarze Przekazywanie obrazu dodaj opis w obszarze Moje tagi , aby wskazać gatunek ptaków pokazanych na zdjęciach.

    6. Wybierz pozycję Przekaż <liczba> pliki.

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

  3. Powtórz poprzedni krok, aby przekazać zdjęcia do każdego folderu gatunków ptaków w pobranym zestawie danych.

Opcja 2. Przekazywanie obrazów i tagowanie obrazów przy użyciu języka Python i zestawu Custom Vision SDK

Zestaw Custom Vision SDK jest dostępny w następujących językach programowania: Python, .NET, Node.js, Go i Java. Użyjemy języka Python. Jeśli nie masz jeszcze zainstalowanego języka Python, zalecamy pobranie go z instalacją platformy Anaconda. Język Python jest pobierany podczas pobierania środowiska Anaconda.

Jeśli wolisz zamiast tego pobrać kod z usługi GitHub, możesz sklonować repozytorium przy użyciu następującego polecenia:

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

Wykonaj następujące kroki, aby utworzyć środowisko wirtualne i wkleić kod do środowiska:

  1. Otwórz wybrane środowisko IDE. Następnie uruchom następujące polecenie, aby zaimportować pakiet:

    !pip install azure-cognitiveservices-vision-customvision
    
  2. Zaimportuj pakiety potrzebne do uruchomienia skryptu:

    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. Teraz użyj następującego kodu, aby utworzyć projekt usługi Custom Vision. Przed uruchomieniem kodu zastąp <endpoint> symbole zastępcze i <key> wartościami zasobu usługi Custom Vision.

    Aby uzyskać wartości zasobów usługi Custom Vision:

    1. W witrynie Azure Portal przejdź do zasobu usługi Custom Vision.

    2. W menu zasobów w obszarze Zarządzanie zasobami wybierz pozycję Klucze i punkt końcowy.

    3. Skopiuj wartość z pola Punkt końcowy . W kodzie zastąp <endpoint> symbol zastępczy tą wartością.

    4. W polu KLUCZ 1 wybierz ikonę kopiowania, aby skopiować klucz. W kodzie zastąp <key> symbol zastępczy tą wartością.

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

    Twój kod będzie wyglądać następująco:

    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. Rozpakuj pobrany plik bird-photos.zip do tego samego katalogu, w którym zapisano plik notesu Jupyter Notebook. Dodaj następujący kod, aby zmienić katalog na zdjęcia ptaków w projekcie.

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

    Ostrzeżenie

    Uruchom kod w tej komórce tylko raz. Jeśli spróbujesz uruchomić komórkę więcej niż raz bez ponownego uruchomienia jądra języka Python, uruchomienie komórki zakończy się niepowodzeniem.

  5. Dodaj następujący kod, aby uzyskać listę tagów typu ptaka. Tagi są tworzone na podstawie nazw folderów w katalogu 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. Następnie utworzymy trzy funkcje, które wywołamy w for pętli:

    • Funkcja createTag tworzy tag klasy w projekcie usługi Custom Vision.
    • Funkcja createImageList używa nazwy tagu i identyfikatora tagu do utworzenia listy obrazów.
    • Funkcja image_list przekazuje obrazy w partiach z listy.

    Aby utworzyć trzy funkcje:

    1. W pliku jupyter Notebook dodaj createTag kod funkcji. Funkcja tworzy tag nazwy obrazu w projekcie usługi 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. Następnie dodaj kod funkcji createImageList . Funkcja przyjmuje dwa parametry: tag nazwę z listy nazw folderów i tag_id z tagu utworzonego w projekcie usługi Custom Vision. Funkcja używa base_image_url wartości , aby ustawić katalog na folder zawierający obrazy utworzone tag na podstawie nazw folderów. Następnie dołączymy każdy obraz do listy, który zostanie użyty do przekazania w partiach do utworzonego pliku 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. Ostatnim kodem do dodania uploadImageList jest utworzenie funkcji. Przekazujemy utworzony element image_list z folderu , a następnie przekazujemy listę do pliku 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. Teraz dodamy kod dla naszej metody main. Dla każdego tagu metoda wywołuje trzy utworzone przez nas funkcje. Przechodzimy w pętli przez każdy tag (nazwę folderu) w tags kolekcji utworzonej na podstawie folderów w katalogu bird-photos/custom-photos. Poniżej przedstawiono kroki w for pętli:

    1. Wywołaj createTag funkcję, która została utworzona wcześniej, aby utworzyć klasę tag w projekcie usługi Custom Vision.

    2. Wywołaj createImageList funkcję, która została utworzona wcześniej, oraz przy tag użyciu nazwy i tag_id wartości zwróconych z usługi Custom Vision. Funkcja zwraca listę obrazów do przekazania.

    3. Wywołaj imageList funkcję, która została utworzona wcześniej, aby przekazać obrazy z image_list partii 25. Przekazujemy w partiach 25, ponieważ usługa Custom Vision upłynął limit czasu, jeśli spróbujemy przekazać cały zestaw danych jednocześnie.

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

      Ostrzeżenie

      Uruchom kod w tej komórce tylko raz. Jeśli spróbujesz uruchomić komórkę więcej niż raz bez usuwania projektu usługi Custom Vision, uruchomienie komórki zakończy się niepowodzeniem.