FutureStandard MAKERS

東京にある映像解析プラットフォーム「SCORER」の開発をしているスタートアップのブログです

Openpose Faceリリース!ウィンクを判定してみよう

f:id:FutureStandard:20180614121942p:plain
皆さんOpenpose使ってますか?
今回は前回の全身骨格検知に続いてOpenposeの追加機能、顔部品検知をご紹介します。

【Openposeのブログ】
blog.futurestandard.jp

この機能は顔の70点の座標を検知し、出力することができる、かなり強力なものになります。
github.comhttps://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/media/keypoints_face.png?raw=true
https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/output.mdより引用)


これにより後処理として一定の計算は必要ですが
・顔の向き
・瞬き状態
・会話中かどうか判定
・目線
・表情
・首の傾げ具合
・うなずき
など、これまたアイデアがわんさか出てきます。
使い方は基本上の記事と同じで、クレカが登録されていればRuleでアルゴリズムを追加してスマホかSCORERラズパイで撮影します。

試しにウィンクのフリー素材画像を撮影してみて目の開き具合を判定してみましょう
[無料写真] ウインクする女性社員 - パブリックドメインQ:著作権フリー画像素材集
これをスマホで撮影してOpenpose Faceをかけるとこうなります。
youtu.be



このデータをダウンロードして、GoogleSpreadSheetsに取り込んでみましょう

解析結果のページからダウンロード対象の時刻を入力してダウンロード

作業フォルダで解凍して、中のファイルを確認する(tsvファイル)
f:id:FutureStandard:20180615144341p:plain

GoogleSpreadsheetの「ファイル」→「インポート」にD&Dする
f:id:FutureStandard:20180615144124p:plain

インポートの条件を聞かれるので
・場所のインポート→現在のシートを置換
・区切り文字の種類→タブ
・テキストを数値や日付に変換→いいえ
で設定
f:id:FutureStandard:20180615144505p:plain

そうするとこのようなかたちで取り込まれます。
f:id:FutureStandard:20180615144631p:plain
ですが、取り込まれたOpenposeのデータはJson形式となっているため、このままシートで解析するのは少々大変そうですね・・

そこで今回はGoogle Spread Sheetsのスクリプト機能を使います。
これはエクセルのマクロやVBAのようなもので、シートのデータを活用した簡単なプログラムが書け、しかもJavascriptに近い言語のため、Jsonデータを扱うのが非常に得意です。
しかも、ここで定義した関数をシートから呼び出すこともできるので、今回はこれを活用してデータを使いやすい形にしてみましょう。

メニューの「ツール」→「スクリプトエディタ」で下記のコードをコピペします。
gist.github.com

f:id:FutureStandard:20180617015040p:plain

今回このブログを書くときにシート名「Sheet2」にopenposeのデータを取り込んだので、シートを追加し、そのE1に
「=openpose2csv("sheet2","face")」
を入力するとJsonのデータが分解されてこのように整理されます。(A1に入れなかったのは後で目の開き具合を計算するためです。)
f:id:FutureStandard:20180617020103p:plain
一つのフレームに複数人映っていることもあるかとおもうので、humanNumの項にて分けて表示しています。

項目名の定義は「face」モードの場合
1こ目が撮影時刻(3fpsなので0.333..刻み)
2こ目がフレーム内人物番号(0~)
3-212こ目が顔の番号(0-69の70点)ごとのX,Y,その部位であろう確率score(0-1)
213こ目がすべての顔パーツの中で一番高いscore
214-217こ目が顔全体を囲うための四角を描画するための情報(最小最大のX座標、Y座標)
となります。

さて、これでデータを解析する準備がようやく整いました。
あとは簡単です。
左目と右目の開き具合は
f:id:FutureStandard:20180617020534p:plain
この番号から41番と37番のY座標の差、46番と44番のY座標の差がわかれば定義できそうです。
A2に「=EA2-DO2」
B2に「=EP2-EG2」
を入力して下にフィルしていきます。
座標の差分だけだと遠いときと近いときとで大きく値が変わってしまうので、閉じてる目と開いてる目の倍率をとりましょう
C2に「=if(B2/A2>1,B2/A2,A2/B2)」
を入れれば倍率が出ます。
f:id:FutureStandard:20180617020434p:plain

今回は一つの画像をスマホで撮影したものなので、あまり変化はないのですが、だいたい3倍ぐらいにしておけば検知ができそうなことがわかります。
もちろん顔が傾いていたりする場合は比率も変わったりするので、きちんと使いこなすにはほかにも補正が必要とはなりますが、簡単にやれる範囲としては十分な結果ではないでしょうか?
これでウィンクしてスナップショットを抜き出すなんて処理が実装できそうですね!

他にも例えば
・目の横の長さ(36と39番のX座標差)に対して開きがほぼないときに「目が閉じている」と定義して眠そうな人を検知
・口の開き具合をしばらく記録して、パクパク動いているかを判定
・目の切れ目(右目なら36と39番のX座標)に対して、目玉位置(68番)のX座標がどちらによっているかで視線を判定
なんかはGoogle Spread Sheetsをちょっといじるだけでいろいろわかってきそうですね!

今回はSCORERクラウドのページからダウンロードしてデータを手動でGoogle spread sheetに入れ込みましたが、近日中に皆さんがお持ちのAWS S3に自動プッシュする機能のリリースも予定しています。ご期待ください!

料金について

Openpose Body+Faceは1時間350円の従量課金になります。
(OpenposeはBodyが判定できないと顔の情報が取得できないため、Bodyとセットでのみお使いいただけます)

また、クラウドでの処理は解析端末の込み具合によって変わりますが、だいたい撮影から15分以上はかかることが多いです。
すぐに判定したいんだよ!というニーズをお持ちの人はニアリアルタイム(遅延1秒程度)のプランも用意していますので、弊社に是非お問合せくださいませ!

それでは!