Ejercicio: Carga de los datos
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.
Cree un proyecto en el portal de Custom Vision:
Vaya a https://www.customvision.ai/projects e inicie sesión. Seleccione New project (Nuevo proyecto).
En Create new project (Crear nuevo proyecto):
Para Name (Nombre), escriba el nombre que desee para el proyecto.
En Description (Descripción), escriba una descripción del modelo.
Para Resource group (Grupo de recursos) seleccione el grupo de recursos que ha creado en Azure Portal.
Para Project Types (Tipos de proyecto), seleccione Classification (Clasificación).
En Classification Types (Tipo de clasificación), seleccione Multiclass (Single tag per image) (Multiclase [etiqueta única por imagen]).
Para Domains (Dominios), seleccione General.
Seleccione Create project (Crear proyecto).
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.
Agregue imágenes y etiquetas para una especie de ave:
En el proyecto de Custom Vision, seleccione Agregar imágenes.
En Open (Abrir), vaya a la carpeta birds-photo donde extrajo los archivos de imagen del archivo zip del conjunto de archivos.
Abra una carpeta de especie de aves.
Seleccione Ctrl + A para seleccionar todas las imágenes de la carpeta de especies y luego seleccione Open (Abrir).
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.
Seleccione Cargar <número> archivos.
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:
Abra el IDE que prefiera. Después, ejecute el comando siguiente para importar el paquete:
!pip install azure-cognitiveservices-vision-customvision
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
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:
En Azure Portal, vaya al recurso de Custom Vision.
En el menú del recurso, en Administración de recursos, seleccione Claves y puntos de conexión.
Copie el valor del cuadro Punto de conexión. En el código, reemplace el marcador de posición
<endpoint>
por este valor.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.
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!")
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.
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)
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:
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}")
A continuación, agregue el código para la función
createImageList
. La función toma dos parámetros: un nombretag
de la lista de nombres de carpeta ytag_id
de la etiqueta que se ha creado en el proyecto de Custom Vision. La función usa el valorbase_image_url
para establecer el directorio en la carpeta que contiene las imágenes detag
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 entag
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
El último código que se va a agregar es crear la función
uploadImageList
. Se pasa el elementoimage_list
que se ha creado a partir de la carpeta y, después, se carga la lista entag
: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)
- La función
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 buclefor
:Llame a la función
createTag
creada anteriormente para crear la clasetag
en el proyecto de Custom Vision.Llame a la función
createImageList
creada anteriormente, con el nombre detag
y los valores detag_id
devueltos de Custom Vision. La función devuelve la lista de imágenes que se van a cargar.Llame a la función
imageList
creada anteriormente para cargar las imágenes desdeimage_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.