Mashrafi2827/CT-SpatialVQA
CT-SpatialVQA CT-SpatialVQA is a benchmark for evaluating semantic-spatial reasoning in 3D CT, derived from the CT-RATE dataset. Stat Value CT volumes 1,601 (CT-RATE validation split) QA pairs 9,077 Spatial Categories Questions are designed to require explicit spatial grounding across six categories: Laterality & Bilateral Symmetry — left vs. right, bilateral involvement Longitudinal (Vertical) Position — superior/inferior, upper/middle/lower… See the full description on the dataset page: https://huggingface.co/datasets/Mashrafi2827/CT-SpatialVQA.
CT-SpatialVQA
CT-SpatialVQA is a benchmark for evaluating semantic-spatial reasoning in 3D CT, derived from the CT-RATE dataset.
Spatial Categories
Questions are designed to require explicit spatial grounding across six categories:
- Laterality & Bilateral Symmetry — left vs. right, bilateral involvement
- Longitudinal (Vertical) Position — superior/inferior, upper/middle/lower zones
- Anterior-Posterior (Depth) Relations — anterior vs. posterior structures
- Medial-Lateral Orientation — central, peripheral, medial, lateral
- Adjacency & Containment — what is adjacent to or within a structure
- Spatial Extent & Boundaries — size, borders, distribution
CT Volume Previews
CT volumes are sourced from CT-RATE and are not distributed here. Previews below show axial / coronal / sagittal center slices for a few cases.
<!-- Preview images are uploaded via generatepreviewimages.py --> <!-- Replace the lines below with actual uploaded preview filenames --> <!-- -->
Dataset Schema
Each row is one QA pair:
Loading the Dataset
from datasets import load_dataset
ds = load_dataset("Mash27/CT-SpatialVQA", split="test")
print(ds[0])
# {
# 'case_id': 'valid_1000_a_1.nii.gz',
# 'ctrate_path': 'dataset/valid_fixed/valid_1000/valid_1000_a/valid_1000_a_1.nii.gz',
# 'question': 'Are there any pathologically enlarged lymph nodes ...',
# 'answer': 'No pathologically enlarged lymph nodes were detected ...'
# }Resolving CT Volumes
CT volumes come from ibrahimhamamci/CT-RATE (gated — requires acceptance of their terms).
from pathlib import Path
from huggingface_hub import hf_hub_download
from datasets import load_dataset
ds = load_dataset("Mash27/CT-SpatialVQA", split="test")
# deduplicate — multiple QA pairs share the same volume
unique_paths = {row["ctrate_path"] for row in ds}
for ctrate_path in unique_paths:
p = Path(ctrate_path)
hf_hub_download(
repo_id="ibrahimhamamci/CT-RATE",
repo_type="dataset",
subfolder=str(p.parent),
filename=p.name,
token="YOUR_HF_TOKEN",
local_dir="./ct_volumes",
local_dir_use_symlinks=False,
)
# 1,601 volumes saved to ./ct_volumes/<ctrate_path>This downloads all 1,601 CT volumes used in this benchmark (the full CT-RATE validation split). Each volume will be at ./ct_volumes/<ctrate_path>, matching the ctrate_path field directly.
Running Evaluation
Once volumes are downloaded, iterate over QA pairs and load each volume by its ctrate_path:
import nibabel as nib
import numpy as np
from pathlib import Path
from datasets import load_dataset
ds = load_dataset("Mash27/CT-SpatialVQA", split="test")
volumes_root = Path("./ct_volumes")
for row in ds:
volume_path = volumes_root / row["ctrate_path"]
ct = nib.load(volume_path).get_fdata() # shape: (H, W, D)
question = row["question"]
reference_answer = row["answer"]
# pass ct + question to your model, compare output to reference_answer
predicted_answer = your_model(ct, question)Citation
If you use CT-SpatialVQA, please cite our paper and also cite CT-RATE:
@article{monon2026ctspatialvqa,
title={Lost in Volume: The CT-SpatialVQA Benchmark for Evaluating Semantic-Spatial Understanding of 3D Medical Vision-Language Models},
author={Monon, Mashrafi and Rahman, Umaima and Hanif, Asif and Saeed, Numan and Yaqub, Mohammad},
journal={arXiv preprint arXiv:2605.08787},
year={2026}
}
@article{ct-rate,
title={Generalist foundation models from a multimodal dataset for 3D computed tomography},
author={Hamamci, Ibrahim Ethem and Er, Sezgin and Wang, Chenyu and others},
journal={Nature Biomedical Engineering},
year={2026}
}