File size: 4,686 Bytes
d1acd9e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
---
license: apache-2.0
base_model: Huangxs/MedPLIB-7b-2e
language:
- en
pipeline_tag: image-segmentation
tags:
- medical
- brain-tumor
- mri
- segmentation
- classification
- multimodal
- lora
- medplib
---

# MedPLIB-BRISC

**Joint brain tumor classification and segmentation from MRI with an adapted multimodal large language model.**

This repository holds the weights we trained on top of MedPLIB-7b-2e for the BRISC 2025 brain tumor MRI dataset. Given an MRI slice and a fixed instruction, the model answers with one of four classes and a `<SEG>` token. The four classes are glioma, meningioma, pituitary tumor and non-tumorous. The hidden state of the `<SEG>` token is decoded into the tumor mask, so the class and the mask come from the same response.

[Project page](https://huggingface.co/spaces/Sssunset/MedPLIB-BRISC) · [Code on GitHub](https://github.com/Peilin-FF/Tumor) · [Base model](https://huggingface.co/Huangxs/MedPLIB-7b-2e)

![Model overview](assets/fig_architecture.png)

## Files

| File | Content |
|---|---|
| `trainable.pt` | All trained weights, 286.8M parameters in total: LoRA on the language model, the image projector, the router, the `<SEG>` projector, the SAM-Med2D mask decoder and the SAM-Med2D encoder adapters |
| `adapter_meta.json` | LoRA settings and the list of trained tensors |
| `assets/` | Figures used on this page |

These weights are not a complete model. They are loaded on top of the original MedPLIB-7b-2e checkpoint, CLIP ViT-L/336 and SAM-Med2D-B with the code from our GitHub repository.

## How to use

```bash
git clone https://github.com/Peilin-FF/Tumor && cd Tumor
scripts/setup_env.sh                      # conda environment "medplib"
scripts/download_models.sh                # MedPLIB-7b-2e, CLIP ViT-L/336, SAM-Med2D-B
huggingface-cli download Sssunset/MedPLIB-BRISC --local-dir checkpoints/medplib-brisc

# interactive demo
python -m medplib_bt.demo_app --adapter checkpoints/medplib-brisc --port 7860

# reproduce the test results, which also needs scripts/download_data.sh
scripts/run_infer.sh 0,1,2,3 outputs/preds/medplib-brisc --adapter checkpoints/medplib-brisc
```

## Training

The model is trained on the 5,000 training slices of the official BRISC 2025 split with 8 NVIDIA A100 GPUs.

| Stage | Epochs | Trained modules | Trainable parameters | Loss |
|---|---|---|---|---|
| A: Alignment | 1 | image projector, router, `<SEG>` projector, mask decoder | 43.1M, 0.37% | CE + 2 BCE + 0.5 Dice |
| B: Adaptation | 12 | Stage A modules, LoRA with rank 16 on attention and both experts in all 32 layers, SAM-Med2D encoder adapters | 286.8M, 2.44% | CE + 2 BCE + 2 Dice + IoU |

Half of the training prompts ask for the class and the mask, a quarter ask for the class only and a quarter ask for the mask only. Non-tumorous slices are trained with an empty mask. At test time, each of the four valid answers is scored by its log-likelihood and the best one is kept. The mask comes from the `<SEG>` state of that answer, and no rule removes it afterwards.

![Two training stages](assets/fig_stages.png)

## Results

Results on the 1,000 BRISC test slices, from one training run with seed 42:

| Metric | Value |
|---|---|
| Accuracy | 0.980 |
| Macro-F1 | 0.982 |
| Dice on the 860 tumor slices | 0.854 |
| Dice on all 1,000 slices | 0.874 |
| Masks drawn on the 140 non-tumorous slices | 0 |
| Slices where the class and the mask disagree | 0 |

Two separately trained models, EfficientNet-B0 and U-Net, draw a mask on 61.4% of the non-tumorous slices and contradict each other on 9.0% of all slices. Trained on both tasks instead of segmentation alone, the same MedPLIB model stops drawing false masks entirely. The project page has the full comparison and case studies.

![Results](assets/fig_results.png)

## Limitations

- The model is trained and tested on 2D slices from one public dataset. The dataset has no patient identifiers, so slices from one patient may appear in both splits.
- A dedicated U-Net still outlines tumors slightly better on average. Gliomas and small lesions are the weakest cases.
- Free text answers became very short after adaptation.
- This is a course research prototype. It is not a medical device and must not be used for diagnosis or treatment decisions.

## Team

GP8001 Group 3, Nanyang Technological University: Simon Tong Sing Hee, Zeng Yi, Feng Peilin, Ye Xiaomeng, Lyu Muyang, Timothy Aw Bang Hao.

## Acknowledgements

This work builds on [MedPLIB](https://arxiv.org/abs/2412.09278), [SAM-Med2D](https://arxiv.org/abs/2308.16184) and the [BRISC 2025 dataset](https://www.nature.com/articles/s41597-026-06753-y). We thank their authors for releasing code, weights and data.