Каким должно быть помеченное изображение для семантической сегментации?
Как я понимаю из приведенного ниже объяснения, для семантической сегментации будут два типа изображений: входные данные и маски. Маскированные изображения - это изображения, которые содержат "метку" в пиксельном значении, которое может быть целым числом (0 для ROAD, 1 для TREE или (100,100,100) для ROAD (0,255,0) для TREE).
Семантическая сегментация описывает процесс связывания каждого пикселя изображения с меткой класса(например, цветок, человек, дорога, небо, океан или автомобиль). https://se.mathworks.com/help/vision/ug/semantic-segmentation-basics.html
Согласно моим исследованиям, существует множество типов помеченных изображений для семантической сегментации. Наряду с различными расширениями (.png .jpg .gif .bmp...), некоторые из них являются RGB-помеченными (3-канальными) изображениями, а некоторые - серыми (1-канальными) изображениями. Ниже приведены два примера, чтобы лучше объяснить эту ситуацию.
RGB помечен расширением ".png"
СЕРЫЙ масштаб с надписью ".gif"
Если мое изображение помечено как СЕРЫЙ масштаб, я в основном делаю его RGB, копируя каждое значение этого серого канала для канала 3 RGB. Напротив, усредняя каналы RGB, я могу сделать помеченное изображение серым. В чем разница? Какой из них больше подходит для какой задачи (бинарная сегментация или что-то еще)?
В моем случае у меня есть 4 класса, и я пытаюсь сделать мультиклассовую семантическую сегментацию. Я уже пометил около 600 изображений на DataTurks. Это означает, что у меня просто есть многоугольники объекта, и я должен сделать свое помеченное изображение самостоятельно. На данный момент расширение моих входных изображений и изображений масок составляет ".jpg" и ".png" соответственно. Как мне маркировать мои изображения вместе с тем, какое расширение?
1 ответ
Вы можете сохранить маску как изображения в градациях серого в формате png со значениями, равными одному из 0,1,2,3(поскольку у вас есть 4 класса) в каждом местоположении, соответствующем классу (дерево, куст и т. Д.) Значений пикселей на входе изображений.
Сделав это, вы можете убедиться, что изображение маски создано правильно.
import cv2
import numpy as np
lbl_img = '<path_to_mask_image>'
mask = cv2.imread(lbl_img, 0)
print(np.unique(mask))
[0 1 2 3] # это будет зависеть от количества классов, присутствующих в изображении маски