Azure Custom Vision Kame Hame Haaaa - ESP
Tags: azure, ai, spanish, tutorial
Published: 2022-03-07 13:36:42

## Introducción

La clasificación de imágenes es una de las cargas comunes en las aplicaciones de inteligencia artificial (IA). Aprovecha la eficacia predictiva del Machine Learning para permitir que los sistemas de inteligencia artificial identifiquen elementos reales en función de imágenes.

El servicio de [Azure Custom Vision](https://azure.microsoft.com/en-us/services/cognitive-services/custom-vision-service/#overview) nos permitirá crear nuestros propios modelos de Computer Vision para la clasificación de imágenes o detección de objetos.

En este caso nos permitirá resolver unos de los problemas comunes de Computer Vision, el cual es el análisis imágenes con el fin de Clasificarlas o Categorizarlas.

Aprenderemos como proveer recursos de Azure para Custom Vision, entender la clasificación de imágenes y entrenar nuestro propio modelo para clasificar personajes de Dragon Ball 😊.

## Crear los recursos de Custom Vision
Para comenzar vamos a necesitar crear nuestro recurso de Custom Vision lo vamos hacer desde el portal de Azure.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzpl7s2k54j0795o1hoc.png)

- En las opciones de creación vamos a seleccionar Both (Ambos) para Entrenamiento y Predicción.

- Seleccionamos nuestra subcripción y luego nuestro grupo de recursos. Podemos utilizar uno ya creado o sino crear un nuevo grupo.

- En los detalles de Instancia seleccionamos la región en donde queremos crear nuestros recursos y escribimos un nombre, en mi caso utilicé "DragonBallCharacters" ya que estaba disponible.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ywbcmnkz6a81vp8woa5.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bo1uji2gn04qqmlvdi6d.png)

- Como se muestra en las imágenes, para el recurso de Training y de Prediction nos habilita utilizar una tier **Free F0** ( 2 transacciones por segundo y la creación de 2 proyectos). Les comparto este [link](https://azure.microsoft.com/en-us/pricing/details/cognitive-services/custom-vision-service/) en donde podrán ver los detalles de los precios.

- Continuamos presionando Review + Create.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/my0l1ptu4568o0vmpwxg.png)

- Chequeamos que pase todas las validaciones y por último precionamos Create.

- Hurra!!! ya hemos creado nuestro recurso de Cognitive Services Custom Vision en el portal de Microsoft Azure.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ffm6t9ec21x0nwdz3rhx.png)

- Ahora nos dirigimos al portal de Custom Vision ([link](https://www.customvision.ai/))

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iq50r9s3rtalx3urt7ng.png)

- Ingresamos las mismas credenciales de las cuales usamos para crear los recursos en elportal de Azure.

- Accedemos a la page principal de Custom Vision para crear nuestro primer Proyecto. 😉

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mdhxxncdppniprk6p2pa.png)

- Presionamos en New Project o Nuevo Proyecto.

- Comenzamos a completar los datos solicitados.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/od1ajper7thkbp5ce9kb.png)

- Escribimos un nombre para nuestro Proyecto.

- Podemos agregar una descripción (es opcional).

- Seleccionamos el recurso que hemos creado anteriormente.

- En Project Types podemos seleccionar Detección de Objetos (encontrar la ubicación del objeto dentro de una imagen) o Clasificación (clasificar-etiquetar imágenes). Nosotros vamos a seleccionar Classification ya que al comienzo de este post mencionamos que vamos a clasificar personajes de Dragon Ball  Z.

- En classification Types podemos elegir Multilabel (múltiples etiquetas a una imagen) oMulticlass (una etiqueta específica a la imagen). Nosotros elegimos Multiclass (single tag por imagen).

- Cuando llegamos a la opción de Dominios aquí hay que tener varios aspectos en cuenta:
   **1.** Primero, establecer que propósito va a tener nuestro modelo, por ejemplo, si deseamos que este optimizado para fotos de alimentos o retails o puntos de referencia.
   **2.** Segundo,  definir si deseamos que sean compactos o no. Esto significa que nuestro modelo lo vamos a exportar para que se ejecute localmente en dispositivos móviles o de IoT.

- En nuestro caso vamos a utilizar General (compact) [S1].
Para mas información sobre los dominios segun los propositivos de nuestros modelos, los tamaños y los tiempos de inferencia les dejo este [link](https://docs.microsoft.com/es-es/azure/cognitive-services/custom-vision-service/select-domain) desde la documentación oficial de Microsoft.

- Para finalizar la creación del Proyecto presionamos en Create project.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4fi3t25ewvemv8u6b0c9.png)
Ya hemos creado nuestro proyecto y ahora viene la mejor parte:

1. SUBIR NUESTRAS IMAGENES
2. ETIQUETAR LAS IMAGENES
3. ENTRENAR EL MODELO
4. EVALUAR EL RESULTADO

- Para este ejemplo utilicé un Dataset con imagenes de algunos personajes para entrenar nuestro modelo, les comparto el [link](https://www.kaggle.com/pablitopiova/dragonball-z) para que puedan descargar las imágenes.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/85o7nhiydrjodxrtkshm.png)

- Seleccionamos add images para comenzar el proceso de upload. Tener en cuenta que las mismas tienen que ser en formato JPG, PNG, BMP y no deben superar los 6MB.

- Cuando comiencen a subir las imágenes de cada personaje en algunos casos les puede indicar que no cumplen con estas restricciones y también en el proceso de upload  nos informa cuando hay imágenes repetidas.

- Por cada personaje que subamos nos brinda la opción de cologar un Tag o etiqueta. En nuestro caso escribimos el nombre del personaje correspondiente a las imágenes.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndtvnslah8dutlf3ckoc.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dtabxlivddh1kkoyvyhf.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pbt4jtnrr6hh4o2msgbf.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vycj6zlnh47qdrqf1y1s.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/65jvjvqsy2hudjd0iwde.png
)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d8as0myz92mnto3x6udq.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/51vx58e4sx4252ljg27p.png)

