AI for Everyone: Building an Image Classifier with Microsoft Azure services
Este Taller se realiza en el marco del Hack Latam 2021, evento en línea organizado por los Microsoft Learn Student Ambassadors de Latinoamérica del 15 al 21 de Febrero de 2021.
Descripción: En este taller desarrollaremos una aplicación capaz de identificar imágenes aplicando un modelo de Inteligencia Artificial. Se utilizará Azure Storage para el almacén de imágenes y resultados de la clasificación, Azure Custom Vision para entrenar un modelo clasificador de imágenes y Azure Logic Apps para consumir el modelo via REST API. Una aplicación web ASP .NET Core será publicada en Azure Web App para la consulta de resultados.
Este taller es una traducción del Workshop: Create an application that can see with Azure Custom Vision creado por el equipo de la Global AI Community.
1. Creación de grupo de recursos
Ingresa al portal de Azure e inicia sesión con tu cuenta. https://portal.azure.com/

Da clic en el botón Create a resource y teclea Resource group. Una vez localizado el recurso, da clic en el botón Create

El nombre del grupo de recursos es HackLatam-RG y la región es South America (Brazil South).

Da clic en Review + create, y si no hay errores, confirma la operación dando clic en Create.
2. Creación del clasificador de imágenes
2.1 Creando el recurso en Azure
De regreso en la página de inicio del portal, da clic en el botón Create a resource y teclea Custom Vision. Una vez localizado el recurso, da clic en el botón Create.

En el formulario, ingresa la siguiente información:
- Grupo de recurso: HackLatam-RG (elige de la lista)
- Nombre del recurso: Una cadena única (si Azure dice que ya existe, ingresa otra). Por ejemplo, HackLatamToolsClassifier
- Ubicación de entrenamiento y predicción: (US) South Central US (puedes elegir otra si gustas pero debe ser la misma en ambos casos)
- Esquema de precios para entrenamiento y predicción: Standard S0 (si eliges el esquema gratuito, obtendrás un error al usar la Logic App)

Da clic en Review + create, y si no hay errores, confirma la operación dando clic en Create.
2.2 Creando el proyecto en CustomVision.ai
Cuando finalice la creación, ingresa al sitio https://www.customvision.ai e inicia sesión con tus credenciales.

Da clic en el botón New Project

Ingresa los datos solicitados en el formulario:
- Nombre del proyecto: HackLatamTools
- Descripción (opcional): A tools classifier
- Recurso: HackLatamToolsClassifier (el que acabas de crear en Azure)
- Tipo de proyecto: Classification
- Tipo de clasificación: Mutliclass (Single tag per image)
- Domains: Retail (compact)
- Capacidades de exportar: Basic platforms (Tensorflow, CoreML, ONNX, …)
- Haz clic en el botón Crear proyecto.

2.3 Agregando imágenes
Descarga este repositorio.
Una vez que aparezca tu espacio de trabajo en Custom Vision, haz clic en el botón Add images.

Del repositorio descargado, ubica la carpeta CV training images y añade todas las imágenes del subdirectorio drills.

Añade la etiqueta drills y haz clic en Upload files.

Recibirás una confirmación y observarás que se han agregado las imágenes con la etiqueta asociada en caso de éxito de la operación.

Repite los pasos para añadir las imágenes de las carpetas hammers, hard hats, pliers y screwdriver con sus respectivas etiquetas.
Al finalizar, tu espacio de trabajo debe mostrar 5 categorías de imágenes:

2.4 Entrenando el modelo
El siguiente paso es comenzar el entrenamiento de un modelo capaz de reconocer cualquiera de estas 5 herramientas en imágenes. Haz clic en el botón Train, elige la opción Quick Training y comienza el entrenamiento.

Una vez que concluya este proceso, la pestaña Performance mostrará los resultados de esta iteración.

2.5 Probando el modelo
Da clic en el botón Quick Test para verificar si el modelo es capaz de reconocer herramientas en nuevas imágenes.

Usa el botón Browse local files y selecciona cualquier imagen de la carpeta CV test images

Observa el resultado con la mayor probabilidad

2.6 Publicando el modelo
Haz clic en el botón Publish

Espera unos instantes y obtén la información necesaria para consumir el modelo haciendo clic en el botón Prediction URL. Copia toda la información mostrada en la sección Prediction API if you have an image URL:
- Prediction URL
- Prediction-key
- Content-key
- Body example

2.7 Consumiendo el modelo
En Postman (o alguna otra herramienta), realiza una petición de tipo POST a la URL de predicción que requiere una URL de imagen. En la sección Headers añade Prediction-Key y Content-Type junto con los valores obtenidos en la sección anterior.

En el cuerpo (Body) de la petición, elige raw para los datos en formato JSON; luego, coloca la cadena de ejemplo obtenida en la sección anterior y coloca la url https://upload.wikimedia.org/wikipedia/commons/d/d7/Battdrill.jpg. Da clic en el botón Send para lanzar la petición:

Por cierto, ésta es la imagen que estaremos analizando:

El resultado del análisis se observa a continuación (en formato JSON). Observa la propiedad predictions y que el primer elemento del arreglo corresponde al elemento con mayor probabilidad, taladros (drills)

