2016-08-12 9 views
13

トレーニング中に入力画像を歪めるために使用されるTensorFlowには多数の画像操作があります。 tf.image.random_flip_left_right(image, seed=None)およびtf.image.random_brightness(image, max_delta, seed=None)などが挙げられる。TensorFlowバッチの画像操作

これらの機能は、単一の画像(すなわち、形状[高さ、幅、色チャンネル]の3次元テンソル)に対して作成されます。どのように画像(バッチ、高さ、幅、色チャンネル)の形状を持つ4次元テンソルで画像を処理するには?

実用的な例が大いにありがとう!

答えて

22

一つの可能​​性は、バッチの各要素に、単一の画像演算子を適用するために、最近tf.map_fn()添加を使用することです。

result = tf.map_fn(lambda img: tf.image.random_flip_left_right(img), images) 

この効果keveman suggests建物と同じグラフを構築し、それはループのTensorFlowのサポートを使用することによって、より大きなバッチサイズのために、より効率的であることができます。

+1

ありがとうございます! tf.imageの関数にこの組み込み関数がない理由はありますか?私は、tf.map_fn()から呼び出される単一の関数前処理()ですべての画像ひずみを作成しました。私はmap_fn()が新しい乱数を使ってpreprocess()を繰り返し呼び出すので、これによってランダムなひずみがすべての画像で異なると考えられます。あなたの答えと提案されたもう一つの違いとmap_fn()がより良い解決策である理由について詳しく説明してください。私は、実行時にtf.map_fn()ループをイメージ上に推測しているので、バッチ内の各イメージのグラフにopsは追加されません。 – questiondude

+0

ありがとうございます。私はこれをして、それは働いた。しかし、トレーニングは変換なしの場合より5倍遅くなっているので効率的ではありません:-( –

3

イメージ操作をループで呼び出し、結果を連結することができます。例えば:

transformed_images = [] 
for i in range(batch_size): 
    transformed_images.append(
    tf.expand_dims(tf.image.random_flip_left_right(image[i, :, :, :]), 0)) 
retsult = tf.concat(0, transformed_images) 
+0

アップしていただきありがとうございます。私はこのようなことを考えましたが、これはバッチ内の各画像のTensorFlowグラフにオプションを追加するため、バッチサイズを変えても機能しません。私は必要なバッチサイズごとにグラフを作成することができたと思いますが、むしろ面倒です。もう一つの答えはそれを行う正しい方法のようです。しかしもう一度ありがとう。 – questiondude

2

TLDR:キューを作成し、キューの単一要素の読み取りと処理のデータを定義し、バッチを作成するよりも、これをTFメソッドで行うことができます。

どのように動作するのかわかりませんが、キューを使用してバッチを作成してテンソルフローメソッドでイメージを読み取ると、単一のイメージと同じようにバッチで作業できます。

大規模なデータセットではまだテストされておらず、速度、メモリ消費などがどれほど良いかわかりません。今は自分でバッチを作成する方が良いかもしれません。

私はこれをcifar10の例で見ました。あなたはここにそれを見ることができますhttps://github.com/tensorflow/tensorflow/tree/r0.10/tensorflow/models/image/cifar10

  1. 最初に彼らはtf.train.string_input_producerでキューを作成します。 https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L222異なる種類のキューを使用できます。たとえば、複数の画像にtf.train.slice_input_producerを使用しようとします。あなたはそれについてここで読むことができますTensorflow read images with labels
  2. それから彼らはすべての必要な操作を単一のイメージとして行います。彼らは読書だけを必要とする場合は、読書だけです、彼らは画像をトリミングし、他のものを処理したい場合。読書はread_cifar10に記載されています。 distorted_inputsの処理は、それは彼らがパラメータに応じtf.train.batchまたはtf.train.shuffle_batchにの結果を渡し、inputs()distorted_inputs()機能から、それを返すここhttps://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L138
  3. です。
  4. 彼らはimages, labels = cifar10.distorted_inputs()のようにそれを読んで、次の仕事をします。それはあなたがシェイプ[バッチ、高さ、幅、チャネル]で4-Dテンソルにtf.image.random_flip_left_rightとtf.image.random_flip_up_downをシミュレートするtf.reverseを使用することができ、ここでhttps://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_train.py#L66