Workshop – Clasificación de imágenes con ONNX, Custom Vision y Azure Functions
Traducido de Global AI Back Together Workshops. Este taller es parte del evento Global AI Back Together Latinoamérica 2021. Sesión en vivo aquí.
¿Quién podría haber imaginado hace unos años que podría crear una Azure Function que pueda decirle qué hay en sus imágenes? Buenas noticias, esto ahora es posible con solo unas pocas líneas de código y algunas imágenes de muestra.
En este laboratorio práctico, entrenará un modelo de clasificación ONNX con el servicio Custom Vision que se ejecutará en una Azure Function escrita en Python utilizando Visual Studio Code como editor y la CLI de Azure para administrar y crear sus recursos de Azure.
Al final del laboratorio, tendrá una API serverless que puede clasificar imágenes y habrá aprendido a usar el SDK de Python de Azure Custom Vision para entrenar un modelo ONNX.
Para ejecutar este taller, necesita una suscripción a Azure. El costo del workshop solo será de unos pocos dólares ($ USD). La forma más sencilla es usar su propia suscripción de Azure si tiene una. Hay varias opciones:
1. Configuración del entorno de desarrollo
Implemente un contenedor de desarrollo en Azure. Haga clic en Deploy to Azure.
Luego, inicie sesión con su cuenta de Azure. Debería ver la pantalla a continuación

- Haga clic en “Crear nuevo” para crear un nuevo grupo de recursos.
- Ingrese un nombre para el grupo de recursos en el campo de nombre, por ejemplo devcontainer_RG
- Haga clic en “Aceptar”
- Seleccione la región más cercana a usted en el menú desplegable
- Puede cambiar el nombre o dejarlo como está.
- Haga clic en “Revisar + crear“

- Si todo está bien, debería ver “Validación aprobada” en verde.
- Haga clic en “Crear” para comenzar a crear los recursos. (Esto puede tardar entre 1 y 5 minutos)

- Después de unos minutos, debería ver “Su implementación está completa“.
- Haga clic en el botón: “Ir al recurso“. Esto lo llevará a los recursos de DevContainer recién creados.

El botón “Ir al recurso” le llevará a la pantalla de arriba. Copie la dirección IP, necesitará esta dirección más adelante.
2. Configuración de Visual Studio Code para usar el contenedor de desarrollo
- Descarga Visual Studio Code desde aquí.
- Instale la extensión Remote SSH:
- Abra Visual Studio Code
- Haga clic en el icono de extensiones a la izquierda (crtl-shift-x)
- En la barra de búsqueda busque: remote-ssh
- Haga clic en Instalar

- Conéctese a Remote Dev Container:
- Haga clic en el botón verde ubicado en la esquina inferior izquierda
- Seleccione “Conectar al host“

- Ingrese usuario@host en el campo:
- Reemplace usuario con: globalai
- El host es la dirección IP de su implementación en los pasos anteriores.
- Presione enter.
- Se abrirá una nueva ventana de VSCode.
- Es posible que aparezca una alerta de seguridad de Windows, si hace clic en: “Permitir acceso“

Seleccione Linux

Seleccione Continuar.

Ingrese la contraseña: back2gether

¡Ahora está conectado a su contenedor de desarrollo remoto!

- Configuración final
- Abra una Terminal, puede hacerlo usando el menú superior> Terminal > Nueva Terminal
- La terminal aparece en la parte inferior de VSCode

- Instalar extensiones adicionales
- Haga clic en el icono de extensiones a la izquierda
- Busque: ms-toolsai.jupyter
- Haga clic en instalar
- Busque: ms-python.python
- Haga clic en instalar

- Para activar las extensiones es necesario volver a cargar VSCode
- En el menú superior, haga clic en “Ver“> Paleta de comandos (crtl-shift-p)
- Escriba: “reload”
- Seleccione: “Developer Reload Window”
- VSCode volverá a cargar.
- Pedirá la contraseña de nuevo: back2gether

