Datasets documentation

Anlamsal segmentasyon

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

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üştürme uygulamayı gösterir.

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

pip install -U albumentations opencv-python

Albumentations, 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şlemleri için Scene Parsing veri setini kullanır.

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

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

>>> dataset[index]["image"]

Benzer şekilde, ilgili segmentasyon maskesini de inceleyebilirsiniz:

>>> dataset[index]["annotation"]

Ayrıca, veri setini görselleştirmek için segmentasyon maskesine bir renk paleti 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.

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

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

>>> 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() fonksiyonunu kullanın:

>>> dataset.set_transform(transforms)

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

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

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

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 ve çıkarım için nasıl kullanılacağını öğrenin.

Update on GitHub