Machine Learning para desarrollo móvil-parte 1
En este tutorial revisaremos un caso práctico en usar aprendizaje automático o machine learning (ML) en un aplicativo móvil. El proyecto será “Clasificar imágenes de flores en Android”.
Me base en los codelabs “TensorFlow For Poets” y “Recognize Flowers with TensorFlow Lite on Android” , comentaré aquí las variaciones que hice en algunos pasos , notas o dificultades que encontré y luego pude resolver. Tener bases de Python u otro lenguaje de programación será suficiente para seguir los pasos, lo importa es tener mucha curiosidad! :)
En esta primera parte vamos a crear el modelo.
Introducción a Machine Learning
Como desarrolladores tenemos una forma de resolver problemas, usamos las reglas (if,else) y los datos y luego obtenemos respuestas.
Por ejemplo, si queremos crear un sistema que realice el reconocimiento de actividades de una persona y tenemos las velocidades, tradicionalmente programaríamos así:
En la programación tradicional, las reglas serían “speed< 4” ,la data sería el input que le damos al sistema es decir el “speed” o velocidad y la respuesta sería “Walking” o “Running”.
En machine learning tendremos lo contrario 😮 :
Entonces, el modelo que construiremos obtendrá los datos (imágenes, voz, montos, etc)y obtendremos las predicciones.
Machine Learning es programar con datos :)
Los Datos
Para el codelab usaremos un conjunto de datos (dataset) de flores para ingresarlas al modelo, aproximadamente 3,670 imágenes. Vemos que hay imágenes de rosas, tulipanes, girasoles, etc.
Para tus propios ejemplos podrías buscar datasets en repositorios públicos como Kaggle, Google AI, UCI ML Repository.
¿Cómo trabaja el modelo?
Lo que hará nuestra aplicación será detectar una imagen y clasificarla en alguno de estos tipos. Entonces , la imagen primero debe ser preprocesada (en un tamaño de 224 x 224) . Además de características como forma, color, sombra, grosor ,etc de la imagen, en la capa oculta o “Hidden layer” estarán el conjunto de características computacionales que el modelo va detectar para clasificar. Este tipo de aprendizaje se llama aprendizaje profundo o deep learning.
El output será la probabilidad de que la imagen detectada sea una clase o tipo. Es decir si ingresamos una imagen de una rosa, en el output nos dará en Roses un 98% y en los demás una probabilidad menor.
Y para casos de detección de imagenes, nos ayudará Tensorflow !
Tensorflow es una biblioteca de machine learning creada por Google, es Open Source y muy útil para deep learning. Usaremos su modelo previamente entrenado MobileNet V2, preciso para ejercicios de detección de imágenes.
El codelab nos da acceso a un archivo de Google Colab con código en Python, está todo lo que necesitaremos. Te muestro que es lo que vamos a obtener luego de correr el modelo MobileNet V2 :
El modelo contiene los siguientes parámetros : optimizer, se utiliza para mejorar la velocidad y el rendimiento del modelo; loss ,es un método para evaluar qué tan bien el algoritmo modela los datos (0 es mejor) y la métrica, la medida para la exactitud del modelo.
Luego de ejecutarlo y re-entrenarlo varias veces, vemos que en promedio sus resultados son : Accuracy 0.87 y Loss 0.4 , son números aceptables para nuestro problema.
Revisando el resumen, nos enfocamos en la cantidad de parámetros (Param) o características que el modelo ha encontrado (2,257,984) y luego seleccionado ( solo 368,837). En un ojo humano podríamos decir que un girasol es amarillo, tiene tal forma de pétalos y listo. Computacionalmente, existen más de 3mil características para detectar si es un tipo de flor, wow 😮
¿Cómo pasamos el modelo a nuestro proyecto móvil?
Convirtiendo el modelo a TFLite. Guardamos el modelo usando “tf.saved_model.save”, convirtiendo el modelo guardado a un formato compatible con TFLite.
En la siguiente parte veremos la integración de estos archivos en un proyecto Android y revisaremos los resultados en nuevos datasets.
Gracias por llegar hasta aquí :)
Recursos y referencias :