Saltar al contenido →

Create ML Tutorial. MLImageClassifier

¿Qué es un modelo de clasificación de imágenes? Apple nos cuenta que es…

A machine learning model that’s been trained to recognize images. When you give it an image, it responds with a label for that image.

Para mí es uno de los campos del Machine Learning/Deep Learning más apasionantes por las repercusiones y posibilidades que nos presenta, desde el reconomiento de escritura manual hasta la ayuda a la detección de diferentes tipos de cáncer.

En este tercer artículo de la serie sobre Create ML exploraremos la vía que Apple nos propone para crear estos modelos.

Anteriormente en Create ML Tutorial…

El el artículo anterior desarrollamos un modelo de clasificación de texto y lo importamos en una app que usaba ese modelo para predecir cómo de buena era la reseña que hacia un usuario de nuestra aplicación.

Y ahora en Create ML Tutorial…

Veremos las dos maneras en la que podemos crear un modelo de clasificación de imágenes. Nuestro modelo nos ayudará a averiguar a que personaje de The Big Bang Theory se corresponde un muñeco.

Pues no perdamos más tiempo y vamos a ello.

Los datos. Siempre los datos.

Como siempre necesitamos datos para entrenar un evaluar nuestros modelos, da igual lo que vayan a clasificar o predecir. En el caso de un modelo de clasificación de imágenes necesitamos… imágenes.

La forma en la que disponemos estas imágenes debe seguir una determinada estructura. Tendremos dos carpetas, una con las imágenes de entrenamiento y otra con las de evaluación.

Dentro de cada carpeta tendremos otras carpetas cuyo nombre será el de cada una de las categorías de nuestro modelo. En nuestro caso tenemos 4 carpetas llamadas con los nombre de los personajes de la serie.

Dentro de cada carpeta hay 10 imágenes, cantidad mínima que necesita un modelo en Create ML para poder entrenarse, con fotos única y exclusivamente del personaje en cuestión. Bajo ningún concepto debemos mezclar imágenes de diferentes categorías (personajes en nuestro caso).

Y recordad que contra más imágenes mejor, y también que las imágenes de evaluación deben suponer más o menos el 20% del juego de entrenamiento y que no deben estar contenidas en este.

Creando un MLImageClassifier (The Easy Way)

Si te digo que sólo necesitas 6 líneas de código para crear el modelo… ¿te lo crees? Pues hazlo, porque gracias al asistente, también conocido como MLImageClassifierBuilder, puedes hacer todo el proceso de entrenamiento y evaluación con un interface gráfico.

Si ejecutas ese código en tu playground para macOS verás algo como la imagen bajo estas líneas. Por cierto para ver el asistente debes cambiar la vista del Playground al modo Assistant Editor.

Como véis podemos definir la cantidad de iteraciones que tendrá el proceso de entrenamiento o la ruta a las carpetas con las imágenes de entrenamiento y validación, esta última no es obligatoria, pero si recomendable.

La sección Augmentation tiene diferentes opciones que indican las diferentes transformaciones a las que se someterá cada imagen para así crear un juego de imágenes mayor del que nosotros le suministramos.

Dicho de otro modo, si tengo 10 imágenes para entrenar y marco las opciones crop y rotate al final tendré 30 imágenes, las 10 originas más las 10 con crop y otras 10 con rotate

En cuanto hayáis terminado de configurar el entrenamiento sólo os queda pulsar el botón Train, si habéis seleccionado las carpetas de imágenes, o arrastar la carpeta con el juego de datos de entrenamiento a la zona con el texto Drop Images To Begin Training

En cuanto el entrenamiento haya terminado podréis apreciar que el interface del asistente cambia, mostrando el resultado del entrenamiento y los campos en los que podemos rellenar los metadatos del modelo.

Si estamos satisfechos con la precisión obtenida y hemos cumplimentado los metadatos sólo queda pulsar en el botón Save para guardar el modelo en el formato mlmodel en nuestro disco.

