Clasificación y detección de Covid-19 en radiografías de tórax usando Deep Learning e IBM Visual Recognition

Jhonatan Camasca
8 min readNov 16, 2020

--

En pleno año 2020, venimos atravesando por una pandemia, cuya causa es la COVID-19, este virus tuvo origen en China a finales del 2019 y llegó a Europa y América a inicios del 2020. A la fecha, mediados de noviembre existen más de 54.9 millones de personas que han sido infectadas por este virus y aproximadamente 1.3 millones de muertos en todo el mundo. Ante esta pandemia, se vienen desarrollando distintas soluciones médicas y también tecnológicas. Hoy en día, con la tecnología podemos crear distintas herramientas que nos ayuden a combatir este virus, como robots. Asimismo, gracias a la Inteligencia Artificial, la cual ayuda a realizar distintas tareas que los humanos hacemos diariamente como ver, se pueden desarrollar algoritmos que permitan diagnosticar la COVID-19 a través de radiografías, tal como lo hace un doctor. Es por ello, que detallo el siguiente trabajo.

Metodología

La metodología consiste en 5 pasos : Recolección, Pre procesamiento, Modelamiento, Detección y Evaluación

Recolección de imágenes

Las imágenes fueron extraídas de Kaggle y contienen la siguiente distribución:

Las imágenes son sobre COVID-19, Normal y Neumonía, ya que la mayoría de lesiones producidas por el coronavirus son muy similares a las lesiones encontradas en casos de neumonía. En total se tiene 2583 imágenes : 577 imágenes de coronavirus, 1004 normales y 1002 con neumonía

Pre-procesamiento de las imágenes

Las radiografías de tórax o comúnmente conocidas como imágenes de rayos x son usadas para obtener imágenes de la estructura interna del cuerpo humano, y son de varios tipos CT Scan ( Tomografía Computarizada), mamografia, angiografia, fluoroscopia, entre otros.

Este tipo de imágenes son las herramientas de diagnostico mas utilizadas en el ámbito medico y permiten ver desde fracturas en los hueso como patologías en los pulmones. Por otro lado, este tipo de imágenes tienen dos desventajas : el bajo contraste de la imagen y el posible ruido aditivo que corrompe la imagen

Existen varios filtros para remover el ruido de las imágenes, uno de ellos es el filtro Gaussiano, que permite estabilizar la varianza en una imagen. Para mejorar el contraste, se puede usar la tecnica de Ecualizacion de histograma adaptada al contraste o en ingles Contrast adapted Histogram equalization (CLAHE) que permite que el contraste en las radiografías incremente luego del proceso de eliminación de ruido con la finalidad de mejorar el performance de la clasificación

Es por ello que estas imágenes deben pasar por una etapa de pre procesamiento. Cabe resaltar que para tratar este tipo de imágenes primero se debe remover el ruido (aplicando el filtro Gaussiano) y luego mejorar el contraste (CLAHE) , en caso se mejore el contraste y no se remueva el ruido antes, puede conllevar a perdida de información (características de las imágenes) que empeorarían la calidad de las imágenes y por ende el performance de la clasificación.

Primero, se importan las librerías:

  1. os: permite el manejo de archivos
  2. BytesIO: permite que se guarde la data en un Buffer en memoria
  3. Zipfile: permite la extraccion de las imagenes comprimidas en un zipp
  4. Ibm_boto3: permite importar el archivo zip a la ruta /home/wuser desde IBM Cloud Object Storage

Segundo, se debe subir un zip con 3 carpetas (Normal, Covid19, Neumonia) al Object Storage

Luego se inserta en codigo mediante StreamingBody Object

Se extraen las imágenes mediante la librería zipfile y se guardan las clases en un array llamado classes_required.

Ahora las imagenes estaran guardadas en la siguiente ruta : /home/wsuser/work/

Mediante dos bucles for se iteraran por las imágenes y se guardaran en un array llamado images.