- Ya hemos subido y etiquetado nuestras imágenes. Ahora estamos en condiciones de comenzar a entrenar nuestro modelo.

- Arriba a la derecha se encuentra el botón _Train_.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iviqfgr87rgnr0r6kxv4.png)
 
- Podemos seleccionar el tipo de entrenamiento, Quick (Rápido) o Advanced Training.
 
- En entrenamiento avanzado lo debemos utilizar para mejorar el rendimiento, especialmente en datasets complejos y detallados.
 
- En este ejemplo seleccioné entrenamiento avanzado con 1 hora y también indiqué que me comuniqué por mail cuando finaliza. Esa opción sirve cuando seleccionamos muchas horas de entrenamiento en grandes o detallados datasets y puede ocurrir que el mismo finalice antes de lo esperado y por ello nos notifique vía mail.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uguqu0tk2e1hcsmthlhu.png)

**Si chequean la fecha y la hora del entrenamiento, podemos decir que debe ser unos de los últimos entrenamientos del año que se ejecute en el cloud de Azure.** 😊


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pyfljf8hgtyvx1y4ur0f.png)

- El entrenamiento termino y ya tenemos nuestra primera iteración.

- En esta pestaña de Performance podemos ver las métricas de rendimiento (si hacemos click en la burbuja "i" veremos el signiticado de cada una.

- Además, nos detalla el rendimiento por cada etiqueta.

- Les comparto un [link](https://docs.microsoft.com/es-es/azure/cognitive-services/custom-vision-service/getting-started-build-a-classifier#evaluate-the-classifier) para entender un poquito más sobre la evaluación del clasificador.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iqbqa2eddrc0fw5ibvig.png)

- Vamos a realizar un Quick Test de este modelo utilizando una imagen que no se encuentra en nuestro dataset.

- Podemos utilizar una imagen desde nuestro computador o utilizar una URL de una imagen.

- Les dejo el [link](https://th.bing.com/th/id/OIP.bxD3r9SM9p4WuzME1D10SgHaJ4?pid=ImgDet&rs=1) de la imagen en la cual realice el Quick Test.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5fzqozw0l9x77opiy8dc.png)

- Nuestro Quick Test nos arrojo una predicción de Goku con un 60,4%. (Muy buen resultado para nuestro primer entrenamiento).

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t8rtlr65bhhmcfnf7qgp.png)

- Si nos dirigimos al a pestaña de predicciones (a la izquierda de Train), nos aparece la imagen que utilizamos en el Quick Test.

- Todas las imágenes que utilicemos para realizar predicciones sean por Quick Test o cuando publiquemos nuestra url de predicciones nos apareceran en esta pestaña para luego darnos la posibilidad de seleccionarlas y volver a etiquetar correctamente según el personaje de Dragon Ball siguiendo nuestro ejemplo.

- Luego de haber realizado este etiquetado de nuestras nuevas imágenes podríamos utlizarlas para un nuevo entrenamiento y poder obtener una nueva iteración.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3lwzeiubic1j0w89ladf.png)

- Volviendo a la pestaña Performance tendremos algunas acciones importantes para realizar que les mostraré a continuación.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ab60i8w03ncvb57w0q6o.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/acod0lf1rzlsikac24zp.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/boa0bjrz2zqogqn353yq.png)

- Publicación de la iteración del modelo, en nuestro caso solamente tenemos 1 iteración,pero a medida que continuemos con los entrenamientos vamos a contar con varias iteraciones y nos va a permitir publicar la iteración que mejor rendimiento tenga segun nuestro analisis de metricas y Test del modelo.

- Cuando tengamos nuestra publicación en la opción de Prediction URL nos brindará los datos necesarios para poder llamar a esta API para realizar predicciones (he ocultado la prediction-key  por seguridad).

- Tambien podemos exportar nuestro modelo según las diferentes plataformas como CoreML para iOS, TensorFlow para Android, ONNX para utilizarlo en ML.NET unos de mis frameworks preferidos y también para Dockerfile cuando necesitamos utilizarlos en dispositivos IoT y varios más dandonos flexibilidad en implementaciones.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dmdg5012k00fsya2azxo.png)

- A la derecha de Quick Test contamos con la opción de Project Settings.

- En esta sección vamos a tener todo el detalle de nuestro proyecto como por ejemplo el cúmulo de entrenamientos, etiquetados e iteraciones y además la posibilidad de cambiar de dominio si es necesario.

---

## Utilizando el modelo en Android utilizando Xamarin Form

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yapjf4x15mb39x5aluky.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w346hilknsw7vjwj5hby.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x8yg924ki0drnbkrk20m.png)

## **Recursos**

- [Documentación de Microsoft](https://docs.microsoft.com/en-us/azure/cognitive-services/custom-vision-service/overview)

- [DataSet](https://www.kaggle.com/pablitopiova/dragonball-z)

- [Documentación C# Quickstart](https://docs.microsoft.com/en-us/azure/cognitive-services/Custom-Vision-Service/quickstarts/image-classification?tabs=visual-studio&pivots=programming-language-csharp)

- [Github XamarinCustomVision](https://github.com/ppiova/XamarinAI)

Espero que les sea de utilidad y vean el gran potencial que tienen los servicios cognitivos de Microsoft.

Con solo una cantidad razonable de imágenes podemos crear
modelos robustos para empezar a utilizar en nuestros proyectos.

Happy New Year!!! and Happy Coding!!!