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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

473閲覧

画像を学習させて、そこから数値を出すには

blackmk

総合スコア23

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/01/21 10:04

現在、画像に数値をラベル付けして以下のような分類を行っているのですが、カテゴリーを出力するのではなく(下のコードの例ならば'_30'など)、数値を出力したい場合はどのようにすればよいでしょうか?

尚、こちらのサイトを参考にさせていただきました。
https://qiita.com/kazuki_hayakawa/items/c93a21313ccbd235b82b

このようにすると数値の分だけフォルダを作成しなければならない気がしておりまして、大変だと思い、最後の活性化関数の値と、出力値が対応できればと考えております。

例えばですが、画像が42という値をもっていて、それを読み込むと42に近い値が出力される,といったものです.下にあるモデルだと,出力として30_90が出力されます.

参考コードです.
まず、こちらで学習します。

python

1import os 2 3from keras.applications.vgg16 import VGG16 4 5from keras.preprocessing.image import ImageDataGenerator 6 7from keras.models import Sequential, Model 8 9from keras.layers import Input, Activation, Dropout, Flatten, Dense 10 11from keras import optimizers 12 13import numpy as np 14 15# 分類するクラス 16 17classes = ['0','_30','30_90','_100'] 18 19nb_classes = len(classes) 20 21 22 23img_width, img_height = 160, 120 24 25 26 27# トレーニング用とバリデーション用の画像格納先 28 29train_data_dir = 'train_for_CNN_5_train' 30 31validation_data_dir = 'validation_for_CNN' 32 33 34 35# 今回はトレーニング用に376枚、バリデーション用に101枚の画像を用意した。 36 37nb_train_samples = 376 38 39nb_validation_samples = 101 40 41 42 43batch_size = 10 44 45nb_epoch = 100 46 47 48 49 50 51result_dir = 'Results' 52 53if not os.path.exists(result_dir): 54 55 os.mkdir(result_dir) 56 57 58 59 60 61def vgg_model_maker(): 62 63 """ VGG16のモデルをFC層以外使用。FC層のみ作成して結合して用意する """ 64 65 66 67 # VGG16のロード。FC層は不要なので include_top=False 68 69 input_tensor = Input(shape=(img_width, img_height, 3)) 70 71 vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor) 72 73 74 75 # FC層の作成 76 77 top_model = Sequential() 78 79 top_model.add(Flatten(input_shape=vgg16.output_shape[1:])) 80 81 top_model.add(Dense(256, activation='relu')) 82 83 top_model.add(Dropout(0.5)) 84 85 top_model.add(Dense(nb_classes, activation='softmax')) 86 87 88 89 # VGG16とFC層を結合してモデルを作成 90 91 model = Model(input=vgg16.input, output=top_model(vgg16.output)) 92 93 94 95 return model 96 97 98 99 100 101def image_generator(): 102 103 """ ディレクトリ内の画像を読み込んでトレーニングデータとバリデーションデータの作成 """ 104 105 train_datagen = ImageDataGenerator( 106 107 rescale=1.0 / 255, 108 109 zoom_range=0.2, 110 111 horizontal_flip=True) 112 113 114 115 validation_datagen = ImageDataGenerator(rescale=1.0 / 255) 116 117 118 119 train_generator = train_datagen.flow_from_directory( 120 121 train_data_dir, 122 123 target_size=(img_width, img_height), 124 125 color_mode='rgb', 126 127 classes=classes, 128 129 class_mode='categorical', 130 131 batch_size=batch_size, 132 133 shuffle=True) 134 135 136 137 validation_generator = validation_datagen.flow_from_directory( 138 139 validation_data_dir, 140 141 target_size=(img_width, img_height), 142 143 color_mode='rgb', 144 145 classes=classes, 146 147 class_mode='categorical', 148 149 batch_size=batch_size, 150 151 shuffle=True) 152 153 154 155 return (train_generator, validation_generator) 156 157 158 159 160 161if __name__ == '__main__': 162 163 start = time.time() 164 165 166 167 # モデル作成 168 169 vgg_model = vgg_model_maker() 170 171 172 173 # 最後のconv層の直前までの層をfreeze 174 175 for layer in vgg_model.layers[:15]: 176 177 layer.trainable = False 178 179 180 181 # 多クラス分類を指定 182 183 vgg_model.compile(loss='categorical_crossentropy', 184 185 optimizer=optimizers.SGD(lr=1e-3, momentum=0.9), 186 187 metrics=['accuracy']) 188 189 190 191 # 画像のジェネレータ生成 192 193 train_generator, validation_generator = image_generator() 194 195 196 197 # Fine-tuning 198 199 history = vgg_model.fit_generator( 200 201 train_generator, 202 203 samples_per_epoch=nb_train_samples, 204 205 nb_epoch=nb_epoch, 206 207 validation_data=validation_generator, 208 209 nb_val_samples=nb_validation_samples) 210 211 212 213 vgg_model.save_weights(os.path.join(result_dir, 'finetuning.h5')) 214

