Back to Blog
Computer Vision April 1, 2025 9 min read

Medical Image Segmentation with U-Net: Reaching Dice 0.7964

How I built a U-Net pipeline for skin lesion segmentation on ISIC 2018 — augmentation strategies, loss functions, and post-processing that pushed Dice from 0.72 to 0.796.

Architecture: U-Net with EfficientNet Encoder

import segmentation_models_pytorch as smp

model = smp.Unet(
    encoder_name='efficientnet-b4',
    encoder_weights='imagenet',
    in_channels=3,
    classes=1,
)

Loss Function: Combo Loss

Dice + BCE combination outperformed either alone:

loss = 0.5 * bce_loss + 0.5 * (1 - dice_score)

Augmentation Stack (Albumentations)

  • RandomResizedCrop, HorizontalFlip, VerticalFlip
  • ElasticTransform, GridDistortion
  • CLAHE, RandomBrightness
  • CoarseDropout (Cutout)

Post-processing

Test-time augmentation (TTA) with 8 flips/rotations added +0.015 Dice.

U-NetMedical ImagingSegmentationPyTorchISIC
O

Ossama Elhakki

AI Engineer & ML Systems Builder — Morocco