Övning – Ladda upp data
Nu är det dags att ladda upp de bilder som vi ska använda för att träna maskininlärningsmodellen. Det finns två sätt att ladda upp bilder:
- I Custom Vision-portalen väljer du, laddar upp och taggar sedan bilder.
- I ett verktyg som Jupyter Notebook använder du de bilder som ingår i Custom Vision SDK.
När du har en stor mängd data, bildklasser och taggar att ladda upp är det snabbare att använda Custom Vision SDK. Du kan dock välja något av de alternativ som beskrivs i nästa avsnitt. Slutför stegen för att ladda upp bilderna i datauppsättningen på det sätt som passar dig bäst.
Alternativ 1: Använd Custom Vision-portalen för att ladda upp och tagga bilder
Bilderna måste laddas upp och taggas individuellt av varje undermapp. I den här övningen kanske du bara vill ladda upp bilder i fyra eller fem av undermapparna beroende på din uppladdningshastighet. Tänk på att fler och varierande exempel ger bättre resultat när du tränar en maskininlärningsmodul.
Skapa ett projekt i Custom Vision-portalen:
Gå till https://www.customvision.ai/projects och logga in. Välj Nytt projekt.
I Skapa nytt projekt:
Som Namn anger du ett valfritt projektnamn.
Som Beskrivning anger du en kort beskrivning av modellen.
För Resursgrupp väljer du den resursgrupp som du skapade i Azure Portal.
För Projekttyper väljer du Klassificering.
För Klassificeringstyper väljer du Multiclass (Enkel tagg per bild).
För Domäner väljer du Allmänt.
Välj Skapa projekt.
Kommentar
Om du vill exportera modellen och distribuera den på en mobil enhet eller i TensorFlow.js eller IoT, går du till Domäneroch väljer ett kompakt modellalternativ. Du kan ändra det här alternativet i inställningarna när projektet har skapats.
Lägg till bilder och taggar för en fågelart:
Välj Lägg till bilder i Custom Vision-projektet.
I Öppna går du till mappen birds-photo där du extraherade bildfilerna från zip-filen för datauppsättningen.
Öppna en mapp för fågelarter.
Välj Ctrl + A för att markera alla bilder i artmappen och välj sedan Öppna.
I Bilduppladdning lägger du till en beskrivning i Mina taggar för att ange arten för fåglarna som visas i bilderna.
Välj Ladda upp <antal> filer.
Upprepa föregående steg för att ladda upp bilderna i varje mapp för fågelarter i den nedladdade datamängden.
Alternativ 2: Använd Python och Custom Vision SDK för att ladda upp och tagga bilder
Custom Vision SDK är tillgängligt på följande programmeringsspråk: Python, .NET, Node.js, Go och Java. Vi använder Python. Om du inte redan har Python installerat rekommenderar vi att du hämtar det med en Anaconda-installation. Du får Python när du laddar ned Anaconda.
Om du föredrar att i stället ladda ned koden från GitHub kan du klona lagringsplatsen med hjälp av följande kommando:
git clone https://github.com/MicrosoftDocs/mslearn-cv-classify-bird-species.git
Följ dessa steg för att skapa den virtuella miljön och klistra in kod i miljön:
Öppna valfri IDE. Kör sedan följande kommando för att importera paketet:
!pip install azure-cognitiveservices-vision-customvision
Importera de paket som du behöver för att köra skriptet:
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
Använd nu följande kod för att skapa Custom Vision-projektet. Innan du kör koden ersätter du
<endpoint>
platshållarna och<key>
med värdena för din Custom Vision-resurs.Så här hämtar du Custom Vision-resursvärdena:
I resursmenyn går du till Resurshantering och väljer Nycklar och Slutpunkt.
Kopiera värdet från rutan Slutpunkt . Ersätt platshållaren med det här värdet i koden
<endpoint>
.För NYCKEL 1 väljer du kopieringsikonen för att kopiera nyckeln. Ersätt platshållaren med det här värdet i koden
<key>
.
Koden ser ut så här:
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!")
Packa upp den nedladdade bird-photos.zip filen till samma katalog där du sparade Jupyter Notebook-filen. Lägg till följande kod för att ändra till katalogen för fågelfoton i projektet.
# Change to the directory for the bird photos import os os.chdir('./bird-photos/custom-photos')
Varning
Kör koden i den här cellen bara en gång. Om du försöker köra cellen mer än en gång utan att starta om Python-kerneln misslyckas cellkörningen.
Lägg till följande kod för att hämta listan över taggar av fågeltyp. Taggarna skapas baserat på mappnamnen i katalogen 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)
Sedan skapar vi tre funktioner som vi anropar i en
for
loop:- Funktionen
createTag
skapar en klasstagg i Custom Vision-projektet. - Funktionen
createImageList
använder taggnamnet och tagg-ID:t för att skapa en bildlista. - Funktionen
image_list
laddar upp bilder i batchar från listan.
Så här skapar du de tre funktionerna:
Lägg till funktionskoden
createTag
i Jupyter Notebook-filen. Funktionen skapar en tagg för avbildningsnamn i Custom Vision-projektet.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}")
Lägg sedan till koden för
createImageList
funktionen. Funktionen tar två parametrar: etttag
namn från listan med mappnamn ochtag_id
från taggen vi skapade i Custom Vision-projektet. Funktionen använderbase_image_url
värdet för att ange katalogen till den mapp som innehåller avbildningarna för detag
vi skapade från mappnamnen. Sedan lägger vi till varje bild i listan, som vi ska använda för att ladda upp i batchar till den skapadetag
: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
Den sista koden som ska läggas till är att skapa
uploadImageList
funktionen. Vi skickar detimage_list
som vi skapade från mappen och laddar sedan upp listan tilltag
: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)
- Funktionen
Nu ska vi lägga till koden för vår huvudmetod. För varje tagg anropar metoden de tre funktioner som vi skapade. Vi loopar igenom varje tagg (mappnamn) i samlingen
tags
som vi skapade från mapparna i katalogen bird-photos/custom-photos. Här är stegen i loopenfor
:Anropa funktionen
createTag
, som du skapade tidigare, för att skapa klassentag
i Custom Vision-projektet.Anropa funktionen
createImageList
, som du skapade tidigare, och med namnettag
ochtag_id
värdena som returneras från Custom Vision. Funktionen returnerar listan över bilder som ska laddas upp.imageList
Anropa funktionen, som du skapade tidigare, för att ladda upp bilderna frånimage_list
i batchar med 25. Vi laddar upp i batchar med 25 eftersom Custom Vision överskrider tidsgränsen om vi försöker ladda upp hela datauppsättningen på en gång.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}")
Varning
Kör koden i den här cellen bara en gång. Om du försöker köra cellen mer än en gång utan att även ta bort ditt Custom Vision-projekt misslyckas cellkörningen.