ディープラーニングで画像認識 実装、keras ImageDataGenerator
index:
概要
mnist 等のサンプル以外で、画像認識の実装テストを行いました。
条件として、自前の画像を準備(カメラ撮影、ネット検索等で取得)し、
ラベル情報を追加して、教師データとして。学習する実践編の形となります。
環境
keras : 2.1.3
tensorflow : 1.4
python : 3.5.2
処理の流れ
・学習
・学習結果、保存
・学習結果、ロード
・検証(predict)
=>画像認識(判定ラベルの出力)
前処理については、次回以降で記載したいと思います。
学習データの配置
data フォルダの下に、
train : 学習用
validation : 検証用
を作成し、
各フォルダの下に、
認識ラベル単位のフォルダ、その下に、学習用の画像を配置
C:\tmp\2017_tmp\python35\tensorflow\img_data_test>tree data
フォルダー パスの一覧: ボリューム Acer
ボリューム シリアル番号は 7221-E6BF です
C:\TMP\2017_TMP\PYTHON35\TENSORFLOW\IMG_DATA_TEST\DATA
├─train
│ ├─bird
│ ├─cat
│ ├─dog
│ └─flower
└─validation
├─bird
├─cat
├─dog
└─flower
ファイル一覧、の一部。
学習用(train)、cat (ネコ) 種類の画像を配置
その他の認識させたい、単位でフォルダを作成し
検証用も、同様に。配置します
C:\tmp\2017_tmp\python35\tensorflow\img_data_test>dir data\train\cat 2018/11/27 09:51 <DIR> . 2018/11/27 09:51 <DIR> .. 2018/11/26 15:46 29,476 cat_0_1.jpg 2018/11/26 15:46 24,597 cat_0_1016.jpg 2018/11/26 15:46 27,204 cat_0_1027.jpg 2018/11/26 15:46 25,610 cat_0_1213.jpg 2018/11/26 15:46 22,106 cat_0_1290.jpg 2018/11/26 15:46 25,508 cat_0_1396.jpg 2018/11/26 15:46 22,789 cat_0_1464.jpg 2018/11/26 15:46 24,569 cat_0_1548.jpg 2018/11/26 15:46 23,503 cat_0_1951.jpg 2018/11/26 15:46 28,274 cat_0_1960.jpg 2018/11/26 15:46 23,413 cat_0_1986.jpg 2018/11/26 15:46 27,176 cat_0_2018.jpg 2018/11/26 15:46 23,045 cat_0_2026.jpg 2018/11/26 15:46 27,157 cat_0_2090.jpg 2018/11/26 15:46 24,045 cat_0_2145.jpg 2018/11/26 15:46 23,925 cat_0_2208.jpg 2018/11/26 15:46 25,596 cat_0_2324.jpg 2018/11/26 15:46 23,728 cat_0_2454.jpg 2018/11/26 15:46 23,944 cat_0_2714.jpg 2018/11/26 15:46 26,649 cat_0_2750.jpg
実行方法
・ train.py
=> 学習処理、学習済みファイルの保存
・predict.py
=> 検証(画像判定)の処理、検証したい画像ファイルを指定します。
例: python predict.py ファイル名
説明など
・学習
ImageDataGenerator で、学習/検証 各フォルダの、画像リサイズ、
ラベル(class)を生成します
epochs 数は、適等に修正下さい。
flow_from_directory は、フォルダを指定すると、
学習に必用なデータに、変換してくれそうですので
便利でしたが。変換後の数値データ等が、カンタンに見れないようで
いまいち、不安が残りました。
class_mode='categorical' を指定すると、3種類以上のカテゴリにも
対応されるようです
train.py
batch_size = 32 epochs = 5 #epochs = 1 # #ImageDataGenerator train_datagen = ImageDataGenerator( rescale=1.0 / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1.0 / 255) # train_generator = train_datagen.flow_from_directory( 'data/train', target_size=(128, 128), batch_size=batch_size, class_mode='categorical') label_dict = train_generator.class_indices print( label_dict ) num_categ =len(label_dict) # validation_generator = test_datagen.flow_from_directory( 'data/validation', target_size=(128, 128), batch_size=batch_size, class_mode='categorical')
・モデル作成、実行。結果の保存。
#model model_cls= Img_Model(num_categ) model= model_cls.get_model() model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) #fit history = model.fit_generator( train_generator, samples_per_epoch=800, nb_epoch=epochs, validation_data=validation_generator, nb_val_samples=200) model.save_weights('img_test.h5')
・ 検証
predict.py
学習済ファイルのロード、
モデルの コンパイル
・ predict で、検証。
numpy arrayが、出力され、各class (フォルダ単位の種類)
ごとの正解率が出力されますので、class を検索して出力します。
# model_cls= Img_Model(num_categ) model= model_cls.get_model() model.load_weights( 'img_test.h5') model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) pred = model.predict(x)[0]
ログ等
・検証の結果
neko_13.jpg で、ネコの画像を検証
class=cat
=> ネコの判定が、出力されました、(正解です)
python predict.py neko_13.jpg Using TensorFlow backend. neko_13.jpg Found 243 images belonging to 4 classes. {'cat': 1, 'dog': 2, 'bird': 0, 'flower': 3} 2018-11-27 17:04:02.157415: I C:\tf_jenkins\home\workspace\rel-win\M\windows\PY\35\tensorflow\core\platform\cpu_feature_guard.cc:137] Your CPU compiled to use: AVX predict: [ 8.98553699e-05 9.68049169e-01 3.16024683e-02 2.58460728e-04] max= 0.968049 dict-value: 1 class=cat
・train の実行ログ
学習画像は、少なめですが。
エポック単位で、110秒ほど処理していますので
作業用のwinPCでは、画像の増加や、パラメータ変更を行う場合。
かなり処理時間が必用かもしれません。