web-dev-qa-db-ja.com

Tensorflow CNNトレーニング画像はすべて異なるサイズです

画像の個々のピクセルを分類するために、Deep Convolutionニューラルネットワークを作成しました。トレーニングデータは常に同じサイズ(32x32x7)ですが、テストデータは任意のサイズにすることができます。

Githubリポジトリ

現在、私のモデルは同じサイズの画像でのみ機能します。私はテンソルフローmnist tutorial を広範囲に使用して、モデルの構築を支援しました。このチュートリアルでは、28x28の画像のみを使用します。 次のmnistモデルはどのようなサイズの画像も受け入れるように変更されますか?

 x = tf.placeholder(tf.float32, shape=[None, 784])
 y_ = tf.placeholder(tf.float32, shape=[None, 10])
 W = tf.Variable(tf.zeros([784,10]))
 b = tf.Variable(tf.zeros([10]))
 x_image = tf.reshape(x, [-1, 28, 28, 1])

もう少し複雑にするために、私のモデルには、出力形状を指定する必要がある転置畳み込みがあります。転置畳み込みが入力と同じサイズの形状を出力するように、次のコード行をどのように調整しますか?.

  DeConnv1 = tf.nn.conv3d_transpose(layer1, filter = w, output_shape = [1,32,32,7,1], strides = [1,2,2,2,1], padding = 'SAME')     
12
Devin Haslam

残念ながら、Tensorflowで動的グラフを作成する方法はありません( fold で試すことはできますが、それは質問の範囲外です)。これには2つのオプションがあります。

  1. バケット化:いくつかの手で選んだサイズで複数の入力テンソルを作成し、実行時に適切なバケットを選択します(例を参照)。どちらの方法でも、おそらく2番目のオプションが必要になります。 バケット化されたSeq2seq

  2. 入力画像と出力画像のサイズを変更します。すべての画像が同じアスペクト比を維持していると仮定すると、推論する前に画像のサイズを変更できます。 MNISTは分類タスクであるため、出力を気にする理由がわかりません。

同じ方法を使用できます。

from PIL import Image

basewidth = 28 # MNIST image width
img = Image.open('your_input_img.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)

# Save image or feed directly to tensorflow 
img.save('feed_to_tf.jpg') 
5
gidim

あなたが言及したmnistモデルコードは、FCネットワークを使用した例であり、畳み込みネットワーク用ではありません。 [None、784]の入力形状は、mnistサイズ(28 x 28)に対して与えられます。例は、固定入力サイズのFCネットワークです。

FCネットワークでは、重みとバイアスの数は入力形状に依存するため、求めていることは不可能です。これは、完全畳み込みアーキテクチャを使用している場合に可能です。したがって、私の提案は、重みとバイアスが入力形状に依存しないように、完全な畳み込みアーキテクチャを使用することです

1
Abhijit Balaji

@ gidim's answer に追加すると、Tensorflowで画像のサイズを変更して、結果を直接推論に送る方法がここにあります。注:この方法では画像が拡大縮小されて歪むため、損失が増える可能性があります。

すべてのクレジットは Prasad Paiのデータ拡張に関する記事 に送られます。

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

IMAGE_SIZE = 32
CHANNELS = 1

def tf_resize_images(X_img_file_paths):
    X_data = []
    tf.reset_default_graph()
    X = tf.placeholder(tf.float32, (None, None, CHANNELS))
    tf_img = tf.image.resize_images(X, (IMAGE_SIZE, IMAGE_SIZE), 
                                    tf.image.ResizeMethod.NEAREST_NEIGHBOR)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())

        # Each image is resized individually as different image may be of different size.
        for index, file_path in enumerate(X_img_file_paths):
            img = Image.open(file_path)
            resized_img = sess.run(tf_img, feed_dict = {X: img})
            X_data.append(resized_img)

    X_data = np.array(X_data, dtype = np.float32) # Convert to numpy
    return X_data
0
RafazZ