knaka Tech-Blog

AI, IoT, DIYエレクトロニクス, データサイエンスについて投稿予定です。

ディープラーニングで画像認識 実装、keras  ImageDataGenerator

index:

概要

mnist 等のサンプル以外で、画像認識の実装テストを行いました。
条件として、自前の画像を準備(カメラ撮影、ネット検索等で取得)し、
ラベル情報を追加して、教師データとして。学習する実践編の形となります。

環境

keras : 2.1.3
tensorflow : 1.4
python : 3.5.2

処理の流れ

・学習
・学習結果、保存
・学習結果、ロード
・検証(predict)
=>画像認識(判定ラベルの出力)

前処理については、次回以降で記載したいと思います。

コード

github.com


上記に、コミットしています。

学習データの配置

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では、画像の増加や、パラメータ変更を行う場合。
かなり処理時間が必用かもしれません。

f:id:knaka0209:20181127170943p:plain