Datasets documentation

Создание набора данных NIfTI

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Создание набора данных 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()

Для дальнейшего изучения мы отсылаем к документации nibabel и, в частности, к этому учебнику по nibabel

Update on GitHub