こちらでAIに見分けさせようとしたがうまく行きませんでした。
このままでは悔しいので、もうちょっと頑張ってみることにします。
データセットの工夫
まずはデータセットの画像を顔のみにトリミングし、かつ、サイズを正方形にした。
顔の向きはまちまち(正面だったり横を向いていたり)のままにしています。
サイズも大きいのから小さいのまでまちまちのままです。
学習結果
ネットワークモデル等の設定はそのままで、学習してみました。
(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枚切り出しました。
その結果!?
(全て「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枚ハズレ...
ほらやっぱり、このドラマの佐藤健は亀梨和也に似ているんだよ!(笑)
※って結論でいいのか?!