3 Creación de una cuenta de almacenamiento
3.1 Creando el recurso en Azure
De regreso en la página de inicio del portal, da clic en el botón Create a resource y teclea Storage account. Una vez localizado el recurso, da clic en el botón Create.

En el formulario, ingresa la siguiente información:
- Grupo de recurso: HackLatam-RG (elige de la lista)
- Nombre del recurso: Una cadena única en minúsculas (si Azure dice que ya existe, ingresa otra). Por ejemplo, hacklatamstorage
- Ubicación: (South America) Brazil South
- Tipo de cuenta: StorageV2 (propósito general)
- Desempeño: Standard (opcional, no necesario, pero reduce costos)
- Replicación: LRS (opcional, no necesario)

Da clic en Review + create, y si no hay errores, confirma la operación dando clic en Create. Cuando finalice la creación, da clic en Go to resource.
3.2 Creando una tabla en Table Storage
Dentro de la cuenta de almacenamiento, da clic en Tables dentro de la sección Table service. Luego, haz clic en el botón + Table y escribe el nombre images. Confirma la operación.

En esta tabla se almacenarán los resultados de los análisis de imágenes enviadas por el usuario.

3.3 Creando un contenedor en Blob Storage
En la sección Blob service, da clic en Containers, luego en el botón + Container y escribe el nombre images con el nivel de acceso Público (anónimo). Confirma la operación.

En esta “carpeta” se agregarán las imágenes que serán analizadas automáticamente por un trabajo en la nube, haciendo uso del modelo.

4 Registro de proveedor de recursos
Accede a la suscripción donde estás creando los recursos en el portal de Azure. En el panel izquierdo, selecciona Resource Providers dentro de Settings y verifica que el proveedor Microsoft.EventGrid está registrado (puedes usar el buscador para localizarlo).

5 Creación de Logic App
5.1 Creando del recurso
Regresa a la página de inicio del portal, da clic en el botón Create a resource y teclea Logic App. Una vez localizado el recurso, da clic en el botón Create.

Ingresa los siguientes datos en el formulario:
- Grupo de recurso: HackLatam-RG (elige de la lista)
- Nombre de la app: Una cadena única (si Azure dice que ya existe, ingresa otra). Por ejemplo, HackLatamLogicApp
- Región: Brazil South

Da clic en Review + create, y si no hay errores, confirma la operación dando clic en Create. Cuando finalice la creación, da clic en Go to resource.
5.2 Creando el flujo
En el diseñador de Logic Apps, elige el trigger When an Event Grid resource event occurs.

Haz clic en el Símbolo + e inicia sesión con tu cuenta de Azure

Haz clic en Continue. Selecciona los siguientes elementos:
- Suscripción
- Tipo de recurso: Microsoft.Storage.StorageAccounts
- Nombre de recurso: hacklatamstorage
- Tipo de evento: Microsoft.Storage.BlobCreated
- Click en New Step.

Escribe Parse JSON en el campo de nueva operación y selecciona dicho elemento de la lista. Además:
- En Content elige Body de la lista del lado derecho
- En Schema coloca el contenido de este json
- Haz clic en New Step.

Ahora localiza la operación Custom Vision y selecciona Classify an image URL

En el portal de Azure, visita el servicio de predicción en la sección Keys and Endpoint. Copia ambos valores (key 1 y endpoint)

A continuación, ingresa los datos de tu conexión:
- Cadena de conexión: El nombre que desees (HackLatamConnection)
- PredictionKey: La del servicio de predicción que acabas de visitar
- URL: El endpoint del servicio predicción que acabas de visitar
- Click en el botón Create

En el sitio de customvision.ai, navega a tu proyecto, da clic en el ícono de settings y obtén el Project Id

También, en la sección Performance obtén el nombre con el que fue publicado tu modelo (Published as)

En el siguiente paso de Logic Apps, introduce los datos del proyecto de Custom Vision:
- Project ID
- Published Name
- Image URL: url (selecionar de la lista)
- Click en Next Step.

Ingresa la operación For Each (disponible en la pestaña Actions) y selecciona Predictions del lado derecho. Da clic en Add an action posteriormente.

Elige Control y luego Condition de la sección Actions

Selecciona Predictions Probability de la lista derecha, luego el operador is greater than y elige el valor 0.7. En la parte True, da clic en Add an action.

Ahora ingresa Insert Entity y selecciónalo de la lista. Escribe un nombre para la conexión (results), elige la conexión hacklatamstorage y da clic en Create.

En Table elige la tabla images, luego en Entity ingresa la cadena en formato JSON mostrada, eligiendo los valores respectivos de la derecha.

Guarda la Logic App

6 Probando la aplicación
Añade una imagen en el contenedor images del Blob Storage

Regresa a tu Logic App y observa en la sección Overview el resultado de la operación desencadenada por el flujo

Comprueba que en tu Table Storage se ha insertado un nuevo registro con la información del análisis de la imagen:

¡Listo!
En este taller construiste -sin código- un clasificador de imágenes que automáticamente identifica una fotografía de una herramienta después de que se inserta en una cuenta de almacenamiento en la nube.
Espero esta sesión haya sido de tu interés.
Saludos,
Luis