TALLER - DEEP LEARNING
FACILITADORES
Ing. Eliecer Estupiñán
Ing. William Vega
DATOS DEL PARTICIPANTE
Nombre Completo: Victor De Hoyos
PROBLEMA
Se tiene una serie de imágenes de animales y se desea construir una herramienta para realizar el
reconocimiento por imagen de esta
OBJETIVO
Construir una herramienta de reconocimiento de imágenes de animales.
HERRAMIENTAS
Ingrese al siguiente enlace
https://colab.research.google.com/notebooks/welcome.ipynb
Archivo > Nuevo Cuaderno de Python 3
INSTRUCCIONES
Escriba y ejecute los siguientes scripts.
Después de realizar todas las actividades planteadas, guarde el documento en formato PDF y
cargue en el Drive, en la ruta dada por los facilitadores.
Page 1 of 10
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.
Esta área se superpone parcialmente con el de las neuronas más próximas, cubriendo de forma
colectiva el campo visual completo.
Macroarquitectura de la red VGG16
Como resultado, las CNNs aprenden a responder a diferentes caracterices 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.
Page 2 of 10
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.
#Cargue el modelo de inicio v3
from keras.applications.inception_v3 import InceptionV3
model = 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 frecuencia con
la que falla el modelo a la hora de predecir la respuesta correcta como una de sus cinco mejores
estimaciones.
Page 3 of 10
Función de predicción
Para empezar a hacer predicciones sólo necesitamos preparar la imagen de entrada y decodificar
el vector de predicción de salida. Para esto, vamos a escribir la función auxiliar predict.
#Función auxiliar para preprocesar la imagen y predecir clases
import numpy as np
from keras.preprocessing import image
from keras.applications.inception_v3 import preprocess_input,
decode_predictions
def 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 imagen 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 múltiples 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 clasificación a través de la
correspondiente etiqueta y la probabilidad predicha.
Page 4 of 10
#Funciones de ayuda para trazar resultados
import matplotlib.pyplot as plt
def plot_image(img_path):
img = image.load_img(fn, target_size=(299, 299))
plt.figure(figsize=(8, 8))
plt.imshow(img, interpolation='nearest')
plt.axis('off')
def plot_pred(pred):
plt.figure(figsize=(8, 2))
classes = [c[1] for c in pred]
probas = [c[2] for c in pred]
y_pos = np.arange(len(classes))
plt.barh(y_pos, probas, align='center')
plt.yticks(y_pos, classes)
plt.gca().invert_yaxis()
plt.xlabel('Probability')
plt.xlim(0, 1)
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ú.
#Código para cargar una imagen
from google.colab import files
uploaded = 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 predicción que se mostrará como a continuación.
#Realiza predicciones y muestra la imagen redimensionada de entrada y los
resultados.
pred = predict(model, fn)
plot_image(fn)
plot_pred(pred)
Page 5 of 10
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”.
Actividad Final
- Realice la carga de mínimo tres imágenes de animales descargadas de internet para verificar el
funcionamiento del reconocimiento de imágenes (adjunte las imágenes con el resultado al
documento de entrega).
Imagen Subida: Armadillo
Page 6 of 10
Resultado: Exitoso
Page 7 of 10
Imagen Subida: Japanese spaniel
Resultado: No Exitoso
Imagen Subida: Great Dane
Page 8 of 10
Resultado: Exitoso
- De una explicación de cómo funciona Deep Learning.
Los modelos de aprendizaje profundo se denominan redes neuronales profundas.
“Profundo” hace referencia al número de capas ocultas en la red neuronal las cuales hasta 150.
Se entrenan mediante el uso de extensos conjuntos de datos etiquetados y arquitecturas de
redes neuronales que aprenden directamente a partir de los datos, sin necesidad de una
extracción manual de características.
- ¿Cuál es la diferencia entre Machine Learning y Deep Learning?
Deep Learning es una forma especializada de aprendizaje automático.
Machine Learning empieza con la extracción manual de las características relevantes de las
imágenes.
Page 9 of 10
Deep Learning, extrae las características directamente de las imágenes. Además realiza un
“aprendizaje completo”, se proporcionan datos sin procesar, se realiza una clasificación, la cual
aprende cómo hacerlo automáticamente.
- Investigue 3 aplicaciones que utilicen deep learning en la actualidad.
Reconocimiento de Imágenes
Reconocimiento de Texto
Reconocimiento de Voz
Page 10 of 10