Tensorflow图像读数&显示

时间:2015-11-11 10:09:45

标签: python tensorflow

我有一堆图像的格式类似于Cifar10(二进制文件,每个图像size = 96*96*3个字节),一个接一个的图像(STL-10 dataset)。我正在打开的文件有138MB。

我试过读&检查包含图像的张量的内容,以确保阅读正确,但我有两个问题 -

  1. FixedLengthRecordReader是否加载整个文件,但是一次只提供一个输入?由于读取第一个size字节应该相对较快。但是,代码运行大约需要两分钟。
  2. 如何以可显示的格式获取实际图像内容,或在内部显示它们以验证图像是否已被很好地读取?我做了sess.run(uint8image),但结果是空的。
  3. 代码如下:

    import tensorflow as tf
    def read_stl10(filename_queue):
      class STL10Record(object):
        pass
      result = STL10Record()
    
      result.height = 96
      result.width = 96
      result.depth = 3
      image_bytes = result.height * result.width * result.depth
      record_bytes = image_bytes
    
      reader = tf.FixedLengthRecordReader(record_bytes=record_bytes)
      result.key, value = reader.read(filename_queue)
      print value
      record_bytes = tf.decode_raw(value, tf.uint8)
    
      depth_major = tf.reshape(tf.slice(record_bytes, [0], [image_bytes]),
                           [result.depth, result.height, result.width])
      result.uint8image = tf.transpose(depth_major, [1, 2, 0])
      return result
    # probably a hack since I should've provided a string tensor
    
    filename_queue = tf.train.string_input_producer(['./data/train_X'])
    image = read_stl10(filename_queue)
    
    print image.uint8image
    with tf.Session() as sess:
      result = sess.run(image.uint8image)
      print result, type(result)
    

    输出:

    Tensor("ReaderRead:1", shape=TensorShape([]), dtype=string)
    Tensor("transpose:0", shape=TensorShape([Dimension(96), Dimension(96), Dimension(3)]), dtype=uint8)
    I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 4
    I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 4
    [empty line for last print]
    Process finished with exit code 137
    

    我在我的CPU上运行它,如果它增加了任何东西。

    编辑:感谢Rosa,我找到了纯TensorFlow解决方案。显然,在使用string_input_producer时,为了查看结果,您需要初始化队列运行程序。 添加到上面代码中唯一需要的是下面的第二行:

    ...
    with tf.Session() as sess:
        tf.train.start_queue_runners(sess=sess)
    ...
    

    之后,result中的图片可以显示matplotlib.pyplot.imshow(result)。我希望这可以帮助别人。如果您还有其他问题,请随时向我询问或查看Rosa答案中的链接。

8 个答案:

答案 0 :(得分:42)

只是给出一个完整的答案:

"C "

如果您有图像目录,可以通过this Github source file

添加所有图像

@mttk和@salvador-dali:我希望这是你需要的

答案 1 :(得分:14)

根据documentation,您可以解码JPEG / PNG图像。

它应该是这样的:

import tensorflow as tf

filenames = ['/image_dir/img.jpg']
filename_queue = tf.train.string_input_producer(filenames)

reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)

images = tf.image.decode_jpeg(value, channels=3)

您可以找到更多信息here

答案 2 :(得分:10)

在评论中与您交谈后,我相信您可以使用numpy / scipy来做到这一点。我们的想法是阅读numpy 3d数组中的图像并将其输入变量。

from scipy import misc
import tensorflow as tf

img = misc.imread('01.png')
print img.shape    # (32, 32, 3)

img_tf = tf.Variable(img)
print img_tf.get_shape().as_list()  # [32, 32, 3]

然后你可以运行你的图表:

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
im = sess.run(img_tf)

并验证它是否相同:

import matplotlib.pyplot as plt
fig = plt.figure()
fig.add_subplot(1,2,1)
plt.imshow(im)
fig.add_subplot(1,2,2)
plt.imshow(img)
plt.show()

enter image description here

你提到过

P.S。Since it's supposed to parallelize reading, it seems useful to know.。我可以说,在数据分析中很少读取数据是瓶颈。你大部分时间都会花时间训练模型。

答案 3 :(得分:3)

使用tf.train.match_filenames_once加载名称获取要使用tf.size迭代的文件数 开放会议并享受; - )

import tensorflow as tf
import numpy as np
import matplotlib;
from PIL import Image

matplotlib.use('Agg')
import matplotlib.pyplot as plt


filenames = tf.train.match_filenames_once('./images/*.jpg')
count_num_files = tf.size(filenames)
filename_queue = tf.train.string_input_producer(filenames)

reader=tf.WholeFileReader()
key,value=reader.read(filename_queue)
img = tf.image.decode_jpeg(value)

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)
    num_files = sess.run(count_num_files)
    for i in range(num_files):
        image=img.eval()
        print(image.shape)
        Image.fromarray(np.asarray(image)).save('te.jpeg')

答案 4 :(得分:1)

(无法发表评论,信誉不足,但这是一个适合我的修改版本)

@HamedMP有关No default session is registered的错误,您可以使用InteractiveSession来消除此错误: https://www.tensorflow.org/versions/r0.8/api_docs/python/client.html#InteractiveSession

对于Image.show的@NumesSanguis问题,您可以使用常规PIL .show()方法,因为fromarray会返回图像对象。

我在下面做了两个(注意我使用的是JPEG而不是PNG):

import tensorflow as tf
import numpy as np
from PIL import Image

filename_queue = tf.train.string_input_producer(['my_img.jpg']) #  list of files to read

reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)

my_img = tf.image.decode_jpeg(value) # use png or jpg decoder based on your files.

init_op = tf.initialize_all_variables()
sess = tf.InteractiveSession()
with sess.as_default():
    sess.run(init_op)

# Start populating the filename queue.

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)

for i in range(1): #length of your filename list
  image = my_img.eval() #here is your image Tensor :) 

Image.fromarray(np.asarray(image)).show()

coord.request_stop()
coord.join(threads)

答案 5 :(得分:1)

首先scipy.misc.imread和PIL不再可用。而是使用imageio库,但您需要为此安装Pillow

pip install Pillow imageio

然后使用以下代码加载图像并获取有关图像的详细信息。

import imageio
import tensorflow as tf

path = 'your_path_to_image' # '~/Downloads/image.png'

img = imageio.imread(path)
print(img.shape) 

img_tf = tf.Variable(img)
print(img_tf.get_shape().as_list()) 

都可以。

答案 6 :(得分:0)

我使用CIFAR10格式而不是STL10,代码就像

一样
filename_queue = tf.train.string_input_producer(filenames)
read_input = read_cifar10(filename_queue)
with tf.Session() as sess:       
    tf.train.start_queue_runners(sess=sess)
    result = sess.run(read_input.uint8image)        
img = Image.fromarray(result, "RGB")    
img.save('my.jpg')

该片段与mttk和Rosa Gronchi相同,但不知怎的,我无法在运行时显示图像,所以我保存为JPG文件。

答案 7 :(得分:0)

您可以使用tf.keras API。

import tensorflow as tf
import numpy as np
from tensorflow.keras.preprocessing.image import load_img, array_to_img

tf.enable_eager_execution()

img = load_img("example.png")
img = tf.convert_to_tensor(np.asarray(img))
image = tf.image.resize_images(img, (800, 800))
to_img = array_to_img(image)
to_img.show()