Luego, se crea un objeto del tipo CLAHE que nos servirá para mejorar el contraste de la imagen ( contrast enhancement) y mediante otro bucle for se iterara sobre las imágenes y se tiene el siguiente procedimiento:

  1. Se convierte a escala de grises ( cv.cvtColor(img,cv.COLOR-RGB2GRAY)
  2. Se aplica el filtro Gaussiano (cv.GaussianBlur(gray,(5,5),0)) que tiene un kernel de 5x5
  3. Finalmente, se aplica la funcion CLAHE para mejorar el contraste de la imagen.

Modelamiento

Se uso una arquitectura de Deep Learning para la extracción de características y la clasificación de las imágenes. En este caso se uso Visual Geometry Group 19 (VGG19) que consta de 19 capas (16 capas de convolución, 3 capas totalmente conectadas, 5 capas MaxPool y 1 capa SoftMax).

Photo by Sai Charan Arishanapally on mc.ai

En primer lugar, las imagenes estan guardadas

Primero se importan las siguientes librerias:

  1. ImageDataGenerator (para hacer data augmentation).
  2. VGG19 (Arquitectura de deep learning).
  3. AveragePooling2D, Input, Dense, Flatten, Dropout, Model para hacerle un tuneo al modelo y adaptarlo a la clasificacion de tres clases.
  4. SGD como el optimizador.
  5. to_categorical( para adaptar los labels al formato numpy de tres clases).
  6. train_test_split para particionar la data.

Como tenemos la data guardada en un array (nv_image), y en orden se procede a mediante un bucle for guardar los labels.

Luego, se redimensionan las imagenes a 224 x 224 y se re escala las imagenes dividiendolas entre 255. Ademas, se realiza el one-hot-encoding de los labels mediante un bucle for y la funcion to_categorical(). La particion de la data es de 75/25

Mediante la funcion ImageDataGenerator se realiza un data augmentation con rotacion de 15 grados. Luego se carga la arquitectura VGG19 para hacer transfer learning con los pesos de ‘imagenet’ . Cabe destacar que se modifica la arquitectura y se le agrega una capa de GlobalAveragePooling, un Fully-connected layer de 514 neuronas y un dropout de 0.5. Debido a que son 3 clases se usa la funcion softmax

El learning rate fue de =0.001, 100 epocas y un batch_size de 64

Deteccion de coronavirus

La deteccion de objetos es una tarea de la vision computacional que implica detectar objetos dentro de imagenes o videos. En este caso, se detecto lesiones que indican presencia de coronovirus mediante el uso del servicio de IBM Cloud, Visual Recognition.

Es importante resaltar que el proceso de etiquetado fue realizado por un radiologo con mas de 15 años de experiencia, que trabajo en varios hospitales de Peru como en clinicas privadas. Como podemos ver en Visual Recognition cargamos las imagenes y seleccionamos el boton Add object para dibujar un cuadrado donde se encuentre las lesiones.

Luego de realizar el etiquetamiento de las imagenes, se presiona el boton de train model.

Despues de que el modelo entreno se extrae el apikey y la url

Con el apikey y la url extraidas, se procede a implementar en un Notebook de IBM Watson el modelo de Visual Recognition. Para ello se importa las librerias ibm_boto3, Config y ClientError ( para poder acceder al IBM Cloud Object Storage)

Para probar el modelo se debe subir un zip con imagenes nuevas (testing2.zip) e importar sus credenciales y el SDK del ICOS (IBM Cloud Object Storage) .

Mediante el comando ls, se vio que el zip ya estaba dentro de la ruta. Por ello, se importo zipfile y se extrajo las imagenes dentro del zip. Con la libreria os se obtuvo el nombre de las imagenes que estaban dentro del zip.

Luego se instancia el modelo de virtual recognition con la url y el apikey

Para realizar la deteccion, se uso un bucle for que recorrio las imagenes y saco las coordenadas de los bounding boxes predecidos con el modelo de visual recognition.

Finalmente con otro bucle for se dibujo los bounding boxes en las imagenes y la clase a la que pertenece.

Este es el resultado final, muchas imagenes con sus respectivos bounding boxes.

Evaluacion

El VGG19 obtuvo como buenos resultados en las cuatro metricas ( accuracy, recall, precision y f1-score)

En la matriz de confusion podemos ver que el modelo clasifico pocas imagenes incorrectamente.

Finalmente, vemos en las graficas que el accuracy y loss demuestran que el modelo generalizo relativamente bien la distribucion de la data. No obstante, esto puede ser mejorado si se contara con mas imagenes y asi poder reducir el loss significativamente.

--

--

Jhonatan Camasca
Jhonatan Camasca

Written by Jhonatan Camasca

Aspiring Data Scientist with a focus on Computer Vision and NLP. LinkedIn: https://www.linkedin.com/in/jhonatancamasca/

No responses yet