Ejercicio: Carga de los datos

Completado

Ahora es el momento de cargar las imágenes que se van a usar para entrenar el modelo de Machine Learning. Hay dos maneras de cargar imágenes:

  • En el portal de Custom Vision, seleccione, cargar y luego etiquete las imágenes.
  • En una herramienta como Jupyter Notebook, use las imágenes incluidas en el SDK de Custom Vision.

Si tiene una gran cantidad de datos, clases de imagen y etiquetas para cargar, es más rápido usar el SDK de Custom Vision. Sin embargo, puede elegir una de las opciones que se describen en las secciones siguientes. Complete los pasos para cargar las imágenes en el conjunto de datos de la manera que mejor se adapte a sus necesidades.

Opción 1: Uso del portal de Custom Vision para cargar imágenes y etiquetarlas

Cada subcarpeta debe cargar y etiquetar las imágenes de forma individual. En este ejercicio, puede que solo quiera cargar imágenes en cuatro o cinco de las subcarpetas, en función de la velocidad de carga. Tenga en cuenta que, al entrenar un módulo de aprendizaje automático, cuanto mayor sea el número y la variedad de ejemplos, se producirán mejores resultados.

  1. Cree un proyecto en el portal de Custom Vision:

    1. Vaya a https://www.customvision.ai/projects e inicie sesión. Seleccione New project (Nuevo proyecto).

    2. En Create new project (Crear nuevo proyecto):

      1. Para Name (Nombre), escriba el nombre que desee para el proyecto.

      2. En Description (Descripción), escriba una descripción del modelo.

      3. Para Resource group (Grupo de recursos) seleccione el grupo de recursos que ha creado en Azure Portal.

      4. Para Project Types (Tipos de proyecto), seleccione Classification (Clasificación).

      5. En Classification Types (Tipo de clasificación), seleccione Multiclass (Single tag per image) (Multiclase [etiqueta única por imagen]).

      6. Para Domains (Dominios), seleccione General.

      7. Seleccione Create project (Crear proyecto).

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

    Nota:

    Si quiere exportar el modelo para implementarlo en un dispositivo móvil o en TensorFlow.js o IoT, en Dominios, seleccione una opción de modelo compacto. Puede cambiar esta opción en la configuración después de crear el proyecto.

  2. Agregue imágenes y etiquetas para una especie de ave:

    1. En el proyecto de Custom Vision, seleccione Agregar imágenes.

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

    2. En Open (Abrir), vaya a la carpeta birds-photo donde extrajo los archivos de imagen del archivo zip del conjunto de archivos.

    3. Abra una carpeta de especie de aves.

    4. Seleccione Ctrl + A para seleccionar todas las imágenes de la carpeta de especies y luego seleccione Open (Abrir).

      Screenshot that shows selecting all images in a species folder.

    5. En Image upload (Carga de imágenes), agregue una descripción en My Tags (Mis etiquetas) para indicar las especies de las aves que se muestran en las fotos.

    6. Seleccione Cargar <número> archivos.

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

  3. Repita el paso anterior para cargar las fotos en cada carpeta de especie de aves en el conjunto de los conjuntos de datos descargado.

Opción 2: Uso de Python y del SDK de Custom Vision para cargar imágenes y etiquetarlas

El SDK de Custom Vision está disponible en los lenguajes de programación siguientes: Python, .NET, Node.js, Go y Java. Usaremos Python. Si todavía no tiene Python instalado, se recomienda que lo obtenga con una instalación de Anaconda. Obtiene Python cuando descarga Anaconda.

Si, en su lugar, prefiere descargar el código desde GitHub, puede clonar el repositorio con el comando siguiente:

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

Siga estos pasos para crear el entorno virtual y pegar código en el entorno:

  1. Abra el IDE que prefiera. Después, ejecute el comando siguiente para importar el paquete:

    !pip install azure-cognitiveservices-vision-customvision
    
  2. Importe los paquetes que necesita para ejecutar el 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. Ahora use el código siguiente para crear el proyecto de Custom Vision. Antes de ejecutar el código, reemplace los marcadores de posición <endpoint> y <key> por los valores del recurso de Custom Vision.

    Para obtener los valores del recurso de Custom Vision:

    1. En Azure Portal, vaya al recurso de Custom Vision.

    2. En el menú del recurso, en Administración de recursos, seleccione Claves y puntos de conexión.

    3. Copie el valor del cuadro Punto de conexión. En el código, reemplace el marcador de posición <endpoint> por este valor.

    4. En Clave 1, seleccione el icono de copia para copiar la clave. En el código, reemplace el marcador de posición <key> por este valor.

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

    El código tendrá un aspecto similar al de este ejemplo:

    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. Descomprima el archivo bird-photos.zip descargado en el mismo directorio donde guardó el archivo de Jupyter Notebook. Agregue el código siguiente para cambiar al directorio de las fotos de aves del proyecto.

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

    Advertencia

    Ejecute el código de esta celda solo una vez. Si intenta ejecutar la celda más de una vez sin reiniciar también el kernel de Python, se produce un error en la ejecución de la celda.

  5. Agregue el código siguiente para obtener la lista de etiquetas de tipo de ave. Las etiquetas se crean en función de los nombres de carpeta del directorio 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. A continuación, se crean tres funciones que llamaremos en un bucle for:

    • La función createTag crea una etiqueta de clase en el proyecto de Custom Vision.
    • La función createImageList utiliza el nombre de etiqueta y el identificador de etiqueta para crear una lista de imágenes.
    • La función image_list carga las imágenes de la lista en los lotes.

    Para crear las tres funciones:

    1. En el archivo de Jupyter Notebook, agregue el código de función createTag. La función crea una etiqueta de nombre de imagen en el proyecto de 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. A continuación, agregue el código para la función createImageList. La función toma dos parámetros: un nombre tag de la lista de nombres de carpeta y tag_id de la etiqueta que se ha creado en el proyecto de Custom Vision. La función usa el valor base_image_url para establecer el directorio en la carpeta que contiene las imágenes de tag que se ha creado a partir de los nombres de carpeta. Después, se anexa cada imagen a la lista, que se usará para cargar por lotes en tag que se creó:

      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. El último código que se va a agregar es crear la función uploadImageList. Se pasa el elemento image_list que se ha creado a partir de la carpeta y, después, se carga la lista en 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. Ahora, agregaremos el código para el método principal. Para cada etiqueta, el método llama a las tres funciones que se han creado. Se recorre cada etiqueta (nombre de carpeta) de la colección tags que se ha creado a partir de las carpetas del directorio bird-photos/custom-photos. Estos son los pasos del bucle for:

    1. Llame a la función createTag creada anteriormente para crear la clase tag en el proyecto de Custom Vision.

    2. Llame a la función createImageList creada anteriormente, con el nombre de tag y los valores de tag_id devueltos de Custom Vision. La función devuelve la lista de imágenes que se van a cargar.

    3. Llame a la función imageList creada anteriormente para cargar las imágenes desde image_list en lotes de 25. Cargamos en lotes de 25 porque, si intentamos cargar todo el conjunto de todos a la vez, se agota el tiempo de espera de 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}")
      

      Advertencia

      Ejecute el código de esta celda solo una vez. Si intenta ejecutar la celda más de una vez sin eliminar también el proyecto de Custom Vision, se produce un error en la ejecución de la celda.