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


こちらで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枚ハズレ...
ほらやっぱり、このドラマの佐藤健は亀梨和也に似ているんだよ!(笑)

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