Bienvenido, soy Miguel y esta vez les traigo este nuevo artículo.
¡Reaviva tu pasión construyendo un clasificador de imágenes simple para detectar neumonía en una radiografía!
Índice
TL; DR
Si está comenzando a sentirse agotado por aprender un tema, a menudo es beneficioso dar un paso fuera de la maleza. Me gusta construir algo divertido y fácil para recuperar un impulso positivo en mi viaje de aprendizaje.
Este es un proyecto que ayudó a que mi creatividad fluyera nuevamente. Cargue mi cuaderno desde mi repositorio de GitHub en Google Colab y cargue el conjunto de datos de Kaggle para aprender a construir un clasificador de imágenes usando el software fastai. ¡No olvide configurar el acelerador de hardware en GPU!
l
y suba el cuaderno a Colab yendo a Archivo → Subir cuaderno → Pestaña GitHub → BSamaha / Chest-Xray-FastAI
Intro
Se ha fijado un objetivo, como querer ser científico de datos o ingeniero de datos. Su pasión y energía están por las nubes mientras revisa todo el material sobre el tema que puede encontrar.
Quizás incluso inició un campo de entrenamiento de codificación o una clase de Coursera para ser su guía en su camino hacia el dominio de los datos. Su cerebro se satura de dopamina a medida que acumula ganancias rápidas.
sci-kit learn
: ¡el aprendizaje automático no es tan malo después de todo! Absorbiste rápidamente toda la información que se te arrojó. Nada puede detenerte.
He estado allí y todavía voy. Soy humano despues de todo. Me refiero a la cima del «monte». Estúpido en El efecto Dunning-Kruger. La regresión lineal fue fácil con un conjunto de datos perfectamente seleccionado, pero esa no es la realidad.
Finalmente, después de aproximadamente un mes o dos de volar a través del material con facilidad, chocas contra un muro llamado estadísticas. Lo mueves y apenas lo logras, excepto que sientes que no has retenido nada.
¿La gente recuerda todas estas cosas de distribución? Alerta de spoiler: sí, y se le preguntará sobre ellos. A medida que avanza, se da cuenta de que sus habilidades con Python no están ni cerca de donde deberían estar.
Decides mirar un par de ofertas de trabajo y luego te das cuenta. No tienes un título de posgrado avanzado en ciencias de la computación y no sabes cómo pronunciar algunos requisitos del trabajo y mucho menos sabes cuáles son: ¿Hadoop? Bienvenido al Valle de la Desesperación.
Mi instructor de ejercicios, el Sargento Rivera, del Marine Corps Recruit Depot Parris Island, un verdadero campo de entrenamiento, dijo una vez:
“La motivación es como la cafeína, eventualmente desaparece. Lo que realmente estás buscando es inspiración «.
Recuerdo esta cita cada vez que me encuentro dirigiéndome hacia el Valle de la Desesperación en cualquier nuevo viaje de aprendizaje en el que me encuentre. La mejor cura para volver a tu juego es recordar lo que te emocionó en primer lugar. Encuentre una victoria rápida para obtener un impulso positivo nuevamente.
Este proyecto fue mi rápida victoria. Me volvió a abrir los ojos al asombroso poder del aprendizaje automático y lo simple que podría ser. Mi imaginación comenzó a volar con ideas de todas las herramientas que podía construir para ayudar a otros en el mundo. Encontré mi inspiración de nuevo y mi pasión se volvió a encender. Espero que te haga lo mismo.
Tiempo de construir
El objetivo de esta publicación de blog no es ser muy técnico y enseñarle todo sobre el aprendizaje profundo. Quiero que vaya a aprender desde el propio maestro, Jeremy Howard en Fast.ai.
Actualmente estoy realizando el curso yo mismo y no puedo recomendarlo lo suficiente. Me encanta su filosofía de enseñanza de arriba hacia abajo y su objetivo de hacer que el aprendizaje profundo sea accesible y utilizable para todos. ¡Lo mejor de todo, es gratis!
El objetivo de esta publicación es inspirarte construyendo rápidamente un modelo de aprendizaje profundo que tiene un caso de uso muy obvio. Este proyecto tardará unos 10
minutos en codificarse.
Sin embargo, el entrenamiento de nuestro alumno de la red neuronal convolucional (CNN)
puede tardar 30
minutos debido al gran conjunto de datos y su hardware.
Recomiendo encarecidamente Google Colab para todas las tareas en las que necesite una GPU; esta es una de esas instancias. Si está familiarizado con los cuadernos de Jupyter, rápidamente se dará cuenta de que es casi una réplica. Si no está familiarizado con ninguno de estos, siga el tutorial de Google Colab.
El conjunto de datos que utilicé en este proyecto se encuentra aquí en Kaggle . Es un poco más de 1 GB
, así que lo descargué en mi disco local y luego lo subí a mi Google Drive. Esto me permitió eliminar el archivo de mi disco duro local.
El conjunto de datos es de más de 5,800 JPG
de radiografías de tórax. Las fotos están etiquetadas por la carpeta en la que se encuentran en ‘Neumonía’ y ‘Normal’ respectivamente. Esto resultará beneficioso más adelante.
Cuando esté listo, utilizará el conjunto de datos de prueba para hacer sus predicciones y enviarlas para la puntuación de la competencia. Para este caso especial, usaremos nuestro conjunto de datos de prueba como nuestro conjunto de datos de validación para medir cómo se está desempeñando nuestro modelo.
No hay competencia para este conjunto de datos y el conjunto de validación es de solo 16 imágenes, lo cual es demasiado pequeño.
En primer lugar, es posible que deba instalar el software Fastai en el portátil Google Colab. Ejecute el siguiente código en la primera celda, si dice que ya está instalado, estamos listos para comenzar.
!pip install fastai
Ahora necesitaremos importar todas las bibliotecas necesarias con alguna funcionalidad adicional. El siguiente código importará todas las bibliotecas necesarias para ejecutar el código. Las dos últimas líneas son opcionales.
Solo ejecute las dos últimas líneas si ha cargado el conjunto de datos en una carpeta de Google Drive, lo cual recomiendo. Tendrá que realizar una acción de autenticación para terminar de montar su Google Drive en Colab.
from fastai.vision import * from fastai.metrics import error_rate, accuracy import warnings warnings.filterwarnings('ignore') from google.colab import drive drive.mount('/content/drive')
El conjunto de datos debe ser un conjunto de carpetas principales y secundarias como las imágenes a continuación. Es muy importante que la estructura de su archivo refleje la mía.
La parte más difícil de todo este proyecto es organizar sus datos. Asumiré de ahora en adelante que ha subido los datos a Google Colab.
Una vez que tenga todos sus datos organizados, la diversión puede comenzar. Estableceremos el directorio raíz donde se almacenan sus datos. Esta es la ruta de la carpeta donde residen las carpetas de prueba, entrenamiento y val.
Cuando guardemos nuestros modelos entrenados más tarde, se guardarán en este directorio.
# Set path to root directory path = Path('/content/drive/My Drive/Colab A tener en cuenta:books/chest_xray') # View all files in directory path.ls()
Entonces debemos crear un "ImageDataBunch"
objeto que es especial para el software Fastai. Este objeto reúne todos nuestros datos de trenes, datos de prueba y datos de validación y realiza las transformaciones necesarias en las imágenes.
El ds_tfms
especifica las transformaciones que están fuera del alcance de este blog y para obtener más información al respecto, recomiendo completar el curso Fast.ai
.
# We are creating a fastai DataBunch from our dataset # Preprocessing takes place when creating the databunch # May need to decrease batch size and num_workers depending on GPU data = ImageDataBunch.from_folder(path, train='train', valid='test', ds_tfms=get_transforms(do_flip=False), size=224, bs=64, num_workers=8)
Ahora puede ver por qué es importante estructurar las carpetas como lo hicimos anteriormente. Esto nos permite usar el método from_folder
para etiquetar correctamente todas las imágenes mientras mantenemos nuestros conjuntos de datos separados para que no haya fugas de datos.
Todas las imágenes están normalizadas a un tamaño de 224 píxeles
por 224 píxeles
. La "bs"
significa tamaño de lote, que es la cantidad de imágenes que se muestran al modelo al mismo tiempo. Es posible que deba reducir "bs"
si su GPU
no tiene suficiente memoria; intente 32
o 16
.
Use el bloque de código a continuación para ver las imágenes y ver cómo las ha cambiado ImageDataBunch
.
# Show what the data looks like after being transformed data.show_batch() # See the classes and count of classes in your dataset print(data.classes,data.c) # See the number of images in each data set print(len(data.train_ds), len(data.valid_ds)
La salida del código anterior debería ser similar a mi salida a continuación.
Ahora construiremos nuestra red neuronal. En fastai
, el modelo que se está entrenando se denomina "aprendiz"
. Un alumno es un concepto general que puede aprender a adaptarse a un modelo. Estamos usando cnn_learner
que usará la arquitectura ResNet34
.
El código para crear nuestro alumno es una simple frase. Una vez que creemos el alumno, usaremos el método fit_one_cycle
para entrenar el modelo en nuestro conjunto de datos.
El modelo ResNet34
es un modelo previamente entrenado en el que estamos ajustando nuestros datos. A esto se le llama aprendizaje por transferencia y es la premisa sobre la que se basa fastai
.
# Build the CNN model with the pretrained resnet34 # Error rate = 1 - accuracy learn = cnn_learner(data, models.resnet34, metrics = [accuracy]) # Train the model on 4 epochs of data at the default learning rate learn.fit_one_cycle(4)
Dado que sustituimos nuestro conjunto de datos de validación con nuestro conjunto de datos de prueba, podemos ver exactamente qué tan preciso es nuestro modelo al final de cada época.
Los resultados muestran que probablemente podríamos haber dejado de entrenar después de 2 épocas. Después de la segunda época, puede ver el aumento de valid_loss
y la disminución de la precisión.
Sin embargo, train_loss
disminuyó en cada época. Este es un buen ejemplo de cómo se ve el sobreajuste de sus datos de entrenamiento. ¡Nuestros resultados muestran una precisión del 87,6%! ¡Lo que es aún más sorprendente es lo simple que fue la codificación para llegar aquí!
# Save the model learn.save('stage-1') # Load the Model learn.load('stage-1')
No olvide guardar su modelo. De esta manera, si realiza correcciones en el futuro que no afecten a esta parte de la 'etapa 1'
del modelo, puede recargarlo sin perder tiempo en reentrenarlo.
Cuando recargue su modelo, verá una salida larga que detalla el funcionamiento interno de la CNN, esto es normal.
En este momento, todas las capas, excepto la última capa, están congeladas. Cuando llamamos fit_one_cycle
a estas capas congeladas, solo entrenamos la capa final, que es la parte que clasifica la imagen de rayos X
como "normal"
o "neumonía"
.
Ahora descongelaremos todas las capas de la CNN
y la volveremos a entrenar un poco más. Esto cambiará cómo el modelo evalúa la imagen y no solo cómo clasifica las imágenes. Antes de entrenar un poco más, averigüemos cuál es una buena tasa de aprendizaje para entrenar.
# Unfreeze all layers of the CNN learn.unfreeze()# Find the optimal learning rate and plot a visual learn.lr_find() learn.recorder.plot(suggestion=True)
Muestra cómo la tasa de aprendizaje puede afectar la precisión del modelo. Podemos ver que a medida que aumenta la tasa de aprendizaje, también aumenta la pérdida de nuestro modelo.
slice ()
.
Elegir una buena tasa de aprendizaje parece ser más un arte que una ciencia y el curso Fastai te ayuda a aprender las reglas generales.
Ahora que tenemos una idea de nuestra tasa de aprendizaje, entrenemos nuevamente todas las capas de nuestro alumno en nuestros datos.
# Fit the model over 2 epochs learn.fit_one_cycle(2, max_lr=slice(3e-7, 3e-6))
Ahora hemos aumentado nuestra precisión al 89,1%. En otros términos, solo predecimos 1
radiografía incorrecta por cada 10
que inspeccionamos. No es perfecto, ¡pero es bastante bueno para la cantidad de trabajo que dedicamos! Entrenemos un par de veces más para ver si podemos sacar algunos puntos porcentuales más.
¡Excelente! ¡Exprimimos otro 2%
de puntos de precisión de nuestro modelo! Ahora, exploremos en qué se equivocó el modelo. En muchos casos, esto le permite comprender un poco mejor sus datos, lo que puede conducir a diferentes técnicas de preprocesamiento o arquitectura utilizada.
Interpretación
Primero, necesitamos crear un objeto intérprete. Desde este objeto "interp"
, podemos llamar a métodos como plot_confusion_matrix
y plot_top_losses
.
# Rebuild interpreter and replot confusion matrix interp = ClassificationInterpretation.from_learner(learn) interp.plot_confusion_matrix(figsize=(12,12), dpi=60)
La matriz de confusión anterior muestra que predijimos incorrectamente un total de 53 imágenes
. 50 imágenes
que predijimos incorrectamente como neumonía, y 3 imágenes
que predijimos normales tenían neumonía.
Su trama también funciona para clasificaciones de múltiples etiquetas. Si usted tiene muchas clases las matrices de confusión son a menudo difíciles de interpretar. Por suerte para nosotros, fastai tiene una versión de texto de matrices de confusión a las que se puede acceder usando el método most_confused
.
Otro método muy útil es plot_top_losses
. Esto le permite examinar las imágenes en las que su modelo estaba más seguro de haber predicho correctamente, pero el modelo estaba equivocado.
Esto a menudo puede mostrar errores en el conjunto de datos. Por ejemplo, si una imagen se etiquetó incorrectamente, debe etiquetar correctamente la imagen.
¡Ahora tiene el marco de cómo construir un clasificador de imágenes usando el poderoso software fastai! Espero que este modelo te inspire a crear todo tipo de herramientas utilizando estas técnicas. ¡El grupo Fast.ai
está preparando un gran programa y los animo a que lo revisen!
Gracias por tomarse el tiempo de leer.
Añadir comentario