web analytics

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

clasficación de imágenes

[wp_ad_camp_1]

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)

1* 8aXZiQ4checANDktkGBrA

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')));
1*jSxwCjsyu

[wp_ad_camp_2]

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.

Te puede interesar:  Clasificación de imágenes multietiquetas usando redes neuronales con python

 

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()
1*sZOpzyGaeGI3D3cYk7Qz2A

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

[wp_ad_camp_3]

1*Ui4gYSRKAZsu WeNbwgNMg

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

1*TSdBxvJ RH9I04eXzlYFYA

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.

[wp_ad_camp_4]

data.show_batch(rows=3, figsize=(7,8))
1*JFdBYF p4TRh9cLKbe3pUQ

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

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

Entrenando el modelo

Te puede interesar:  Árboles de Decisión / Decision Trees con python

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()
1*smjdf9n53FwGNOYQOsh7Vg

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 =)

1*uTlpvIWnd 9dur9uN4ggag

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ó.

Te puede interesar:  Generación de música con Python

[wp_ad_camp_5]

interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix()
1*IeZlDVn J4wYeLJ5pIgbpQ

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)
1*8v4dY1B6Vg08zLuMA Jl3w

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

Ahora veamos con las demas imágenes.

1*wVVDzg vLZKtgAylNc63DA

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

Y por último un puma.

1* hcDJqKQbKCgL5XmPG6I7A

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

 

Deja una respuesta

Subir