Ćwiczenie — przekazywanie danych
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.
Utwórz projekt w portalu Custom Vision:
Przejdź do https://www.customvision.ai/projects strony i zaloguj się. Wybierz pozycję Nowy projekt.
W oknie Create new project (Utwórz nowy projekt):
W polu Nazwa wprowadź wybraną nazwę projektu.
W polu Opis wprowadź krótki opis modelu.
W obszarze Grupa zasobów wybierz grupę zasobów utworzoną w witrynie Azure Portal.
W obszarze Typy projektów wybierz pozycję Klasyfikacja.
W obszarze Typy klasyfikacji wybierz pozycję Multiclass (pojedynczy tag na obraz).
W obszarze Domeny wybierz pozycję Ogólne.
Wybierz pozycję Utwórz projekt.
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.
Dodaj obrazy i tagi dla gatunków ptaków:
W projekcie usługi Custom Vision wybierz pozycję Dodaj obrazy.
W obszarze Otwórz przejdź do folderu birds-photo , w którym wyodrębniono pliki obrazów z pliku zip zestawu danych.
Otwórz folder gatunków ptaków.
Wybierz Ctrl + A, aby zaznaczyć wszystkie obrazy w folderze gatunek, a następnie wybierz pozycję Otwórz.
W obszarze Przekazywanie obrazu dodaj opis w obszarze Moje tagi , aby wskazać gatunek ptaków pokazanych na zdjęciach.
Wybierz pozycję Przekaż <liczba> pliki.
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:
Otwórz wybrane środowisko IDE. Następnie uruchom następujące polecenie, aby zaimportować pakiet:
!pip install azure-cognitiveservices-vision-customvision
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
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:
W witrynie Azure Portal przejdź do zasobu usługi Custom Vision.
W menu zasobów w obszarze Zarządzanie zasobami wybierz pozycję Klucze i punkt końcowy.
Skopiuj wartość z pola Punkt końcowy . W kodzie zastąp
<endpoint>
symbol zastępczy tą wartością.W polu KLUCZ 1 wybierz ikonę kopiowania, aby skopiować klucz. W kodzie zastąp
<key>
symbol zastępczy tą wartością.
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!")
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.
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)
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:
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}")
Następnie dodaj kod funkcji
createImageList
. Funkcja przyjmuje dwa parametry:tag
nazwę z listy nazw folderów itag_id
z tagu utworzonego w projekcie usługi Custom Vision. Funkcja używabase_image_url
wartości , aby ustawić katalog na folder zawierający obrazy utworzonetag
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 plikutag
: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
Ostatnim kodem do dodania
uploadImageList
jest utworzenie funkcji. Przekazujemy utworzony elementimage_list
z folderu , a następnie przekazujemy listę do plikutag
: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)
- Funkcja
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 wfor
pętli:Wywołaj
createTag
funkcję, która została utworzona wcześniej, aby utworzyć klasętag
w projekcie usługi Custom Vision.Wywołaj
createImageList
funkcję, która została utworzona wcześniej, oraz przytag
użyciu nazwy itag_id
wartości zwróconych z usługi Custom Vision. Funkcja zwraca listę obrazów do przekazania.Wywołaj
imageList
funkcję, która została utworzona wcześniej, aby przekazać obrazy zimage_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.