その後、こちらで判定を行います。

python

1import os, sys 2 3import numpy as np 4 5from keras.applications.vgg16 import VGG16 6 7from keras.models import Sequential, Model 8 9from keras.layers import Input, Activation, Dropout, Flatten, Dense 10 11from keras.preprocessing import image 12 13from keras import optimizers 14 15 16 17classes = ['0','_30','30_90','_100'] 18 19nb_classes = len(classes) 20 21img_width, img_height = 160, 120 22 23 24 25result_dir = 'Results' 26 27 28 29# このディレクトリにテストしたい画像を格納しておく 30 31test_data_dir = 'D:/image_data/_100' 32 33 34 35def model_load(): 36 37 # VGG16, FC層は不要なので include_top=False 38 39 input_tensor = Input(shape=(img_width, img_height, 3)) 40 41 vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor) 42 43 44 45 # FC層の作成 46 47 top_model = Sequential() 48 49 top_model.add(Flatten(input_shape=vgg16.output_shape[1:])) 50 51 top_model.add(Dense(256, activation='relu')) 52 53 top_model.add(Dropout(0.5)) 54 55 top_model.add(Dense(nb_classes, activation='softmax')) 56 57 58 59 # VGG16とFC層を結合してモデルを作成 60 61 model = Model(input=vgg16.input, output=top_model(vgg16.output)) 62 63 64 65 # 学習済みの重みをロード 66 67 model.load_weights(os.path.join(result_dir, 'finetuning.h5')) 68 69 70 71 # 多クラス分類を指定 72 73 model.compile(loss='categorical_crossentropy', 74 75 optimizer=optimizers.SGD(lr=1e-3, momentum=0.9), 76 77 metrics=['accuracy']) 78 79 80 81 return model 82 83 84 85 86 87if __name__ == '__main__': 88 89 90 91 # モデルのロード 92 93 model = model_load() 94 95 96 97 # テスト用画像取得 98 99 test_imagelist = os.listdir(test_data_dir) 100 101 102 103 for test_image in test_imagelist: 104 105 filename = os.path.join(test_data_dir, test_image) 106 107 img = image.load_img(filename, target_size=(img_width, img_height)) 108 109 x = image.img_to_array(img) 110 111 x = np.expand_dims(x, axis=0) 112 113 # 学習時に正規化してるので、ここでも正規化 114 115 x = x / 255 116 117 pred = model.predict(x)[0] 118 119 120 121 # 予測確率が高いトップを出力 122 123 124 125 top = 3 126 127 top_indices = pred.argsort()[-top:][::-1] 128 129 result = [(classes[i], pred[i]) for i in top_indices] 130 131 print('file name is', test_image) 132 133 print(result) 134 135 print('=======================================')

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

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

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

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

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

Q71

2019/01/22 01:12

質問文は、色々省略されているように思います。 「42」と書いてある画像を学習するのでしょうか。それとも、例えばビーカーに入っている水が「およそ42cc」というのを出したいのでしょうか。 前者なら、0〜9を学習して、物体検出を行い、検出した位置から最終的な「数字」を出すことができそうです。
blackmk

2019/01/23 16:02

修正依頼ありがとうございます.後者の方の検証を行いたいと考えてます.
guest

回答1

0

ベストアンサー

このようにすると数値の分だけフォルダを作成しなければならない気がしておりまして

はいその通りです。

具体的にどのようなことをしたいのかは分かりませんが、別のアプローチで解決すべき問題だと思います。

追記

例えばですが、学習済みCNNモデル(InceptionV3, Vgg16など)を用いて特徴抽出を行い、その特徴量を用いてクラスタリング(例えばk-means法)を用いて分類し、最後に対応するクラスにラベルをつけるということなら可能かもしれません。

投稿2019/01/21 14:55

編集2019/01/21 15:02
_Victorique__

総合スコア1392

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

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

blackmk

2019/01/23 16:03

ご回答ありがとうございます。そうですね,たしかにそのまま行うのは大変そうなので,手法の検討をしたいと思います.ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問