KerasによるCNNでアニメ画像の認識
今回のテーマは、「KerasによるCNNでアニメ画像の認識」です。
Kerasというライブラリを使うことで、簡単にディープラーニングのネットワークを構築できます。
アニメ画像の認識の対象は、ジャンヌ3姉妹です。
3人とも、かなり似ているので、認識できるかどうか不安です。
それでは、手順含め、認識していきましょう。
*追加
続編を更新しました!
KerasによるCNNで画像の認識Part2+モデルの保存と読み込み
今回のゴール
とりあえず、動くようにすること!
これが、1番のゴールです。
今日思いついたので、今日中に実行すること。
色々と改善することと、理解が出来てないことが、浮き彫りになりました。
アニメ画像と前処理
アニメ画像収集
Fateのジャンヌ3姉妹の画像をグーグルの画像検索など、ネットから手動で取得しました。
集める画像は、ジャンヌ・ジャンヌオルタ・ジャンヌオルタリリィの3姉妹
訓練データにそれぞれ80枚
テストデータにそれぞれ30枚
予測用データは、取得画像の余り
画像の前処理
今回のゴール設定から、前処理はKerasのImageDataGeneratorによるもののみです。
今後は、顔画像の抽出などに取り組んでいきたいです。
CNNの構造
今回は、計算量がなるべく小さく、構造も単純にするために、
畳み込み層:1
プーリング層:1
中間層:1
出力層:1
の構成になっています。
とりあえず、動かすことを目標にしていきます。
結果
訓練データの精度が約34%、テストデータの精度が約33%でした。
そして、
予測データの精度が17%です。
まとめ
今回のゴールである
”とりあえず、動くようにすること!”
は達成できました。
しかし、
学習における精度が、30%台なので、物凄く精度が悪いです。
予測に関しては、17%とという結果になりました。
問題点
画像データが一番の問題だと、私は考えます。
画像データ
今回用意した画像データには、
- データ数が圧倒的に少ない
- 被っている画像
- リサイズはしてますが、サイズがバラバラ
- 顔は写っているが、その他の情報が多い
- 以上を含めノイズが多い
などの問題点があります。(他にもあると思いますが、)
ネットワーク
ネットワークが単純です。
畳み込み層が1層、中間層1層の単純ネットワークです。
改善
思いつきで始めたことなので、改善するかは・・・
ジャンヌ好きなので、改善しよう
画像の前処理
まず、画像の前処理を重点的にしていきます。
元データが悪ければ、出力の精度も悪くなるのは、自明だと考えます。
顔の抽出に取り組むこと。
データ数を増やす(水増し)
自動でデータ収集
など考えていますが、実行するかは・・・
追加:
アニメ画像の顔抽出を行いました。
ネットワーク
AlexNetや、GoogleNetなど、成果をあげているネットワークを参考に、ネットワーク構築する。
しかし、ノートPCではスペック不足が考えられるので、そこは別個に対応する。
Kerasを理解する
これが一番かもしれません。
まだ、Kerasを十分に理解していない且つ、機能も使いきれてないと思います。
ドキュメントの熟読踏まえ、違うデータ・サンプルデータでの実行を心がけたい。
プログラムコード
''' ライブラリのインポート ''' import numpy as np from keras.layers import Conv2D from keras.layers import Dense from keras.layers import Flatten from keras.layers import MaxPooling2D from keras.models import Sequential ''' CNNの構築 ''' model = Sequential() #畳み込み層 model.add(Conv2D(32, (3, 3), input_shape = (256, 256, 3), activation = 'relu')) model.add(MaxPooling2D(pool_size = (2, 2))) #平滑化 model.add(Flatten()) #全結合層 model.add(Dense(128, activation = 'relu')) model.add(Dense(3, activation = 'softmax')) #コンパイル model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy']) ''' 画像データのインポート & 訓練データ、テストデータ、予測データ ''' from keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator(rescale = 1./255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True) test_datagen = ImageDataGenerator(rescale = 1./255) predict_datagen = ImageDataGenerator(rescale = 1./255) training_set = train_datagen.flow_from_directory('train', target_size = (256, 256), batch_size = 32, class_mode="categorical") test_set = test_datagen.flow_from_directory('test', target_size = (256, 256), batch_size = 32, class_mode="categorical") predict_set = predict_datagen.flow_from_directory('predict', target_size=(256, 256), batch_size=32, class_mode="categorical") ''' 学習 ''' model.fit_generator(training_set, epochs = 10, verbose=2, validation_data = test_set) ''' モデルの評価 ''' score = model.evaluate_generator(predict_set) print(score)
最後に
ジャンヌ3姉妹尊い
P.S.
一番好きなジャンヌオルタは、一番画像保存していました。
続編の紹介
*追加
続編を更新しました!
KerasによるCNNで画像の認識Part2+モデルの保存と読み込み
参考
夢見るディープラーニング ニューラルネットワーク[Python実装]入門
画像認識 (機械学習プロフェッショナルシリーズ)