RSNA 2024 Lumbar Spine Degenerative Classification¶
Modality: MRI | Format: DICOM (per-series volumes) | Dim: 3D | Labels: 75 severity columns
Overview¶
The RSNA 2024 Lumbar Spine Degenerative Classification challenge dataset contains MRI studies of the lumbar spine labelled for five degenerative conditions at five lumbar levels (L1/L2 through L5/S1), giving 25 condition–level combinations. Each is labelled Normal/Mild, Moderate, or Severe — encoded as 75 one-hot severity columns (3 per condition-level pair). Three MRI series types are available per study: Axial T2, Sagittal T1, and Sagittal T2/STIR.
Download¶
Available on Kaggle: RSNA 2024 Lumbar Spine. Requires Kaggle account.
Expected layout¶
rsna-2024-lumbar-spine-degenerative-classification/
train.csv
train_series_descriptions.csv
train_label_coordinates.csv # point annotations (optional)
train_images/
<study_id>/
<series_id>/
<instance_number>.dcm
Label columns¶
75 columns in the format <condition>_<level>_<severity>:
Conditions: spinal_canal_stenosis, left_neural_foraminal_narrowing, right_neural_foraminal_narrowing, left_subarticular_stenosis, right_subarticular_stenosis
Levels: l1_l2, l2_l3, l3_l4, l4_l5, l5_s1
Severities: normal_mild, moderate, severe
Example: spinal_canal_stenosis_l1_l2_normal_mild, spinal_canal_stenosis_l1_l2_moderate, spinal_canal_stenosis_l1_l2_severe
Constructor arguments¶
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
base_image_dir |
str |
Yes | None |
train_images/ (or test_images/ for the test split) — direct parent of <study_id>/<series_id>/ (e.g. ~/datasets/competitions/rsna-2024-lumbar-spine-degenerative-classification/train_images/) |
csv_path |
str |
No | auto | train.csv; auto-discovered |
series_description_csv_path |
str |
No | auto | train_series_descriptions.csv |
coord_csv_path |
str |
No | auto | train_label_coordinates.csv for point bbox annotations |
series_filter |
str\|None |
No | None |
Load only one series type: "Axial T2", "Sagittal T1", or "Sagittal T2/STIR" |
Shared arguments (inherited from BaseRadiologicalDataset)¶
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
output_cls |
bool |
No | False |
Include "cls" tensor 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¶
The constructor arguments above apply to both RSNA2024LumbarSpineTrainDataset and RSNA2024LumbarSpineTestDataset. The test split has no labels — output_cls and output_bbox are silently ignored, and only series_description_csv_path is needed (no train.csv or coords CSV).
Train split¶
import torch
from radharmony.dataset import RSNA2024LumbarSpineTrainDataset
# Load Sagittal T2/STIR series only
ds = RSNA2024LumbarSpineTrainDataset(
base_image_dir="/data/rsna-2024-lumbar-spine/train_images/",
series_filter="Sagittal T2/STIR",
output_cls=True,
dtype=torch.float32,
)
train_ds, val_ds = ds.get_datasets(n_splits=5)
Test split¶
from radharmony.dataset import RSNA2024LumbarSpineTestDataset
ds = RSNA2024LumbarSpineTestDataset(
base_image_dir="/data/rsna-2024-lumbar-spine/test_images/",
series_filter="Sagittal T2/STIR",
dtype=torch.float32,
)
Harmonizer¶
from radharmony.harmonizer import RSNA2024LumbarSpineTrainHarmonizer
h = RSNA2024LumbarSpineTrainHarmonizer(
csv_path="/data/rsna-2024-lumbar-spine/train.csv",
base_image_dir="/data/rsna-2024-lumbar-spine/train_images/",
series_description_csv_path="/data/rsna-2024-lumbar-spine/train_series_descriptions.csv",
)
df = h.harmonize()
print(df.columns.tolist())
df.to_csv("rsna_lumbar_harmonized.csv", index=False)
Load from saved harmonized CSV¶
import pandas as pd
from radharmony.dataset import RSNA2024LumbarSpineTrainDataset
ds = RSNA2024LumbarSpineTrainDataset(
base_image_dir="/data/rsna-2024-lumbar-spine/train_images/",
harmonized_df=pd.read_csv("rsna_lumbar_harmonized.csv"),
output_cls=True,
)
Harmonizer notes¶
image_pathpoints to a series directory; ITKReader loads it as a 3D volume- Labels are one-hot encoded across three severity levels per condition-level pair
series_filteris applied at load time to select a subset of series types- Point annotations from
train_label_coordinates.csvare represented as small dot bounding boxes whenoutput_bbox=True - Each study may contribute up to 3 rows (one per series type) unless filtered
Outputs¶
| Flag | Key | Shape | Notes |
|---|---|---|---|
output_cls=True |
"cls" |
(75,) |
One-hot severity across 25 condition-level pairs |
output_bbox=True |
"bbox", "bbox_labels" |
list | Point annotations as dot boxes |
Example paths¶
| Role | Path |
|---|---|
base_image_dir (train) |
/path/to/rsna-2024-lumbar-spine-degenerative-classification/train_images/ |
base_image_dir (test) |
/path/to/rsna-2024-lumbar-spine-degenerative-classification/test_images/ |
csv_path (train.csv) |
/path/to/rsna-2024-lumbar-spine-degenerative-classification/train.csv |
series_desc_csv_path (train_series_descriptions.csv) |
/path/to/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv |
label_coord_csv_path (train_label_coordinates.csv) |
/path/to/rsna-2024-lumbar-spine-degenerative-classification/train_label_coordinates.csv |