top of page
Search
  • Writer's picturesiria sadeddin

Detección de Cancer de Piel con Deep Learning. PRIMERA PARTE: OBTENCIÓN Y MANIPULACIÓN DE DATOS

Hola de nuevo! 🤓

En la siguiente serie de posts les contaré como crear un clasificador binario de imágenes dermatológicas con exelentes resultados, usando la arquitectura de Redes Convolucionales ResNet.

El Cancer de piel es un problema de salud grave. Al año alrededor de 130.000 personas en el mundo son diagnosticadas con esta enfermedad, y a pesar de que no es el tipo de cancer mas común (1% de los casos) es el más mortal, debido sobretodo al diagnóstico tardío.

Nuestro objetivo es crear un clasificador de imagenes dermatológicas, y de esta manera ofrecer una herramienta que permita identificar (incluso desde casa) lesiones que podrían tener características malignas, debemos acotar que este artículo es de investigación y no pretende ofrecer un diagnóstico médico.

Los datos que usaremos para este proyecto fueron tomados de la siguiente página: https://challenge2019.isic-archive.com/data.html


Las siguientes citas se hacen por derechos de autor:

The "ISIC 2019: Training" data includes content from several copyright holders. To comply with the attribution requirements of the CC-BY-NC license, the aggregate "ISIC 2019: Training" data must be cited as:

ISIC 2019 data is provided courtesy of the following sources: BCN_20000 Dataset: (c) Department of Dermatology, Hospital Clínic de Barcelona HAM10000 Dataset: (c) by ViDIR Group, Department of Dermatology, Medical University of Vienna; https://doi.org/10.1038/sdata.2018.161 MSK Dataset: (c) Anonymous; https://arxiv.org/abs/1710.05006 ; https://arxiv.org/abs/1902.03368




Para el desarrollo de este proyecto hemos usado un Notebook de Colab. Lo primero que haremos será hacer la descarga de los datos.



!wget https://s3.amazonaws.com/isic-challenge-2019/ISIC_2019_Training_Input.zip
!wget https://s3.amazonaws.com/isic-challenge-2019/ISIC_2019_Training_GroundTruth.csv
!wget https://s3.amazonaws.com/isic-challenge-2019/ISIC_2019_Training_Metadata.csv



Hemos descargado tres archivos:

1) ISIC_2019_Training_Input.zip: Contiene los archivos .jpg con las imagenes dermatológicas.


2) ISIC_2019_Training_GroundTruth.csv: Contiene la tabla de datos que identifíca el tipo de patología que presenta el paciente, indicando el ID de la fotografia que le corresponde.


3) ISIC_2019_Training_Metadata.csv: Contiene la tabla de datos que brinda información personal del paciente, como la edad, sexo, lugar de la lesión y ID de la imagén.


Los datos de las imagenes estan en un archivo .zip así que debemos extraerlos para poder usarlos.


# importe de librerias
from zipfile import ZipFile
import pandas as pd
import numpy as np
import os

zip_file = ZipFile('/content/ISIC_2019_Training_Input.zip')
#opening the zip file in READ mode
with ZipFile('/content/ISIC_2019_Training_Input.zip', 'r') as zip:
    # extracting all the files
    print('Extracting all the files now...')
    zip.extractall()
    print('Done!')

Antes de entrenar nuestro modelo, debemos hacer la exploración de los datos, para esto vamos a leer los archivos de GroundTruth y Metadata.


#lee GroundTruth .csv
df_class = pd.read_csv('/content/ISIC_2019_Training_GroundTruth.csv')
# exploring data
df_class.head()


Los nombres de las columnas nos dicen el tipo de lesión que tiene el paciente entre 8 diferentes clases, pero como nuestro objetivo es clasificar entre benigno y maligno, hemos investigado a que clase pertenecen estas patologías.


1. MEL: Melanoma (malignant) 2. MV: Melanocytic nevus (benign) 3. BCC: Basal cell carcinoma (malignant) 4. AK: Actinic keratosis (malignant) 5. BKL: Benign keratosis (solar lentigo / seborrheic  keratosis / lichen planus-like keratosis) 6. DF: Dermatofibroma (benign) 7. VASC: Vascular lesion (benign) 8. SCC: Squamous cell carcinoma (malignant)

Convertiremos la información ofrecida por este conjunto de datos en un vector que indica el tipo de lesión para cada una de las fotografías.

# convert dummy columns into one columns with lesion type acronyms as values
lesion_type=df_class.iloc[:,1:].idxmax(axis=1)
lesion_type.head()

También creamos dos vectores que contienen los tipos de lesiones malignas y benignas.

# Benign and malignant acronyms
benign = ['NV', 'BKL', 'DF', 'VASC']
malignant = ['MEL', 'SCC', 'BCC', 'AK']

Leamos ahora los metadatos

#reading metadata
df_meta = pd.read_csv('/content/ISIC_2019_Training_Metadata.csv')
#exploring metadata
df_meta.head()



Nos aseguramos que los ID de la imagenes en los metadatos y los ID de imagenes GroundTruth son iguales y se encuentran en el mismo órden.

all(df_class.image==df_meta.image)

Vemos que en efecto es así, entoces podemos pegar el vector que indica el tipo de lesión 'lesion_type' como nueva columna ('lesion_type') a la tabla de metadatos. Además creamos otra columna que indica si la lesión es maligna o benigna ('is_ca').

También suprimimos la columna 'lesion_id' ya que ésta solo indica la fuente de los datos, y esto no es de interés para la predicción.

# we add the lesion type to the metadata
#and also a new column that says if the lesion is malignant or benign
#we drop the lesion_id column (it says from were data source it has bee take)
df_meta['lesion_type']=lesion_type
df_meta['is_ca']=df_meta.lesion_type.isin(malignant)
df_meta['is_ca']=df_meta['is_ca'].replace({False: 'benign', True: 'malignant'})
df_meta=df_meta.drop('lesion_id',axis=1)
data=df_meta
data.head()

Esta maniputacion de los datos nos deja una nueva tabla que llamamos 'data'



Es super importante que los datos que se van a usar para el entrenamiento de modelos y la exploración de los datos tengan un manejo adecuado de los valores faltantes. En nuestros datos, consideramos que los valores faltantes no eran tantos como para hacer una manipulación muy elaborada. Así que simplemente vamos a suprimir las filas que contengan alguna columna con valores faltantes.


print(data.shape)
data = data.dropna()
print(data.shape)
data.head()

Despues de eliminar las filas con valores faltantes, nos hemos quedado con el 90% de los datos originales.


De esta manera hemos obtenido una tabla de datos limpia que podemos usar tanto para la exploración analítica de los datos como para el entrenamiento de modelos de machine learning de clasificación binaria.


En el siguiente post les mostraré el analisis de exploración estadístico de estos datos. Esta fase es importante porque nos ayuda a entender como los datos pueden ofrecer soluciones a los problemas de clasificación.😋

74 views0 comments
Post: Blog2_Post
bottom of page