Curso 2022/23

Detección de COVID-19 en Radiografías de Tórax basada en Transfer Learning: Aprovechando Redes Neuronales Profundas para un diagnóstico preciso.

Introducción

En la actualidad, la detección temprana y precisa de enfermedades pulmonares a través de radiografías desempeña un papel fundamental en el ámbito médico.

La utilización de técnicas de Deep Learning ha adquirido un papel destacado en el análisis médico, permitiendo mejoras significativas en la detección y clasificación de enfermedades. En este contexto, el estudio realizado por Shen et al. [1] ha demostrado los avances prometedores que se han logrado en el campo del análisis médico mediante el uso de redes neuronales profundas.

Los modelos preentrenados, como los utilizados en el estudio de Shen et al. [1], capturan de manera efectiva la información relevante en grandes conjuntos de datos y pueden adaptarse para abordar tareas específicas, mediante el uso de transfer learning, como la detección de COVID-19 en radiografías pulmonares.

Basándonos en las investigaciones previas y en los avances logrados en el análisis médico mediante el uso de redes neuronales profundas [1], junto con la técnica de transfer learning descrita por Pan y Yang [2], buscamos desarrollar un sistema de detección de COVID-19 en radiografías pulmonares.

El transfer learning es una técnica en la cual se aprovecha el conocimiento y la representación aprendida por una red neuronal previamente entrenada en un conjunto de datos relacionado. Nuestro objetivo es aprovechar el conocimiento y la representación aprendida por modelos preentrenados para lograr una detección precisa y temprana de la enfermedad.

Formulación

Nuestro objetivo principal es desarrollar un sistema capaz de detectar la presencia de COVID-19 en radiografías pulmonares. Para lograr esto, nos hemos basado en un proyecto previo disponible en Kaggle [3], el cual se enfoca en la detección de diversas enfermedades pulmonares utilizando una red neuronal MobileNet con una capa de promediado global (GAP) propuesta por K Scott Mader. En este proyecto, se han entrenado y guardado los pesos de la red neuronal.

En nuestro enfoque, utilizamos la técnica de transfer learning. El primer paso en la aplicación del transfer learning fue adquirir la solución propuesta por K Scott Mader y utilizarla como punto de partida. Esta etapa de preentrenamiento implica alimentar la red con imágenes de radiografías pulmonares etiquetadas con diferentes clases de enfermedades, lo que permite a la red aprender características relevantes y generar pesos óptimos para reconocer y clasificar las diversas enfermedades pulmonares.

Una vez obtenido el modelo preentrenado, realizamos modificaciones específicas para adaptarlo a nuestra tarea de detección de COVID-19 en radiografías. Para ello, ajustamos las capas finales del modelo, eliminando las capas de clasificación originales y reemplazándolas con nuevas capas adecuadas para nuestro nuevo conjunto de datos, que hemos seleccionado también en la plataforma de Kaggle [4] y que consta de cuatro clases: COVID-19, neumonía viral, diagnóstico normal y opacidad pulmonar.

Este enfoque nos permite aprovechar el conocimiento y la representación aprendida por el modelo preentrenado en el dominio de enfermedades pulmonares. Al iniciar el entrenamiento con un modelo que ya ha capturado características relevantes en imágenes de radiografías pulmonares, podemos acelerar el proceso de aprendizaje y mejorar la precisión en la detección de COVID-19. Además, al adaptar el modelo a nuestro conjunto de datos específico, nos aseguramos de que pueda reconocer y clasificar correctamente las cuatro clases relevantes para nuestra tarea.

Desarrollo

Para comprobar las ventajas que puede tener el enfoque de transfer learning, hemos realizado un pequeño caso de estudio. Comenzamos cargando una red neuronal previamente entrenada que se encuentra en un proyecto de K Scott Mader [1].

