こんにちは、えんせきです。
結婚式ラッシュでここ2週間毎週結婚式にお呼ばれしていました。
裏では、目線を検出できるようにデータセットを作ったりしていたのですが、若干データセットのバリエーション不足が顕在化してきています。
今まで何してたの?
- 最初にデータセットを作る準備をしていた
- 苦行に耐える準備をしていた
- 苦行に耐えて平均画像まで準備した
- GoogLeNetに顔画像を学習させた
GoogLeNetには辛い思いをさせたと思う。
大まかな方針
モデルを読み込む
平均画像を作成する
以下ループ
OpenCVで顔のキャプチャ画像を取得する
キャプチャ画像から顔の部分を切り取る
画像に前処理を行う
ネットワークに通す
7x5の画像(注視点がなんか色変わることを期待してる)で表示する
普通の識別問題だったら最後にSoftmaxからのargmaxだけど、今回は空間情報になるしからargmaxは参考程度にして各注視点の予測確率をそのまま可視化してみた。
学習回していた時の性能としては、
Train Loss, Train Accuracy, Valid Loss, Valid Accuracy
0.0529584 0.988353 1.8799 0.837176
になっている2000epoch目のモデル(10000epochは現在計算中)
(かなり過学習気味。背景のバリエーションが少なくてかなり性能が良さそうに出ている。撮影環境をもっと振ったほうが良さそう。)
結果
2000年台のネチケットを遵守するおっさんなので顔は写せないけど、得意な領域と苦手な領域が出ているようす。
ちなみに黄緑色の注視点座標は10回分の移動平均で出している。
顔を隠しているグレーのマトリクスが注視点マトリクスで明るいほど注目されている場所になるはず。
ただ、色が全体的にうすすぎてイマイチだった。Gifにすると余計イマイチだった。
ここからは可視化の工夫が必要だと思う。
所感
とりあえず、Webカメラで撮影したものをリアルタイムでニューラルネットワークに突っ込んで結果を拾うことは出来た。
あとは、学びとして、
学習/検証のためのデータセット、ロバスト性確認のための別環境データセット、リアルタイムデータ
の3パターンを用意したほうが良いかもしれない。
ロバスト性確認のための別環境データセットがないからいきなりリアルタイムデータに入れてしまっていて定量的な評価が出来ていない。
コード
説明込みにしようと思ってJupyter notebookで作ったけど、OpenCVのimshowをJupyter Notebookから使うとうまくdestroyAllWindws()してくれないので注意
github.com