Datasets 文档
创建 NIfTI 数据集
并获得增强的文档体验
开始使用
创建 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=FalseNifti 特征支持 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.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_xNifti 特征同样适用于压缩的数据集 —— 每个 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()