Названия истинных пикселей в PASCAL VOC для семантической сегментации

Я экспериментирую с FCN (полностью сверточной сетью) и пытаюсь воспроизвести результаты, представленные в исходной статье (Long et al. CVPR'15).

В этой статье авторы сообщили о результатах по набору данных PASCAL VOC. После загрузки и распаковки набора данных train-val за 2012 г. (http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar), я заметил, что в SegmentationClass и такое же количество файлов в подкаталоге SegmentationObject.

Значения пикселей в этих файлах png кажутся кратными 32 (например, 0, 128, 192, 224 ...), которые не попадают в диапазон от 0 до 20. Мне просто интересно, каково соответствие между значения пикселей и метки истинности для пикселей. Или я смотрю не те файлы?


person cccjjj    schedule 03.04.2018    source источник
comment
Я недавно воспроизвел эти результаты FCN, и они работали нормально. Как вы читаете свои изображения? Вы изменили их размер? Однажды я сделал это бездумно и испортил метки из-за интерполяции или средних значений при изменении размера ...   -  person MeanStreet    schedule 25.04.2018
comment
Вы в этом разобрались? Я тоже вижу много 224 значений в необработанных байтовых данных. Я нигде не вижу 224 на цветовой карте. Означает ли это, что они не определены? VOC_COLORMAP = [[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]]   -  person Hashman    schedule 19.05.2019


Ответы (3)


Я знаю, что этот вопрос задавали некоторое время назад. Но я задал себе аналогичный вопрос, когда пробовал PASCAL VOC 2012 с tenorflow deeplab.

Если вы посмотрите на file_download_and_convert_voc2012.sh , есть строки, отмеченные «# Удалите цветовую карту в аннотациях наземной истины». Эта часть обрабатывает исходные файлы SegmentationClass и создает необработанные файлы сегментированных изображений, каждый пиксель которых имеет значение от 0 до 20. (Если вы можете спросить, почему, проверьте этот пост:

Должен признать, что не совсем понимаю, как работает

np.array(Image.open(filename))

Ниже я показал вам набор изображений для справки (сверху вниз: исходное изображение, класс сегментации и необработанный класс сегментации).

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

person captainst    schedule 03.08.2018

Только что скачал Pascal VOC. Значения пикселей в наборе данных следующие:

  • 0: фон

  • [1 .. 20] интервал: сегментированные объекты, классы [Самолет, ..., Tvmonitor]

  • 255: пустая категория, используемая для пограничных областей (5 пикселей) и для маскировки сложных объектов

Дополнительную информацию о наборе данных можно найти здесь.

В предыдущем ответе капитана обсуждались файлы png, сохраненные с цветовыми палитрами, я думаю, что это не связано с исходным вопросом. Связанный код тензорного потока просто загружает png, который был сохранен с цветовой картой (палитрой), затем преобразует его в массив numpy (на этом этапе цветовая палитра теряется), а затем снова сохраняет массив как png. Числовые значения при этом не меняются, удаляется только цветовая палитра.

person mkisantal    schedule 19.03.2019

Значения, упомянутые в исходном вопросе, выглядят как значения «цветовой карты», которые могут быть получены функцией getpalette() из модуля PIL Image.

Для аннотированных значений изображений VOC я использую следующий фрагмент кода, чтобы проверить их:

import numpy as np
from PIL import Image

files = [ 
        'SegmentationObject/2007_000129.png',
        'SegmentationClass/2007_000129.png',
        'SegmentationClassRaw/2007_000129.png', # processed by _remove_colormap()
                                                # in captainst's answer...
        ]

for f in files:
    img = Image.open(f)
    annotation = np.array(img)
    print('\nfile: {}\nanno: {}\nimg info: {}'.format(
        f, set(annotation.flatten()), img))

Три изображения, используемые в коде, показаны ниже (слева направо соответственно):

введите здесь описание изображения

Соответствующие выходы кода следующие:

file: SegmentationObject/2007_000129.png
anno: {0, 1, 2, 3, 4, 5, 6, 255}
img info: <PIL.PngImagePlugin.PngImageFile image mode=P size=334x500 at 0x7F59538B35F8>

file: SegmentationClass/2007_000129.png
anno: {0, 2, 15, 255}
img info: <PIL.PngImagePlugin.PngImageFile image mode=P size=334x500 at 0x7F5930DD5780>

file: SegmentationClassRaw/2007_000129.png
anno: {0, 2, 15, 255}
img info: <PIL.PngImagePlugin.PngImageFile image mode=L size=334x500 at 0x7F5930DD52E8>

Из вышеприведенного вывода я понял две вещи.

Во-первых, значения аннотации изображений в папке SegmentationObject присваиваются по количеству объектов. В данном случае 3 человека и 3 велосипеда, а аннотированные значения - от 1 до 6. Однако для изображений в папке SegmentationClass их значения назначаются значением класса объектов. Все люди относятся к классу 15, а все велосипеды - к классу 2.

Во-вторых, как уже упоминал mkisantal, после операции np.array() цветовая палитра была удалена (я "знаю" это, наблюдая за результатами, но я все еще не понимаю механизма под капотом ... ). Мы можем подтвердить это, проверив image mode выходов:

  • И SegmentationObject/2007_000129.png, и SegmentationClass/2007_000129.png имеют image mode=P, в то время как

  • SegmentationClassRaw/2007_000129.png имеет image mode=L. (ref: Режимы изображения PIL )

person hiankun    schedule 25.04.2020
comment
Я знаю это, наблюдая за результатами, но я до сих пор не понимаю механизма под капотом ... - Для сохранения цвета требуется 3 байта, по одному для R, G, B. Когда у u есть только 20 классов во всем наборе данных, то есть 20 цветов для переднего плана и 1 цвет для фона, у u есть только 21 уникальное значение для каждого пикселя, которые могут быть закодированы максимум в 5 бит (2 ^ 5 = 32), так почему используйте 3 байта. Теперь это можно сделать с помощью изображения PNG, в котором вы можете хранить LUT, то есть ПОСМОТРЕТЬ ТАБЛИЦУ цветов. - person saurabheights; 31.01.2021
comment
Если вы проверяете необработанное значение пикселя, оно сохраняет 0,1,20, 255 и т. Д. Но большинство просмотрщиков изображений считывают изображение, а затем применяют LUT к этому значению, чтобы дать вам красный цвет. Таблица поиска хранится с использованием только 256 записей цветов, то есть 0 соответствует черному, 1 соответствует цвету X и т. Д., И эта таблица поиска сохраняется в метаданных. - person saurabheights; 31.01.2021
comment
Наконец, вы можете проверить наличие метаданных изображения, запустив identify -verbose <imagepath>. Идентификатор - это команда imagemagick, которая предустановлена ​​в ubuntu. - person saurabheights; 31.01.2021
comment
P.S. Этот LUT называется палитрой в библиотеке PIL. - person saurabheights; 31.01.2021