#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')