【Raspberry Pi】 カメラを使ってみる②(顔認識)
Android Things
12/13にAndroid Thingsなるものが発表されました。 Androidでラズパイを操れるらしいです。 普段Android触ってる私としては、興味も沸きますが、これまでと同等の事が出来るのでしょうか・・・ 最近ラズパイが体調不良ですが、気が向いたら試してみようと思います。
Webカメラを使った顔認識
Webカメラを使って顔認識をしてみます。 利用するのは、pythonのOpenCVです。
最終的に、webiopiに組み込むことを考えます。 よって利用するのは、OpenCV3です。
お試しで手軽にインストール出来たOpenCV2を使って、いろいろ試してさあ実践と思ったら、 OpenCV3じゃなきゃダメってことに気付いて、入れ替えるだけだろうとか気軽に考えていると大きな時間のロスと深い悲しみを味わいます。(本人談)
RaspberryPi に OpenCV3をインストールする際は、ビルドをする必要があります。 Ubuntuですと、Anacondaで手軽にpython用OpenCV3がインストール出来ますが、 RaspberryPiにインストールできるAnacondaの亜種MinicondaにはOpenCVが無い為 makeをする必要があります。
こちらを参考に導入しました。
http://www.pyimagesearch.com/2016/04/18/install-guide-raspberry-pi-3-raspbian-jessie-opencv-3/
最終的に
import cv2
cv2.__version__
としたもののバージョンが、3.xになっていれば導入成功です。
ビルドに1時間以上かかるため、のんびり待ちましょう。 ラズパイの能力では、他ごとをするのは厳しいと思います。
手順の途中で、仮想環境(virtualenv)を使っていますが、利用することをお勧めします。
ダウンロードして展開したフォルダ内に、各種サンプルがあり、Python用の物もあるため参考になります。 ドキュメントも豊富なので情報に困ることは無いでしょう。出来ることが多すぎて困るくらいです。
では戦車に搭載する機能です。
チュートリアル的な意味合いも踏まえ、顔認識をして照準を出す事をします。
追加したメイン処理がこちら。 https://github.com/kyo-kato/raspi/blob/master/webiopi/tank/parts/camera.py
見るからに課題が多い・・・
OpenCVのサンプルでは、GUIのウィンドウを表示して画像を出力しているが、 今回はHTMLに埋め込みたいので、base64に変換しています。 たった二行ですが試行錯誤の嵐でした・・・。 base64の文字列にしたものを変数に保持して、webiopiのjsからゲッターを呼ぶことで画面に表示しています。 映像は無限ループさせなければならず、python側からjsの関数を呼ぶことは出来ないので苦肉の策と言ったところでしょうか。 sleep入れなければ、スムーズな映像となりますが、CPU負荷が高い為、やむなく入れています。
真ん中付近は顔検出および描画処理です。
v2.CascadeClassifierで検出器を設定し、例えばここに車のデータを渡すと車の検出となります。
顔が検出されたら、その座標を元に照準マークを描画します。
検出された時の様子がこちら。 
ディスプレイに某有名な方の顔を映しています。 10人くらい映しても検出できていました。 センターに〇印を描画し、(見にくいですが)検出された顔の上に中心点からの距離を表示しています。
今回は、サンプルにもあった顔検出器を利用しました。 OpenCVには物体検出の機能があり、カスケード分類器と呼ばれるものを作成することで、サンプルには無いいろいろなモノを検出できるようになります。
願わくば、戦車を検出できるようにしたいところです。 そのためには、機械学習のお勉強が必要です。 ついでに深層学習なども勉強したいです。
先日、「人工知能は人間を超えるか」という本に出会い、なかなかの衝撃を受けました。 (以前から気になってはいましたが、ラズパイを触ってから読むと、また違う面白さがあります。)
来年のテーマは、機械学習や深層学習といった分野になるかもしれません。 まさかゲーム用途以外で、GTX1000系グラボが欲しくなる日が来るとは思っていませんでした。