Escrito por Jorge Rodríguez Araújo en Planeta Chatbot.
Empezar a desarrollar soluciones de aprendizaje profundo (Deep Learning) se está volviendo cada vez más fácil. Por ejemplo, Google ofrece Colaboratory como un servicio cloud donde podrás desarrollar tus aplicaciones usando una GPU de forma gratuita.
Colaboratory ofrece un entorno Jupyter pre-configurado que se ejecuta enteramente en la nube, sin tener que descargar, instalar o ejecutar nada en tu ordenador. Además, los blocs de notas (notebooks) creados serán alamacenados en Google Drive y podrán ser compartidos como cualquier otro documento de Google Docs.
El entorno soporta Python y viene con TensorFlow pre-instalado, el framework de código abierto para Deep Learning desarrollado por Google. Si no estás familiarizado con Python, este es un buen momento para empezar, dado que es el lenguage de programación más popular para aprendizaje máquina (Machine Learning).
Bloc de notas de Collaboratory ejecutando una CNN para reconocimiento de imagen
En este momento, ya puedes ir al notebook de Colaboratory que hemos programado para este artículo y probar a ejecutarlo con tus propias imágenes. Sólo necesitas copiarlo en tu cuenta de Google y ejecutarlo desde el menú Runtime > Run all. Una vez ejecutado, en el paso 5 se te pedirá que subas tu propia imagen.
Tabla de contenidos
Reconocimiento de imagen y CNNs
El reconocimiento de imagen es el problema de identificar y clasificar objetos en una imagen. Posiblemente, una de sus aplicaciones más comunes en la actualidad es el etiquetado automático de imágenes, usado para la gestión y organización de contenido web.
Gracias a un tipo de modelos conocidos como Convolutional Neural Networks (CNNs), redes neuronales convolucionales, el reconocimiento de imagen ha experimentado enormes progresos. Estos modelos están inspirados por los procesos biológicos que tienen lugar en el cortex visual, donde las neuronas individuales responden a estímulos en un área restringida del campo visual. Este área se superpone parcialmente con el de las neuronas más proximas, cubriendo de forma colectiva el campo visual completo.
Como resultado, las CNNs aprenden a responder a diferenctes caractéricas de la imagen (bordes, formas, etc), como los bancos de filtros utilizados en los algoritmos tradicionales y definidos de forma manual. De hecho, la capacidad de aprender dichos filtros supone una ventaja única de las CNNs, que elimina el esfuerzo manual requerido en el diseño de características.
En la actualidad, existen multitud de arquitecturas de CNN disponibles de forma gratuita y sin restricciones de uso que pueden alcanzar un rendimiento razonable en tareas de reconocimiento visual. Por ejemplo, Keras — una librería de alto nivel que sirve como capa de abstracción sobre Tensorflow — proporciona acceso a alguno de los ganadores de la competición ImageNet ILSVRC. CNNs como ResNet50 (desarrollada por Microsoft Research) o InceptionV3 (desarrollada por Google Research) se ofrecen listas para reconocer 1000 objectos comunes (lista de objectos ILSVRC).
Empezando con Colaboratory
Para empezar sólo necesitamos acceder a Colaboratory, crear un nuevo notebook desde New Notebook > New Python 3 Notebook, e instalar Keras.
!pip install -q keras
Precedido con “!”, Colaboratory permite escribir comandos de sistema, lo que nos da control sobre la máquina virtual para instalar paquetes no disponibles por defecto.
Cargando y ejecutando el modelo
Cualquiera de los modelos de reconocimiento de imagen disponibles en Keras puede ser cargado con sólo dos líneas de código. Esto automáticamente descargará el modelo entrenado para clasificar 1000 objetos comunes usando el conjunto de datos de ImageNet.
from keras.applications.inception_v3 import InceptionV3model = InceptionV3(weights='imagenet', include_top=True)
El módulo keras.applications
proporciona acceso a las arquitecturas más comunes, como VGG16, ResNet50, InceptionV3 o MobileNet. En este caso vamos a elegir la Inception-v3 de Google, que es una de las mejores, con un error top-5 del 3,46%. Valor que mide la frequencia con la que falla el modelo a la hora de predecir la respuesta correcta como una de sus cinco mejores estimaciones — error top-5 — .
Función de predicción
Para empezar a hacer prediciones sólo necesitamos preparar la imagen de entrada y decodificar el vector de predición de salida. Para esto, vamos a escribir la función auxiliar predict
.
import numpy as np from keras.preprocessing import image from keras.applications.inception_v3 import preprocess_input, decode_predictionsdef predict(model, img_path, target_size=(299, 299), top_n=5): img = image.load_img(img_path, target_size=target_size) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) x = preprocess_input(x) preds = model.predict(x) return decode_predictions(preds, top=top_n)[0]
En primer lugar, la imagen tiene que ser redimensionada para adaptarse al tamaño de entrada de la red Inception-v3, en este caso target_size=(299, 299)
, otras redes como la VGG16 o la ResNet50 deben establecer un tamaño igual a (224, 224)
. La función image.load_img
del módulo keras.preprocessing
carga directamente la image desde su ubicación img_path
y redimensiona la imagen al tamaño especificado target_size
.
El siguiente paso es convertir la imagen img
a un array de numpy con image.img_to_array
y cambiar sus dimensiones con np.expand_dim
para pasar de (3, 299, 299)
a (1, 3, 299, 299)
. De este modo se tiene un array de 4 dimensiones con 1 imagen de 3 canales RGB y tamaño 299 por 299. Esto es necesario porque la función model.predict
requiere que la entrada sea un array de 4 dimensiones, pudiendo clasificar multiples imágenes de una sola vez.
El último paso antes de la predicción es la normalización de los datos, que usa la función preprocess_input
para centrarlos en cero usando la media de los valores de los canales de las imágenes del conjunto de entrenamiento. Este paso es extremadamente importante porque si no se realiza provocará que las probabilidades de las predicciones sean incorrectas.
Finalmente, el valor devuelto por la función de predicción model.predict
es decodificado por decode_predictions
para devolver el resultado de la clasificiación a través de la correspondiente etiqueta y la probabilidad predicha.
Carga de la imagen
Definido nuestro sistema de reconocimiento, solo necesitamos cargar nuestras propias imágenes para probar su funcionamiento. Para ello, podemos usar directamente el código que podemos encontrar al hacer click en el botón negro que se encuentra en lo alto a la izquierda, justo debajo del menú.
from google.colab import filesuploaded = files.upload()for fn in uploaded.keys(): print(‘User uploaded file “{name}” with length {length} bytes’.format( name=fn, length=len(uploaded[fn])))
Predicción
Cargada la imagen, obtendremos una predición que se mostrará como a continuación.
pred = predict(model, fn) plot_image(fn) plot_pred(pred)
La cual, usa la librería matplotlib
para mostrar la imagen y el resultado predicho en un gráfico de barras horizontal.
Conclusiones
Este artículo da un vistazo rápido de cómo empezar con la predicción de objectos presentes en una imagen empleando redes neuronales convolucionales (CNNs). Pero esto no es más que una introducción, dado que dichas redes pueden ser adaptadas a medida para predecir con gran precisión nuestras propias clases de objectos usando “transfer learning”.
En el próximo artículo, introduciremos la técnica de “transfer learning” para el reconocimiento a medida de distintas clases de objetos.