Datasets documentation
Tạo một tập dữ liệu NIfTI
Tạo một tập dữ liệu NIfTI
Trang này cho thấy cách tạo và chia sẻ một tập dữ liệu hình ảnh y tế ở định dạng NIfTI (.nii / .nii.gz) bằng thư viện datasets.
Bạn có thể chia sẻ một tập dữ liệu với nhóm của mình hoặc với bất kỳ ai trong cộng đồng bằng cách tạo một kho dữ liệu trên Hugging Face Hub:
from datasets import load_dataset
dataset = load_dataset("<username>/my_nifti_dataset")Có hai cách phổ biến để tạo một tập dữ liệu NIfTI:
- Tạo một dataset từ các tệp NIfTI cục bộ bằng Python và tải lên bằng
Dataset.push_to_hub. - Sử dụng quy ước dựa trên thư mục (một tệp cho mỗi ví dụ) và một hàm trợ giúp nhỏ để chuyển đổi nó thành
Dataset.
Bạn có thể kiểm soát quyền truy cập vào bộ dữ liệu của mình bằng cách yêu cầu người dùng chia sẻ thông tin liên hệ trước. Xem hướng dẫn Datasets có kiểm soát để biết thêm thông tin.
Tệp cục bộ
Nếu bạn đã có danh sách các đường dẫn tệp đến các tệp NIfTI, quy trình dễ nhất là tạo một Dataset từ danh sách đó và chuyển kiểu cột sang đặc trưng 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=FalseTính năng Nifti hỗ trợ tham số decode. Khi decode=True (mặc định), nó tải tệp NIfTI vào một đối tượng nibabel.nifti1.Nifti1Image. Bạn có thể truy cập dữ liệu ảnh dưới dạng mảng numpy bằng img.get_fdata(). Khi decode=False, nó trả về một dict chứa đường dẫn tệp và bytes.
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()Sau khi chuẩn bị xong bộ dữ liệu, bạn có thể đẩy nó lên Hub:
ds.push_to_hub("<username>/my_nifti_dataset")Điều này sẽ tạo một kho dữ liệu chứa bộ dữ liệu NIfTI của bạn với thư mục data/ chứa các shard parquet.
Quy ước thư mục và metadata
Nếu bạn tổ chức bộ dữ liệu của mình trong các thư mục, bạn có thể tạo các phần chia (train/test/validation) một cách tự động bằng cách tuân theo cấu trúc như:
dataset/train/scan_0001.nii
dataset/train/scan_0002.nii
dataset/validation/scan_1001.nii
dataset/test/scan_2001.niiNếu bạn có nhãn hoặc các metadata khác, hãy cung cấp một metadata.csv, metadata.jsonl, hoặc metadata.parquet trong thư mục để các tệp có thể được liên kết với các dòng metadata. Metadata phải chứa trường file_name (hoặc *_file_name) với đường dẫn tương đối đến tệp NIfTI nằm cạnh tệp metadata.
Ví dụ metadata.csv:
file_name,patient_id,age,diagnosis
scan_0001.nii.gz,P001,45,healthy
scan_0002.nii.gz,P002,59,disease_xTính năng Nifti hoạt động với cả các bộ dữ liệu nén — mỗi tệp zip có thể chứa các tệp NIfTI và một tệp metadata. Điều này hữu ích khi tải lên các bộ dữ liệu lớn dưới dạng các tệp lưu trữ.
Điều này có nghĩa là cấu trúc bộ dữ liệu của bạn có thể trông như sau (kết hợp tệp nén và tệp không nén):
dataset/train/scan_0001.nii.gz
dataset/train/scan_0002.nii
dataset/validation/scan_1001.nii.gz
dataset/test/scan_2001.niiChuyển đổi sang tensor PyTorch
Sử dụng hàm set_transform() để áp dụng phép biến đổi trực tiếp lên các lô dữ liệu của tập dữ liệu:
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)
Việc truy cập các phần tử bây giờ (ví dụ ds[0]) sẽ trả về các tensor torch trong khóa "nifti_torch".
Cách sử dụng NifTI1Image
NifTI là định dạng để lưu trữ kết quả của các lần quét não 3 (hoặc thậm chí 4) chiều. Điều này bao gồm 3 chiều không gian (x,y,z) và tùy chọn một chiều thời gian (t). Hơn nữa, các vị trí được cho ở đây chỉ là tương đối so với máy quét, do đó các chiều (4, 5, 6) được sử dụng để nâng chúng lên tọa độ thực tế.
Bạn có thể trực quan hóa các tệp nifti, chẳng hạn bằng cách sử dụng matplotlib như sau:
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()