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

تُظهر هذه الصفحة كيفية إنشاء ومشاركة مجموعة بيانات من الصور الطبية بصيغة NIfTI (.nii / .nii.gz) باستخدام مكتبة `datasets`.

يمكنك مشاركة مجموعة بيانات مع فريقك أو مع أي شخص في المجتمع من خلال إنشاء مستودع مجموعة بيانات على Hugging Face Hub:

```py
from datasets import load_dataset

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

هناك طريقتان شائعتان لإنشاء مجموعة بيانات NIfTI:

- أنشئ مجموعة بيانات من ملفات NIfTI المحلية في Python وارفعها باستخدام `Dataset.push_to_hub`.
- استخدم اتفاقية مبنية على المجلدات (ملف واحد لكل مثال) ومساعد صغير لتحويلها إلى `Dataset`.

> [!TIP]
> يمكنك التحكم في الوصول إلى مجموعة بياناتك من خلال اشتراط مشاركة المستخدمين لمعلومات التواصل الخاصة بهم أولاً. اطّلع على دليل [مجموعات البيانات المُقيَّدة](https://huggingface.co/docs/hub/datasets-gated) لمزيد من المعلومات.

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

إذا كان لديك بالفعل قائمة بمسارات ملفات إلى ملفات NIfTI، فإن أسهل سير عمل هو إنشاء `Dataset` من تلك القائمة ثم تحويل العمود إلى ميزة `Nifti`.

```py
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`، تُرجع الدالة قاموسًا يحتوي على مسار الملف والبايتات.

```py
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:

```py
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`:

```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()](/docs/datasets/v5.2.0/ar/package_reference/main_classes#datasets.Dataset.set_transform) لتطبيق التحويل على دفعات مجموعة البيانات أثناء التشغيل:

```py
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` على النحو التالي:
```python
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](https://nipy.org/nibabel/index.html) ولا سيما [هذا الشرح التعليمي لـ nibabel](https://nipy.org/nibabel/coordinate_systems.html) ---

