Datasets 文档

创建 NIfTI 数据集

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

创建 NIfTI 数据集

本页将展示如何使用 datasets 库来创建和分享 NIfTI 格式 (.nii / .nii.gz) 的医学图像数据集。

您可以通过在 Hugging Face Hub 上创建数据集仓库,将数据集与您的团队或社区中的任何人共享。

from datasets import load_dataset

dataset = load_dataset("<username>/my_nifti_dataset")

创建 NIfTI 数据集有两种常用的方法:

  • 在 Python 中通过本地 NIfTI 文件创建数据集,并使用 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 对象。您可以使用 img.get_fdata() 将图像数据作为 numpy 数组访问。当 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 数据集的数据集仓库,其中包含一个存放 parquet 分片的 data/ 文件夹。

文件夹约定与元数据

如果您将数据集组织在文件夹中,可以通过遵循以下结构自动创建数据集划分(训练集/测试集/验证集):

dataset/train/scan_0001.nii
dataset/train/scan_0002.nii
dataset/validation/scan_1001.nii
dataset/test/scan_2001.nii

如果您有标签或其他元数据,请在文件夹中提供 metadata.csvmetadata.jsonlmetadata.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 是一种用于存储 3(甚至 4)维脑扫描结果的格式。这包括 3 个空间维度 (x,y,z) 和可选的时间维度 (t)。此外,这里给出的位置仅相对于扫描仪,因此使用维度 (4, 5, 6) 将其提升到真实世界坐标。

例如,您可以使用 matplotlib 按如下方式可视化 nifti 文件:

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 教程

在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.