Este proyecto permite clasificar imágenes de células como benignas o malignas mediante redes neuronales convolucionales (CNN) y algoritmos de clasificación como KNN. Además, se incluye visualización de características extraídas y evaluación del rendimiento del modelo.
- Instalación: https://youtu.be/GDUpCo7fy58?si=KvYZZkAGXpMQy0pE
- Demo: https://youtu.be/3sMBg-RV74E?si=9ToRXA6f4icOgDZv
- Resultados experimentación: https://youtu.be/L5rsEp35fn8?si=Tvaoy4SYjc6D4sXo
Nota: La carpeta images_prueba_profesor contiene un menor conjunto de imágenes en caso de que el profesor prefiriese utilizarlas para las pruebas de la aplicación. Estás están estructuradas de forma similar al resto de carpetas de imágenes, estando inicialmente divididas por su magnificación (40x, 100x, 200x o 400x) e internamente en benignas o malignas.
Descarga el conjunto de datos desde el siguiente enlace:
Una vez descargado y descomprimido:
- Crea la siguiente estructura de carpetas en la raíz del proyecto:
images/
└── binary_scenario/
├── train/
└── test/
- Ejecuta el siguiente script para unificar las imágenes:
python merge_images_folder.pyEsto generará una carpeta images/binary_scenario_merged/ con las imágenes mezcladas y organizadas por clase.
Descarga el modelo KNN desde:
Ubícalo en:
models/
└── training_1.h5
Las características de las imágenes existentes pueden encontrar aquí:
Además de encontrarse por defecto en la ruta models/features
Este modelo fue tomado del repositorio original:
📦 https://github.com/forderation/breast-cancer-retrieval
Los diferentes pesos según la amplitud de la imagen para el modelo CNN:
Estos pesos deben de almacenarse en la carpeta saved_weights de la forma
saved_weights/
├─── modelo_cnn_40x.weights.h5
├─── modelo_cnn_100x.weights.h5
├─── modelo_cnn_200x.weights.h5
├─── modelo_cnn_400x.weights.h5
└─── modelo_cnn_all.weights.h5
Asegúrate de tener instalado:
- Python 3.8 o superior
- Las dependencias listadas en
requirements.txt:
pip install -r requirements.txtSe recomienda usar un entorno virtual:
# Crear entorno virtual
python -m venv venv
# Activar entorno (Windows)
.\venv\Scripts\activate
# Desactivar entorno (Windows)
.\venv\Scripts\deactivatePara iniciar la aplicación principal, ejecuta:
python app.pyAsegúrate de haber instalado previamente todos los requisitos.
Para entrenar una red neuronal convolucional desde cero, descarga las imágenes como se indica anteriormente, modifica los parámetros como se indicará en el siguiente punto y ejecuta:
python train_cnn.pyEste script entrenará un modelo utilizando las imágenes de la carpeta:
images/binary_scenario/train/
El entrenamiento del modelo se ajusta dinámicamente según los valores de los atributos MAGNIFICIENT, SAVE_MODEL y SAVE_WEIGHTS.
- Define el nivel de ampliación aplicado a las imágenes.
- Si se asigna un valor numérico (por ejemplo,
10,20, etc.), el modelo se entrenará exclusivamente con imágenes correspondientes a esa ampliación. - Si se establece como
None, se utilizará un enfoque experimental basado en la combinación de imágenes de distintas ampliaciones dentro de un conjunto de entrenamiento unificado.
- Valor booleano (
TrueoFalse). - Si es
True, se guarda el modelo completo tras el entrenamiento.
- Valor booleano (
TrueoFalse). - Si es
True, se guardan únicamente los pesos del modelo, sin incluir la arquitectura.
Esta configuración permite:
- Controlar qué tipo de datos se utilizan durante el entrenamiento. Esto debido a que el procesamiento de cada uno de ellos lleva un tiempo prolongado.
- Elegir la forma en la que se almacena el resultado final del modelo, ya sea completo o solo sus pesos. El programa inicialmente guardaba el modelo completo, pero para mejor uso de memoria se decidió una migración a que únicamente se guardasen los pesos. Sin embargo, en caso de que algún usuario vea de utilidad la obtención del modelo completo guardado, podrá obtenerlo cambiando las variables.
Las métricas siguiente son mostradas tomando como caso positivo a que el resultado sea maligno.
-
Accuracy:
Proporción de predicciones correctas sobre el total de predicciones realizadas. Mide qué tan bien el modelo clasifica en general.
Fórmula:
Accuracy = (TP + TN) / (TP + TN + FP + FN) -
Recall:
Proporción de verdaderos positivos detectados sobre el total de positivos reales. Indica la capacidad del modelo para identificar correctamente los casos positivos.
Fórmula:
Recall = TP / (TP + FN) -
Precision:
Proporción de verdaderos positivos sobre el total de predicciones positivas. Evalúa la exactitud de las predicciones positivas del modelo.
Fórmula:
Precision = TP / (TP + FP) -
F1 Score:
Media armónica entre la precisión y el recall. Es útil cuando hay un desequilibrio entre las clases.
Fórmula:
F1 = 2 * (Precision * Recall) / (Precision + Recall)
Donde:
- TP: Verdaderos Positivos
- TN: Verdaderos Negativos
- FP: Falsos Positivos
- FN: Falsos Negativos
- Con datos originales
La carpeta images contiene las imágenes utilizadas para el entrenamiento y prueba del modelo. Su estructura es la siguiente:
images/
├── binary_scenario/
│ ├── train/
│ │ ├── 40X/
│ │ │ ├── benign/
│ │ │ └── malignant/
│ │ ├── 100X/
│ │ │ ├── benign/
│ │ │ └── malignant/
│ │ ├── 200X/
│ │ │ ├── benign/
│ │ │ └── malignant/
│ │ └── 400X/
│ │ ├── benign/
│ │ └── malignant/
│ └── test/
│ ├── 40X/
│ │ ├── benign/
│ │ └── malignant/
│ ├── 100X/
│ │ ├── benign/
│ │ └── malignant/
│ ├── 200X/
│ │ ├── benign/
│ │ └── malignant/
│ └── 400X/
│ ├── benign/
│ └── malignant/
└── binary_scenario_merged/
├── train/
│ ├── benign/
│ └── malignant/
└── test/
├── benign/
└── malignant/
-
binary_scenario/:
Contiene las imágenes originales organizadas en carpetas separadas para entrenamiento (train/) y prueba (test/), cada una dividida por niveles de ampliación (40X/,100X/,200X/,400X/), siendo estas a su vez dividias en malignas o benignas (/malignant,/benign). -
binary_scenario_merged/:
Carpeta generada tras ejecutar el scriptmerge_images_folder.py. Contiene las imágenes de entrenamiento, y prueba unificadas y organizadas por malignas o benignas (/malignant,/benign).
Esta estructura facilita la manipulación y el acceso a las imágenes durante las etapas de entrenamiento, validación, prueba y análisis.
El conjunto de datos contiene casi 8,000 imágenes, distribuidas entre las diferentes carpetas y clases, lo que proporciona una base sólida para entrenar y evaluar los modelos.
- Con datos aumentados (rotaciones, escalados, etc.)
Para aumentar los datos se ha aplicado la técnica de data augmentation, es una técnica utilizada para incrementar la cantidad y diversidad de datos de entrenamiento mediante transformaciones como rotaciones, escalados, volteos, y cambios de brillo o contraste en las imágenes originales. Esto ayuda a mejorar la generalización del modelo y su capacidad para manejar variaciones en los datos reales.
| Modelo | Métrica 1 | Métrica 2 | Métrica 3 | Métrica 4 |
|---|---|---|---|---|
| modelo_cnn_100x | 0.7638 | 0.7670 | 0.7722 | 0.7638 |
| modelo_cnn_200x | 0.8141 | 0.8074 | 0.8090 | 0.8141 |
| modelo_cnn_400x | 0.8141 | 0.8001 | 0.8150 | 0.8141 |
| modelo_cnn_40x | 0.8141 | 0.8001 | 0.8150 | 0.8141 |
| modelo_cnn_all | 0.8241 | 0.8093 | 0.8304 | 0.8241 |
| modelo_cnn_aug_100x | 0.8280 | 0.8285 | 0.8290 | 0.8280 |
| modelo_cnn_aug_200x | 0.8239 | 0.8236 | 0.8234 | 0.8239 |
| modelo_cnn_aug_400x | 0.8044 | 0.7817 | 0.8219 | 0.8044 |
| modelo_cnn_aug_40x | 0.7809 | 0.7626 | 0.7758 | 0.7809 |
| modelo_cnn_aug_all | 0.7911 | 0.7747 | 0.7877 | 0.7911 |
| Modelo | Métrica 1 | Métrica 2 | Métrica 3 | Métrica 4 |
|---|---|---|---|---|
| modelo_knn_100x | 0.8986 | 0.9293 | 0.8961 | 0.9650 |
| modelo_knn_200x | 0.8806 | 0.9124 | 0.9259 | 0.8993 |
| modelo_knn_400x | 0.8950 | 0.9237 | 0.9127 | 0.9350 |
| modelo_knn_40x | 0.9045 | 0.9304 | 0.9338 | 0.9270 |
| modelo_knn_all | 0.9010 | 0.9293 | 0.9128 | 0.9465 |
| modelo_knn_aug_100x | 0.4966 | 0.5126 | 0.7740 | 0.3832 |
| modelo_knn_aug_200x | 0.7194 | 0.8291 | 0.7162 | 0.9842 |
| modelo_knn_aug_400x | 0.4177 | 0.2869 | 0.8548 | 0.1724 |
| modelo_knn_aug_40x | 0.6814 | 0.8061 | 0.6937 | 0.9620 |
| modelo_knn_aug_all | 0.4211 | 0.3144 | 0.8476 | 0.1930 |
- Ejecuta el análisis de características para recorrer todos los test:
Nota: Si prefieres ver la matríz de confusión resultante de la ejecución de alguno de los test. Puedes dirigirte a sus archivos y cambiar en el fragmento de ejecución la variable show_metrics a True. Por defecto en el proyecto se encuentra en False.
python analice.py- Luego genera los gráficos con:
python metrics.pyEsto guardará graficas de cómo afecta el aumento de datos al rendimiento del modelo guardandolo en la ruta outputs/metrics.
Se extraen características a partir de un encoder entrenado (modelo autoencoder).
- PCA (Análisis de Componentes Principales): Reduce las dimensiones a 2 para una representación clara.
- t-SNE: Método no lineal que preserva la estructura de datos para mostrar agrupamientos y patrones.
Los resultados se almacenan en:
outputs/features/
├── pca/
└── tsne/
Este proyecto se basa en modelos y datasets públicos con fines académicos y de investigación. Parte del trabajo de extracción de características está basado en el repositorio: