| --- |
| language: |
| - en |
| license: mit |
| tags: |
| - pytorch |
| - classification |
| - medical-imaging |
| - skin-lesion |
| - efficientnet |
| - efficientnet-b0 |
| - isic2018 |
| - dermatology |
| - transfer-learning |
| - fine-tuning |
| datasets: |
| - isic-2018 |
| base_model: |
| - timm/efficientnet_b0.ra_in1k |
| metrics: |
| - f1 |
| - roc_auc |
| pipeline_tag: image-classification |
| library_name: pytorch |
| --- |
| |
| # EfficientNet-B0 — Clasificación de Lesiones Cutáneas ISIC 2018 |
|
|
| Modelo de clasificación multiclase de lesiones cutáneas dermoscópicas entrenado sobre HAM10000 (ISIC 2018 Task 3) mediante fine-tuning progresivo. Segunda etapa del pipeline de análisis de lesiones cutáneas — clasifica la región segmentada por U-Net en 7 categorías clínicas. |
|
|
| **Repositorio:** [skin-lesion-analysis](https://github.com/Jesusrodriguezf90/skin-lesion-analysis) |
| **Modelo de segmentación (primera etapa):** [unet-resnet34-isic2018-segmentation](https://huggingface.co/Jesusrodriguezf90/unet-resnet34-isic2018-segmentation) |
|
|
| --- |
|
|
| ## Métricas |
|
|
| | Métrica | Valor | |
| |---|---| |
| | F1 macro (val) | **0.7700** | |
| | F1 weighted (val) | **0.7877** | |
| | AUC macro (val) | **0.9719** | |
| | Accuracy (val) | **0.77** | |
|
|
| > Split 80/20 estratificado sobre HAM10000 (10.015 imágenes). 8.012 imágenes de entrenamiento, 2.003 de validación. |
|
|
| ### Métricas por clase |
|
|
| | Clase | Precision | Recall | F1 | Soporte | |
| |---|---|---|---|---| |
| | MEL — Melanoma | 0.40 | 0.82 | 0.54 | 223 | |
| | NV — Melanocytic nevus | 0.98 | 0.73 | 0.84 | 1341 | |
| | BCC — Basal cell carcinoma | 0.77 | 0.92 | 0.84 | 103 | |
| | AKIEC — Actinic keratosis | 0.71 | 0.74 | 0.72 | 65 | |
| | BKL — Benign keratosis | 0.62 | 0.82 | 0.71 | 220 | |
| | DF — Dermatofibroma | 0.81 | 0.91 | 0.86 | 23 | |
| | VASC — Vascular lesion | 0.82 | 0.96 | 0.89 | 28 | |
|
|
| > **Nota sobre MEL:** precision 0.40 con recall 0.82 indica que el modelo genera falsos positivos de melanoma. En contexto clínico este comportamiento es aceptable — mejor sobrediagnosticar que infradiagnosticar — pero refleja la dificultad intrínseca de distinguir melanoma de nevus en imágenes ambiguas del dataset. |
|
|
| --- |
|
|
| ## Uso |
|
|
| ```python |
| import torch |
| import timm |
| import albumentations as A |
| from albumentations.pytorch import ToTensorV2 |
| from huggingface_hub import hf_hub_download |
| import numpy as np |
| from PIL import Image |
| |
| CLASES = ["MEL", "NV", "BCC", "AKIEC", "BKL", "DF", "VASC"] |
| |
| # 1. Descargar el checkpoint |
| ruta = hf_hub_download( |
| repo_id="Jesusrodriguezf90/efficientnet-b0-isic2018-classification", |
| filename="best_efficientnet_b0.pth" |
| ) |
| |
| # 2. Reconstruir el modelo |
| model = timm.create_model( |
| "efficientnet_b0", |
| pretrained=False, |
| num_classes=7, |
| ) |
| model.load_state_dict(torch.load(ruta, map_location="cpu")) |
| model.eval() |
| |
| # 3. Preprocesamiento — mismo pipeline que en entrenamiento |
| transform = A.Compose([ |
| A.Resize(256, 256), |
| A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)), |
| ToTensorV2(), |
| ]) |
| |
| # 4. Inferencia |
| img = np.array(Image.open("imagen_dermoscopica.jpg").convert("RGB")) |
| tensor = transform(image=img)["image"].unsqueeze(0) |
| |
| with torch.no_grad(): |
| logits = model(tensor) |
| probs = torch.softmax(logits, dim=1).squeeze() |
| pred = probs.argmax().item() |
| |
| print(f"Predicción: {CLASES[pred]} ({probs[pred]:.3f})") |
| ``` |
|
|
| --- |
|
|
| ## Arquitectura y entrenamiento |
|
|
| ### Fine-tuning progresivo |
|
|
| El entrenamiento se divide en dos fases para preservar los pesos preentrenados en ImageNet: |
|
|
| **Fase 1 — encoder congelado (5 épocas, lr=1e-3):** solo se entrenan los 8.967 parámetros del clasificador final. El encoder está congelado para evitar que los gradientes erráticos del clasificador recién inicializado destruyan las representaciones aprendidas en ImageNet. |
|
|
| **Fase 2 — modelo completo descongelado (30 épocas máx, lr=1e-4):** se descongela todo el modelo con lr reducido para afinar los pesos del encoder sin sobreescribir el conocimiento previo. Early stopping con paciencia=5 sobre F1 macro val. |
|
|
| ### Estrategia contra el desbalance (ratio 58.3x entre NV y DF) |
|
|
| Doble estrategia complementaria: |
| - **WeightedRandomSampler** — sobremuestrea clases minoritarias en cada batch |
| - **CrossEntropyLoss con pesos de clase** — penaliza más los errores en clases minoritarias |
|
|
| ### Proceso experimental |
|
|
| Se realizaron tres experimentos para determinar la configuración óptima: |
|
|
| | Experimento | Configuración | F1 macro | AUC | |
| |---|---|---|---| |
| | E1 — baseline | `epochs_unfrozen=20` | 0.7493 | 0.9704 | |
| | E2 — regularización | + `drop_rate=0.2` + `label_smoothing=0.1` + `epochs_unfrozen=30` | ~0.50 | ~0.96 | |
| | E3 — configuración final ✓ | Solo `epochs_unfrozen=30` | **0.7700** | **0.9719** | |
|
|
| E2 demostró que combinar dropout adicional y label smoothing con un dataset fuertemente desbalanceado ralentiza la convergencia sin beneficio neto. La configuración final (E3) amplía el margen de entrenamiento para que el early stopping pueda actuar correctamente. |
|
|
| | Parámetro | Valor | |
| |---|---| |
| | Dataset | HAM10000 / ISIC 2018 Task 3 | |
| | Imágenes entrenamiento | 8.012 | |
| | Split | 80/20 estratificado (seed=42) | |
| | Resolución entrada | 256×256 | |
| | Épocas fase 1 (frozen) | 5 | |
| | Épocas fase 2 (unfrozen) | 30 máx (early stopping paciencia=5) | |
| | Épocas ejecutadas | 35 | |
| | lr fase 1 | 1e-3 | |
| | lr fase 2 | 1e-4 | |
| | Weight decay | 1e-4 | |
| | Loss | CrossEntropyLoss con pesos de clase | |
| | Optimizer | AdamW | |
| | Scheduler | ReduceLROnPlateau (factor=0.1, patience=3) | |
| | Parámetros totales | 4.016.515 | |
| | Hardware | Kaggle GPU T4 | |
|
|
| --- |
|
|
| ## Limitaciones |
|
|
| - El dataset HAM10000 está fuertemente desbalanceado — NV representa el 66.9% de las muestras. A pesar de la doble estrategia de balanceo, el modelo tiende a favorecer NV |
| - MEL presenta precision baja (0.40) — el modelo genera falsos positivos de melanoma al confundirlo con nevus en imágenes ambiguas |
| - Entrenado exclusivamente con imágenes dermoscópicas estándar — no aplicable a fotografías clínicas convencionales ni fotos de smartphone sin dermatoscopio |
| - La clasificación en el pipeline completo se realiza sobre la imagen completa — en inferencia con U-Net, EfficientNet clasifica sobre la región enmascarada, lo que puede diferir del comportamiento en entrenamiento |
|
|
| --- |
|
|
| ## Dataset |
|
|
| **HAM10000 — ISIC 2018 Task 3** |
| International Skin Imaging Collaboration (ISIC) |
| 🔗 https://challenge.isic-archive.com/data/#2018 |
|
|
| Tschandl et al. (2018). The HAM10000 dataset, a large collection of multi-source dermatoscopic images of common pigmented skin lesions. *Scientific Data* |
|
|
| --- |
|
|
| ## Licencia |
|
|
| MIT |
|
|