En esta red se utiliza la arquitectura MobileNet como modelo base sin los pesos preentrenados. Luego se construye un modelo secuencial en el que se agregan capas adicionales. En nuestro caso de trabajo, cargamos los pesos guardados previamente, que contienen la información aprendida durante el entrenamiento del modelo original. Finalmente, compilamos el modelo utilizando la función de pérdida y métricas adecuadas.

Después de cargar la red previamente entrenada, ajustamos las capas finales del modelo MobileNet para adaptarlo a nuestra tarea de detección de COVID-19 en radiografías pulmonares. Para lograr esto, congelamos las capas de la red base, lo que significa que los pesos de esas capas no se actualizarán durante el entrenamiento. Luego, añadimos capas adicionales al final del modelo para ajustarlo a nuestras cuatro clases específicas, (COVID-19, neumonía viral, diagnóstico normal y opacidad), actualizando así la red neuronal previa.


# Congelar las capas
for layer in base_mobilenet_model.layers:
    layer.trainable = False

# Agregar capas adicionales
num_classes = 4
x = base_mobilenet_model.output
x = GlobalAveragePooling2D()(x)
x = Dropout(0.5)(x)
x = Dense(512, activation='relu', kernel_regularizer=l2(0.001))(x)  # Regularización L2 con factor de penalización 0.001
x = Dropout(0.5)(x)
predictions = Dense(num_classes, activation='softmax')(x)

covid_model = Model(inputs=base_mobilenet_model.input, outputs=predictions)

covid_model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy'])  # Utiliza categorical_crossentropy para problemas de múltiples clases

# Calcular los pesos de clase
class_weights = {}
for i, c_label in enumerate(np.unique(all_labels)):
    class_weights[i] = 1 / np.mean(test_Y[:, i])

weight_path_new = "{}_weights_new.best.hdf5".format('xray_class')

checkpoint = ModelCheckpoint(weight_path_new, monitor='val_loss', verbose=1, 
                             save_best_only=True, mode='min', save_weights_only=True)

early = EarlyStopping(monitor="val_loss", 
                      mode="min", 
                      patience=3)

callbacks_list = [checkpoint, early]

covid_model.fit_generator(train_gen, 
                          steps_per_epoch=396,
                          validation_data=(test_X, test_Y), 
                          epochs=3,
                          class_weight=class_weights,  # Ajustar los pesos de clase
                          callbacks=callbacks_list)
  1. Agregamos una capa de promediado global para capturar características globales de las imágenes y reduce la dimensionalidad de la salida.
  2. Incluimos una capa de regularización por eliminación (dropout) para prevenir el sobreajuste al apagar aleatoriamente un porcentaje de las unidades de entrada durante el entrenamiento.
  3. Añadimos una capa densa con activación ReLU para combinar características y generar representaciones más complejas. Para evitar el sobreajuste, aplicamos regularización L2 a los pesos de esta capa
  4. Por último, utilizamos una capa de salida con activación softmax para obtener las probabilidades de pertenencia a cada clase.

Posteriormente, para abordar el desequilibrio de clases en el conjunto de datos, calculamos los pesos de clase. Estos pesos se asignan de forma inversamente proporcional a la media de las muestras en cada clase, lo que permite que el modelo se enfoque más en las clases menos representadas.

Finalmente, ajustamos el modelo utilizando un generador de datos para el conjunto de entrenamiento y especificamos los hiperparámetros. A través de este enfoque de transfer learning y la adaptación del modelo a nuestro dominio de interés, logramos entrenar un modelo capaz de detectar COVID-19 en radiografías pulmonares.

Discusión de resultados

En primer lugar, analizamos una forma de evaluar y visualizar la precisión del modelo en la clasificación de cada clase individualmente, mostrando el porcentaje de aciertos para cada clase en relación con el conjunto de prueba, obteniendo los siguientes resultados:

Los resultados obtenidos indican que el modelo logró identificar correctamente aproximadamente el 22% de las radiografías con Covid-19 en el conjunto de prueba (Dx: 21.88%). Además, las predicciones del modelo tuvieron un 26.50% de aciertos en la clasificación de casos de Covid-19 (PDx: 26.50%).

