Clasificación de imágenes y producción usando redes neuronales con python

Practical Deep Learning — Clasificación de imágenes — Parte 2

En la publicación anterior vimos cómo podemos entrenar un clasificador de imágenes. En esta publicación llevaremos nuestro clasificador a la producción, en la cuál subiremos una foto diferente de la base de datos y el modelo entrenado nos dirá la predicción más probable.

Entrenaremos un modelo en el que subiremos nuestras propias imágenes.

Iremos a images.google.com y buscaremos las fotos que queramos ingresar en nuestro modelo a entrenar.

En mi caso yo voy a crear un identificador de felinos (leones,pumas,jaguares,leopardos, tigres, etc)

Ahora para descargar las imágenes de una manera mucho más rapido, daremos click derecho (no seleccionando ninguna imagen) y luego damos click en inspeccionar elemento.

Se nos abrirá este cuadro y luego damos click en consola, en este espacio pegaremos el siguiente código.

urls = Array.from(document.querySelectorAll('.rg_di .rg_meta')).map(el=>JSON.parse(el.textContent).ou);
window.open('data:text/csv;charset=utf-8,' + escape(urls.join('\n')));

Damos enter y luego se nos pedirá guardar el archivo, guardamos y nos aseguramos que el formato sea .txt

Haremos esto para cada categoría de imágenes de nuestro modelo de clasificación.

Ahora procedemos a crear los directorios de cada categoría de imágenes.

folder = 'leones'
file = 'leones/leones.txt'

Cada vez que corremos el código de arriba debemos correr el código abajo de este texto. Luego para la siguiente categoría corremos el código de arriba pero cambiado el texto y luego el código de abajo y así sucesivamente tantas veces como categorías tengamos.

 

path = Path('data/felinos')
dest = path/folder
dest.mkdir(parents=True, exist_ok=True)

Para verificar que todo está bien, veremos el directorio.

path.ls()

Para subir los archivos de texto daremos click derecho en cada carpeta y seleccionamos la opcion subir, subimos el respectivo .txt

Creamos ahora nuestras clases, importante en el mismo orden con el que vamos descargando las imágenes.

classes = [‘leones’,’tigres’,’pumas’,’jaguares’,’guepardos’,’panteras’]

En otras palabas correremos los códigos así.

1, luego 2 , 3.

Después 1.1, 2.1,3.1 y así sucesivamente Recordando que antes del código 3 debemos subir a cada carpeta el archivo.txt

Una vez descargadas las imágenes corremos el siguiente código para asignar la etiqueta (clase) a cada categoría.

for c in classes:
print(c)
verify_images(path/c, delete=True, max_size=500)

Ahora procedemos a procesar los datos.

np.random.seed(42)
data = ImageDataBunch.from_folder(path, train=".", valid_pct=0.2,
ds_tfms=get_transforms(), size=224, num_workers=4).normalize(imagenet_stats)

y para verificar nuestras clases.

data.classes

Para ver una muestra de nuestras imágenes.

data.show_batch(rows=3, figsize=(7,8))

Para verificar el tamaño de nuestro set de entrenamiento y validación

len(data.train_ds), len(data.valid_ds)

Entrenando el modelo

La parte más interesante es entrenar el modelo, en este ejemplo usaré resnet50 (pueden probar el modelo que mejor les convenga)

learn = create_cnn(data, models.resnet34, metrics=error_rate)

Corremos lr_find() para ver la mejor taza de aprendizaje y luego la graficamos.

learn.lr_find()
learn.recorder.plot()

Escogemos el lugar más bajo de la curva pero que su pendiente sea suave, En este caso está entre 1e-03 y 1e-02 o bien hasta 1e-01.

Yo escogeré el intervalo de -2 a -1 y adicional lo haré correr 5 epochs

learn.fit_one_cycle(5, max_lr=slice(1e-2,1e-1))

Es normal que nuestro porcentaje de error sea elevado debido a que las imágenes descargadas puede que no todas estén limpias además de que son pocas imágenes y el modelo necesita muchas más para poder aprender bien.

Al decir que no están limpias me refiero a que por ejemplo una imagen de un león puede que sea un león de peluche, una imagen de un puma puede que sea de un jugador del equipo de los pumas.

Pero aún así obtuvimos solo un 11% de error =)

Antes de proceder a interpretar los datos primero guardaremos y cargaremos nuestro progreso

learn.save('stage-1')
learn.load('stage-1')

Interpretación

Estos pasos de interpretación son opcionales pero como buena práctica debemos hacerlos para identificar donde nuestro modelo falló.

interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix()

De la matriz vemos que los leones y tigres fueron los correctamente identificados en su mayoría.

Tambien apreciamos que en algunos guepardos el modelo predijo jaguares.

Modelo en producción.

Para poner en producción a nuestro modelo y que identifique cualquier imagen que le pasemos.

learn.export()

Haremos varias pruebas:

Una subiendo la imagen de la pantera rosa, otra de león, puma y jaguar esperando que el modelo nos de la predicción correcta.

Subimos cada imagen a nuestro directorio.

img1 = open_image(path/'jaguar.jpg')
img1

Cargamos el learner

learn = load_learner(path)

Y ahora la magia.

pred_class,pred_idx,outputs = learn.predict(img1)
print(pred_class)

El modelo entrenado me dijo que es un jaguar y efectivamente lo es.

Ahora veamos con las demas imágenes.

Esta de la pantera rosa fue por curiosidad de ver qué salía.

Y por último un puma.

Eso es todo! En la próxima entrega veremos cómo tomar datos directamente desde kaggle y cómo subir nuestro archivo final para participar en los concursos de kaggle.

Además identificaremos imágenes que tienen más de 1 etiqueta.

Pueden ver el ipynb en este enlace.

https://github.com/ai-saturdays-guayaquil/Curso/blob/master/DL_L2.ipynb

 

Previous

Clasificación de Imágenes usando redes neuronales con python

Clasificación de imágenes multietiquetas usando redes neuronales con python

Next

Deja un comentario