Skip to content

Repository files navigation

DermTrace

🔬 DermTrace

Clasificación automática de lesiones cutáneas mediante Deep Learning

Streamlit TensorFlow Python


📋 Descripción

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 de DermTrace

Pantalla principal: selección de la fuente de imagen, umbral de sensibilidad clínica y recorte de la lesión.

✨ Características principales

  • 📸 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 DullRazor

Preprocesamiento con DullRazor: imagen original, máscara de vello detectada e imagen final sin vello.

Resultado del análisis con riesgo de malignidad

Resultado del análisis: diagnóstico, alerta de riesgo maligno acumulado y gauge de riesgo.

Top 3 diagnósticos y distribución de probabilidades

Top 3 diagnósticos y distribución de probabilidades por clase.

Mapa de calor Grad-CAM

Explicabilidad con Grad-CAM: zonas de la lesión que más influyeron en el resultado.

🧠 Modelo

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.

📊 Resultados del modelo

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.

Distribución de diagnósticos en HAM10000

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

Matriz de confusión normalizada (test). El modelo confunde sobre todo clases pigmentadas visualmente similares (akiecbkl, melnv), el patrón esperable dado el parecido dermatoscópico real entre esas lesiones.

Curvas ROC y Precision-Recall: ConvNeXt-Small vs EfficientNetV2S

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.

Comparativa de recall y precisión de melanoma: ConvNeXt-Small vs Stacking Ensemble

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.

🛠️ Stack técnico

  • Frontend / app: Streamlit
  • Modelo: TensorFlow / Keras (ConvNeXtSmall)
  • Procesado de imagen: OpenCV, Pillow
  • Visualización: Plotly
  • Componentes: streamlit-cropper, streamlit-paste-button

🚀 Instalación y uso local

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.py

La 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.

Con Dev Containers / GitHub Codespaces

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.

📁 Estructura del proyecto

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

⚠️ Aviso clínico

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).

About

User interface for the Dermtrace ML model

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages