Datasets documentation

Segmentasi semantik

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

Segmentasi semantik

Dataset segmentasi semantik digunakan untuk melatih model mengklasifikasikan setiap piksel dalam sebuah gambar. Terdapat beragam aplikasi yang didukung oleh dataset ini, seperti penghapusan latar belakang dari gambar, pemberian gaya pada gambar, atau pemahaman adegan untuk pengemudian otonom. Panduan ini akan menunjukkan cara menerapkan transformasi pada dataset segmentasi gambar.

Sebelum memulai, pastikan Anda telah menginstal versi terbaru dari albumentations dan cv2:

pip install -U albumentations opencv-python

Albumentations adalah pustaka Python untuk melakukan augmentasi data untuk computer vision. Pustaka ini mendukung berbagai tugas computer vision seperti klasifikasi gambar, deteksi objek, segmentasi, dan estimasi keypoint.

Panduan ini menggunakan dataset Scene Parsing untuk segmentasi dan parsing gambar menjadi berbagai wilayah gambar yang dikaitkan dengan kategori semantik, seperti langit, jalan, orang, dan tempat tidur.

Muat split train dari dataset dan lihat contohnya:

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

Dataset memiliki tiga bidang:

  • image: objek gambar PIL.
  • annotation: mask segmentasi dari gambar.
  • scene_category: label atau kategori adegan dari gambar (seperti “dapur” atau “kantor”).

Selanjutnya, lihat gambar dengan:

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

Demikian pula, Anda dapat melihat mask segmentasi yang sesuai:

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

Kita juga dapat menambahkan palet warna pada mask segmentasi dan menampilkannya di atas gambar asli untuk memvisualisasikan dataset:

Setelah mendefinisikan palet warna, Anda seharusnya siap untuk memvisualisasikan beberapa overlay.

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

Sekarang terapkan beberapa augmentasi dengan albumentations. Anda akan terlebih dahulu mengubah ukuran gambar dan menyesuaikan kecerahannya.

>>> import albumentations

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

Buat fungsi untuk menerapkan transformasi ke gambar:

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

Gunakan fungsi set_transform() untuk menerapkan transformasi secara langsung pada batch dataset guna mengurangi penggunaan ruang disk:

>>> dataset.set_transform(transforms)

Anda dapat memverifikasi bahwa transformasi berhasil dengan mengindeks ke dalam pixel_values dan label dari sebuah contoh:

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

>>> visualize_seg_mask(image, mask)

Dalam panduan ini, Anda telah menggunakan albumentations untuk melakukan augmentasi pada dataset. Anda juga dapat menggunakan torchvision untuk menerapkan beberapa transformasi serupa.

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

Sekarang setelah Anda tahu cara memproses dataset untuk segmentasi semantik, pelajari bagaimana melatih model segmentasi semantik dan menggunakannya untuk inferensi.

Update on GitHub