Datasets documentation
Phân đoạn ngữ nghĩa
Phân đoạn ngữ nghĩa
Bộ dữ liệu phân đoạn ngữ nghĩa được sử dụng để huấn luyện mô hình phân loại từng pixel trong một hình ảnh. Có rất nhiều ứng dụng được hỗ trợ bởi các bộ dữ liệu này, chẳng hạn như xóa nền khỏi hình ảnh, tạo phong cách cho hình ảnh, hoặc hiểu cảnh cho lái xe tự hành. Hướng dẫn này sẽ cho bạn thấy cách áp dụng các phép biến đổi cho một bộ dữ liệu phân đoạn hình ảnh.
Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt các phiên bản mới nhất của albumentations và cv2:
pip install -U albumentations opencv-python
Albumentations là một thư viện Python để thực hiện tăng cường dữ liệu cho thị giác máy tính. Nó hỗ trợ nhiều tác vụ thị giác máy tính khác nhau như phân loại ảnh, phát hiện đối tượng, phân đoạn và ước lượng điểm chính.
Hướng dẫn này sử dụng bộ dữ liệu Scene Parsing để phân đoạn và phân tích một hình ảnh thành các vùng hình ảnh khác nhau gắn với các danh mục ngữ nghĩa, chẳng hạn như bầu trời, đường, người và giường.
Tải phần train của bộ dữ liệu và xem một ví dụ:
>>> 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}Bộ dữ liệu có ba trường:
image: một đối tượng ảnh PIL.annotation: mặt nạ phân đoạn của hình ảnh.scene_category: nhãn hoặc danh mục cảnh của hình ảnh (ví dụ “kitchen” hoặc “office”).
Tiếp theo, hãy xem một hình ảnh bằng cách sử dụng:
>>> dataset[index]["image"]
Tương tự, bạn có thể xem xét mặt nạ phân đoạn tương ứng:
>>> dataset[index]["annotation"]
Chúng ta cũng có thể thêm một bảng màu lên mặt nạ phân đoạn và phủ nó lên trên ảnh gốc để trực quan hóa bộ dữ liệu:
Sau khi định nghĩa bảng màu, bạn đã sẵn sàng để trực quan hóa một số lớp phủ.
>>> 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"])
... )
Bây giờ hãy áp dụng một số phép tăng dữ liệu với albumentations. Trước tiên, bạn sẽ thay đổi kích thước ảnh và điều chỉnh độ sáng của nó.
>>> import albumentations
>>> transform = albumentations.Compose(
... [
... albumentations.Resize(256, 256),
... albumentations.RandomBrightnessContrast(brightness_limit=0.3, contrast_limit=0.3, p=0.5),
... ]
... )Tạo một hàm để áp dụng phép biến đổi lên các hình ảnh:
>>> 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 examplesSử dụng hàm set_transform() để áp dụng phép biến đổi trực tiếp lên các lô dữ liệu của tập dữ liệu nhằm tiết kiệm dung lượng ổ đĩa:
>>> dataset.set_transform(transforms)Bạn có thể kiểm tra xem phép biến đổi đã hoạt động hay chưa bằng cách truy cập vào pixel_values và label của một ví dụ:
>>> image = np.array(dataset[index]["pixel_values"])
>>> mask = np.array(dataset[index]["label"])
>>> visualize_seg_mask(image, mask)
Trong hướng dẫn này, bạn đã sử dụng albumentations để tăng cường bộ dữ liệu. Bạn cũng có thể sử dụng torchvision để áp dụng một số phép biến đổi tương tự.
>>> 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)
Update on GitHubBây giờ bạn đã biết cách xử lý một tập dữ liệu cho phân đoạn ngữ nghĩa, hãy tìm hiểu cách huấn luyện một mô hình phân đoạn ngữ nghĩa và sử dụng nó để suy luận.