Как я могу получить список пикселей определенного класса из замаскированного изображения с помощью tensorflow на графическом процессоре?

#python #tensorflow #computer-vision #gpu

Вопрос:

У меня есть сегментированное изображение (например, 200,200,20 -gt; 20 классов) и изображение(200,200,3). Я пытаюсь получить цвет списка пикселей, принадлежащих определенному классу.

Я могу выполнить эту задачу, используя числовые операции, но это вычисление уровня пикселей очень дорого. Поэтому я пытаюсь создать модель tensorflow для запуска на графическом процессоре, которая принимает входное изображение и сегментированное изображение. Затем пытаюсь получить список пикселей, которые я буду вводить в имеющуюся у меня функцию, возвращающую наиболее доминирующий цвет. Но сначала мне нужно получить список пикселей.

Я сделал это с numpy и почти с tensorflow. Но с помощью tensorflow я не могу получить список пикселей для пакета изображений. Для 1 изображения он работает, но для пакета изображений на этапе pixel_list = tf.boolean_mask(orig_img,mask) список пикселей объединяется вместе, поэтому невозможно различить пиксели, которые принадлежат какому изображению.

Пример: 4 изображения RGB, 20 классов

входные данные для модели: image_tensor = 4,200,200,3 , segmented_image = 4,200,200,20

На сцене pixel_list = tf.boolean_mask(orig_img,mask)

orig_image: (4,200,200,3)

маска: (4, 200,200)

ожидание: (4,) -gt; [ (n1,3), (n2,3), (n3,3), (n4,3) ] {переменная, ni-количество пикселей, принадлежащих определенному классу на изображении i}

Вместо этого я получаю: (n1 n2 n3 n4),3 , размеры потеряны, список пикселей объединяется вместе. Таким образом, невозможно различить пиксели, которые принадлежат какому изображению.

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

код для справки:

 def create_model():  segmented_image = tf.keras.Input(shape=(200, 200, 1),  dtype=tf.float32, name='post_input')  original_image = tf.keras.Input(shape=(200, 200, 3),  dtype=tf.float32, name='image')  recognized_classes = [  'hat',  'upper_clothes',  'dress',  'coat',  'pants',  'jumpsuits',  'skirt',  ]   # currently supported classes   classes = [  1,  5,  6,  7,  9,  10,  12,  ]   # mask and pixel list for class 1   pixel_list_result = dict()  placer = 0  for i in classes:  print '=-' * 50  print ('for ', recognized_classes[placer])   # # Creating mask of class i   mask = tf.cast(tf.math.equal(parse_result, i), tf.bool) # none,240,240   # # Logits   logit_list = tf.boolean_mask(logit_result, mask)  logit_list = tf.math.sigmoid(logit_list)  logit_mean = tf.math.reduce_mean(logit_list, axis=0,  name=recognized_classes[placer])   # # Pixels list   pixel_list = tf.boolean_mask(orig_img, mask)  pixel_list = tf.reverse(pixel_list, axis=[-1],  name=recognized_classes[placer])   # # Final   pixel_list_result[recognized_classes[placer]] = [pixel_list,  logit_mean]  placer  = 1   return tf.keras.Model(inputs=[model_output, im_input], outputs=[  pixel_list_result['hat'],  pixel_list_result['upper_clothes'],  pixel_list_result['dress'],  pixel_list_result['coat'],  pixel_list_result['pants'],  pixel_list_result['jumpsuits'],  pixel_list_result['skirt'],  ], name='postprocessing')