DermTrace es una aplicación web que analiza fotografías dermatoscópicas o clínicas de lesiones cutáneas y estima a qué tipo de las 7 categorías del dataset HAM10000 pertenecen (melanoma, carcinoma basocelular, queratosis actínica, nevus melanocítico, queratosis benigna, dermatofibroma y lesión vascular), señalando además el riesgo de malignidad acumulado.
El objetivo del proyecto es explorar hasta qué punto un pipeline de deep learning reproducible —preprocesado clínico, calibración de sensibilidad y explicabilidad visual— puede convertirse en una herramienta de apoyo al cribado dermatológico. No sustituye el diagnóstico médico.
![]()
Pantalla principal: selección de la fuente de imagen, umbral de sensibilidad clínica y recorte de la lesión.
- 📸 Múltiples fuentes de imagen: subida de archivo, cámara (con captura nativa en móvil) o pegado desde el portapapeles.
- ✂️ Recorte interactivo: encuadra la lesión antes de analizarla para reducir ruido de fondo.
- 🪒 Eliminación de vello (DullRazor): filtro morfológico Black-Hat direccional + inpainting Navier-Stokes, con detección automática de falsos positivos sobre piel clínica.
- 🧠 Clasificación con ConvNeXtSmall: modelo entrenado sobre HAM10000 con 7 clases de lesiones.
- ⚕️ Umbral clínico ajustable: slider de sensibilidad objetivo (80–97%) calibrado en validación para priorizar la detección de melanoma frente a falsos negativos.
- 🌡️ Explicabilidad con Grad-CAM: mapa de calor que muestra en qué zonas de la lesión se apoyó el modelo para decidir.
- 📊 Panel de resultados: gauge de riesgo, distribución de probabilidades por clase, top-3 diagnósticos y tabla detallada.
![]()
Preprocesamiento con DullRazor: imagen original, máscara de vello detectada e imagen final sin vello.
![]()
Resultado del análisis: diagnóstico, alerta de riesgo maligno acumulado y gauge de riesgo.
![]()
Top 3 diagnósticos y distribución de probabilidades por clase.
![]()
Explicabilidad con Grad-CAM: zonas de la lesión que más influyeron en el resultado.
| Arquitectura | ConvNeXt Small + preprocesado DullRazor |
| Entrada | 260×260 px, RGB |
| Clases | 7 (akiec, bcc, bkl, df, mel, nv, vasc) |
| Dataset | HAM10000 |
| Explicabilidad | Grad-CAM sobre la última capa convolucional del backbone |
La regla de decisión prioriza la hipótesis de melanoma cuando su probabilidad supera un umbral calibrado en validación (puntos de anclaje en 90% y 95% de sensibilidad), en lugar de tomar siempre la clase de mayor probabilidad — reduciendo así el riesgo de falsos negativos en el escenario clínicamente más costoso.
Métricas sobre el conjunto de test (828 imágenes) para el modelo ConvNeXt-Small desplegado en la app. Metodología completa, curvas ROC/PR y comparativa con otras arquitecturas en el notebook.
HAM10000 está muy desbalanceado: nv (nevus melanocítico) domina el dataset frente a clases clínicamente críticas como melanoma o carcinoma basocelular.
Umbral por defecto (0.50 — argmax):
| Métrica | Valor |
|---|---|
| Accuracy | 90.82% |
| F1 macro | 0.7847 |
| F1 weighted | 0.9153 |
| Clase | Precisión | Recall | F1 | Soporte |
|---|---|---|---|---|
| Melanoma (mel) | 0.4516 | 0.8000 | 0.5773 | 35 |
| Carcinoma basocelular (bcc) | 0.8333 | 0.7407 | 0.7843 | 27 |
| Queratosis actínica (akiec) | 0.7143 | 0.6818 | 0.6977 | 22 |
| Queratosis benigna (bkl) | 0.7162 | 0.8030 | 0.7571 | 66 |
| Dermatofibroma (df) | 0.6250 | 0.8333 | 0.7143 | 6 |
| Nevus melanocítico (nv) | 0.9873 | 0.9382 | 0.9621 | 663 |
| Lesión vascular (vasc) | 1.0000 | 1.0000 | 1.0000 | 9 |
nv representa el 80% del test set (663/828), un desbalance heredado de HAM10000. Por eso el accuracy global no es representativo por sí solo: el F1 macro (0.7847), que pesa todas las clases por igual, refleja mejor el rendimiento real sobre las clases minoritarias y clínicamente más relevantes (melanoma, carcinoma basocelular).
Matriz de confusión normalizada (test). El modelo confunde sobre todo clases pigmentadas visualmente similares (akiec↔bkl, mel↔nv), el patrón esperable dado el parecido dermatoscópico real entre esas lesiones.
ConvNeXt-Small superó a EfficientNetV2S como backbone en la detección de melanoma (AUC 0.960 vs 0.947), por lo que fue la arquitectura elegida para la app.
Calibración del umbral de melanoma (trade-off sensibilidad / accuracy):
| Configuración | Umbral P(mel) | Recall melanoma | Precisión melanoma | Falsos negativos | Falsos positivos | Accuracy global |
|---|---|---|---|---|---|---|
| Por defecto | 0.50 | 80.00% | 45.16% | 7 | 34 | 90.82% |
| Sensibilidad ≥ 90% | 0.076 | 94.29% | 20.37% | 2 | 129 | 81.16% |
| Sensibilidad ≥ 95% | 0.030 | 94.29% | 14.54% | 2 | 194 | 73.91% |
El slider de sensibilidad clínica de la app deja elegir este punto del trade-off: subir la sensibilidad reduce los falsos negativos de melanoma (el error más costoso) a cambio de más falsas alarmas y menor accuracy global — una decisión de diseño explícita, no un efecto secundario del modelo.
En el notebook se exploraron también un ensemble por stacking y un modelo multimodal (imagen + datos clínicos) como comparativa. El ensemble mejora la precisión de melanoma a cada nivel de sensibilidad, pero no llegó a desplegarse en esta app.
- Frontend / app: Streamlit
- Modelo: TensorFlow / Keras (ConvNeXtSmall)
- Procesado de imagen: OpenCV, Pillow
- Visualización: Plotly
- Componentes:
streamlit-cropper,streamlit-paste-button
La app está desplegada en dermtrace.streamlit.app — no necesitas instalar nada para probarla. Para correrla en local:
git clone https://github.com/valencodes/app_dermtrace.git
cd app_dermtrace
pip install -r requirements.txt
streamlit run app.pyLa app se abre por defecto en http://localhost:8501. Incluye un botón "Usar imagen de demo" para probarla sin necesidad de subir una foto propia.
El repositorio incluye configuración en .devcontainer/: al abrir el proyecto en un Codespace o en VS Code con la extensión Dev Containers, se instalan las dependencias y se lanza streamlit run app.py automáticamente sobre el puerto 8501.
app_dermtrace_v2/
├── app.py # Interfaz Streamlit y flujo de la app
├── preprocess.py # Pipeline de preprocesado (EXIF, resize, DullRazor)
├── dullrazor.py # Algoritmo DullRazor de eliminación de vello
├── gradcam.py # Generación de mapas de calor Grad-CAM
├── dullrazor_ConvNeXtSmall_best.keras # Modelo entrenado
├── labels.json # Clases del modelo
├── config.json / metadata.json # Configuración y metadatos del modelo
├── eda_plots/ # Gráficas del análisis exploratorio de datos
├── notebook/ # Notebook de entrenamiento, evaluación y experimentos
└── requirements.txt
DermTrace es una herramienta de apoyo basada en inteligencia artificial con fines educativos y de investigación. Los resultados son orientativos y no sustituyen el diagnóstico ni la valoración de un profesional sanitario. Ante cualquier lesión cutánea sospechosa, consulta siempre a un dermatólogo.
👤 Valentina G. - github.com/valencodes
Proyecto originado como Final AI Capstone Project para el bootcamp de Inteligencia Artificial - EOI & Samsung Innovation Campus (2026).