- En la terminal, use la CLI de Azure para iniciar sesión en su cuenta de Azure
- En la terminal escriba “az login”
- Abra una ventana del navegador y navegue a: https://microsoft.com/devicelogin
- Introduzca el código que se muestra en la terminal
- Inicie sesión con su cuenta de Microsoft que tiene acceso a la suscripción que desea utilizar.
- Haga clic en continuar para confirmar que está iniciando sesión con la CLI de Azure
- Puede cerrar la ventana del navegador.
- En la Terminal, debería ver un documento JSON largo con todas las Suscripciones de Azure a las que tiene acceso su cuenta de usuario.
- Establecer la suscripción correcta como suscripción predeterminada. En la terminal ingrese el comando
- Debería ver una lista de todas las suscripciones a las que tiene acceso su cuenta.
- Para establecer el tipo de suscripción predeterminado, en la terminal ingrese:
- Reemplace <SubscriptionId> con el id de suscripción que desea usar.
- Ahora, esta suscripción se usará para crear sus recursos de Azure de forma predeterminada.
Ya estás listo para comenzar a desarrollar con Visual Studio Code y un contenedor de desarrollo remoto
3. Lab #1: Entrena tu modelo
El objetivo es crear un modelo de visión de computadora personalizado con el servicio Microsoft Custom Vision.
Cree un grupo de recursos: El Custom Vision Endpoint debe crearse dentro de un grupo de recursos. Puede utilizar un grupo de recursos existente o crear uno nuevo.
Para crear un nuevo grupo de recursos, use bloque de código mostrado a continuación, reemplazando <resource-group-name> con un nombre para usarlo en este grupo de recursos. Reemplace <location> con la región de Azure que se usará para este grupo de recursos.
Cree la cuenta de Cognitive Services: Ejecute el siguiente comando para crear un Endpoint de Entrenamiento de Custom Vision gratuito. Reemplaza <resource-group-name> con el nombre que se usó arriba y usa la misma ubicación. Reemplaza <name> con un nombre para tu recurso como: my-custom-vision-training.
Obtenga los detalles del endpoint de la cuenta de Cognitive Services: Para obtener el endpoint de la cuenta de Cognitive Services, ejecute el comando mostrado a continuación. Reemplace <name> y <resource-group-name> con los nombres utilizados anteriormente.
Obtenga las claves de API
Obtenga la URL del endpoint
En este punto debería tener:
- Una URL de endpoint con este aspecto: https: // <region> .api.cognitive.microsoft.com /
- 2 llaves con este aspecto: 06a611d19f4f4a88a03f3b552a5d2379
Cree un Jupyter Notebook: Para crear el modelo, usaremos un Jupyter Notebook que se ejecuta en Visual Studio Code.
Abra un Jupyter Notebook vacío: En la terminal escriba
Esto abrirá un notebook vacío en Visual Studio Code.
¿Cómo funciona un notebook?
- Un cuaderno tiene celdas
- En una celda pones código.
- Puede ejecutar la celda para ejecutar código dentro de esa única celda
Hello World

En la primer celda escriba:
- Haga clic en el botón Play a la izquierda de la celda
- La primera vez que tenga que seleccionar el Kernel que está usando su computadora, seleccione el primero que aparezca
- El resultado del código se muestra debajo de la celda.
- Para agregar una nueva celda, puede hacer clic en el botón “+ código” en el menú superior o si mueve el mouse debajo de una celda.

