Я работаю над семантической сегментацией с использованием нейронных сетей, у меня есть аннотированное изображение, которое помечено для каждого пикселя соответствующим классом, который представлен целым числом (например, в моем случае у меня есть 11 классов, поэтому возможное значение будет находиться в диапазоне от 0 до 10). Я сохранил каждое аннотированное изображение в виде png-файла. Когда я хочу получить метки из каждого аннотированного изображения, я просто загружаю изображение, используя библиотеку подушек, со следующим кодом
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
label_img = Image.open("image_1.png")
print(label_img.size) # (500, 375)
print(label_img.mode) # P - (8-bit pixels, mapped to any other mode
# using a color palette)
plt.imshow(label_img) # this shows RGB image as a result.
label_img = np.array(label_img)
print(label_img.shape) # (375, 500)
plt.imshow(label_img) # this time I got an image with different color
print(label_img) # the values inside the array are an integer
# with range 0-10 as expected
Используя библиотеку Pillow, все работает отлично, я могу успешно получить свои метки при преобразовании загруженного изображения в массив numpy. Но, поскольку я использую TensorFlow в качестве основы, мне нужно загрузить изображение с помощью библиотеки TensorFlow, поэтому я использую следующий код:
label_img_str = tf.readfile(label_path)
label_img = tf.decode_png(label_img_str, channels=0) # channels 0 means
# use the number of channels in the
# PNG-encoded image
Но этот decode_png преобразует мое аннотированное значение в тензор, представляющий изображение в оттенках серого вместо тензора целочисленного значения, представляющего соответствующий класс, как при преобразовании изображения Pil в массив Numpy.
Мои вопросы:
1 : Может кто-нибудь объяснить мне, как работает процесс преобразования изображений? Почему Pillow может открыть палитру 8-битного изображения и затем автоматически отобразить его в RGB, но когда оно преобразуется в простой массив, оно становится 2D-массивом без каналов RGB? (И это не тот случай, когда используются другие библиотеки, такие как образ matplotlib, cv2 и misc от scipy с операцией imread).
2 : Есть ли способ извлечь тензор целочисленных значений, каждый из которых представляет соответствующий класс из png-изображения, используя библиотеку TensorFlow?
Большое спасибо за любую помощь.