¡Y listo! Ya tenemos un modelo de clasificación de imágenes que podemos importar en nuestro proyecto de Xcode.

Creando un MLImageClassifier (The Coder’s Way)

Si por cualquier motivo no queremos o no podemos usar el interface para crear el modelo siempre podemos recurrir al código. En este caso la estructura que estamos buscando se llama MLImageClassifier y nos va a recordar mucho a su homólogo de texto que vimos en el artículo anterior.

Lo primero que necesitamos son las capetas, o carpeta si sólo tenemos imágenes de entrenamiento, donde estás las fotos de lo que vamos a clasificar, en nuestro caso muñecos de la serie The Big Bang Theory.

Con estos rutas podemos crear la enumeración MLImageClassifier.DataSource que necesita el inicializador de MLImageClassifier. Si hemos estructurado nuestras imágenes en carpetas usaremos la opción labeledDirectories(at:) y si por el contrario los archivos de imagen contiene el nombre de la categoría emplearemos labeledFiles(at:)

Al clasificador también podemos pasarle una serie de parámetros, como por ejemplo la carpeta con las imágenes de validación o un array con los distintos tipos de transformaciones a los que podemos someter a las imágenes de entrenamiento.

Una vez que lo hemos inicializado con éxito ya podemos exportarlo a disco para usarlo en uno de nuestros proyectos, y si queremos también podemos asignarle unos metadatos al igual que hicimos en el modelo del artículo anterior.

La forma de establecer estos metadatos es con la estructura MLModelMetadata. Recordemos que se puede decir el autor del modelo, su versión y el tipo de licencia entre otros datos. También tenemos un diccionario de datos para otro tipo de información que creamos relevante.

Acelerando el entrenamiento con MLImageClassifier.FeatureExtractorType

Vamos a detenernos un momento en la estructura MLImageClassifier.ModelParameters y vamos a fijarnos en uno de los parámetros que se le pasan a su inicializador.

Debemos mirar el parámetro featureExtractor al que le pasamos un valor de la enumeración MLImageClassifier.FeatureExtractorType.

¿Y qué es este extractor de características? Pues consiste en que durante el entrenamiento podemos aprovecharnos del entrenamiento de otro modelo, además de necesitar muchas menos imágenes para el entrenamiento, por lo que el proceso se acelera bastante. A este proceso se le denomina Transferencia de Aprendizaje

Basicamente lo que ocurre es que se extraen una serie de características de nuestras imágenes de entrenamiento y se buscan características parecidas en otros modelos que se usarán para acelerar el entrenamiento.

Seguro que te viene dos preguntas a la cabeza ahora mismo ¿Vale para todo? y ¿Qué valor le pongo? La respuesta para la primera es NO, por ejemplo para reconocimiento de escritura no serviría. Y la segunda es 1, y si no me crees Apple lo corrobora:

The enum’s associated value indicates which revision of the feature extractor to use. Set this to 1 when creating a scene print feature extractor.

Información del proceso

Independientemente de la manera en la que generas el modelo podrás ver un log bastante detallado con las estadísticas de cada uno de los pasos e información adicional bastante útil.

Mención especial a la Matriz de Confusión donde veremos en que se equivoca nuestro modelo y con qué otra categoría lo confunde. En nuestro caso parece que piensa que es Raj en lugar de Leonard en 2 de las 3 ocasiones.

En el próximo artículo…

Aún nos quedan cosas por descubrir de CreateML y vamos a averiguar como hacer un modelo que pueda categorizar en función de una serie de características, o lo que es lo mismo, daremos un repaso a MLClassifier.

Código Fuente

Como siempre aquí os dejo el repositorio en GitHub para que podaís probar todo el código en local.

En él encontraréis el playground con la generación del modelo, la app iOS para probarlo y los juegos de datos en formato json.

Enlaces de interés

Artículos de la serie

  1. Create ML. Tutorial
  2. Create ML. MLTextClassifier
  3. Create ML. MLImageClassifier

Publicado en Create ML Machine Learning