# Anlamsal segmentasyon

Anlamsal segmentasyon veri setleri, bir modelin görüntüdeki her pikseli sınıflandırmasını sağlamak için kullanılır. Bu veri setleri, görüntülerden arka plan kaldırma, görüntüleri stilize etme veya otonom sürüş için sahne anlama gibi çeşitli uygulamalara olanak tanır. Bu kılavuz, bir görüntü segmentasyon veri setine dönüşümler uygulama yöntemini gösterecektir.

Başlamadan önce, `albumentations` ve `cv2` kütüphanelerinin güncel sürümlerinin yüklü olduğundan emin olun:

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

[Albumentations](https://albumentations.ai/), bilgisayar görüşü için veri artırma işlemlerini gerçekleştirmek üzere geliştirilmiş bir Python kütüphanesidir. Görsel sınıflandırma, nesne algılama, segmentasyon ve anahtar nokta tahmini gibi çeşitli bilgisayar görüşü görevlerini destekler.

Bu kılavuz, gökyüzü, yol, kişi ve yatak gibi anlamsal kategorilerle ilişkilendirilen farklı görüntü bölgelerine ayırma ve çözümleme için [Scene Parsing](https://huggingface.co/datasets/scene_parse_150) veri setini kullanır.

Veri setinin `train` bölümünü yükleyin ve bir örneğe göz atın:

```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}
```

Veri seti üç alana sahiptir:

* `image`: bir PIL görüntü nesnesi.
* `annotation`: görüntünün segmentasyon maskesi.
* `scene_category`: görüntünün etiketi veya sahne kategorisi (ör. “mutfak” veya “ofis”).

Ardından, bir görüntüyü şu komutla inceleyin:

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

    

Benzer şekilde, ilgili segmentasyon maskesini de inceleyebilirsiniz:

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

    

Ayrıca, veri setini görselleştirmek için segmentasyon maskesine bir [renk paleti](https://github.com/tensorflow/models/blob/3f1ca33afe3c1631b733ea7e40c294273b9e406d/research/deeplab/utils/get_dataset_colormap.py#L51) ekleyip bunu orijinal görüntünün üzerine bindirebiliriz:

Renk paletini tanımladıktan sonra bazı katmanları görselleştirmeye hazır olmalısınız.

```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"])
... )
```

    

Şimdi `albumentations` ile bazı artırma işlemleri uygulayın. Önce görüntüyü yeniden boyutlandırıp parlaklığını ayarlayacaksınız.

```py
>>> import albumentations

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

Görsellere dönüşümü uygulamak için bir fonksiyon oluşturun:

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

Dizinin toplu verilerine (batch) dönüşümü anlık olarak uygulamak ve daha az disk alanı tüketmek için [set_transform()](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.Dataset.set_transform) fonksiyonunu kullanın:

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

Dönüşümün çalıştığını, bir örneğin `pixel_values` ve `label` değerlerine indeksleyerek doğrulayabilirsiniz:

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

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

    

Bu kılavuzda, veri setini artırmak için `albumentations` kullandınız. Benzer dönüşümleri uygulamak için `torchvision` kullanmak da mümkündür.

```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]
> Artık bir veri setini semantik segmentasyon için nasıl işleyeceğinizi bildiğinize göre, [semantik segmentasyon modelinin nasıl eğitileceğini](https://huggingface.co/docs/transformers/tasks/semantic_segmentation) ve çıkarım için nasıl kullanılacağını öğrenin.

