EnsekiTT Blog

EnsekiTTが書くブログです。

OpenCVとWebカメラで撮った画像をリアルタイムでChainerのDNNに突っ込んだ話

こんにちは、えんせきです。
結婚式ラッシュでここ2週間毎週結婚式にお呼ばれしていました。
裏では、目線を検出できるようにデータセットを作ったりしていたのですが、若干データセットのバリエーション不足が顕在化してきています。

つまりなにしたの?

目線検出のために、OpenCVWebカメラで撮った画像をChainerのDNN(GoogLeNet for 目線検出)に突っ込んでリアルタイムにネットワークを通してみた。
f:id:ensekitt:20171218020050j:plain

今まで何してたの?

ensekitt.hatenablog.com

  • 苦行に耐える準備をしていた

ensekitt.hatenablog.com

  • 苦行に耐えて平均画像まで準備した

ensekitt.hatenablog.com

  • 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は現在計算中)
(かなり過学習気味。背景のバリエーションが少なくてかなり性能が良さそうに出ている。撮影環境をもっと振ったほうが良さそう。)

結果

f:id:ensekitt:20171218014747g:plain
2000年台のネチケットを遵守するおっさんなので顔は写せないけど、得意な領域と苦手な領域が出ているようす。
ちなみに黄緑色の注視点座標は10回分の移動平均で出している。
顔を隠しているグレーのマトリクスが注視点マトリクスで明るいほど注目されている場所になるはず。
ただ、色が全体的にうすすぎてイマイチだった。Gifにすると余計イマイチだった。
ここからは可視化の工夫が必要だと思う。

所感

とりあえず、Webカメラで撮影したものをリアルタイムでニューラルネットワークに突っ込んで結果を拾うことは出来た。
あとは、学びとして、
学習/検証のためのデータセットロバスト性確認のための別環境データセット、リアルタイムデータ
の3パターンを用意したほうが良いかもしれない。
ロバスト性確認のための別環境データセットがないからいきなりリアルタイムデータに入れてしまっていて定量的な評価が出来ていない。

コード

説明込みにしようと思ってJupyter notebookで作ったけど、OpenCVのimshowをJupyter Notebookから使うとうまくdestroyAllWindws()してくれないので注意
github.com

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。