Crea tu modelo Machine Learning con Teachable Machine

Enrique Blanco    27 enero, 2020
galaxia

Hace unos pocos meses, Google liberó Teachable Machine, una herramienta y un recurso sorprendentes para Machine Learning dirigida al público general.

Esta herramienta nos permite abstraernos de la definición del modelo, algoritmo y tratamiento de datos y centrarnos sólo en el despliegue del modelo que generemos.

Funciona en el navegador, con una webcam o con archivos que tengamos alojados en local o en Google Drive, y en pocos minutos puede comprender rápidamente cómo un modelo «aprende» a través de una simple demostración de clasificación.

Figura 1. Teachable Machine webpage.
Figura 1. Teachable Machine webpage.

En marzo del año pasado realizamos una serie de artículos donde mostramos cómo aplicar un algoritmo de clasificación muy sencillo haciendo uso de Random Forest a través de los estimadores de Scikit-Learn. Podéis consultar la serie aquí o en este otro enlace.

Para diferenciarnos un poco de la extensa literatura soportada en datasets muy conocidos y usados, decidimos clasificar los datos del Sloan Digital Sky Survey (SDSS) DR14, relacionado con el mundo de la astrofísica, donde se recogen datos fotométricos de estrellas, galaxias y quasars. Podéis encontrar el dataset en el siguiente enlace.

Para abrir boca, vamos a usar datos no tan usuales en la demostración del excelente desempeño de este servicio. Recurriremos al Galaxy Zoo classification dataset.

Obtener y entender los datos

Por poner en antecedentes, Galaxy Zoo es un proyecto de crowdsourcing, donde se pide a los usuarios que describan la morfología de las galaxias en base a imágenes. Se les hacen preguntas como «¿Cómo de redonda es la galaxia?» y «¿Tiene una protuberancia central?«. Las respuestas de los usuarios determinan qué pregunta se hará a continuación. Las preguntas forman un árbol de decisión que se muestra en la figura a continuación, tomada de Willett et al. 2013.

Figura 2.  Árbol de decisión de clasificación de galaxias (Willett et al. 2013)
Figura 2. Árbol de decisión de clasificación de galaxias (Willett et al. 2013)

Cuando muchos usuarios han clasificado la misma imagen, sus respuestas se pueden agregar en un conjunto de probabilidades para cada respuesta. A menudo, no todos los usuarios estarán de acuerdo con todas sus respuestas, por lo que es útil cuantificar esta incertidumbre. Determinar la morfología de un objeto es una tarea muy subjetiva.

El objetivo del desafío Galaxy Zoo es predecir estas probabilidades a partir de las imágenes de galaxias que se muestran a los usuarios. En otras palabras, construya un modelo de cómo «la multitud» percibe y clasifica estas imágenes. El dataset, consistente en más de 60,000 imágenes, se puedes descargar en el siguiente enlace.

Esto significa que estaríamos ante un problema de regresión, no un problema de clasificación: no tenemos que determinar a qué clases pertenecen las galaxias, sino la fracción de personas que las clasificaría como tal.

Sin embargo, dada la funcionalidad de Teachable Machine, nos vamos a tomar una licencia y vamos a procesar las imágenes que tenemos para poder separarlas en varias clases morfológicas que se intenten adaptar lo más posible a la secuencia del Hubble. Esta secuencia es un esquema de clasificación morfológica para galaxias.

Figura 3. Hubble Tunning Fork.
Figura 3. Hubble Tunning Fork.

Grosso modo, en su definición más simple, las galaxias:

  • elípticas tienen distribuciones de luz suaves y sin características y aparecen como elipses en las imágenes.
  • espirales consisten en un disco aplanado, con estrellas formando una estructura (generalmente de dos brazos) y una concentración central de estrellas conocida como el bulbo galáctico, que es similar en apariencia a una galaxia elíptica.
  • lenticulares también consiste en un brillante bulbo central rodeado por una estructura extendida, similar a un disco pero, a diferencia de galaxias espirales, sin estructura espiral visible.

Ordenando las imágenes

Como comentamos con anterioridad, hay alrededor de 60,000 imágenes en el conjunto de entrenamiento, en formato JPEG en color con dimensiones 424×424.

Con esas fotografías también se nos facilita un fichero CSV con el resultado de las clasificaciones realizadas por los usuarios. Hemos usado ese CSV para ordenar las imágenes en base a la clase con voto mayoritario.

Haciendo uso del siguiente script de Python, todas las imágenes de la carpeta ‘data/‘ quedarán convenientemente ordenadas.

import os
import numpy as np
import csv
import shutil

dir_path = os.path.dirname(os.path.realpath(__file__))
path = os.path.join(dir_path, 'data')
files = os.listdir(path)