Importante: Agregue cada bloque de código de este laboratorio en una celda separada y ejecute la celda a medida que avanza.
Cree un modelo de Custom Vision
Cada experimento de Machine Learning comienza con una pregunta que desea que se le responda. Para este ejemplo, vas a responder a la pregunta: ¿Es una figura Lego de Homer o Marge?
Descarga el conjunto de datos: Ahora que sabemos qué preguntarle al modelo, podemos pasar al siguiente requisito: los datos. Nuestro modelo será un modelo de clasificación, lo que significa que el modelo mirará la imagen y calificará las imágenes en comparación con las diferentes clases.
Entonces, el resultado será: estoy 70% seguro de que es Homer y 1% seguro de que es Marge. Al tomar la clase con la puntuación más alta y estableciendo un umbral mínimo para la puntuación de confianza, sabemos lo que hay en la imagen.
Se ha creado un conjunto de datos con 50 imágenes de una figura de Lego de Homer Simpson y 50 imágenes de una figura de Lego de Marge Simpson. Algunas características de este dataset:
- Se usaron fondos diversos
- Las fotos están tomadas desde diferentes ángulos.
- Se aseguró que el único objeto en la foto fuera Homer o Marge.
- La calidad de las fotos es constante.
Utilice el código de Python mostrado a continuación para descargar y extraer el conjunto de datos en la carpeta “data-train“.
Cree un proyecto de Custom Vision: Empiece importando los paquetes necesarios.
A continuación, cree variables para el endpoint de Custom Vision, la clave de entrenamiento de Custom Vision y la ubicación donde se almacenan las imágenes de entrenamiento.
Para comenzar con el entrenamiento, necesitamos crear un Cliente de entrenamiento. Este método toma como entrada el endpoint y la clave de entrenamiento.
Ahora está listo para crear su primer proyecto. El proyecto toma un nombre y un dominio como entrada:
- El nombre puede ser cualquier cosa.
- El dominio es una historia diferente. Puede solicitar una lista de todos los dominios posibles y elegir el más cercano a lo que está tratando de lograr. Por ejemplo, si está tratando de clasificar los alimentos, elija el dominio “Food” o “Landmarks” para lugares.
Utilice el siguiente código para mostrar todos los dominios.
Es posible que observe que algunos dominios tienen la palabra “Compact” detrás de ellos. Si este es el caso, significa que Azure Custom Vision Service creará un modelo más pequeño, que podrá exportar y ejecutar localmente en su teléfono móvil o computadora.
Creemos un nuevo proyecto con el dominio configurado como “General Compact“.
Suba y etiquete las imágenes: A continuación, debe crear etiquetas (tags), estas etiquetas son las mismas que las clases mencionadas anteriormente. Cuando haya creado algunos tags, podemos etiquetar imágenes con ellas y cargar las imágenes en el servicio de Azure Custom Vision.
Nuestras imágenes están ordenadas por etiqueta / clase en una carpeta. Todas las fotos de Marge están en la carpeta llamada ‘Marge’ y todas las imágenes de Homer están en la carpeta llamada ‘Homer’.
En el siguiente código, realizamos los siguientes pasos:
- Abrimos el directorio que contiene las carpetas con imágenes de entrenamiento.
- Recorremos todos los directorios que se encuentran en esta carpeta
- Creamos una nueva etiqueta con el nombre de la carpeta.
- Abrimos la carpeta que contiene las imágenes
- Creamos, para cada imagen en esa carpeta, un ImageFileEntry que contenga el nombre del archivo, el contenido del archivo y la etiqueta.
- Agregamos este ImageFileEntry a una lista.
Ahora tiene una lista que contiene todas las imágenes etiquetadas. Hasta ahora no se han agregado imágenes al servicio Azure Custom Vision, solo se han creado las etiquetas.
La carga de imágenes se realiza en lotes con un tamaño máximo de 64 imágenes por lote. Nuestro conjunto de datos tiene más de 300 imágenes, por lo que primero debemos dividir la lista en partes de 64 imágenes.
Ahora que tenemos nuestras imágenes divididas en lotes de 64, podemos subirlas lote por lote al servicio Azure Custom Vision. Nota: ¡Esto puede tardar un poco!
Entrena el modelo de clasificación: A partir de este punto, solo quedan dos pasos antes de que pueda acceder al modelo a través de un punto final de API:
- Primero necesitas entrenar el modelo.
- Luego debes publicar el modelo, para que sea accesible a través de una API de predicción.
El entrenamiento puede llevar un tiempo, por lo que puede crear un ciclo while después de la solicitud de entrenamiento para verificar el estado del entrenamiento del modelo cada segundo.
¡Ahora ha entrenado con éxito su modelo!
Pruebe su modelo: Para probar nuestro modelo vamos a exportar nuestro modelo en formato ONNX, descargar el modelo y ejecutarlo localmente.
Exporta la iteración a un modelo ONNX: Utilice el siguiente código para iniciar la exportación. La creación de una exportación puede llevar un tiempo dependiendo del tamaño de su modelo y la plataforma elegida.
El siguiente código comprueba cada 10 segundos si el proceso de exportación ha finalizado.
Descarga y descomprime el modelo exportado: Cuando se realiza la exportación, podemos descargar el modelo en un archivo zip y extraer el archivo zip en el directorio ./model.
Descarga el conjunto de datos de prueba: Para probar el modelo necesitamos imágenes que el modelo nunca ha visto. Este código descarga el conjunto de entrenamiento y lo descomprime en la carpeta /data-test
Ejecute las imágenes de prueba a través del modelo: Finalmente podemos ver si nuestro modelo funciona. El siguiente código:
- Obtiene todas las imágenes del directorio data-test
- Carga el modelo
- Recorre la matriz con las imágenes de prueba.
- Abre y escala la imagen al formato correcto para el modelo.
- Lo ejecuta a través del modelo.
- Imprime la predicción en la consola.
El resultado final se muestra a continuación:

