2015-11-11 16 views
25

私は、Cifar10(バイナリファイルsize = 96*96*3バイト/画像)、1つの画像を次々に(STL-10 dataset)のような形式で画像の束を持っています。私が開いているファイルは138MBです。Tensorflow画像の読み取りと表示

私は&しかし私は2つの質問持って、読み取りが正しく行われていることを確認するために、画像を含むテンソルの内容を確認読み取ろうとしました -

  1. FixedLengthRecordReaderしかしちょうど、ファイル全体をロードしません一度に1つの入力を提供するか?最初のsizeバイトの読み込みは比較的速いはずです。ただし、コードの実行には約2分かかります。
  2. 実際のイメージの内容を表示可能な形式で取得する方法、またはイメージをよく読み取ることを検証するために内部で表示する方法はありますか?私はsess.run(uint8image)でしたが、結果は空です。

コードは以下の通りです:

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上でこれを実行していますよ。

EDIT:Rosaのおかげで純粋なTensorFlowソリューションが見つかりました。明らかに、結果を見るためにstring_input_producerを使用するときは、キューランナーを初期化する必要があります。

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

その後、resultに画像がmatplotlib.pyplot.imshow(result)で表示することができる。 コードに追加する唯一必要なことは、上記の下から2行目はです。私はこれが誰かを助けることを望む。さらなる質問がある場合は、私に尋ねるか、Rosaの答えのリンクを確認してください。

+0

私は、([Dimension(96)、Dimension(96)、Dimension(3)]に基づいて1つの画像しか読んでいないように見えます。 –

+0

これは私がやりたかったことですが、1つのイメージを読み込んで表示するのですが、TensorFlowがまだファイル全体を読み込むかどうかは分かりませんでした。読み込みには数分かかります(これは比較的簡単な操作ですlong) – mttk

+0

numpyのファイルを3D配列として読み込み、tensorFlow変数に入力したくない理由はありますか? –

答えて

38

を見つけることができます

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) 

の画像をすべて追加できます。this Github source file

@mttkとサルバドール・ダリ@:私が@HamedMPエラーに

(十分な評判、ないコメントが、ここで私のために働いた修正版ではできません)、それはあなたが

+0

sess.run(init_op)の後のすべてが2スペースで字下げされるべきではありませんか? ValueError:eval()を使ってテンソルを評価できません:デフォルトのセッションは登録されていません。 (image = my_image.eval()の場合) – NumesSanguis

+0

@NumesSanguisはい、そうです、コピーして貼り付けるときに問題があったと思います。あなたはインデントを試して、結果が何かを見ましたか? –

+0

はい、私たちはもうエラーはありませんでしたが、何も起こりませんでした。画像が正しく読み込まれていない可能性があります。http://stackoverflow.com/questions/34356828/tensorflow-image-reading-empty @サルバドール・ダリは働いていますが、読者オブジェクトを使いたいと思っています。 – NumesSanguis

8

コメントであなたと話した後、私はあなたが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.。データ分析の読書でめったにデータの読書がボトルネックであると私は言うことができます。ほとんどの場合、モデルのトレーニングに費やします。

+1

ボトルネックではないデータの読書に同意しましたが、純粋なTensorFlowでこれを行う方法があるはずですので、何が欠けていたか知りたいと思っていました。 あなたの答えのおかげで、それは助けました:) – mttk

+0

サルバドールの理由は私たちが純粋なTFソリューションを望んでいるかもしれません:TFコンパイルの手順とそれを自分の環境で実行するので、 PythonとTFのネイティブ計算の間を行き来する時間(C)。私は訴訟はしていないが、違うと思う。同意しますか? –

+0

@HamedMP私はまた、TFソリューションを見たいと思っていますし、私はそれがより良いと信じています。問題は、私がTFでこれを行う方法を知らないので、私が知っているものを書いたことです。私はまた、オーバーヘッドは、モデルを訓練することによって要求される時間と比較して、小さくなると考えている。 –

11

documentationによれば、JPEG/PNG画像をデコードできます。

それはこのようなものでなければなりません:

filename_queue = tf.train.string_input_producer(['/Users/HANEL/Desktop/tf.png']) # list of files to read 

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

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

init_op = tf.global_variables_initializer() 
with tf.Session() as sess: 
    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 :) 

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

    coord.request_stop() 
    coord.join(threads) 

それとも、ディレクトリがある場合:あなただけの完全な答えを与えるために、もう少し情報here

+0

ありがとう、私は最終的に解決策を見つけました:) – mttk

1

を必要とするものであると思いますNo default session is registeredこのエラーを取り除くためにInteractiveSessionを使用することができます:fromarrayはイメージオブジェクトを返すため https://www.tensorflow.org/versions/r0.8/api_docs/python/client.html#InteractiveSession

そして@NumesSanguis問題へImage.showで、あなたは定期的にPIL .show()メソッドを使用することができます。私は(私はJPEGではなくPNGを使用しています注意してください)以下の両方を行う

:tf.train.match_filenames_onceと

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) 
2

ロード名には、ファイルの数が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')enter code here 
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') 
のように出てきました210

スニペットはmttkとRosa Gronchiと同じですが、何とか実行時にイメージを表示できないため、JPGファイルとして保存しました。

関連する問題