Datasets documentation

إنشاء مجموعة بيانات NIfTI

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
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.

يمكنك التحكم في الوصول إلى مجموعة بياناتك من خلال اشتراط مشاركة المستخدمين لمعلومات التواصل الخاصة بهم أولاً. اطّلع على دليل مجموعات البيانات المُقيَّدة لمزيد من المعلومات.

الملفات المحلية

إذا كان لديك بالفعل قائمة بمسارات ملفات إلى ملفات 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.

اتفاقيات المجلدات والبيانات الوصفية

إذا نظّمت مجموعة بياناتك في مجلدات، يمكنك إنشاء تقسيمات تلقائية (تدريب/اختبار/تحقق) باتباع بنية مثل:

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 مع مجموعات البيانات المضغوطة أيضًا — حيث يمكن أن يحتوي كل ملف مضغوط على ملفات 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]) إلى إرجاع تينسورات torch في المفتاح "nifti_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