VinDr-CXR¶
Modality: CXR | Format: DICOM | Dim: 2D | Labels: 28 findings
Overview¶
VinDr-CXR is a large-scale chest X-ray dataset from Vietnam containing 18,000 CXR scans annotated by a panel of experienced radiologists. It provides image-level classification labels and bounding box annotations for 28 critical findings. The dataset is split into train (15,000) and test (3,000) sets with separate annotation files.
Download¶
Available from PhysioNet: VinDr-CXR. Requires CITI training and signed DUA.
Expected layout¶
vindr-cxr/1.0.0/
train/
image_labels_train.csv
annotations_train.csv
<image_id>.dicom
test/
image_labels_test.csv
annotations_test.csv
<image_id>.dicom
Label columns¶
28 findings (same for train and test):
aortic_enlargement, atelectasis, calcification, cardiomegaly, clavicle_fracture, consolidation, copd, edema, emphysema, enlarged_pa, ild, infiltration, lung_cavity, lung_cyst, lung_opacity, lung_tumor, mediastinal_shift, no_finding, nodule/mass, other_diseases, other_lesion, pleural_effusion, pleural_thickening, pneumonia, pneumothorax, pulmonary_fibrosis, rib_fracture, tuberculosis
Constructor arguments¶
Both VinDrCXRTrainDataset and VinDrCXRTestDataset share the same signature:
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
base_image_dir |
str |
Yes | None |
Split-specific dir — train/ or test/ — flat directory of <image_id>.dicom files (e.g. /data/VinDr-CXR/vindr-cxr/1.0.0/train/) |
csv_path |
str |
No | auto | Image-level labels CSV — image_labels_train.csv (train) / image_labels_test.csv (test); auto-discovered under base_image_dir, then sibling dirs |
bbox_csv_path |
str |
No | auto | Bounding box annotations CSV; auto-discovered |
Shared arguments (inherited from BaseRadiologicalDataset)¶
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
output_cls |
bool |
No | False |
Include "cls" in data dict |
output_mask |
bool |
No | False |
Include "mask" in data dict |
output_report |
bool |
No | False |
Include "report" in data dict |
output_bbox |
bool |
No | False |
Include "bbox" and "bbox_labels" in data dict |
transform |
MONAI transform | No | None |
MONAI Compose transform; None uses the default pipeline |
cache_dir |
str |
No | "./cache" |
MONAI cache directory |
dtype |
torch.dtype |
No | torch.bfloat16 |
Output tensor dtype |
harmonized_df |
pd.DataFrame |
No | None |
Pre-built harmonized DataFrame |
harmonizer |
harmonizer | No | None |
Pre-instantiated harmonizer |
harmonizer_path |
str |
No | None |
Path to saved harmonized CSV |
Dataset constructor¶
Train split¶
import torch
from radharmony.dataset import VinDrCXRTrainDataset
ds = VinDrCXRTrainDataset(
base_image_dir="/data/VinDr-CXR/vindr-cxr/1.0.0/train/",
output_cls=True,
output_bbox=True,
dtype=torch.float32,
)
train_ds, val_ds = ds.get_datasets(n_splits=5)
Test split¶
from radharmony.dataset import VinDrCXRTestDataset
ds = VinDrCXRTestDataset(
base_image_dir="/data/VinDr-CXR/vindr-cxr/1.0.0/test/",
output_cls=True,
output_bbox=True,
dtype=torch.float32,
)
Harmonizer¶
from radharmony.harmonizer import VinDrCXRTrainHarmonizer
h = VinDrCXRTrainHarmonizer(
csv_path="/data/VinDr-CXR/vindr-cxr/1.0.0/train/image_labels_train.csv",
base_image_dir="/data/VinDr-CXR/vindr-cxr/1.0.0/train/",
bbox_csv_path="/data/VinDr-CXR/vindr-cxr/1.0.0/train/annotations_train.csv",
)
df = h.harmonize()
print(df.columns.tolist())
df.to_csv("vindr_cxr_train_harmonized.csv", index=False)
Load from saved harmonized CSV¶
import pandas as pd
from radharmony.dataset import VinDrCXRTrainDataset
ds = VinDrCXRTrainDataset(
base_image_dir="/data/VinDr-CXR/vindr-cxr/1.0.0/train/",
harmonized_df=pd.read_csv("vindr_cxr_train_harmonized.csv"),
output_cls=True,
)
Harmonizer notes¶
- Image-level CSV provides multi-label classification; annotations CSV provides per-box labels
- Boxes are in pixel space; harmonizer normalises to fractional coordinates
- Multiple annotators may label the same image; labels are consolidated to consensus in the harmonizer
Outputs¶
| Flag | Key | Shape | Notes |
|---|---|---|---|
output_cls=True |
"cls" |
(28,) |
Multi-label binary |
output_bbox=True |
"bbox", "bbox_labels" |
list | One box per finding instance |
Example paths¶
| Role | Path |
|---|---|
base_image_dir (train) |
/path/to/VinDr-CXR/physionet.org/files/vindr-cxr/1.0.0/train/ |
base_image_dir (test) |
/path/to/VinDr-CXR/physionet.org/files/vindr-cxr/1.0.0/test/ |
annotations_csv_path (train) |
/path/to/VinDr-CXR/physionet.org/files/vindr-cxr/1.0.0/annotations/annotations_train.csv |
annotations_csv_path (test) |
/path/to/VinDr-CXR/physionet.org/files/vindr-cxr/1.0.0/annotations/annotations_test.csv |
| image-level labels (train) | /path/to/VinDr-CXR/physionet.org/files/vindr-cxr/1.0.0/annotations/image_labels_train.csv |
| image-level labels (test) | /path/to/VinDr-CXR/physionet.org/files/vindr-cxr/1.0.0/annotations/image_labels_test.csv |