This repository contains our team's submission to the ODELIA Challenge, where our method got 🥈2nd place out of 8 submission in the final phase.
- Challenge Goal: Classification of breast MRI scans on a highly heterogeneous dataset into normal (or no lesion), benign and malignant categories.
- Result: Finished 2nd place 🎉
- Leaderboard Score: 0.86 AUC
- Method Paper: https://arxiv.org/abs/2508.20621
- ODELIA Challenge: https://odelia2025.grand-challenge.org/
- Dataset: https://huggingface.co/datasets/ODELIA-AI/ODELIA-Challenge-2025
- Dataset Paper: https://arxiv.org/abs/2506.00474
ODELIA challenge required participants to obtain a generalizable algorithm for detecting malignancies in breast MRIs. Each MRI study is assigned two labels, one for the left breast and one for the right breast. Each breast must be categorized into one of three classes/labels: “no lesion,” “benign lesion” or “malignant lesion.” The dataset has 511 breast MRI studies curated from six European centres, covering multiple vendors at both 1.5 and 3 T. Each MRI study contains a T2-weighted acquisition alongside a DCE acquisition with one pre-contrast phase and between 2 and 7 post-contrast phases. The evaluation metrics for challenge evaluation were micro AUC, Sensitivity at 90% Specificity and Specificity at 90% Sensitivity.
bcnaim-odelia-challenge/
│
├── Classification/ # Breast MRI classification framework
│ ├── dataloading/ # Data loading utilities
│ │ ├── collate_function.py # Custom collate function for batching 2D slices
│ │ └── dataloader2D.py # PyTorch dataset & dataloader for 2D classification
│ ├── models/
│ │ └── swinunetr.py # SwinUNETR backbone with classification head
│ ├── config2d.yaml # Classification config (hyperparameters, paths, channels)
│ ├── inference.py # Run inference on classification model(s)
│ └── train.py # Training script & logging
│
├── Segmentation/ # Breast mask segmentation framework
│ ├── dataloading/
│ │ ├── dataloader.py # PyTorch dataset & dataloader for segmentation
│ │ └── dataloader_testing.py # Dataloader for test/eval segmentation
│ ├── config2d.yaml # Segmentation config
│ ├── inference.py # Run inference on segmentation model
│ ├── inference_save_predictions.py # Inference script with option to save predicted masks
│ └── train.py # Training script for breast mask segmentation
│
├── challenge_submissions/ # Submission files for ODELIA challenge
│ ├──submission_final # Final Submission
|
├── csvs/ # Pre-generated dataset splits
│ ├── breast_mask_segmentation_splits/ # Segmentation training/validation splits
│ └── crossval_splits/ # Classification cross-validation splits
│
├── prepare_and_preprocess/ # Data preparation utilities
│ ├── cross_validation_split.py # Script to create stratified 5-fold CV splits
│ ├── mips_odelia_default.py # Generate MIPs from ODELIA MRI dataset
│ └── preprocess.py # Preprocessing pipeline (resizing, normalization, etc.)
│
├── .gitignore # Ignore build artifacts, logs, checkpoints
└── README.md # Project documentation
Download the segmentation model and classification models' checkpoints from here: https://drive.google.com/drive/folders/1aQGZk_JhqtFVfiZKVdSlgPU0xr0pHvjp?usp=sharing!
-
✨ Preprocess the data
Create Maximum Intensity Projections (MIPs) from the default challenge dataset:
python prepare_and_preprocess/mips_odelia_default.py
-
🚀 Train the model
Start training (most parameters are loaded from the config file, though a few are still hardcoded 👀 - TO DO):
python Classification/train.py
This repository was developed at the BCN-AIM, Universitat de Barcelona, Spain.
We gratefully acknowledge support from RadioVal (European research and innovation programme grant agreement No 101057699).


