scarlettlin/VietPET-RoI
VietPET-RoI VietPET-RoI is a Vietnamese whole-body PET/CT dataset containing paired cropped 3D volumes, regional reports, and modality-specific 3D ROI bounding boxes. It is intended for medical multimodal research, report generation, visual question answering, and ROI grounding. Research use only. This dataset is not intended for diagnosis, treatment decisions, or direct patient care. Summary Split Patients CT/PET region pairs ROIs Train 160 480 1,544… See the full description on the dataset page: https://huggingface.co/datasets/scarlettlin/VietPET-RoI.
VietPET-RoI
VietPET-RoI is a Vietnamese whole-body PET/CT dataset containing paired cropped 3D volumes, regional reports, and modality-specific 3D ROI bounding boxes. It is intended for medical multimodal research, report generation, visual question answering, and ROI grounding.
Research use only. This dataset is not intended for diagnosis, treatment decisions, or direct patient care.
Summary
Each patient has head_neck, chest, and abdomen_pelvis crops. Train and validation are patient-disjoint. The six disease groups are lymphoma, lung, esophageal, thyroid, colorectal, and head-and-neck cancer. Reports and ROI descriptions are in Vietnamese.
Files
train.json,val.json: CT, PET, and report paths.train_roi.json,val_roi.json: split-specific ROI annotations.combined_roi_reformat.json: canonical annotations for all 600 region pairs.- Disease directories:
.npyvolumes, regional reports, and markup files.
Volumes use (z, y, x) array order:
- CT:
(D, 512, 512),int32 - PET:
(D, 256, 256),float64
The arrays are not normalized. The complete dataset is approximately 135 GiB.
Download and load
pip install huggingface_hub numpyfrom huggingface_hub import snapshot_download
root = snapshot_download(
repo_id="b00l26/VietPET-RoI",
repo_type="dataset",
local_dir="VietPET-RoI",
)import json
from pathlib import Path
import numpy as np
root = Path(root)
train = json.loads((root / "train.json").read_text(encoding="utf-8"))
sample = train[0]
ct = np.load(root / sample["ct_img_path"], mmap_mode="r")
pet = np.load(root / sample["pet_img_path"], mmap_mode="r")
report = json.loads(
(root / sample["report_path"]).read_text(encoding="utf-8")
)To download only the manifests, add:
allow_patterns=["README.md", "*.json"]to snapshot_download.
ROI coordinates
combined_roi_reformat.json stores each box as:
[x_min, y_min, z_min, x_max, y_max, z_max]Coordinates are zero-based and relative to the cropped volume. CT and PET have separate boxes because their in-plane resolutions differ. Use upper bounds as exclusive Python slice endpoints:
data = json.loads(
(root / "combined_roi_reformat.json").read_text(encoding="utf-8")
)
sample = data["samples"][0]
roi = sample["rois"][0]
ct = np.load(root / sample["modalities"]["ct"], mmap_mode="r")
x1, y1, z1, x2, y2, z2 = roi["modalities"]["ct"]
ct_roi = ct[z1:z2, y1:y2, x1:x2]The source-volume z coordinate is z_in_crop + z_offset. Physical-space geometry and voxel spacing are not included in the manifests.
Known issues
train_roi.jsonandval_roi.jsoncurrently use_processed.npypaths, while released files omit_processed. Replace_processed.npywith.npy, or use the paths intrain.json,val.json, orcombined_roi_reformat.json.- PET values should not be assumed to be standardized SUV units.
Reports may contain demographic and examination metadata. Treat the dataset as sensitive health data and do not attempt to re-identify individuals.
License
Citation
@inproceedings{nguyen2026region,
title={Region-Grounded Report Generation for 3D Medical Imaging: A Fine-Grained Dataset and Graph-Enhanced Framework},
author={Nguyen, Cong Huy and Nguyen, Son Dinh and Li, Guanlin and Nguyen, Tuan Dung and Sankaran, Aditya Narayan and Thong, Mai Huy and Nguyen, Thanh Trung and Son, Mai Hong and Farahbakhsh, Reza and Le Nguyen, Phi and others},
booktitle={Proceedings of the 64th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)},
pages={19725--19740},
year={2026}
}