4. Lab #2: Crea la función
Implemente su modelo ONNX en una Azure Function.
Cree la función de Azure: Ejecute el comando func init
nuevamente en la ventana de terminal que ha abierto, de la siguiente manera, para crear un proyecto de funciones en una carpeta llamada SimpsonsFunctions
con el runtime de Python y navegue hasta la carpeta del proyecto.
Esta carpeta contiene varios archivos para el proyecto, incluidos los archivos de configuración denominados local.settings.json y host.json Debido a que local.settings.json puede contener secretos descargados de Azure, el archivo se excluye del control de código fuente de forma predeterminada en el archivo .gitignore.
Agrega una función a tu proyecto usando el siguiente comando, donde el argumento --name
es el nombre único de tu función (Classify) y el argumento --template
especifica el disparador (trigger) de la función (HTTP).
func new
crea una subcarpeta que coincide con el nombre de la función que contiene un archivo de código apropiado para el idioma elegido del proyecto y un archivo de configuración llamado function.json.
Abra el archivo que contiene el código de su función.
Reemplace el código en la función (Classify / __ init__.py) con:
Copie el modelo a la función.
Abra el archivo requirements.txt
. Este archivo contienen una lista de paquetes que deben instalarse en la función de Azure.
Agregue los siguientes paquetes al archivo requirements.txt
Implemente Azure Functions. Primero hay que crear los recursos de Azure:
Cree un grupo de recursos para Azure Functions:
Cree una cuenta de almacenamiento. Reemplace <UNIQUE_NAME>
con un nombre único como simpsonfunc112
; además, reemplace <STORAGE_NAME>
con un nombre que sea apropiado y único en Azure Storage. Los nombres deben contener de 3 a 24 caracteres (solo números y letras minúsculas). Standard_LRS
especifica una cuenta de uso general, la cual es soportada por Azure Functions.
Cree la aplicación de función en Azure. Reemplace <APP_NAME>
con un nombre único global apropiado. <APP_NAME> es el dominio DNS predeterminado para la aplicación de función.
Este comando crea una aplicación de función que se ejecuta en el tiempo de ejecución de su idioma especificado en el Plan de Consumo de Azure Functions, el cual es gratis para la cantidad de uso que incurriremos en este laboratorio. El comando también aprovisiona una instancia de Azure Application Insights asociada en el mismo grupo de recursos, con la que puede supervisar su aplicación de función y ver registros de errores o información de actividad. Para más información, ver Monitor Azure Functions. La instancia no incurre en costos hasta que la activa.
Una vez que haya creado correctamente su aplicación de funciones en Azure, estará listo para implementar su proyecto de funciones locales mediante el comando func azure functionapp publish.
Publique la función de Azure: En el siguiente ejemplo, reemplace <APP_NAME> con el nombre de su aplicación.

Pruebe la función publicada: Copie la URL de invocación, péguela en su navegador y agregue la cadena de consulta a continuación a la URL.
Como resultado, debería ver:

¡Hecho!
Enhorabuena, ahora ha implementado con éxito un modelo de clasificación, que ha creado utilizando el servicio Azure Custom Vision, que se ejecuta en una función de Python Azure.
5. Limpia recursos
Cuando haya terminado con su laboratorio, puede eliminar su grupo de recursos. Reemplace el grupo de recursos con el nombre del grupo que creó en el Laboratorio 1.