質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

1806閲覧

cifar10プログラムについて

salah0615

総合スコア49

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2019/09/24 08:48

編集2019/09/24 17:08

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, ..., ..., ..., ..., ..., ..., ..., ...]

以下省略

のような形です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Q71

2019/09/24 13:51

> #何故キャスト? 画像は整数型ですが、この後の計算で実数が必要になるため、先に実数型に変換しています。 Python も、「整数÷整数=整数」ではなかったでしょうか。 > と書いてあったのですが 出典を明らかにして下さい。 > 本当に三次元で考える必要はあるのでしょうか 出典が参照するTensorFlowのバージョンを明らかにして下さい。
salah0615

2019/09/24 15:12

キャストの点については、なるほど、ありがとうございます。 出典についてなのですが、プログラミングスクールの資料なので、としか言えません、、 tensorflowのバージョンなのですが、スクールのパソコンでしか見れないので、二日ほどお時間いただけますでしょうか。ちなみに参考になるかは分かりませんが、出典は2017年9月に発行された資料で、pythonのバージョンは3.5です。
nandymak

2019/09/25 00:12

変な話ですがプログラミングスクールでは質問できないのでしょうか?
salah0615

2019/09/25 08:20

せっかちなもので早く解決したく質問してしまいました。。 それにこちらで質問した方が専門的な方が多く的確な回答が返ってくると期待したもので、、 でもスクールで作られた資料なのでスクールで聞いた方が正確かもしれませんね。 失礼しました。
guest

回答1

0

自己解決

解決したので、簡単に載せます。
まず、何故三次元に直して扱わなくてはならないのかについてですが、
これは、tensorflowのバージョンによっては三次元で扱わなくてはいけない、ということでした。
そして、imageには一枚目の画像データしか入らないので、batch()によって画像をまとめても、最初の一枚しか変換されていないように思える、という点についてなのですが、
これは資料の記述ミスで、本当はslice_input_producer()からper_image_standardization()までを、画像の枚数分ループしなくてはいけないらしいです。

投稿2019/09/26 08:47

salah0615

総合スコア49

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問