Esto significa que el modelo mostró cierta capacidad para detectar la presencia de Covid-19 en las radiografías pulmonares analizadas, aunque también se observa un margen de mejora, ya que hubo una proporción considerable de casos que no fueron identificados correctamente.

También se empleó la métrica de área bajo la curva ROC (ROC AUC) para evaluar el rendimiento del modelo en la detección de COVID-19, obteniendo un valor de 0.70. Esta métrica evalúa la capacidad del modelo para distinguir entre casos positivos y negativos de COVID-19. Cuanto más cercano a 1 sea el valor de ROC AUC, mejor será el desempeño del modelo en la clasificación.

En este caso, un valor de 0.70 indica que el modelo tiene una capacidad moderada para diferenciar entre casos positivos y negativos de COVID-19, lo que implica una tasa aceptable de verdaderos positivos y falsos positivos en la clasificación de casos de COVID-19. La métrica de ROC AUC permite evaluar la eficacia de un modelo en términos de su capacidad para realizar predicciones precisas.

Durante el entrenamiento de los datos mediante tres épocas, los resultados muestran que el modelo logró una precisión de alrededor del 50% en la clasificación de las imágenes en todas las clases, incluyendo el caso específico del COVID-19. Esto indica que el modelo tiene dificultades para realizar predicciones precisas en este conjunto de datos. Sería necesario mejorar el modelo o ajustar los parámetros de entrenamiento para obtener una precisión más alta y un mejor rendimiento en la detección de casos de COVID-19.

Conclusión

Para concluir, en este caso de trabajo se ha desarrollado un sistema de detección de COVID-19 en radiografías pulmonares utilizando técnicas de transfer learning y redes neuronales profundas.

El enfoque de transfer learning nos permitió aprovechar el estado del arte en el análisis médico mediante el uso de modelos preentrenados, capturando características relevantes en grandes conjuntos de datos de enfermedades pulmonares.

A pesar de que el modelo logró identificar correctamente aproximadamente el 22% de las radiografías con COVID-19 en el conjunto de prueba, se observa la necesidad de mejorar la precisión en la detección de casos de COVID-19. Estos resultados están en línea con el estado del arte en este campo, donde se han logrado avances prometedores en la detección y clasificación de enfermedades pulmonares mediante el uso de redes neuronales profundas.

Como propuesta de mejora, futuras investigaciones podrían enfocarse en la optimización del modelo y el ajuste de los parámetros de entrenamiento para obtener una mayor precisión y un mejor rendimiento en la detección temprana y precisa de COVID-19 en radiografías pulmonares.

Hemos utilizado el artículo de Venugopal et al. [6] como referencia para la investigación de casos e información, así como para los conjuntos de datos utilizados en nuestro caso de estudio.

Referencias

[1] Shen, D., Wu, G., & Suk, H. (2017). Deep Learning in Medical Image Analysis. Annual Review of Biomedical Engineering, 19, 221-248. doi: 10.1146/annurev-bioeng-071516-044442. [Enlace]

[2] Pan, S.J., & Yang, Q. (2010). A Survey on Transfer Learning. IEEE Transactions on Knowledge and Data Engineering, 22, 1345-1359. doi: 10.1109/TKDE.2009.191.[Enlace]

[3] Kaggle – Train Simple XRay CNN. [Enlace]

[4] Kaggle- COVID-19 Radiography Database. [Enlace]

[5] K. Mader, “Train-Simple-XRay-CNN,” Kaggle, 2021. [Enlace]

[6] K. Venugopal, R. Suresh, A. Jaisankar, M. Ramasamy, V. Bhuvaneswari, and S. U. Pillai, “Automated Deep Learning Framework for Detection and Classification of COVID-19 Infections on Chest X-ray Images,” IEEE Access, vol. 9, pp. 108724-108739, 2021. doi: 10.1109/ACCESS.2021.3108905. [Enlace]