初めまして、2015年1月に中途入社しました開発部の山田です。
前職では14年間、Windows/iOS/Androidのアプリ開発をしており、サーバーやWebに関することは株式会社ロックオンが初めて。毎日、悪戦苦闘しながらも個性豊かなメンバーに囲まれて楽しく働いています。

さて、先日、仕事帰りにメンバーとラーメンを食べに行った時のこと。
私が、前々から疑問に思っていたことを口にしたことでちょっと盛り上がりました。

「駅や街の広告は、どのくらい見られているのか?」
「見ているなら、広告のどこをみているのか?」

でも、Web広告みたいにクリックなんかで計測はできないよね・・・。
ということで、話し合った結果

1. 広告内に小型カメラを設置する
2. 顔(目や鼻)認識で、カメラと目や鼻が合ったときに広告が目に入ったとする
3. 大きい広告には、何分割かに小型カメラを設置し、どのカメラと一番合ったかで、広告のどこを見られているかを判定する

という結論に。
では、さっそくデモを作成しなければっ!
ということで、会社のお昼休みに簡単なWindowsアプリを作ってみました。

1. 開発環境を入れる
Windowsアプリを作成するには、とにもかくにも開発環境。
無償提供されているVisual Studio 2013 Express(以降 VS2013)をインストールします。

windowsDesktop Applicationを作成する「for Windows Desktop」をインストールします。

2. プロジェクトの作成
VS2013をインストールしたら、プロジェクト作成。
今回は「C# Windowsフォームアプリケーション」で作成します。

VS2013では、WPFアプリケーションやVisual Basic、C++のプログラミングもできるので、興味のある方はそちらもお試しください。

3. カメラ制御
カメラ制御は、DirextShow(以前、趣味で「宅外iPhoneから自宅エアコンを操作する」システムを作った際の、カメラでエアコン状態を監視する)モジュールを流用しました。

DirectShowは、昔からあるWindowsの技術要素で特に新しいものではありませんが、DirectShowの概念やプログラミングは、Windowsプログラミングに慣れていないと若干難しいかもしれません。
DirextShow(DirextX)のことを書き始めると、ブログの範囲を超えてしまうので、興味のある方は専門書などをご参考ください。

ここで一旦動作テスト。
「撮影ボタン」でカメラを使って画面に出して。
「解析」で一枚画をBitmapとして取得!

nakayama

動いた!動いた!
左側の真っ黒な個所は、実際にはカメラからの映像が流れています。
オーバーレイ描画なのでキャプチャすると真っ黒になります。

4. 顔認識
さて、ここからが本題の顔認識です。
検索エンジンでモジュールを探してみると
・KINECT for Windows
・OpenCV
の二つがパッと出てきました。

そういえば、前職でKINECTでの画像処理をやっていたのをすっかり忘れていました。

今回は、OpenCV系の顔認識モジュールを使うことに。
プロジェクトに.netのモジュールを参照追加するだけで使えますしフリーです。
ただし、商用利用したり趣味のレベルを超えた使用を考える場合、ライセンスには注意してください。

認識処理はかなり簡単
1. カメラから写真データを取得
2. 表示サイズにリサイズする(小さい方が、認識処理が高速)
3. (2)を顔認識モジュールに渡し、顔オブジェクトの位置情報を取得
4. (3)に基づいて、矩形で囲む
5. 画面に表示する

たったこれだけ。
コードにすると。

code-1

なお、”haarcascade_frontalface_default.xml”は標準的な顔認識辞書。
鼻を検出する辞書や目を検出する辞書に変更すれば、目や鼻、耳も判定可能です。

では、顔認識テスト!
ロックオフでの鍋パーティにて!

scan2

黄色い矩形が顔認識で判定された箇所です。
ちゃんと判定されてます。
若干ズレてしまっているところもありますので、認識率は課題ですね。

撮影作業を除いて、ここまででざーっと40分程度。
基本部分はお昼休みで作れちゃいました。
OpenCVに感謝ですねっ!!

5. 今後と課題
このままでは、どこにでもある単なる顔認識アプリ

・目や鼻を認識した時にカウントする機能
・見ている秒数により、注目度を測定・判定する機能
・複数のカメラで分割部分の注目度を測定・判定する機能

なんかを付けて、人からアドバイスを頂けるものになっていけば…と思っています。

課題はやっぱり認識率。
人ではないものに反応したり、見てもないのにカウントしたり、見ているのにカウントしなかったりすると意味がありません。

(趣味ですが)以前、特定文字の認識率を上げるため、文字認識のモジュールを自作しました。
同じように、広告測定に合った顔認識モジュールを模索しなければいけないかもしれませんね。