cifar10の画像認識方法についてなのですが、まず
python
1import cv2 2cv2.imread("画像ファイル")
によって、画像を読み取り、それをいろいろ変換して、32x32の3チャンネルの画像10枚を取得しました。
これらをimagesに入れて、images.shape = (10, 32, 32, 3)の状態です。(imagesはnumpy配列です。)
ここまでは前置きです。
この後、画像変換に使用される計算グラフは三次元(一枚の画像)を想定しているために、ひとまとめにではなく一枚ずつ送り込む必要がある、と書いてあったのですが、その計算グラフの部分は、
python
1#画像の配列を一枚ずつ供給するproducerの形成 2image, = tf.train.slice_input_producer([images], shuffle = False) 3#画像の切り落とし 4reshaped_image = tf.cast(image, tf.float32) #何故キャスト? 5resized_image = tf.image.resize_image_with_crop_or_pad(reshaped_image, 24, 24) 6#画像の正規化 7float_image = tf.image.per_image_standardization(resized_image)
でした。
この後、
python
1images = tf.train.batch([float_image], batch_size = FLAGS.batch_size)
によって、個々の画像を四次元配列に戻すため、ここまでが画像を三次元で扱わなくてはいけないところだと思うのですが、いろいろ調べてみると、
https://www.tensorflow.org/api_docs/python/tf/image/resize_with_crop_or_pad
には、引数は3Dでも4Dでも良いと書いてあり、
https://www.tensorflow.org/api_docs/python/tf/image/per_image_standardization
には、引数はn次元と書いてあります。
つまり僕の解釈としては、どこにも画像を3次元で扱わなくてはいけないような要素はないと感じました。
本当に三次元で考える必要はあるのでしょうか。
そしてそもそも、slice_input_producerによって、imageには一枚目の画像データしか入らないので、batch()によって画像をまとめても、最初の一枚しか変換されていないように思うのですが、どういうことでしょうか。
それからもう一つ、コードの部分にも記述しましたように、何故浮動小数点にキャストする必要があるのでしょうか。
この三つについてご教授願います。
長くなるとアレなので、なるべく短く説明しましたので、不足があったら申し訳ありません。
追記
念の為、全コードを追記します。
python
1import os 2import cv2 3import numpy as np 4import TensorFlow as tf 5from フォルダ名 import cifar10 6 7image_path = '画像フォルダ' 8classes = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] 9#画像の読み込み 10images = [] 11files = os.listdir(image_path) 12for file in files: 13 img = cv2.imread(os.path.join(image_path, file)) 14 img = img[:, :, ::-1] 15 height = img.shape[0] 16 width = img.shape[1] 17 cropped_size = min(width, height) 18 sx = (width - cropped_size) // 2 19 sy = (height - cropped_size) // 2 20 cropped_img = img[sy:sy + cropped_size, sx:sx + cropped_size] 21 resized_img = cv2.resize(cropped_img, (32, 32)) 22 images.append(resized_img) 23 24images = np.array(images) 25 26FLAGS = tf.app.flags.FLAGS 27FLAGS.batch_size = len(images) 28 29image, = tf.train.slice_imput_producer([images], shuffle = False) 30reshaped_image = tf.cast(image, tf.float32) 31resized_image = tf.image.resize_image_with_crop_or_pad(reshaped_image, 24, 24) 32float_image = tf.image.per_image_standardization(resized_image) 33 34#バッチ入力の設定 35images = tf.train.batch([float_image], batch_size = FLAGS.batch_size) 36 37#予測器の作成 38logits = cifar10.inference(images) 39 40softmax = tf.nn.softmax(logits) 41prediction = tf.argmax(softmax, 1) 42 43#移動平均版の学習データを復元するように設定 44variable_averages = tf.train.ExponentialMovingAverage(cifar10.MOVING_AVERAGE_DECAY) 45variables_to_restore = variable_averages.variables_to_restore() 46saver = tf.train.Saver(variables_to_restore) 47 48sess = tf.Session() 49 50checkpoint = tf.train.latest_checkpoint('cifar10_train') 51if checkpoint: 52 saver.restore(session, checkpoint) 53 54#複数の画像がキューに詰められた状態なので、一つずつ取り出して処理するランナーの生成 55coord = tf.train.Coordinator() 56try: 57 #処理を行うスレッドの生成 58 threads = [] 59 for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): 60 threads.extend(qr.create_threads(sess, coord = coord, daemon = True, start = True)) 61 62 softmaxs, predictions = session.run([softmax, prediction]) 63 for f, s, p in zip(files, softmaxs, predictions): 64 print(f, classes[p]) 65 print(list(s)) 66 print() 67 68except Exception as e: 69 coord.request_stop(e) 70 71#スレッドを止める 72coord.request_stop() 73coord.join(threads, stop_grace_period_secs = 10)
結果は,
画像ファイル名 dog
[0.02342324234, 0.00324532453, ..., ..., ..., ..., ..., ..., ..., ...]
以下省略
のような形です。
回答1件
あなたの回答
tips
プレビュー