--- license: mit tags: - medical-imaging - segmentation - coronary-artery - 3d - ct - cta - unet - mamba - pytorch - monai library_name: pytorch pipeline_tag: image-segmentation --- # Coronary Artery Segmentation (3D CTA) — U-Net vs. Attention–Mamba2 Two 3D segmentation models for **voxel-wise binary segmentation of the coronary artery tree** from cardiac CT angiography (CTA) volumes. Released as a portfolio study comparing a convolutional baseline against a state-space/attention hybrid encoder under an identical training and evaluation harness. - **Repository:** https://github.com/noahschuetz/coronary-artery-segmentation - **Task:** binary 3D semantic segmentation (foreground = coronary artery) - **Framework:** PyTorch + MONAI - **License:** MIT ## Checkpoints | File | Model | Input channels | Params | |---|---|---|---| | `baseline_unet.pth` | 3D U-Net (MONAI) | 1 (CT) | ~31M | | `att_mamba2_unet.pth` | Attention–Mamba2 U-Net | 2 (CT + Frangi vesselness) | ~31M | `.pth` files are PyTorch state dicts. Instantiate the architecture from the repo, then load weights. ## Results Identical training: AdamW (lr 1e-4, weight decay 1e-4, 5-epoch warmup), 100 epochs, 96³ patches, 4 patches/volume. Metrics on a held-out test split. clDice is topology-aware (penalizes centerline breaks). | Model | Dice | clDice | Precision | Recall | IoU | Time/Epoch | |---|---|---|---|---|---|---| | 3D U-Net | 0.788 | 0.864 | 0.820 | 0.762 | 0.653 | ~1.7 min | | Att-Mamba2 U-Net | 0.791 | 0.865 | 0.812 | 0.775 | 0.657 | ~1 min | **Finding:** the two encoders are at parity on segmentation quality (~0.003 Dice apart). The state-space hybrid reaches that quality at roughly half the per-epoch training time. This is an efficiency/negative result, not a SOTA claim. ## Usage ```python import torch from huggingface_hub import hf_hub_download from src.models.model_factory import get_model # from the project repo model_cfg = {"name": "att_mamba2_unet", "features": [32, 64, 128, 256], "in_channels": 2} data_cfg = {"patch_size": [96, 96, 96]} model = get_model(model_cfg, data_cfg) ckpt = hf_hub_download("noahschuetz/coronary-segmentation", "att_mamba2_unet.pth") state = torch.load(ckpt, map_location="cpu", weights_only=True) # .pth is a plain state dict model.load_state_dict(state) model.eval() ``` Preprocessing must match training: reorient → resample → HU windowing → intensity normalization → (for the Att-Mamba2 model) append a Frangi vesselness channel. See `src/data/transforms.py`. Inference uses sliding-window patching over the full volume; see `scripts/inference.py`. ## Training data Developed on the public **ImageCAS** coronary CTA dataset (cardiac CT angiography with expert coronary artery annotations). The dataset is not redistributed with these weights; obtain it from its original source. ## Intended use & limitations - **Intended use:** research and educational demonstration of 3D vessel segmentation and architecture comparison. - **Not for clinical use.** These models are not a medical device and have not been validated for diagnosis or treatment. - **Domain shift:** trained on a single dataset's acquisition characteristics; performance will degrade on scanners, contrast protocols, or populations that differ from ImageCAS. - **Thin-vessel failure modes:** distal/small branches and severe stenoses are the hardest cases; clDice is reported precisely because voxel Dice under-weights these topology errors. ## Citation If you use these weights, please cite this repository and the ImageCAS dataset.