Datasets documentation
Создание набора данных NIfTI
Создание набора данных NIfTI
На этой странице показано, как создать и опубликовать набор медицинских изображений в формате NIfTI (.nii / .nii.gz) с помощью библиотеки datasets.
Вы можете поделиться набором данных со своей командой или с любым участником сообщества, создав репозиторий набора данных на Hugging Face Hub:
from datasets import load_dataset
dataset = load_dataset("<username>/my_nifti_dataset")Существует два распространённых способа создания набора данных NIfTI:
- Создайте набор данных из локальных файлов NIfTI в Python и загрузите его с помощью
Dataset.push_to_hub. - Используйте файловую структуру (один файл на пример) и небольшой вспомогательный инструмент для преобразования её в
Dataset.
Вы можете управлять доступом к вашему набору данных, требуя от пользователей сначала предоставить контактные данные. Подробнее см. в руководстве Gated datasets.
Локальные файлы
Если у вас уже есть список путей к файлам NIfTI, самый простой рабочий процесс — создать Dataset из этого списка и привести столбец к типу Nifti.
from datasets import Dataset
from datasets import Nifti
# simple example: create a dataset from file paths
files = ["/path/to/scan_001.nii.gz", "/path/to/scan_002.nii.gz"]
ds = Dataset.from_dict({"nifti": files}).cast_column("nifti", Nifti())
# access a decoded nibabel image (if decode=True)
# ds[0]["nifti"] will be a nibabel.Nifti1Image object when decode=True
# or a dict {'bytes': None, 'path': '...'} when decode=FalseВозможность Nifti поддерживает параметр decode. Если decode=True (значение по умолчанию), файл NIfTI загружается в объект nibabel.nifti1.Nifti1Image. Доступ к данным изображения в виде массива numpy можно получить с помощью img.get_fdata(). Если decode=False, возвращается словарь с путём к файлу и байтами.
from datasets import Dataset, Nifti
ds = Dataset.from_dict({"nifti": ["/path/to/scan.nii.gz"]}).cast_column("nifti", Nifti(decode=True))
img = ds[0]["nifti"] # instance of: nibabel.nifti1.Nifti1Image
arr = img.get_fdata()После подготовки набора данных вы можете загрузить его в Hub:
ds.push_to_hub("<username>/my_nifti_dataset")Это создаст репозиторий датасета, содержащий ваш набор данных NIfTI с папкой data/ с фрагментами в формате parquet.
Соглашения о папках и метаданные
Если вы организуете набор данных в папках, вы можете автоматически создать разбиения (train/test/validation), следуя структуре, подобной следующей:
dataset/train/scan_0001.nii
dataset/train/scan_0002.nii
dataset/validation/scan_1001.nii
dataset/test/scan_2001.niiЕсли у вас есть метки или другие метаданные, добавьте в папку файл metadata.csv, metadata.jsonl или metadata.parquet, чтобы файлы можно было сопоставить со строками метаданных. Метаданные должны содержать поле file_name (или *_file_name) с относительным путём к файлу NIfTI, расположенному рядом с файлом метаданных.
Пример metadata.csv:
file_name,patient_id,age,diagnosis
scan_0001.nii.gz,P001,45,healthy
scan_0002.nii.gz,P002,59,disease_xВозможность Nifti также работает с датасетами в формате zip — каждый архив может содержать файлы NIfTI и файл метаданных. Это удобно при загрузке больших датасетов в виде архивов.
В таком случае структура вашего датасета может выглядеть следующим образом (смешанные сжатые и несжатые файлы):
dataset/train/scan_0001.nii.gz
dataset/train/scan_0002.nii
dataset/validation/scan_1001.nii.gz
dataset/test/scan_2001.niiПреобразование в тензоры PyTorch
Используйте функцию set_transform(), чтобы применять преобразование к батчам датасета на лету:
import torch
import nibabel
import numpy as np
def transform_to_pytorch(example):
example["nifti_torch"] = [torch.tensor(ex.get_fdata()) for ex in example["nifti"]]
return example
ds.set_transform(transform_to_pytorch)
Теперь при обращении к элементам (например, ds[0]) в ключе "nifti_torch" будут возвращаться тензоры torch.
Использование NifTI1Image
NifTI — это формат для хранения результатов трёхмерных (а иногда и четырёхмерных) сканирований мозга. Он включает три пространственных измерения (x, y, z) и, при необходимости, временное измерение (t). Кроме того, указанные здесь координаты являются относительными по отношению к сканеру, поэтому измерения (4, 5, 6) используются для перехода к реальным мировым координатам.
Вы можете визуализировать файлы nifti, например, с помощью matplotlib, следующим образом:
import matplotlib.pyplot as plt
from datasets import load_dataset
def show_slices(slices):
""" Function to display row of image slices """
fig, axes = plt.subplots(1, len(slices))
for i, slice in enumerate(slices):
axes[i].imshow(slice.T, cmap="gray", origin="lower")
nifti_ds = load_dataset("<username>/my_nifti_dataset")
for epi_img in nifti_ds:
nifti_img = epi_img["nifti"].get_fdata()
show_slices([nifti_img[:, :, 16], nifti_img[26, :, :], nifti_img[:, 30, :]])
plt.show()