Datasets documentation

Segmentação semântica

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

Segmentação semântica

Conjuntos de dados de segmentação semântica são usados para treinar um modelo a classificar cada pixel em uma imagem. Existem uma grande variedade de aplicações habilitadas por esses conjuntos de dados, como a remoção de fundo de imagens, a estilização de imagens ou a compreensão de cenas para direção autônoma. Este guia mostrará como aplicar transformações a um conjunto de dados de segmentação de imagem.

Antes de começar, verifique se você tem as versões mais recentes de albumentations e cv2 instaladas:

pip install -U albumentations opencv-python

Albumentations é uma biblioteca em Python para realizar aumento de dados para visão computacional. Ela suporta diversas tarefas de visão computacional, como classificação de imagens, detecção de objetos, segmentação e estimativa de pontos-chave.

Este guia usa o conjunto de dados Scene Parsing para segmentar e analisar uma imagem em diferentes regiões associadas a categorias semânticas, como céu, estrada, pessoa e cama.

Carregue o split train do conjunto de dados e veja um exemplo:

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

O conjunto de dados possui três campos:

  • image: um objeto de imagem PIL.
  • annotation: máscara de segmentação da imagem.
  • scene_category: o rótulo ou categoria da cena da imagem (como “cozinha” ou “escritório”).

A seguir, verifique uma imagem com:

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

Da mesma forma, você pode verificar a máscara de segmentação respectiva:

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

Também podemos adicionar uma paleta de cores na máscara de segmentação e sobrepor à imagem original para visualizar o conjunto de dados:

Depois de definir a paleta de cores, você deve estar pronto para visualizar alguns overlays.

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

Agora aplique algumas aumentações com albumentations. Primeiro, redimensione a imagem e ajuste seu brilho.

>>> import albumentations

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

Crie uma função para aplicar a transformação às imagens:

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

Use a função set_transform() para aplicar a transformação em tempo real aos lotes do conjunto de dados, consumindo menos espaço em disco:

>>> dataset.set_transform(transforms)

Você pode verificar se a transformação funcionou indexando o pixel_values e o label de um exemplo:

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

>>> visualize_seg_mask(image, mask)

Neste guia, você usou albumentations para aumentar o conjunto de dados. Também é possível usar torchvision para aplicar algumas transformações semelhantes.

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

Agora que você sabe como processar um dataset para segmentação semântica, aprenda como treinar um modelo de segmentação semântica e usá-lo para inferência.

Update on GitHub