PromptM-UNet / README.md
Kiuyha's picture
Upload folder using huggingface_hub
09fee2a verified
|
Raw
History Blame Contribute Delete
8.44 kB
---
license: apache-2.0
tags:
- medical
- 3d-segmentation
- mamba
- state-space-model
- vision-language
- prompt-guided-segmentation
- ct-scan
- spleen
- totalsegmentator
- lightm-unet
pipeline_tag: image-segmentation
library_name: promptm-unet
---
# PromptM-UNet: Efficient Text-Prompted 3D Medical Image Segmentation with Mamba SSM
[![GitHub Repository](https://img.shields.io/badge/GitHub-Repository-black?logo=github)](https://github.com/kiuyha/PromptM-UNet)
[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
**PromptM-UNet** is an ultra-lightweight, multi-modal 3D medical image segmentation framework that integrates **Residual Vision Mamba (SSM)** with **multi-stage language conditioning**. It enables accurate, prompt-guided volumetric CT segmentation while maintaining linear \(O(N)\) computational complexity and a minimal memory footprint feasible for standard consumer GPUs.
* **GitHub Repository**: [https://github.com/kiuyha/PromptM-UNet](https://github.com/kiuyha/PromptM-UNet)
* **Target Organ**: Spleen (TotalSegmentator CT Cohort)
---
## 🌟 Key Features
* **Linear \(O(N)\) Volumetric Modeling**: Built on 3D Residual Vision Mamba (RVM) blocks from LightM-UNet, providing global receptive field modeling without quadratic \(O(N^2)\) Transformer memory explosion.
* **Ultra-Lightweight Footprint**: Active visual backbone is only **~1.87 Million parameters** (\(16\times\) smaller than standard 3D nnU-Net, \(100\times\) smaller than SegVol).
* **Zero-Overhead Language Conditioning**: Decoupled text embedding caching ensures frozen language models (CLIP, BioBERT, Sentence-BERT) consume 0 extra GPU memory during training/inference.
* **Dual-Resolution Spatial Zoom**: SegVol-inspired dual-scale pipeline (3mm global context + 1.5mm high-resolution target crop).
* **Clinical Performance**: Achieves **\(0.862+\) Dice Similarity Coefficient (DSC)** and **\(0.792+\) Normalized Surface Distance (NSD)** on TotalSegmentator CT scans with under **4.3 GB** validation VRAM.
---
## πŸ“Š Benchmark & Ablation Results
The following results are evaluated on the official TotalSegmentator spleen validation cohort across 30 training epochs (from [`notebooks/ablation_promptm_unet.ipynb`](notebooks/ablation_promptm_unet.ipynb)):
### 1. Fusion Strategy Ablation
*Evaluated using Multiplication operation, CLIP text encoder, and 50:50 BCE supervision:*
| Fusion Strategy | Peak Epoch | Peak DSC | Peak NSD | Final DSC (Epoch 30) | Final NSD (Epoch 30) | Peak Val VRAM |
| :--- | :---: | :---: | :---: | :---: | :---: | :---: |
| **Early Fusion** | **19** | **`0.8622`** | **`0.7928`** | `0.8196` | `0.7514` | **< 4.3 GB** |
| **All-Stage Fusion** | 24 | `0.8619` | `0.7871` | `0.7737` | `0.6848` | < 4.3 GB |
| **Late Fusion** | 12 | `0.8576` | `0.7675` | `0.7347` | `0.6095` | < 4.3 GB |
### 2. Loss Function Ablation
*Evaluated across compound loss formulations:*
| Loss Configuration | Peak Epoch | Peak DSC | Peak NSD | Final DSC (Epoch 30) | Final NSD (Epoch 30) |
| :--- | :---: | :---: | :---: | :---: | :---: |
| **Focal Loss (50:50)** | **20** | **`0.8627`** | `0.7827` | `0.8045` | `0.7195` |
| **Standard BCE (50:50)** | 24 | `0.8619` | **`0.7871`** | `0.7737` | `0.6848` |
| **Dynamic Loss (80:20 \(\to\) 65:35)** | 27 | `0.8537` | `0.7668` | `0.8280` | `0.7299` |
| **Focal Loss (80:20)** | 20 | `0.7827` | `0.6821` | `0.7358` | `0.6393` |
### 3. Fusion Operation Ablation
*Evaluated using 50:50 BCE supervision:*
| Operation | Peak Epoch | Peak DSC | Peak NSD | Final DSC (Epoch 30) | Final NSD (Epoch 30) |
| :--- | :---: | :---: | :---: | :---: | :---: |
| **Multiplication** | **24** | **`0.8619`** | **`0.7871`** | `0.7737` | `0.6848` |
| **Concatenation** | 26 | `0.8381` | `0.7647` | `0.8120` | `0.7387` |
| **Hybrid** | 28 | `0.8152` | `0.7301` | `0.7962` | `0.7041` |
### 4. Text Encoder Ablation
*Evaluated with Early Fusion:*
| Text Encoder | Peak Epoch | Peak DSC | Peak NSD | Final DSC (Epoch 30) | Final NSD (Epoch 30) |
| :--- | :---: | :---: | :---: | :---: | :---: |
| **CLIP** | **19** | **`0.8622`** | **`0.7928`** | `0.8196` | `0.7514` |
| **BioBERT** | 19 | `0.8466` | `0.7584` | `0.7968` | `0.7148` |
### 5. Multi-Tier Clinical Prompt Robustness
*Evaluated on Best Early Fusion + CLIP checkpoint across prompt complexity tiers:*
| Prompt Tier | Clinical Description | Peak DSC |
| :--- | :--- | :---: |
| **Tier \(N\)** | Organ Name (*e.g., "spleen"*) | `0.8620` |
| **Tier \(NS\)** | Name + Synonym (*e.g., "spleen, lien"*) | `0.8621` |
| **Tier \(NL\)** | Name + Location (*e.g., "spleen in left upper quadrant"*) | **`0.8624`** |
| **Tier \(NSL\)** | Name + Synonym + Location (*e.g., "spleen, lien in upper left abdomen"*) | `0.8622` |
---
## πŸš€ Quickstart & Inference
### 1. Installation
```bash
# Clone the repository
git clone https://github.com/kiuyha/PromptM-UNet.git
cd PromptM-UNet
# Install dependencies and package
pip install -e .
```
### 2. Python Inference
```python
import torch
import yaml
from promptm_unet.models.PromptMUNet import PromptMUNet
# Load configuration
with open("configs/default.yml", "r") as f:
config = yaml.safe_load(f)
# Instantiate model
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = PromptMUNet(config).to(device)
# Load checkpoint
checkpoint = torch.load("best_model.pth", map_location=device)
model.load_state_dict(checkpoint["model_state_dict"])
model.eval()
# Dummy 3D input: (Batch, Channels, Depth, Height, Width)
dummy_ct = torch.randn(1, 1, 64, 128, 128).to(device)
prompt = ["spleen segmentation in abdominal CT scan"]
# Forward pass
with torch.no_grad():
prediction = model(dummy_ct, prompt) # Output: (1, 1, 64, 128, 128)
probabilities = torch.sigmoid(prediction)
binary_mask = (probabilities > 0.5).cpu().numpy()
print(f"Predicted spleen mask shape: {binary_mask.shape}")
```
### 3. CLI Training & Evaluation
```bash
# Run training with default 50:50 compound supervision
accelerate launch -m promptm_unet.cli train \
--path.raw_data_dir "/path/to/totalsegmentator_raw" \
--path.prepro_data_dir "/path/to/preprocessed_data" \
--training.batch_size 2 \
--training.epochs 30 \
--loss.dice_weight 0.5 \
--loss.bce_weight 0.5
# Run multi-tier evaluation
python -m promptm_unet.cli test \
--checkpoint "./experiments/checkpoints/best_model.pth"
```
---
## πŸ—οΈ Model Architecture
```
3D CT Volume (1.5mm / 3.0mm)
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Visual Encoderβ”‚ (Residual Vision Mamba - RVM Blocks)
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Bottleneck β”‚ ◄────► β”‚ Text Projection β”‚ ◄── Frozen CLIP / BioBERT / SBERT
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ (512D / 768D / 384D)
β”‚ β–²
β–Ό β”‚ (Multi-Stage Hadamard Product)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ Visual Decoderβ”‚ β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
Deep Supervision Heads ──► High-Resolution Spleen Binary Mask
```
---
## πŸ“œ Citation & License
This project is licensed under the **Apache License 2.0**.
If you find this work useful in your research, please cite our repository:
```bibtex
@misc{promptm_unet2026,
title={PromptM-UNet: Efficient Text-Prompted 3D Medical Image Segmentation Using State-Space Model Mamba for Spleen},
author={Shridhara, Ketut and Setyawan, Ivan Andika and Al-Habib, Hasanuddin},
year={2026},
publisher={Universitas Negeri Surabaya},
howpublished={\url{https://github.com/kiuyha/PromptM-UNet}}
}
```
---
## 🀝 Acknowledgements
* [LightM-UNet](https://github.com/Mr-TalhaIlyas/LightM-UNet) for the 3D Mamba visual backbone.
* [VoxTell](https://arxiv.org/abs/2511.11450) & [SegVol](https://arxiv.org/abs/2311.13385) for multimodal prompting inspirations.
* [TotalSegmentator](https://github.com/wasserth/TotalSegmentator) for CT dataset annotations.
* Research funded by **LPPM Universitas Negeri Surabaya (UNESA)**.