2016-01-27 9 views
5

私はデータセットを作成し、それをTFRecordファイルに保存しました。写真はサイズが違うので、画像も一緒に保存したいだから私はTFRecordWriterを使用し、同じような機能を定義した:TFRecordファイルで異なるサイズの画像を読み取る方法

example = tf.train.Example(features=tf.train.Features(feature={ 
    'rows': _int64_feature(image.shape[0]), 
    'cols': _int64_feature(image.shape[1]), 
    'image_raw': _bytes_feature(image_raw)})) 
私は読んでTFRecordReaderを使用して画像をデコードしますが、事は、彼らがしているので、私は、ファイルからrowsとcolsの値を得ることができないであることを期待

テンソル。ですから、サイズを動的に読み込み、それに応じてイメージを再形成する方法はどうでしょうか。ありがとうございました

答えて

2

tf.reshapeは、shapeの動的パラメータで呼び出すことができます。

image_rows = tf.cast(features['rows'], tf.int32) 
image_cols = tf.cast(features['cols'], tf.int32) 
image_data = tf.decode_raw(features['image_raw'], tf.uint8) 
image = tf.reshape(image_data, tf.pack([image_rows, image_cols, 3])) 
+0

"すべての図形を完全に定義する必要があります:1"というエラーが発生しました。ログからは、関数 "tf.train.shuffle_batch()"と関係があるようです。私は何をしなければならないのですか? –

+0

バッチは、グラフの構築中に形状を知る必要があります(そのため、キューに割り当てるメモリの量を知ることができます)。tf.batchの前にtf.image.resize_imagesを使用しますか?あなたがバッチを構築しているので、標準convnetsのいずれかを使用している場合、イメージは同じサイズにサイズ変更する必要があります。 –

+0

+ Tong Shen、イ​​メージは同じサイズでなければなりません。このサイズを事前に知っていれば、 'image.set_shape([32,32,3])'のようなものを呼び出して形状を完全に定義することができます。 – bgshi

2

私のようなワークフローを提案:

TARGET_HEIGHT = 500 
TARGET_WIDTH = 500 

image = tf.image.decode_jpeg(image_buffer, channels=3) 
image = tf.image.convert_image_dtype(image, dtype=tf.float32) 

# Choose your bbox here. 
bbox_begin = ... (should be (h_start, w_start, 0)) 
bbox_size = tf.constant((TARGET_HEIGHT, TARGET_WIDTH, 3), dtype=tf.int32) 

cropped_image = tf.slice(image, bbox_begin, bbox_size) 

cropped_imageが一定テンソルの大きさを持ち、その後シャッフルバッチにスローすることができます。

tf.shape(image)を使用すると、復号化された画像のサイズに動的にアクセスできます。結果のサブ要素について計算を行い、次にbbox_begin = tf.pack([bbox_h_start, bbox_y_start, 0])のようなものを使用してそれらを一緒にステッチすることができます。作物の開始点を決めるためにそこに独自のロジックを挿入するだけで、イメージがあなたのパイプラインに必要なものよりも小さい場合は何をしたいのですか?

アップサイズをに変更する場合は、の画像がターゲットのサイズよりも小さい場合は、tf.control_flow_ops.condまたはそれと同等の値を使用する必要があります。しかし、は、要求されたサイズよりも小さい場合はフルイメージを返すように、そして最大で500x500までリサイズするように、トリミングウィンドウのサイズを設定するためにminおよびmax操作を使用できます。トリミングされたイメージはすでに500x500になるので、サイズ変更は効果的なノーオペレーションになるはずです。

+0

このワークフローはFIFOファイルキューで動作する予定ですか?今、私は無作為に500 * 500を使用して画像を切り抜きたい、あなたのやり方は作物が固定された領域であるようです。今私は、最小寸法が500以上であるように画像を事前にサイズ変更しました。私が直面している唯一の事は、生の文字列から画像をデコードし、元のサイズに再形成する方法です。画像の重さと高さが異なるため、固定サイズを使用することはできません。 –

+0

もちろん、500x500のbboxの先頭をランダムに選択する必要があります。 bbox_sizeを[500、500、3]に設定すると(チャネル数は3です)、500x500の作物が得られます。ランダムなトリミングのアルゴリズムに応じて、ランダムなトリミングの開始点を設定する必要があります。あなたがサイズを変更したことを考えると、単純に 'imageshape = tf.shape(image)'を実行して、開始点、終点を次のように設定することができます: 'h_start = tf.random_uniform([]、minval = 0、maxval = imageshape [0 ] -500、dtype = tf.int32) 'であり、w_startの場合も同様です。 – dga