LoginSignup
4
1

More than 5 years have passed since last update.

もうちょっと頑張って、佐藤健と亀梨和也を人よりも賢く見分けたい

Last updated at Posted at 2018-09-11

こちらでAIに見分けさせようとしたがうまく行きませんでした。
このままでは悔しいので、もうちょっと頑張ってみることにします。

データセットの工夫

まずはデータセットの画像を顔のみにトリミングし、かつ、サイズを正方形にした。
顔の向きはまちまち(正面だったり横を向いていたり)のままにしています。
サイズも大きいのから小さいのまでまちまちのままです。

○佐藤健フォルダ
image.png
○亀梨和也フォルダ
image.png

学習結果

ネットワークモデル等の設定はそのままで、学習してみました。
(GPUで1000epochぶん回しています)

loss: 0.0277 - acc: 1.0000 - val_loss: 0.7732 - val_acc: 0.7222

全然効果がなく、とっても残念な感じです。
それでも懲りずに、別のデータで識別してみます。
(こちらは、トリミングや正方形化はしていません)

seikai:  70.0 %

あれ?思ったよりも良い結果になってますね(苦笑)
(佐藤健:2/10枚ハズレ、亀梨和也:4/10枚ハズレ)
亀梨くんを少しだけ見分けられるようになった感じです。
でも、イマイチはイマイチです。

他にも画像データ数を増やすとか打つ手はありますが、とりあえず今回はデータセットの工夫はここまでとします。

気を取り直して別の工夫に行きましょう。

ネットワークモデルの工夫

データセットは上記の工夫をしたまま、ネットワークモデルを工夫してみます。
まずはOver Fittingが疑われますので、そこから手を打っていきます。

最終層のGAPのあとに全結合を追加し、Dropoutを0.5で設定してみます。

# 最終層の設定
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation="relu")(x)
x = Dropout(0.5)(x)
predictions = Dense(1, kernel_initializer="glorot_uniform", activation="sigmoid", kernel_regularizer=l2(.0005))(x)
model = Model(inputs=base_model.input, outputs=predictions)

学習結果

で、学習してみると...

loss: 0.0048 - acc: 1.0000 - val_loss: 2.1575 - val_acc: 0.5556

val_lossが悲しいことになっています(爆)
当然のことながら、識別してみても、

seikai:  65.0 %

と効果はなかったようです。
「なんでも佐藤健」状態に近づいてしまいました。
(佐藤健:0/10枚ハズレ、亀梨和也:7/10枚ハズレ)

weightを変更してみる

imagenetの事前学習モデルを使用しているのですが、その重みパラメータを変更せずに使用していました。
最終層の重みパラメータの調整だけではどうにもならないようなので、せっかくの初期値を調整していきます。

# base_modelはweightsを更新しない
#for layer in base_model.layers:
#    layer.trainable = False

なお、それまで1epoch=2秒だったのが6秒と遅くなりますが、まぁしょうがないですね。
なのでのんびり待っていられないので、EarlyStoppingを追加しました。

from keras.callbacks import EarlyStopping

# 途中省略

# 学習を実行(10%はテストに使用)
early_stopping = EarlyStopping(monitor='val_loss')
model.fit(image_list, label_list, epochs=1000, batch_size=64, verbose=1, validation_split=0.1, callbacks=[early_stopping])

学習結果

その結果!!!

Epoch 22/1000
162/162 [==============================] - 6s 39ms/step - loss: 0.0017 - acc: 1.0000 - val_loss: 0.2523 - val_acc: 0.9444
<keras.callbacks.History at 0x7f5fe476ff60>

22epoch目で止まってしまいましたが、まぁまぁです。

seikai:  95.0 %

それでも95%までいきました。
(佐藤健:0/10枚ハズレ、亀梨和也:1/10枚ハズレ)

人(私)よりも賢いか?

一番やりたかった某ドラマの画像で確認します。
予告動画から15枚切り出しました。
image.png

その結果!?
(全て「0」が期待値)

file: drive/keras/data/gibo/image01.jpg result: 0.006102049
file: drive/keras/data/gibo/image02.jpg result: 0.96996385
file: drive/keras/data/gibo/image03.jpg result: 0.11807108
file: drive/keras/data/gibo/image04.jpg result: 0.94474953
file: drive/keras/data/gibo/image05.jpg result: 0.78054476
file: drive/keras/data/gibo/image06.jpg result: 0.0018015407
file: drive/keras/data/gibo/image07.jpg result: 0.99702007
file: drive/keras/data/gibo/image08.jpg result: 0.96259487
file: drive/keras/data/gibo/image09.jpg result: 0.86161226
file: drive/keras/data/gibo/image10.jpg result: 0.9739649
file: drive/keras/data/gibo/image11.jpg result: 0.02239359
file: drive/keras/data/gibo/image12.jpg result: 0.037958916
file: drive/keras/data/gibo/image13.jpg result: 0.62988317
file: drive/keras/data/gibo/image14.jpg result: 0.83684933
file: drive/keras/data/gibo/image15.jpg result: 0.49231532

9/15枚ハズレ...
ほらやっぱり、このドラマの佐藤健は亀梨和也に似ているんだよ!(笑)

※って結論でいいのか?!

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1