def get_all_solutions():
    ### Import solutions file and load into all_solutions
    all_solutions = {}
    with open('training_solutions_rev1.csv', 'r') as f:
        reader = csv.reader(f, delimiter=",")
        labels = next(reader)[1:-1]
        for i, line in enumerate(reader):
            all_solutions[line[0]] = labels[np.argmax([float(x) for x in line[1:]])]
    return all_solutions, labels

def move_pics():
    """
    Classify images by its label from training_solutions_rev1.csv
    """
    mapping, labels = get_all_solutions()

    for type in labels:
        if not os.path.exists(os.path.join(path, type)):
            try:
                os.mkdir(os.path.join(path, type))
            except OSError:
                print("Creation of the directory %s failed" % path)
            else:
                print("Successfully created the directory %s " % path)

    for file in files:
        shutil.move(os.path.join(path, file), os.path.join(path, mapping[file.split('.')[0]], file))

if __name__=="__main__":
    move_pics()

Lo que nos hemos encontrado es que el 85% de las galaxias han acabado mayoritariamente agrupadas en 3 directorios. La discriminación de cada grupo es clara: elípticas, espirales o irregulares.

Entrenando el modelo

Para comenzar a entrenar el modelo de clasificación, primero tenemos que crear diferentes categorías o clases para enseñarla.

Figura 5. Vista del comienzo de un proyecto de clasificación de imágenes.
Figura 5. Vista del comienzo de un proyecto de clasificación de imágenes.

Vamos a hacer una prueba rápida creando sólo dos clases: una para galaxias elípticas (Class 1.1) y otra para galaxias con forma espiral (Class 1.2), fácilmente reconocibles a simple vista.

Figura 6. Una vez subidas las imágenes, podemos prepararnos para comenzar el entrenamiento (definición de los hiperparámetros más básicos)
Figura 6. Una vez subidas las imágenes, podemos prepararnos para comenzar el entrenamiento (definición de los hiperparámetros más básicos)

Con las clases o etiquetas definidas, subimos desde local las muestras de cada clase para que pueda comenzar el entrenamiento. Elegimos 200 imágenes con resolución 424×424 por clase.

Ahora que tenemos las clases listas, procedemos a entrenar.

Vídeo 1. Entrenamiento de modelo de clasificación.

Como se puede observar, el modelo tarda en entrenar sólo un minuto. No sólo la rapidez en el entrenamiento es excelente (quizás me quede corto con este adjetivo), sino que te ofrecen métricas dinámicas valiosas como la precisión y pérdida del training y test dataset y la precisión por clase observada.

Nuestro modelo se estanca en el aprendizaje alrededor de la decimoquinta época, amagando con sufrir de overfitting. Pero el resultado es bastante bueno considerando que es una prueba muy rápida con los hiperparámetros por defecto.

Las precisiones para la clasificación de las clases son del 87% para Class 1.1 y del 100% para Class 1.2. Esto se puede interpretar con el hecho de que algunas galaxias elípticas pueden tener una forma con excentricidad algo más elevada de lo normal y se confundan con las espirales. Estas últimas son las que mejor reconoce el modelo, pues como ya vimos en la Figura 4 (medio) son las más fácilmente reconocibles.

Testeando el modelo

Esta tarea es también muy sencilla de realizar.

Vídeo 2. Testeo de modelo de clasificación.

Como se puede ver en el Video 2, cogiendo dos imágenes al azar entre aquellas que no se han usado para el entrenamiento, nuestro modelo es capaz de clasificarlas correctamente. Tenemos la opción de cargar recursos para testeo tanto desde local o Google Drive como desde nuestra webcam.

Obteniendo el modelo para despliegue

Si fuera poco, se puede exportar su modelo como modelo Tensorflow.js y alojarlo en Teachable Machine de forma gratuita, para que pueda llamarlo a cualquier sitio web o aplicación. También puede convertirlo a Tensorflow y Tensorflow Lite y descargarlo para uso local. Las posibilidades son innumerables con gracias a esta funcionalidad.

Video 3. Posibilidades de exportación de modelos de clasificación en Teaching Machine

Conclusión

Por supuesto, en nuestra prueba no hemos llegado a las precisiones que lograron los vencedores del challenge (cuya aproximación mediante redes neuronales convolucionales se explica en este link), pero sí que nos ha permitido mostrar cómo de simple es usar esta herramienta y el poco tiempo que hemos invertido en entrenar el modelo.

Hay que destacar que sólo en entrenar un modelo convolucional, hay que esperar bastante más tiempo que los dos minutos que hemos invertido en obtener nuestro resultado, sin hablar del preprocesado, organización en batches, etc.

Si os pica la curiosidad, os invitamos a probarlo. Puedes intentar hacer tu propio modelo de clasificación en unos pocos minutos. También puedes entrenar y desplegar un modelo basado en sonido o en la pose de un individuo. Han prometido incorporar más funcionalidades en un futuro.

Para mantenerte al día con LUCA visita nuestra página web,  suscríbete a LUCA Data Speaks o síguenos en TwitterLinkedIn YouTube.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *