Lector pCR
CNN 2D entrenada desde cero que estima, a partir de un corte de resonancia magnética de mama con contraste dinámico (DCE-MRI) adquirida antes del tratamiento neoadyuvante, la probabilidad de respuesta patológica completa (pCR): que tras el tratamiento y la cirugía no quede tumor invasivo.
Uso exclusivamente docente y de investigación. No es un producto sanitario, no está validado clínicamente y no debe usarse para tomar decisiones sobre pacientes. Su capacidad de discriminación es baja (ver Resultados).
- Código, entrenamiento y evaluación: github.com/alejandrobarreche/breast-cnn
- Aplicación web (inferencia en el navegador): alejandrobarreche.github.io/breast-cnn
Descripción del modelo
| Tarea | Clasificación binaria por corte: pCR frente a no pCR |
| Arquitectura | CNN propia de 5 bloques; cada bloque aplica 2 × (convolución 3×3 + BatchNorm + ReLU) y max-pooling 2×2. Canales 4 → 8 → 16 → 32 → 64, media global, dropout 0,3 y capa lineal 64 → 1 |
| Parámetros | 74.253 por modelo |
| Preentrenamiento | Ninguno: pesos inicializados aleatoriamente y entrenados desde cero |
| Ensemble | 5 modelos, uno por fold de validación cruzada; se promedian sus probabilidades |
| Calibración | Mapa de Platt ajustado con predicciones fuera de fold de un ensemble anidado |
| Autor | Alejandro Barreche Ruiz (Universidad Alfonso X el Sabio, Aprendizaje Automático, 2026) |
Ficheros
| Fichero | Contenido |
|---|---|
ensemble.onnx |
Los 5 modelos y la calibración en un único grafo ONNX (opset 20, 1,8 MB). Es el que usa la aplicación web |
model_fold{0..4}.pt |
Pesos de PyTorch de cada fold (state_dict). Requieren el código del repositorio y architecture.yaml |
architecture.yaml |
Descripción de la arquitectura que construye breast_cnn.models.builder |
config.yaml |
Configuración completa del entrenamiento |
metrics.json |
Métricas de validación interna por fold |
onnx_export.json |
Entradas, salidas, umbral, versiones y comprobación de paridad PyTorch–ONNX |
test_evaluation_patient_narrow.json |
Evaluación en el conjunto de test |
SHA-256 de ensemble.onnx: d1338e3c98afd9bbd15bd6411e9db989620fe29499e3aa066d978e25872f2a3f
Entrada y salidas
Entrada images: float32 [N, 3, 256, 256].
- Los canales son las tres fases de la DCE-MRI en este orden:
PRE(antes del contraste),EARLY(captación inicial) yLATE(fase tardía). Son tres instantes temporales, no un color RGB. - Cada fase es un PNG en escala de grises de 8 bits y 256 × 256 píxeles, escalado como
valor / 255. No se aplica la normalización de ImageNet ni ninguna normalización por fase. - El recorte central de 128 × 128 está dentro del modelo: no hay que hacerlo antes.
Salidas, en este orden:
| Nombre | Forma | Significado |
|---|---|---|
fold_probabilities |
[N, 5] |
Probabilidad de cada modelo de fold |
probability |
[N] |
Media de las cinco |
calibrated |
[N] |
Media tras la calibración de Platt; es la puntuación que se compara con el umbral |
fold_calibrated |
[N, 5] |
Cada probabilidad de fold con la misma calibración |
Umbral: calibrated ≥ 0,351 → pCR. Se fijó en validación interna para una especificidad del 90 % por corte.
Uso
import numpy as np
import onnxruntime as ort
from PIL import Image
phases = [
np.asarray(Image.open(f"corte_{phase}.png"), dtype=np.float32) / 255
for phase in ("PRE", "EARLY", "LATE")
]
images = np.stack(phases)[None] # [1, 3, 256, 256]
session = ort.InferenceSession("ensemble.onnx")
fold_probabilities, probability, calibrated, fold_calibrated = session.run(None, {"images": images})
label = "pCR" if calibrated[0] >= 0.351 else "no pCR"
Datos de entrenamiento
Versión docente de BreastDCEDL (Fridman et al., 2026), construida a partir de las colecciones de TCIA I-SPY1, I-SPY2 y Duke. Contiene unos 10 cortes axiales por paciente.
- Entrenamiento: 1.097 pacientes (10.945 cortes), de las que 322 (29,4 %) alcanzan pCR. Por cohorte: Duke 209, I-SPY1 104 e I-SPY2 784.
- Validación interna: 5 folds separados por paciente; los cortes de una paciente nunca se reparten entre entrenamiento y validación.
- Test: 176 pacientes (53 con pCR), que no intervinieron en ninguna decisión de diseño.
Entrenamiento
- Pérdida:
BCEWithLogitsLossponderada conpos_weight = N0 / N1, calculado en cada fold solo con su entrenamiento. - Optimización: AdamW con tasa de aprendizaje 10⁻⁴, weight decay 10⁻⁴ y lotes de 32. La tasa sigue un decaimiento coseno planificado para 40 épocas y se usa una media exponencial de los pesos (0,998).
- Duración: 8 épocas, elegidas con la curva media de validación de los otros folds.
- Aumento de datos: volteo horizontal, rotación de ±15°, traslación del 10 % y escala de 0,9 a 1,1, idénticos en las tres fases.
Resultados
El AUC es la probabilidad de que, tomando una paciente con pCR y otra sin ella, el modelo puntúe más alto a la primera; 0,5 equivale al azar. La referencia de cohorte asigna a cada paciente la tasa de pCR de su cohorte en entrenamiento, sin mirar la imagen.
| Conjunto | Unidad | AUC | Referencia de cohorte |
|---|---|---|---|
| Validación interna (5 folds, media ± desviación) | paciente | 0,582 ± 0,034 | 0,549 |
| Test (176 pacientes, IC 95 % por bootstrap) | paciente | 0,522 [0,442; 0,603] | 0,544 |
Test con el umbral por paciente (0,352):
| Valor | |
|---|---|
| Matriz de confusión | 5 VP, 48 FN, 114 VN, 9 FP |
| Sensibilidad | 9,4 % |
| Especificidad | 92,7 % |
| Exactitud equilibrada | 0,511 |
AUC en test por cohorte: Duke 0,59 (42 pacientes), I-SPY1 0,36 (35) e I-SPY2 0,55 (99).
Lectura de los resultados:
- La diferencia con la referencia de cohorte en test es de −0,022 [−0,102; 0,059]. El modelo no supera a esa referencia, y parte de la señal que capta puede ser la identidad de la cohorte y no el tumor.
- Esta es la segunda evaluación sobre el mismo conjunto de test. Una versión anterior, más ancha, obtuvo un AUC de 0,591 [0,508; 0,673] en la primera; el modelo final se eligió por la validación interna, no por el test.
Limitaciones
- Señal débil: con el umbral elegido detecta aproximadamente 1 de cada 10 pacientes con pCR.
- Usa unos 10 cortes 2D por paciente, no el volumen completo ni una segmentación del tumor.
- La imagen es la única entrada; no se usan variables clínicas.
- Solo se ha evaluado en tres cohortes públicas, y el rendimiento varía mucho entre ellas. No se ha probado en otros hospitales ni con otros escáneres.
- Las probabilidades están calibradas en validación interna. En test su escala puede diferir, porque el ensemble de 5 modelos produce probabilidades menos dispersas que el ensemble anidado usado para calibrar.
Licencia y atribución
El modelo se distribuye bajo CC BY-NC 4.0, la misma licencia que las imágenes con las que se entrenó: no se permite el uso comercial. El código del repositorio tiene su propia licencia.
Si usas el modelo, cita el dataset:
Fridman et al. BreastDCEDL: a standardized deep learning-ready breast DCE-MRI dataset of 2,070 patients. Scientific Data, 2026. doi:10.1038/s41597-026-06589-6
y las colecciones originales de TCIA: I-SPY1, I-SPY2 y Duke Breast Cancer MRI.
- Downloads last month
- 5