RadSight: Towards Perceptually Reliable Multimodal Radiology Image Understanding
RadSight
Research use only. RadSight is not a medical device and must not be used
for autonomous diagnosis, triage, treatment decisions, or patient-facing
medical advice. Model outputs may be incomplete, incorrect, or hallucinated
and must be reviewed by qualified healthcare professionals.
RadSight is a perception-driven medical multimodal large language model (MLLM)
for unified understanding of 2D radiology images and native 3D CT volumes. It
uses modality-specific 2D and 3D visual encoders and a shared language-model
interface to support tasks ranging from fine-grained visual perception to
clinical diagnosis and radiology report generation.
RadSight is trained with a four-stage progressive curriculum:
- visual-language alignment;
- fine-grained visual perception;
- clinical diagnosis;
- diagnostic interpretation.
The model is designed to learn explicit visual evidence—such as lesion
attributes and spatial correspondence—before producing higher-level diagnostic
or report-level outputs.
Model family
| Model | Language backbone | Supported visual inputs | Checkpoint precision |
|---|
| RadSight-4B | Qwen3-VL-4B | 2D images and 3D CT volumes | BF16 |
| RadSight-8B | Qwen3-VL-8B | 2D images and 3D CT volumes | BF16 |
The 4B and 8B names refer to the language-backbone scale. The complete
multimodal checkpoints also include visual encoders and projectors; therefore,
the total parameter counts displayed by the Hugging Face interface may be
larger than the variant names.
Model sources
Quick start
1. Install the project
The released checkpoints use custom RadSight model and preprocessing code.
They are not intended to be loaded as a standard text-only Transformers model.
1git clone https://github.com/alibaba-damo-academy/damo-RadSight.git
2cd damo-RadSight
3
4conda create -n radsight python=3.10 -y
5conda activate radsight
6
7pip install torch==2.7.0 torchvision==0.22.0 \
8 --index-url https://download.pytorch.org/whl/cu124
9pip install -r requirements.txt
10pip install flash-attn --no-build-isolation
CUDA 12 or later is recommended. Building Flash Attention 2 requires a CUDA
toolkit compatible with the installed PyTorch version.
2. Download a checkpoint and the 2D visual encoder
1# Choose one RadSight variant.
2hf download unstoppableljq/RadSight-4B \
3 --local-dir ./weights/RadSight-4B
4
5# For RadSight-8B, use:
6# hf download unstoppableljq/RadSight-8B \
7# --local-dir ./weights/RadSight-8B
8
9hf download DAMO-NLP-SG/VL3-SigLIP-NaViT \
10 --local-dir ./weights/VL3-SigLIP-NaViT
3. Configure the visual-encoder path
Before loading the checkpoint, edit its config.json and set
vision_encoder to the local SigLIP-NaViT directory:
1{
2 "vision_encoder": "/absolute/path/to/weights/VL3-SigLIP-NaViT"
3}
This step is required because the released configuration may contain an
environment-specific path. Using a local path also prevents unexpected network
access while the model is being loaded.
4. Run inference
The following example supports both 2D images and 3D CT volumes. Set modal,
visual_input, and the conversation placeholder consistently.
1import torch
2
3from radsight.model import load_pretrained_model
4from radsight.mm_utils import (
5 get_model_name_from_path,
6 load_3D,
7 load_images,
8)
9from radsight.model.processor import RadSightProcessor
10
11
12model_path = "./weights/RadSight-4B"
13model_name = get_model_name_from_path(model_path)
14
15tokenizer, model, image_processor, context_len = load_pretrained_model(
16 model_path,
17 None,
18 model_name,
19 device_map={"": "cuda:0"},
20)
21processor = RadSightProcessor(image_processor, tokenizer)
22model.config.use_token_compression = False
23
24# ----- Option A: 2D image -----
25modal = "image"
26visual_input = load_images("./example_xray.jpg")
27conversation = [
28 {
29 "role": "user",
30 "content": [
31 {"type": "image"},
32 {
33 "type": "text",
34 "text": "Please generate a radiology report for this image.",
35 },
36 ],
37 }
38]
39
40# ----- Option B: 3D CT volume -----
41# modal = "volume"
42# visual_input = load_3D("./example_ct.nii.gz")["image"]
43# conversation = [
44# {
45# "role": "user",
46# "content": [
47# {"type": "video", "num_frames": 12},
48# {
49# "type": "text",
50# "text": "Please generate a radiology report for this CT scan.",
51# },
52# ],
53# }
54# ]
55
56inputs = processor(
57 images=[visual_input],
58 text=conversation,
59 merge_size=1,
60 modal=modal,
61 return_tensors="pt",
62)
63inputs = {
64 key: value.cuda() if isinstance(value, torch.Tensor) else value
65 for key, value in inputs.items()
66}
67if "pixel_values" in inputs:
68 inputs["pixel_values"] = inputs["pixel_values"].to(torch.bfloat16)
69
70with torch.inference_mode():
71 output_ids = model.generate(
72 **inputs,
73 do_sample=False,
74 modals=[modal],
75 max_new_tokens=8192,
76 use_cache=True,
77 pad_token_id=tokenizer.eos_token_id,
78 )
79
80output = tokenizer.batch_decode(
81 output_ids,
82 skip_special_tokens=True,
83)[0].strip()
84print(output)
For reproducible evaluation, use deterministic decoding (do_sample=False) and
the same prompts, preprocessing, and output parsing rules as the corresponding
benchmark.
Preprocessing
For 2D images, the default training resolution is 448 × 448.
For 3D CT volumes:
- volumes are resampled to
1 × 1 × 5 mm spacing;
- Hounsfield units are clipped to
[-1000, 1000] and normalized to [0, 1];
- volumes are cropped or padded to
96 × 256 × 384; and
- the same orientation, spacing, intensity, and crop/pad conventions should be
preserved during evaluation.
Differences in preprocessing can substantially affect spatial grounding,
anomaly detection, and report-generation results.
Training procedure
| Stage | Objective | Main supervision |
|---|
| 1 | Visual-language alignment | 2D/3D image-report pairs |
| 2 | Fine-grained visual perception | Attribute judgment, spatial grounding, and spatial understanding |
| 3 | Clinical diagnosis | Disease prediction and abnormality detection |
| 4 | Radiology report generation | Chest X-ray and CT reports |
The checkpoints were trained in BF16 with a progressive curriculum. The
training implementation uses PyTorch, Transformers, DeepSpeed, Flash Attention
2, gradient checkpointing, and distributed training. Refer to the project
repository and paper for complete stage-specific hyperparameters.
Citation
If you use RadSight in your research, please cite:
1@article{liu2026radsight,
2 title = {RadSight: Towards Perceptually Reliable Multimodal Radiology Image Understanding},
3 author = {Liu, Jianqin and Cao, Weiwei and Chang, Wanxing and Yuan, Ruifeng
4 and Shi, Bowen and Zheng, Zhilin and Zhang, Xianjie and Zhang, Ling
5 and Wang, Peng and Zhang, Jianpeng},
6 journal = {Preprint},
7 year = {2026}
8}
The paper URL and bibliographic record will be updated after the preprint is
publicly available.
Acknowledgements
RadSight builds on open-source work including VideoLLaMA3, Qwen3-VL, MONAI,
nnU-Net, TotalSegmentator, and RADAR. We thank the creators and maintainers of
the public medical datasets used in this research.
Contact
For research questions, please contact
liujianqin1@gmail.com.