---
language:
- es
metrics:
- accuracy
- precision
- recall
- f1
tags:
- image-classification
- pytorch
- cnn
- deep-learning
- medical-imaging
- brain-cancer
---
# Modelo CNN para Clasificación de Cáncer Cerebral
 
⚠️ ADVERTENCIA IMPORTANTE ⚠️
Este modelo es un PROTOTIPO de investigación y NO DEBE SER UTILIZADO para diagnóstico médico real.
Cualquier decisión médica debe ser tomada por un profesional de la salud cualificado.
Este repositorio contiene un modelo de Red Neuronal Convolucional (CNN) entrenado con PyTorch para clasificar imágenes de resonancias magnéticas cerebrales en tres categorías.
## Descripción del Modelo
El modelo es una CNN diseñada para la tarea de clasificación de imágenes. Fue entrenado para distinguir entre los siguientes tres tipos de tumores cerebrales:
* **Glioma (`brain_glioma`)**
* **Meningioma (`brain_menin`)**
* **Tumor pituitario (`brain_tumor`)**
**Arquitectura:** El modelo utiliza una CNN personalizada (`SimpleCNN`) con cuatro capas convolucionales (32, 64, 128, 256 filtros respectivamente), cada una seguida de una capa de activación ReLU y una capa de max-pooling. Después de las capas convolucionales, la salida se aplana y se pasa a través de dos capas completamente conectadas (512 neuronas en la primera) para la clasificación final en 3 clases.
**Framework:** PyTorch
Este repositorio también incluye el notebook `evaluar_dataset.ipynb`, que contiene el código utilizado para evaluar el modelo, generar la matriz de confusión y calcular las métricas de rendimiento.
El dataset utilizado para el entrenamiento, validación y test se encuentra en la carpeta `data/`.
## Cómo Empezar
Para utilizar este modelo, necesitas tener PyTorch y Torchvision instalados. Puedes cargar el modelo y usarlo para hacer predicciones de la siguiente manera.
Asegúrate de guardar tu modelo entrenado (por ejemplo, como `torch_brain_cancer_91.pth`) y usar el siguiente script.
```python
import torch
from torchvision import transforms
from PIL import Image
# 1. Cargar el modelo
# Asegúrate de que la ruta al archivo .pth sea correcta
model = torch.load('modelo/torch_brain_cancer_91.pth')
model.eval()
# 2. Definir las transformaciones de la imagen
# ¡IMPORTANTE! Usa las mismas transformaciones que usaste para la validación/test.
# Rellena los valores correctos de reescalado y normalización.
preprocess = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406], # [DATO A RELLENAR: si usaste valores diferentes]
std=[0.229, 0.224, 0.225] # [DATO A RELLENAR: si usaste valores diferentes]
)
])
# 3. Cargar y preprocesar la imagen
img = Image.open("[RUTA/A/TU/IMAGEN.jpg]").convert('RGB')
img_preprocessed = preprocess(img)
batch_img_tensor = torch.unsqueeze(img_preprocessed, 0)
# 4. Realizar la predicción
with torch.no_grad():
output = model(batch_img_tensor)
# 5. Obtener la clase predicha
class_names = ['brain_glioma', 'brain_menin', 'brain_tumor']
_, index = torch.max(output, 1)
predicted_class = class_names[index[0]]
print(f"La clase predicha es: {predicted_class}")
```
## Dataset de Entrenamiento
**Descripción:** Este conjunto de datos contiene una colección completa de imágenes de resonancia magnética para la investigación del cáncer cerebral, específicamente destinadas a respaldar el diagnóstico médico. Es un dataset de imágenes de resonancia magnética de cáncer cerebral.
**División de datos:**
El dataset fue pre-procesado y dividido en:
* **Entrenamiento:** 70%
* **Test:** 15%
* **Validación:** 15%
**Preprocesamiento:**
Se aplicaron diferentes transformaciones a las imágenes para el entrenamiento y la evaluación:
* **Para el conjunto de entrenamiento (`transformaciones_train`):**
* `RandomResizedCrop(224)`: Recorte aleatorio y redimensionamiento a 224x224 píxeles.
* `RandomHorizontalFlip()`: Volteo horizontal aleatorio.
* `RandomRotation(15)`: Rotación aleatoria de hasta 15 grados.
* `ToTensor()`: Conversión de las imágenes a tensores PyTorch.
* `Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])`: Normalización con los valores medios y desviación estándar de ImageNet.
* **Para los conjuntos de validación y test (`transformaciones_test`):**
* `Resize(256)`: Redimensionamiento de la imagen a 256 píxeles en el lado más corto.
* `CenterCrop(224)`: Recorte central a 224x224 píxeles.
* `ToTensor()`: Conversión de las imágenes a tensores PyTorch.
* `Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])`: Normalización con los valores medios y desviación estándar de ImageNet.
Estas transformaciones se aplicaron a los datasets utilizando `ImageFolder` y se cargaron con `DataLoader` con un `batch_size` de 32.
## Procedimiento de Entrenamiento
**Hiperparámetros:**
* **Optimizador:** Adam
* **Tasa de aprendizaje (Learning Rate):** 0.001
* **Función de pérdida:** CrossEntropyLoss
* **Número de épocas (Epochs):** 25
* **Tamaño del lote (Batch Size):** 32
## Evaluación
El modelo fue evaluado en el conjunto de test, obteniendo los siguientes resultados:
```
Reporte de Clasificación:
precision recall f1-score support
brain_glioma 0.95 0.95 0.95 300
brain_menin 0.84 0.91 0.87 300
brain_tumor 0.94 0.86 0.90 307
accuracy 0.91 907
macro avg 0.91 0.91 0.91 907
weighted avg 0.91 0.91 0.91 907
```
**Precisión por clase:**
* brain_glioma: 95.00%
* brain_menin: 91.00%
* brain_tumor: 85.99%
**Matriz de Confusión:**
| | brain_glioma | brain_menin | brain_tumor |
| :---------- | :----------- | :---------- | :---------- |
| brain_glioma | 285 | 15 | 0 |
| brain_menin | 9 | 273 | 18 |
| brain_tumor | 6 | 37 | 264 |
**Análisis de la Matriz de Confusión:**
La matriz de confusión muestra el rendimiento del modelo para cada clase. Se observa que el modelo clasifica la clase `brain_glioma` con una alta precisión y pocos errores. La principal área de mejora se encuentra en la distinción entre las clases `brain_menin` y `brain_tumor`. Hay un número notable de falsos negativos y falsos positivos entre estas dos categorías, lo que indica que el modelo a veces confunde estos dos tipos de tumores entre sí. Por ejemplo, 37 casos de `brain_tumor` fueron clasificados erróneamente como `brain_menin`, y 18 casos de `brain_menin` fueron clasificados como `brain_tumor`.
## Limitaciones y Consideraciones Éticas
* **NO PARA DIAGNÓSTICO MÉDICO:** Este modelo es una prueba de concepto y **no debe ser utilizado para el diagnóstico médico real**. Cualquier diagnóstico debe ser realizado por un profesional de la salud cualificado.
* **Sesgos del Dataset:** El rendimiento del modelo está limitado por la naturaleza del dataset de entrenamiento. Puede no generalizar bien a imágenes de escáneres con configuraciones diferentes o a datos demográficos no representados en el conjunto de datos.
* **Generalización:** El modelo fue entrenado y evaluado en un conjunto de datos específico. Su rendimiento en datos completamente nuevos y no vistos puede variar.
---
*Model creado por Izan Medkouri López (IntelliGrow).*