Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MVAA 2026 - Mitral Valve Anatomy Analysis (MICCAI Challenge)

Submission code for the MICCAI 2026 MVAA challenge (Medical World Models workshop). Three segmentation tasks: cardiac CT, 3D transesophageal echocardiography, and intraoperative surgical video frames.

Final hidden-test results

Task DSC HD ASD
1 - Cardiac CT 0.8394 5.426 mm 0.4327 mm
2 - 3D TEE 0.8530 9.190 mm 0.5649 mm
3 - Surgical video 0.7551 236.29 px 63.76 px

Rank 12 of 29 teams. Task 1 ASD placed ~5th and HD ~7th in the field. Distances are millimetres for the 3D tasks (spacing-aware) and pixels for the 2D task. HD is the maximum Hausdorff distance, not HD95.

Method

Tasks 1 and 2 - nnU-Net ResEnc L. Five-fold ensemble, 250 epochs, mirroring test-time augmentation, then largest-connected-region post-processing (and largest component per class for Task 2 two leaflet labels).

Task 3 - six-model UNet++ ensemble. EfficientNet-B4 encoder with ImageNet initialisation, mean-teacher semi-supervised training over the 1,379 unlabeled frames, 448x800 input, Dice+Focal loss, four-way flip TTA, probability averaging, threshold 0.50, then components below 1 percent of the largest area removed.

Inference runs from a single Docker container; see the docker/ directory.

Three findings that mattered

1. Training labels contain heavy annotation speckle. Task 3 ground truth has a median of 17 connected components per frame with a median component size of 2 pixels; only 21 percent of frames are single-component. Removing components under 100 px discards 0.10 percent of the foreground area. Training on cleaned labels cut unfiltered Hausdorff distance from 161.7 to 97.5 - the model stopped emitting speckle once it stopped being taught to. Task 1 labels are pristine (27/27 single-component), which explains why 30 teams cluster within 1.3 percent Dice there: an annotation ceiling.

2. Empty predictions dominate the distance metrics. On the hidden test the model produced no output on roughly 16 percent of frames. Forcing a non-empty prediction cut HD from 520.4 to 236.3 and ASD from 386.7 to 63.8 while raising Dice (0.7502 to 0.7551). The rise proves those frames genuinely contain the valve, since rescuing a valve-absent frame would have destroyed a perfect score. Two gated variants (rescue only when max probability exceeded 0.50 or 0.35) returned byte-identical numbers to no rescue, showing the failing frames peak below 0.35. Solving the metric shifts jointly implies Dice ~0.89 on frames the model handles; the deficit is coverage of unfamiliar footage, not segmentation quality.

3. Pretraining beat architecture at 117 labelled frames. ImageNet initialisation was worth +0.21 Dice over training from scratch. nnU-Net 2D (ResEnc L, no pretraining) reached 0.7304 official Dice against 0.7956 for the ImageNet-pretrained UNet++, despite comparable cross-validation scores.

Negative results

  • Boundary loss (Kervadec, weights 0.1 and 0.3, three seeds, paired): worse on all three metrics (mean dDSC -0.017, dHD +2.04, dASD +1.16).
  • Input resolution 448x800 to 704x1280: no effect.
  • Decision-threshold sweeps: HD and ASD flat from 0.10 to 0.70.
  • Doubling training to 500 epochs: Task 1 CV 0.8501 to 0.8517, Task 2 0.8386 to 0.8387.
  • Pseudo-labelling Task 3 on 793 confident frames from 45 videos: validation Dice collapsed from 0.79 to 0.30, predicting 2.6x too much foreground - confirmation bias.
  • Local validation is unreliable for Task 3 post-processing: leave-video-out and official scores were anti-correlated for component filtering, because training labels are speckled while evaluation labels are clean.

Repository layout

  • task1/, task2/ - nnU-Net-based pipelines (from the official baseline)
  • task3/ - surgical video pipeline (UNet++ / mean teacher)
  • docker/ - Dockerfile and run_all.py, the submitted inference container
  • scripts/ - failure audits, label-quality checks, post-processing sweeps, ensembling, pseudo-labelling, nnU-Net conversion

Model weights

Trained weights are archived on Zenodo: https://doi.org/10.5281/zenodo.21742743

The archive (4.3 GB) contains the exact weights used in the evaluated submission: nnU-Net five-fold ensembles for Tasks 1 and 2, and six UNet++ models for Task 3. Checkpoints are stripped to inference-only tensors, so they predict but cannot resume training. See the README inside the archive for loading instructions.

The same weights ship inside the public Docker image:

docker pull sanketkachole/mvaa@sha256:ac9f7fcdae3491adb86bd8310f0caea443f6f2dd7c20480e10ad6d0f28c2a622

The container auto-detects task subdirectories under /input and writes t1_ct/, t2_tee/ and t3_vid/ with prediction JSON files under /output.

Environment

PyTorch 2.5.1 (CUDA 12.1), MONAI 1.6.0, segmentation-models-pytorch 0.5.0, nnU-Net v2 2.8.1. Trained on an RTX 6000 Ada (48 GB) and V100-32GB nodes. Evaluation hardware was a V100 32 GB (sm_70).

Acknowledgement

Built on the official MVAA baseline: https://github.com/db0725/MVAA

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages