Esercizio - Caricare i dati

Completato

A questo punto, è possibile caricare le immagini che verranno usate per il training del modello di Machine Learning. È possibile caricare le immagini in due modi:

  • Nel portale di Visione personalizzata selezionare Carica e quindi Aggiungere i tag immagini.
  • In uno strumento come Jupyter Notebook usare le immagini incluse nell'SDK di Visione personalizzata.

Quando si ha una grande quantità di dati, classi di immagini e tag da caricare, è più veloce usare l'SDK di Visione personalizzata. È tuttavia possibile scegliere una delle opzioni descritte nelle sezioni successive. Completare i passaggi per caricare le immagini nel set di dati nel modo migliore per lo scenario specifico.

Opzione 1: usare il portale di Visione personalizzata per caricare e contrassegnare le immagini

Le immagini devono essere caricate e contrassegnate singolarmente da ogni sottocartella. Per questo esercizio è possibile caricare immagini solo in quattro o cinque delle sottocartelle in base alla velocità di caricamento. Tenere presente che quando si esegue il training di un modulo di Machine Learning, una quantità e varietà maggiore di esempi produrrà risultati migliori.

  1. Creare un progetto nel portale di Visione personalizzata:

    1. Passare a https://www.customvision.ai/projects ed eseguire l'accesso. Selezionare New project (Nuovo progetto).

    2. In Crea nuovo progetto:

      1. Per Nome immettere un nome di progetto.

      2. Per Descrizione immettere una breve descrizione del modello.

      3. Per Gruppo di risorse selezionare il gruppo di risorse creato nel portale di Azure.

      4. Per Project Types (Tipi di progetto) selezionare Classificazione (Classificazione).

      5. Per Classification Types (Tipi di classificazione) selezionare Multiclass (Single tag per image) (Multiclasse (singolo tag per immagine)).

      6. Per Domini selezionare Generale.

      7. Seleziona Crea progetto.

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

    Nota

    Per esportare il modello per distribuirlo in un dispositivo mobile, in TensorFlow.js o in IoT, in Domains (Domini) selezionare un'opzione di modello compatto. È possibile modificare questa opzione nelle impostazioni dopo la creazione del progetto.

  2. Aggiungere immagini e tag per una specie di uccelli:

    1. Nel progetto di Visione personalizzata selezionare Add images (Aggiungi immagini).

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

    2. In Apri passare alla cartella birds-photo dove sono stati estratti i file di immagine dal file ZIP del set di dati.

    3. Aprire una cartella relativa a una specie di uccelli.

    4. Premere CTRL+A per selezionare tutte le immagini nella cartella della specie e quindi selezionare Apri.

      Screenshot that shows selecting all images in a species folder.

    5. In Caricamento immagine aggiungere una descrizione in My Tags (Tag personali) per indicare la specie degli uccelli presenti nelle foto.

    6. Selezionare Upload <number> files (Carica file).

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

  3. Ripetere il passaggio precedente per caricare le foto di tutte le cartelle relative alle specie di uccelli del set di dati scaricato.

Opzione 2: usare Python e l'SDK di Visione personalizzata per caricare e contrassegnare le immagini con tag

L'SDK di Visione personalizzata è disponibile nei linguaggi di programmazione seguenti: Python, .NET, Node.js, Go e Java. Verrà usato Python. Se Python non è già installato, è consigliabile ottenerlo con un'installazione di Anaconda. Quando si scarica Anaconda si ottiene anche Python.

Se invece si preferisce scaricare il codice da GitHub, è possibile clonare il repository usando il comando seguente:

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

Seguire questa procedura per creare l'ambiente virtuale e incollarvi il codice:

  1. Aprire l'IDE preferito. Eseguire il comando seguente per importare il pacchetto:

    !pip install azure-cognitiveservices-vision-customvision
    
  2. Importare i pacchetti necessari per eseguire lo script:

    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. Usare ora il codice seguente per creare il progetto di Visione personalizzata. Prima di eseguire il codice, sostituire i segnaposto <endpoint> e <key> con i valori per la risorsa di Visione personalizzata.

    Per ottenere i valori della risorsa di Visione personalizzata:

    1. Nel portale di Azure passare alla risorsa di Visione personalizzata.

    2. Nel menu della risorsa, in Gestione risorse selezionare Chiavi ed endpoint.

    3. Copiare il valore dalla casella Endpoint. Nel codice sostituire il segnaposto <endpoint> con questo valore.

    4. Copiare CHIAVE 1 selezionando l'icona di copia. Nel codice sostituire il segnaposto <key> con questo valore.

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

    Il codice sarà simile all'esempio seguente:

    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. Decomprimere il file bird-photos.zip scaricato nella stessa directory in cui è stato salvato il file di Jupyter Notebook. Aggiungere il codice seguente per passare alla directory con le foto degli uccelli nel progetto.

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

    Avviso

    Eseguire il codice in questa cella una sola volta. Se si cerca di eseguire la cella più di una volta senza riavviare anche il kernel Python, l'esecuzione della cella avrà esito negativo.

  5. Aggiungere il codice seguente per ottenere l'elenco dei tag per i tipi di uccelli. I tag vengono creati in base ai nomi delle cartelle nella directory 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. Si creeranno quindi tre funzioni che verranno chiamate in un ciclo for:

    • La funzione createTag crea un tag di classe nel progetto di Visione personalizzata.
    • La funzione createImageList usa il nome e l'ID del tag per creare un elenco di immagini.
    • La funzione image_list carica le immagini in batch dall'elenco.

    Per creare le tre funzioni:

    1. Nel file di Jupyter Notebook aggiungere il codice della funzione createTag. La funzione crea un tag di nome di immagine nel progetto di Visione personalizzata.

      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. Aggiungere quindi il codice per la funzione createImageList. La funzione accetta due parametri: un nome tag dall'elenco di nomi di cartelle e il valore tag_id dal tag creato nel progetto di Visione personalizzata. La funzione usa il valore di base_image_url per impostare la directory sulla cartella contenente le immagini per l'oggetto tag creato dai nomi delle cartelle. Si aggiunge quindi ogni immagine all'elenco, che si userà per il caricamento in batch nell'oggetto tag creato:

      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. Il codice finale da aggiungere è quello per creare la funzione uploadImageList. Viene passato l'oggetto image_list creato dalla cartella e quindi l'elenco viene caricato in 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. A questo punto, verrà aggiunto il codice per il metodo principale. Per ogni tag, il metodo chiama le tre funzioni create. Si scorrerà ciclicamente ogni tag (nome di cartella) della raccolta tags creata dalle cartelle della directory bird-photos/custom-photos. Ecco i passaggi nel ciclo for:

    1. Chiamare la funzione createTag, creata in precedenza, per creare la classe tag nel progetto di Visione personalizzata.

    2. Chiamare la funzione createImageList, creata in precedenza, con il nome tag e i valori di tag_id restituiti da Visione personalizzata. La funzione restituisce l'elenco di immagini da caricare.

    3. Chiamare la funzione imageList, creata in precedenza, per caricare le immagini da image_list in batch di 25. Il caricamento viene eseguito in batch di 25 perché in Visione personalizzata si verifica il timeout se si prova a caricare l'intero set di dati contemporaneamente.

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

      Avviso

      Eseguire il codice in questa cella una sola volta. Se si cerca di eseguire la cella più di una volta senza eliminare il progetto di Visione personalizzata, l'esecuzione della cella avrà esito negativo.