2016-08-16 2 views
1

Я хочу получить класс python, который может загрузить модель tensorflow и реализовать inference.but, но я понятия не имею, как я могу вводить изображение с переменным размером изображения. :(Различные размеры изображений в тензорном потоке с batch_size = 1

?
class ArtGenerater(): 
    def __init__(self,model_path): 
      self.model_path = model_path 
      # vary shape? 
      self.x = tf.placeholder(tf.float32,shape=(1,512,512,3)) 
      self.gen = model.resnet(self.x) 
      self.out = tf.saturate_cast(self.gen,tf.uint8) 

      self.sess = tf.Session() 
      file = tf.train.lastest_checkpoint(self.model_path) 
      saver = tf.train.Saver() 
      saver.restore(self.sess,file) 
    def pic(self,image_path): 
      img =np.asarray(Image.open(image_path)).astype(np.float32) 
      img = np.expand_dims(img,0) 
      output_t = self.sess.run(self.out,feed_dict={self.x:img}) 
      return output_t 

Теперь я просто использовать tf.placeholder(tf.float32,shape=(1,512,512,3)), но мой образ имеют разные размеры (., например, 1000 * 900) .как я могу достигнуть этой функции спасибо

EDIT:. спасибо everyone.I решили решить проблему, используя x = tf.placeholder(tf.string) img = tf.image.decode_jpeg(x,channels=3) , и это может обеспечить сеть (мой ConvNet включает в себя множество conv2d & conv2d_tranpose) с различным размером изображения. :)

+0

Вы можете комбинировать их как jpeg-строки в тензорном потоке и использовать декодирование jpeg op для обеспечения равномерного размера –

+0

хорошая идея. Большое спасибо, я постараюсь. –

ответ

2

В принципе вы можете определить различный входной размер не используя None следующего

self.x = tf.placeholder(tf.float32, [1, None, None, 3]) 

, а затем вы можете подать другой вход

feed_dict={self.x: current_data} etc.. 

Но будьте осторожны о вашей нейронной сети структуры. Если вы выравниваете свой последний слой conv в качестве входа в первый плотный слой, тогда ваша сеть работает только с таким размером, и вам нужно либо растянуть, либо обрезать изображение, чтобы заставить его работать.

Более гибкий подход - использовать что-то вроде Global Average Pooling или Spatial Pyramid Pooling, которые исправляют эту проблему.

+0

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

+0

Он часто используется для определения размера партии, но это полностью зависит от вас ... Поскольку после этого можно изменить размер \ обрезать изображение с помощью tf-операций, так что вы можете просто прокормить график изображениями разных размеров, используя None. В любом случае, я предпочитаю разделять обработку данных и использование NN .. –

+0

Мне просто нужен размер изображения (не batch_size). И я решил проблему, используя 'img = tf.placeholder (tf.string) '' image = tf .image.decode_jpeg (img, channels = 3) ' –

Смежные вопросы