Как работает маркировка в сегментации изображений [SegNet] - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь понять сегментацию изображения, используя реализацию SegNet в keras. Я прочитал оригинальную статью, используя архитектуру Conv и Deconv, а также слои Dilated conv. Однако мне сложно понять, как работает маркировка пикселя.

Я рассматриваю следующую реализацию: https://github.com/nicolov/segmentation_keras

Здесь используются атрибуты набора данных Паскаль:

21 Классы:

# 0=background
# 1=aeroplane, 2=bicycle, 3=bird, 4=boat, 5=bottle
# 6=bus, 7=car, 8=cat, 9=chair, 10=cow
# 11=diningtable, 12=dog, 13=horse, 14=motorbike, 15=person
# 16=potted plant, 17=sheep, 18=sofa, 19=train, 20=tv/monitor

Классы представлены:

pascal_nclasses = 21
pascal_palette = np.array([(0, 0, 0)
    , (128, 0, 0), (0, 128, 0), (128, 128, 0), (0, 0, 128), (128, 0, 128)
    , (0, 128, 128), (128, 128, 128), (64, 0, 0), (192, 0, 0), (64, 128, 0)
    , (192, 128, 0), (64, 0, 128), (192, 0, 128), (64, 128, 128), (192, 128, 128)
    , (0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128)], dtype=np.uint8)

Я пытался открыть помеченные изображения для кота и лодки, поскольку кот находится только в R-пространстве, а лодка только в синем. Я использовал следующие, чтобы показать помеченные изображения:

Для лодки:

label = cv2.imread("2008_000120.png")
label = np.multiply(label, 100)
cv2.imshow("kk", label[:,:,2])
cv2.waitKey(0)

Для кошек:

label = cv2.imread("2008_000056.png")
label = np.multiply(label, 100)
cv2.imshow("kk", label[:,:,0])
cv2.waitKey(0)

Однако не имеет значения, какое пространство я выберу, оба изображения всегда дают одинаковые результаты. то есть следующий код также дает такие же результаты

Для лодки:

label = cv2.imread("2008_000120.png")
label = np.multiply(label, 100)
cv2.imshow("kk", label[:,:,1]) # changed to Green space
cv2.waitKey(0)

Для кошек:

label = cv2.imread("2008_000056.png")
label = np.multiply(label, 100)
cv2.imshow("kk", label[:,:,1]) # changed to Green space
cv2.waitKey(0)

Я предполагал, что я увижу кошку только в красном цвете, а лодку - только в синем. Однако выходной во всех случаях:

Masked boat masked cat

Теперь я запутался, как эти пиксели помечены и как они читаются и используются уникальным образом для сопряжения с категориями в процессе создания логитов.

Было бы замечательно, если бы кто-то мог объяснить или поставить некоторые соответствующие ссылки, чтобы понять этот процесс. Я попытался выполнить поиск, но в большинстве учебных пособий обсуждается только архитектура CNN, а не процесс маркировки или то, как эти метки используются в CNN.

Я приложил помеченные изображения кота и лодки для справки. Labelled boat Labelled cat

1 Ответ

0 голосов
/ 08 мая 2018

Метки - это просто двоичные маски изображений, поэтому одноканальные изображения. Значение пикселя в каждом месте изображения метки изменяется в зависимости от класса, присутствующего в каждом пикселе. Таким образом, это будет значение 0, когда в пикселе нет объекта, и значение 1-20 в зависимости от класса в противном случае.

Семантическая сегментация является задачей классификации, поэтому вы пытаетесь классифицировать каждый пиксель с помощью класса (в данном случае метки классов 0-20).

Ваша модель создаст выходное изображение, и вы хотите выполнить кросс-энтропию softmax между каждым пикселем выходного изображения и каждым пикселем изображения метки.

В случае мультикласса, когда у вас есть K классов (например, здесь K = 21), у каждого пикселя будет K каналов, и вы выполняете кросс-энтропию softmax по каналам в каждом пикселе. Почему канал для каждого класса? Подумайте, в классификации мы создаем вектор длины K для классов K, и это сравнивается с одним горячим вектором длины K.

...