Blog de Amazon Web Services (AWS)
Utilizando image classification en imágenes de rayos-x para detección de COVID-19 – Parte 1
Por Thiago Couto, Arquitecto de Soluciones AWS Brasil
La pandemia causada por el Covid-19 alcanzó a todos los sectores y con ella trajo nuevos desafíos, especialmente en el área de la salud. Científicos en todo el mundo buscan nuevos tratamientos, formas de prevenir y detectar la enfermedad. En esta búsqueda por nuevos métodos un requisito crucial es la escala, dadas las proporciones de la pandemia, se hace necesario que los resultados sean escalables para alcanzar una grande parte de la población.
Uno de los métodos que pueden ser utilizados para examinar a pacientes con sospecha de Covid-19 es el análisis de rayos-x e tomografía de la región torácica, en ese análisis podemos aplicar técnicas de clasificación de imágenes con Machine Learning para agilizar la detección y escalar para un mayor número de pacientes. En esa dirección algunas publicaciones como https://data.mendeley.com/datasets/8h65ywd2jr/3 exploran esa posibilidad.
En este blog post vamos a explorar la utilización del algoritmo built-in de AWS para clasificación de imágenes (https://docs.thinkwithwp.com/sagemaker/latest/dg/image-classification.html) para clasificar imágenes de rayos-x torácico de pacientes entre Covid-19 detectado y no detectado. El algoritmo utiliza una CNN (ResNet) e puede ser entrenado utilizando transfer learning para mejorar los resultados cuando un número mayor de imágenes no está disponible.
El post fue inspirado en este trabajo https://github.com/shervinmin/DeepCovid, bien como el dataset utilizado, que por su vez es basado en datasets públicos https://github.com/ieee8023/covid-chestxray-dataset y https://stanfordmlgroup.github.io/competitions/chexpert/. El jupyter notebook de este post está disponible en https://github.com/thiagomcouto/covid19_image_classification y fue ejecutado utilizando una instancia ml.t2.medium
Preparando el Dataset
Para iniciar vamos a hacer la descarga del dataset https://github.com/shervinmin/DeepCovid/tree/master/data y organizar la estructura de los directorios
El dataset actual contiene imágenes de otras enfermedades que para el efecto de este análisis serán consideradas como “Covid no detectado”, abajo seleccionamos algunas imágenes del dataset para posteriormente probar nuestro modelo, esas imágenes no serán utilizadas para el entrenamiento.
Data Augmentation
El dataset actual esta desbalanceado, contiene 184 imágenes de pacientes diagnosticados con Covid-19 y 5 mil imágenes de pacientes sin Covid-19. Para reducir esa diferencia vamos a utilizar una biblioteca en Python para generar 1 mil nuevas imágenes de pacientes con Covid-19 positivo.
Generando RecordIO
Con las imágenes estructuradas en los directorios, vamos a convertir las imágenes para MXNet RecordIO, formato recomendado, mas detalles obre el formato y los beneficios de utilizarlo en este link https://mxnet.apache.org/versions/1.7.0/api/architecture/note_data_loading.html
Utilizando los archivos lst crearemos los archivos recordIO redimensionando las imágenes para un tamaño único.
Creando el Modelo
Con el dataset creado, vamos a iniciar la creación del modelo. Abajo utilizados las bibliotecas boto3 y sagemaker para buscar la sesión y el rol (provenientes del Notebook Instance), bien como la uri de la imagen que vamos a utilizar para el entrenamiento.
Subiendo el dataset al S3
Con el dataset creado y dividido en entrenamiento y validación, vamos a utilizar la biblioteca boto3 para subir el archivo al S3 y almacenar en variables a ser utilizadas como channel posteriormente.
Hyperparameters
En la celda inferior informaremos los hyperparameters para el modelo, para este post utilizaremos una ResNet18 con transfer learning, 20 epochs y learning rate de 0.0005. Además de eso vamos a utilizar la funcionalidad nativa de data augmentation para aumentar el número de samples y configuración de early stop. La instancia utilizada para el entrenamiento es la ml.p2.xlarge.
Otras configuraciones están descritas en los comentarios. Mas informaciones sobre las posibilidades de hyperparameters están disponibles en el link https://docs.thinkwithwp.com/sagemaker/latest/dg/IC-Hyperparameter.html
Entrenando el Modelo
Con las configuraciones preparadas previamente, vamos a iniciar el entrenamiento del modelo y aguardar la finalización.
En la celda de abajo, vamos a configurar un modelo basado en el resultado del entrenamiento anterior, poseyendo este modelo podemos iniciar un endpoint para inferencias en tiempo real o inferencias en batch.
Inferencias en batch
Con el modelo creado, vamos a subir los datos de prueba que hemos separado anteriormente y crear un job en batch para inferencias. Como fue citado anteriormente, podemos también configurar un endpoint con el modelo y ejecutar inferencias en tiempo real, pero para el objetivo de este blog post inferencias en batch son suficientes. El job evaluará las inferencias de las imágenes especificadas en el bucket S3 y almacenará el resultados en archivos json en el directorio output.
En la celda inferior creamos el job de inferencia en batch y aguardamos la conclusión del mismo
Validando el Modelo
Luego de la conclusión del job de inferencia, vamos a inspeccionar los resultados en el directorio output y validar como nuestro modelo se ha desempeñado.
A pesar de que nuestros datos sean de volumen reducido. Vamos a generar la matriz de confusión y calcular la precisión para facilitar la validación de futuros trabajos y la utilización de datasets mayores.
Resultados y Próximos Pasos
Debido al carácter aleatorio de separación de los datos los resultados obtenidos pueden variar, en mis pruebas realizadas el modelo clasificó todos los pacientes correctamente dentro de las imágenes de prueba. Caso deseemos buscar mejores resultados podemos utilizar la feature del sagemaker llamada automatic model tunning, mas informaciones en este link: https://docs.thinkwithwp.com/sagemaker/latest/dg/automatic-model-tuning-how-it-works.html
Para el escenario presentado, puede haber casos en donde tengamos una probabilidad de clasificación baja, haciendo necesario una validación con un médico especialista.
La validación humana es un caso común para workloads de machine learning en que el modelo tenga una respuesta con una probabilidad debajo de un determinado threshold. Para solucionar este problema AWS dispone del servicio Augmented AI, que será el tema de la parte 2 de este blog post.
Sobre el autor
Thiago Couto es un arquitecto de soluciones en AWS y actúa en el segmento Enterprise auxiliando clientes en Retail y CPG en sus jornadas a la nube. Posee mas de 10 años de experiencia actuando en arquitecturas que engloban AI/ML, integraciones, IoT y relacionados.
Sobre el traductor