# التجزئة الدلالية

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

قبل أن تبدأ، تأكد من تثبيت أحدث إصدارات من `albumentations` و`cv2`:

```bash
pip install -U albumentations opencv-python
```

[Albumentations](https://albumentations.ai/) هي مكتبة بلغة بايثون لتنفيذ زيادة البيانات (Data Augmentation) في مجال الرؤية الحاسوبية. تدعم مهام الرؤية الحاسوبية المختلفة مثل تصنيف الصور، وكشف الأشياء، والتجزئة، وتقدير النقاط الرئيسية.

يستخدم هذا الدليل مجموعة بيانات [Scene Parsing](https://huggingface.co/datasets/scene_parse_150) لتجزئة وتحليل صورة إلى مناطق مختلفة مرتبطة بفئات دلالية، مثل السماء والطريق والشخص والسرير.

حمّل الجزء `train` من مجموعة البيانات وانظر إلى مثال:

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("scene_parse_150", split="train")
>>> index = 10
>>> dataset[index]
{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=683x512 at 0x7FB37B0EC810>,
 'annotation': <PIL.PngImagePlugin.PngImageFile image mode=L size=683x512 at 0x7FB37B0EC9D0>,
 'scene_category': 927}
```

تحتوي مجموعة البيانات على ثلاثة حقول:

* `image`: كائن صورة من مكتبة PIL.
* `annotation`: قناع تقسيم الصورة.
* `scene_category`: التسمية أو فئة المشهد للصورة (مثل “مطبخ” أو “مكتب”).

التالي، اطّلع على صورة باستخدام:

```py
>>> dataset[index]["image"]
```

    

وبالمثل، يمكنك الاطلاع على قناع التقطيع المقابل:

```py
>>> dataset[index]["annotation"]
```

    

يمكننا أيضًا إضافة [لوحة ألوان](https://github.com/tensorflow/models/blob/3f1ca33afe3c1631b733ea7e40c294273b9e406d/research/deeplab/utils/get_dataset_colormap.py#L51) على قناع التقسيم وتراكبه فوق الصورة الأصلية لتصور مجموعة البيانات:

بعد تحديد لوحة الألوان، يجب أن تكون مستعدًا لتصور بعض التراكبات.

```py
>>> import matplotlib.pyplot as plt

>>> def visualize_seg_mask(image: np.ndarray, mask: np.ndarray):
...    color_seg = np.zeros((mask.shape[0], mask.shape[1], 3), dtype=np.uint8)
...    palette = np.array(create_ade20k_label_colormap())
...    for label, color in enumerate(palette):
...        color_seg[mask == label, :] = color
...    color_seg = color_seg[..., ::-1]  # convert to BGR

...    img = np.array(image) * 0.5 + color_seg * 0.5  # plot the image with the segmentation map
...    img = img.astype(np.uint8)

...    plt.figure(figsize=(15, 10))
...    plt.imshow(img)
...    plt.axis("off")
...    plt.show()

>>> visualize_seg_mask(
...     np.array(dataset[index]["image"]),
...     np.array(dataset[index]["annotation"])
... )
```

    

الآن طبّق بعض عمليات المعالجة باستخدام `albumentations`. ستقوم أولاً بتغيير حجم الصورة وضبط سطوعها.

```py
>>> import albumentations

>>> transform = albumentations.Compose(
...     [
...         albumentations.Resize(256, 256),
...         albumentations.RandomBrightnessContrast(brightness_limit=0.3, contrast_limit=0.3, p=0.5),
...     ]
... )
```

أنشئ دالةً لتطبيق التحويل على الصور:

```py
>>> def transforms(examples):
...     transformed_images, transformed_masks = [], []
...
...     for image, seg_mask in zip(examples["image"], examples["annotation"]):
...         image, seg_mask = np.array(image), np.array(seg_mask)
...         transformed = transform(image=image, mask=seg_mask)
...         transformed_images.append(transformed["image"])
...         transformed_masks.append(transformed["mask"])
...
...     examples["pixel_values"] = transformed_images
...     examples["label"] = transformed_masks
...     return examples
```

استخدم دالة [set_transform()](/docs/datasets/main/ar/package_reference/main_classes#datasets.Dataset.set_transform) لتطبيق التحويل على دفعات مجموعة البيانات أثناء التشغيل لتقليل مساحة القرص المستهلكة:

```py
>>> dataset.set_transform(transforms)
```

يمكنك التحقق من نجاح التحويل عن طريق الوصول إلى `pixel_values` و`label` في مثال:

```py
>>> image = np.array(dataset[index]["pixel_values"])
>>> mask = np.array(dataset[index]["label"])

>>> visualize_seg_mask(image, mask)
```

    

في هذا الدليل، استخدمتَ `albumentations` لزيادة حجم مجموعة البيانات. كما يمكن استخدام `torchvision` لتطبيق بعض التحويلات المشابهة.

```py 
>>> from torchvision.transforms import Resize, ColorJitter, Compose

>>> transformation_chain = Compose([
...     Resize((256, 256)),
...     ColorJitter(brightness=0.25, contrast=0.25, saturation=0.25, hue=0.1)
... ])
>>> resize = Resize((256, 256))

>>> def train_transforms(example_batch):
...     example_batch["pixel_values"] = [transformation_chain(x) for x in example_batch["image"]]
...     example_batch["label"] = [resize(x) for x in example_batch["annotation"]]
...     return example_batch

>>> dataset.set_transform(train_transforms)

>>> image = np.array(dataset[index]["pixel_values"])
>>> mask = np.array(dataset[index]["label"])

>>> visualize_seg_mask(image, mask)
```

    

> [!TIP]
> الآن بعد أن أصبحت تعرف كيفية معالجة مجموعة بيانات للتجزئة الدلالية، تعلّم [كيفية تدريب نموذج للتجزئة الدلالية](https://huggingface.co/docs/transformers/tasks/semantic_segmentation) واستخدامه للاستدلال.

