Cvičení – nahrání dat
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.
Vytvořte projekt na portálu Custom Vision:
Přejděte a https://www.customvision.ai/projects přihlaste se. Vyberte Nový projekt.
V okně Create new project (Vytvořit nový projekt):
Jako Název zadejte název projektu podle vašeho výběru.
Jako popis zadejte krátký popis modelu.
V části Skupina prostředků vyberte skupinu prostředků, kterou jste vytvořili na webu Azure Portal.
U typů projektů vyberte Klasifikaci.
U typů klasifikace vyberte Vícetřídy (jedna značka na obrázek).
V části Domény vyberte Obecné.
Vyberte příkaz Vytvořit projekt.
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.
Přidejte obrázky a značky pro ptačí druhy:
Ve svém projektu Custom Vision vyberte Přidat obrázky.
V okně Otevřít přejděte do složky birds-photo , do které jste extrahovali soubory obrázků ze souboru ZIP datové sady.
Otevřete složku ptačích druhů.
Pokud chcete vybrat všechny obrázky ve složce druhů, vyberte Ctrl+A a pak vyberte Otevřít.
Nahrání obrázku přidejte do části Moje značky popis, který označuje druhy ptáků zobrazených na fotkách.
Vyberte Nahrát <počet> souborů.
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í:
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
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
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:
Na webu Azure Portal přejděte k prostředku Custom Vision.
V nabídce prostředků v části Správa prostředků vyberte Klíče a koncový bod.
Zkopírujte hodnotu z pole Koncový bod . V kódu nahraďte
<endpoint>
zástupný symbol touto hodnotou.Pro klíč 1 vyberte ikonu kopírování a zkopírujte klíč. V kódu nahraďte
<key>
zástupný symbol touto hodnotou.
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!")
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ří.
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)
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í:
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}")
Dále přidejte kód funkce
createImageList
. Funkce má dva parametry:tag
název ze seznamu názvů složek atag_id
značku, kterou jsme vytvořili v projektu Custom Vision. Funkce použijebase_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éhotag
souboru: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
Posledním kódem, který chcete přidat, je vytvoření
uploadImageList
funkce. Předávámeimage_list
soubor, který jsme vytvořili ze složky, a pak nahrajeme seznam dotag
slož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)
- Funkce
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 vefor
smyčce:createTag
Voláním funkce, kterou jste vytvořili dříve, vytvořte třídutag
v projektu Custom Vision.createImageList
Volejte funkci, kterou jste vytvořili dříve, a stag
názvem atag_id
hodnotami vrácenými z Custom Vision. Funkce vrátí seznam obrázků k nahrání.imageList
Voláním funkce, kterou jste vytvořili dříve, nahrajte obrázky zimage_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.