/ Proyectos / Salud / Clasificación de leucemia

Clasificación de leucemia linfoblástica aguda: CNN con data augmentation por GAN

Clasificación de imágenes de frotis sanguíneo en 4 subtipos de LLA, entrenando una GAN por clase para compensar el desbalance del dataset antes de clasificar con una CNN.

11 min de lectura Python · TensorFlow/Keras · OpenCV Datos: dataset público ALL (Kaggle, Aria et al. 2021) Aplicable a tesis de ciencia de datos e ingeniería biomédica
Imagenes de frotis de sangre periferica analizadas con CNN y GAN para clasificar subtipos de leucemia linfoblastica aguda

Nota importante: este proyecto es una herramienta educativa y de investigación sobre clasificación de imágenes médicas. No es un dispositivo de diagnóstico clínico y ninguna predicción de este pipeline debe usarse para decisiones médicas reales.

El objetivo era clasificar imágenes de frotis de sangre periférica en 4 clases: hematógonos benignos y tres subtipos de linfoblastos malignos (Pre-B temprana, Pre-B, Pro-B). El problema real: el dataset público disponible está desbalanceado desde el origen, con casi el doble de imágenes en la clase mayoritaria que en la minoritaria, y las células benignas pueden confundirse visualmente con linfoblastos malignos incluso para un observador entrenado.

Se diseñó un pipeline en dos etapas: una GAN entrenada por clase para generar imágenes sintéticas adicionales, compensando el desbalance con variabilidad morfológica real en vez de solo transformaciones geométricas, y una CNN vanilla para la clasificación final. El hallazgo más importante no fue de arquitectura, fue de datos: la decisión de invertir en generar datos sintéticos por clase, en vez de solo reponderar la función de pérdida, es lo que hace este pipeline replicable a otros problemas médicos con datasets pequeños y desbalanceados.


Mapa del casoContenido


Estructura de alto nivelDiagrama de la solución

Entrada Imagenes PBS por clase Preprocesamiento Color RGB + normalizacion [-1,1] Imagenes reales Dataset original (desbalanceado) GAN por clase Generador + discriminador Dataset balanceado Reales + sinteticas Split train/test 80% entrenamiento 20% prueba CNN de clasificacion 2 conv + softmax(4) Clase predicha Apoyo educativo, no diagnostico

Pasa el cursor sobre cada bloque para ver que hace ese paso.

La GAN se entrena por clase, no una sola GAN condicionada a las 4 clases, porque el objetivo era controlar de forma independiente cuánta variabilidad sintética se agrega a cada clase según su déficit real de ejemplos.


De la teoría a la prácticaConstrucción de la solución

Condiciones del proyecto

RestricciónDato
Fuente del datasetPúblico (Kaggle, Aria et al. 2021), 3,256 imágenes de 89 pacientes
Distribución de clases504 Benign, 985 Early, 963 Pre, 804 Pro — desbalance real, no de muestreo
Similitud visual entre clasesHematógonos benignos y linfoblastos malignos tempranos son difíciles de distinguir incluso para un observador entrenado
Uso previsto del modeloEducativo y de investigación, no diagnóstico clínico
OpciónPor qué se descartó
Solo reponderar la función de pérdida por claseCorrige el sesgo del entrenamiento, pero no añade variabilidad morfológica real a la clase minoritaria
Data augmentation solo con transformaciones geométricas (rotación, flip, zoom)Genera variantes de la misma imagen, no ejemplos con variabilidad celular nueva
GAN entrenada por clase para generar ejemplos sintéticos adicionalesAprende y sintetiza variabilidad morfológica plausible específica de cada clase

Pasos

1

Preprocesamiento de las imágenes

Agente: propuso normalizar directamente a [0, 1] como es más común.
Criterio aplicado: normalizar a [-1, 1], porque la capa de salida del generador de la GAN usa activación `tanh`, cuyo rango de salida es [-1, 1] — las imágenes reales y las generadas deben compartir la misma escala.

2

Diseño del generador de la GAN

Agente: propuso una arquitectura de generador estándar sin verificar que la dimensión de salida coincidiera con la del discriminador.
Criterio aplicado: calcular explícitamente cuántas capas `Conv2DTranspose` con stride 2 se necesitan para llegar de 7×7 a 224×224 (5 capas: 7→14→28→56→112→224), y verificarlo ejecutando el modelo antes de asumir que la arquitectura estaba completa.

3

Separación de datos de entrenamiento y prueba

Agente: propuso mezclar imágenes reales y sintéticas antes de hacer el split train/test.
Criterio aplicado: asegurar que las imágenes sintéticas generadas a partir de una imagen real no terminen simultáneamente en train y test, para no inflar artificialmente el accuracy por fuga de datos.

4

Elección de la arquitectura de clasificación

Agente: propuso partir directamente de una arquitectura preentrenada (transfer learning) sin justificar la elección.
Criterio aplicado: empezar con una CNN vanilla simple como baseline explícito, dejando el transfer learning como extensión documentada, no como punto de partida — así la mejora de cualquier arquitectura más compleja se mide contra algo concreto.

Proceso de iteración

Ajuste documentado, no forzado

El generador de la GAN, tal como estaba diseñado originalmente con 4 capas `Conv2DTranspose`, producía imágenes de 112×112 píxeles, pero el discriminador esperaba 224×224. El error solo apareció al ejecutar el pipeline completo: ValueError: Input... incompatible with the layer: expected shape=(None, 224, 224, 3), found shape=(None, 112, 112, 3). La causa fue simple una vez identificada, faltaba una quinta capa de upsampling, pero el error no era evidente solo leyendo el código, solo se detectó al correrlo. La lección: verificar las formas de salida de cada bloque de una GAN antes de conectar generador y discriminador ahorra tiempo de depuración más adelante.


CierreLecciones importantes

El generador de una GAN necesita que su forma de salida se verifique explícitamente contra la entrada del discriminador, ese tipo de error no aparece leyendo el código, solo al ejecutarlo. El desbalance de clases en un dataset médico pequeño se resuelve mejor generando variabilidad morfológica nueva por clase que solo reponderando la pérdida o rotando las mismas imágenes. Y ningún número de accuracy tiene valor sin verificar primero que no hay fuga de datos entre entrenamiento y prueba, sobre todo cuando las imágenes sintéticas derivan de un conjunto reducido de imágenes reales.

Si quieres ver un enfoque publicado con una idea similar, clasificación de leucemia sobre este mismo dataset con arquitecturas más complejas, este paper de los propios creadores del dataset es una buena referencia del nivel de la contribución: Ghaderzadeh et al. (2022), A fast and efficient CNN model for B-ALL diagnosis and its subtypes classification using peripheral blood smear images.

Termina ya tu proyecto

¿Tienes un proyecto similar y no sabes por dónde empezar? Yo te ayudo a diseñarlo.

El 92% de los profesionales de datos desbloquea sus proyectos al ver ejemplos completos resueltos.

53
proyectos
8
sectores
100%
aplicado

Sin registro. Acceso inmediato