Webカメラで、シビアすぎる「だるまさんがころんだ」

人や物の動きを検知

前回に続いて、今回もOpenCVを使ったデモです。Lucas-Kanade法を使った移動物体のトラッキングをご紹介します。

トラッキングにより、Webカメラに映っている人や物の動きを、コンピューターが検知できるようになります。例えば、寝ている赤ちゃんがグズった時に親のスマホに通知したり、マウスやタッチパネルに触れることなく、画面を操作するようなアプリが作れるという事です。

Lucas-Kanade法は、有名なトラッキング手法の一つです。ざっくり説明すると、この手法は、動画のフレーム画像の個々の画素(ピクセル)の色や明るさが、時間と共にどの方向へ移動していくのか探索することで、物体の動きを把握しようとします。

こんな感じになりました

左上に、動いた方向が表示されています。赤い線が、追跡できた動きです。この動画の終盤を見て分かる通り、1センチ程度の震えでも、コンピューターに検出されてしまいます。もしこれを使って「だるまさんがころんだ」遊びをすると、きっと、最初に鬼が振り向いた瞬間に全員つかまります。

デモを作っていて分かったこと

探索精度よりも、ノイズの除去が大事

人が写るくらいの距離で撮ったビデオや写真には、探索に使用できるピクセルパターンが山ほどあります。なので、探索精度をいくら向上させても、ノイズだらけで役には立ちません。人の動きを期待どおりに検知するには、ノイズをきちんと除去する事が大切でした。

試行錯誤した結果、思い切ってフレーム画像を1/10まで縮小してから処理させてみると、ノイズを9割がた消してくれるようになりました。残り1割は、ローカット(閾値よりも動きの小さい線を除外)して対処しました。

縮小することで、処理画素数が減ってCPU処理コストも下がって一石二鳥でした。

光源の向きにも気を配る

光源の向きにも気を配る必要があります。コンピューターは、顔や手など、特徴的な見た目の物体をトラッキングするのは得意ですが、壁のような一様でのっぺりした物体は苦手です。特に顔の動きを追跡しようとするとそうなのですが、逆光になってしまうと、カメラから目、鼻、口の輪郭が捉えにくくなり、精度がガクッと落ちます。

今後の課題

今回は、誰もいない部屋でデモしました。もし、屋外や、パーティー会場など、絶えず何かが動いているような場所でデモしたとすると、これほどの精度は出せないかも知れません。

また、普通のWebカメラではなく、赤外線カメラやKinnect などの深度カメラを使うと、どれくらい精度が上がるのかも気になるところです。

今後は、その辺りも調べてみたいと思います。

サンプル画像10枚で、Haar分類器の自作に挑戦!

OpenCV でHaar分類器を自作してみる

昨年の12月に、OpenCV の バージョン3.1がリリースされました。画像認識の分野では、おそらく一番有名なプログラミング用ライブラリです。

OpenCVには、既に出来合いのHaar分類器があって、これを使うと、画像のどこに顔があるか認識できます。この分類器の認識精度に満足できない場合は、分類器を自作する必要があります。というわけで、試しに作ってみました。

分類器の自作にあたっては、「Create Your Own Haar Classifier for Detecting objects in OpenCV」というブロク記事と、「詳解 OpenCV -コンピュータビジョンライブラリを使った画像処理・認識-」という書籍を参考にしています。

Haar分類器とは?

Haar分類器は、教師あり機械学習手法の一つです。教師あり機械学習の場合、大量の正解画像(例えば、画像+顔の位置を表す矩形領域のXY座標)を予め人の手で用意しておいて、それを分類器の入力データとして与えます。そうすると、顔の位置を特定する為に最適な”パラメーター”を求めます。このパラメーターを求めるプロセスが、いわゆる「学習」に相当します。

パラメーターとは、-0.29384 とか、 2.3734509882 といった実数の集まりです。使う分類器の種類によって、パラメーターの意味合いは変わります。人間がその数字を見ても、デタラメな数にしか見えません。正解画像を1枚ずつ与えていくと、パラメーターの個数は変わらずに各々の値だけが刻々と変化します。値だけ眺めていても、どれくらいの認識精度を実現できそうなのか、さっぱり分かりません。テスト画像を実際に分類器にかけてみて、初めて精度を実感できます。

Haar分類器の作り方

Haar分類器で「顔」の位置を特定するデモはよく見かけるので、今回は少しひねって「目」の位置を特定してみます。

一般的に、Haar分類器は、最低でも1000枚単位の正解画像が必要だと言われています。前述のブログ記事を参考に、以下の手順で正解画像を用意しました。

  1. 動画撮影(Webカメラで自分を撮影)
  2. 動画の各フレームをbmp画像化(このやり方だと、一度に大量の画像が作れます。ffmpegを使いました)
  3. それらの画像から、目の位置をマウスで囲む(下の画像の赤い四角形)

tagging

黙々と作業すること20分、なんとか200枚作成できました。この生産性だと、1000枚作るのに約1時間半、ひたすら自分の顔が映った画像と向き合わねばならず、なかなか辛いです(笑)。ということで、1000枚集めるのは早々に諦めました。

実験結果

以下が、正解画像10枚の結果です。丸の箇所を「目」の位置と認識しています。

正解画像 10枚で学習

以下、100枚の場合。

正解画像 100枚で学習

以下、200枚の場合。

正解画像 200枚で学習

 

正解画像の増加に比例して、検出漏れが少し減り、誤検出が”激増”しました。この作業の延長線で1000枚集めても、シャボン玉で埋め尽くされる残念な結果になる気がします。

 

今後の課題

正解画像の集め方とか、正解画像の前処理とか、学習方法とか、識別アルゴリズムの種類とか、チューニングすべきポイントは山ほどあります。今回は、チューニングを一切考慮しないでHaar分類器を作るとどうなるか?という実験でもありました。

今後は、少しずつチューニングを施して、どこをいじるとどれくらい効果的なのか、検証していきたいと思います。

Toodledoでタスク管理を始めて、3ヶ月が経ちました

3ヶ月くらい前に、あなたの1日は27時間になる。――「自分だけの3時間」を作る人生・仕事の超整理法という本を読んだことをキッカケに、今まで手を出さなかったTo-Doアプリを使い始めました。

AppStoreにはタスク管理のアプリが山ほどありますが、私は永年、紙の手帳を使っていて、それで不自由なかった為、アプリを使うモチベーションはありませんでした。

そんな私が、著者オススメのToodledoを使ってみた訳ですが、なんと、3日坊主の私が今日までの3ヶ月間ずっと使い続けています。自分でもビックリ(笑)。

以下、ToDoリストを3か月使ってみた感想です。

サブタスク機能、いらなかった。

著者も使っていないようですが、私も、結局使っていません。

サブタスクというのは、親タスク–子タスク–孫タスク…といった階層関係のあるタスクのことです。階層化できると、例えば、プロジェクト–工程-作業…といった感じで、直感的にタスクを表現できます。

やってみようと思い立った時、「サブタスク」機能がどこまで充実しているか?という観点で色々なアプリを評価しました。

タスクを作成しているうちは気づかなかったのですが、”今日やるタスク”という視点でタスクを串刺しすると、どのアプリも、該当する子タスクのタイトルしか表示してくれません。「設計書作成」というタイトルでは何をすべきか分かりません。「〇〇プロジェクトの設計書作成」というところまでタイトルに含まれている必要があるのです。

じゃあいっそ、子タスクのタイトルに、親タスクのタイトルも入れてしまえば良いのでは?と思ったのとほぼ同時に、サブタスク機能いらないのでは?と気づいた訳です(笑)

今では、「親タスク」+空白文字+「子タスク」というタイトル表記法を取り入れて、サブタスク機能は使っていません。

予実は気にしない。期限管理のみ。

著者は、コンテキストを時間帯毎に区切って、その中にタスクを放り込んでいるそうです。さらに、各タスクに実績時間を入力して、自分の生産性を測定し、作業時間の見積精度を上げているそうです。本を読んだ時は、このPDCAサイクルの美しさに感動し、私もやってみたいと思ったわけですが、いざ始めてみると…やってないです(汗)。

実は昔、個人レベルの予実管理は、独自システムまで作って2年くらいトライしてみた結果、あまり役に立たなかった経験があります。自分の感覚を裏付ける数字は取れたものの、そこから先の改善に繋がらなかったのです。

そういう訳で、実績入力には二の足を踏んでいます。終わったタスクをチェックして消し込むという、シンプルな実績管理をしています。

その代わり、各タスクに期限(Due Date)を入れる事にしています。期限から逆算して、各タスクにどれくらい時間をかけるべきか頭の中で計算しているのです。今のところ、こんなやり方でも役に立っています。

週1のバックアップを忘れなくなった!

ToodleDoを使うまで、これは不可能なことでした(笑)。紙の手帳は10年以上続けているですが、こういう周期的なタスクを紙の手帳で管理しようとすると、毎週・毎月、次のページに同じタスクを記入する必要があります。私はものぐさなので、重要なタスクならまだしも、忘れてもそれほどインパクトのないタスクは、いちいち記入しません。

ToodleDoは、タスクに周期を設定しておけば、自動的に次のタスクを差し込んでくれるので、とっても便利です。実は、「週1回、アメブロをバックアップしています」は、これをトリガーにしています。

タスク粒度は粗め。

タスクは細かく分けるべきという主張には、見習うべき教訓が含まれていると感じています。実際、私がタスク管理してみようと思ったのは、著者のタスクの細かさにドン引きすると同時に、なぜそこまで熱中できるのだろう?と不思議に思った好奇心がきっかけです。

とはいえ、今の私のタスク粒度は、結構粗めです。ToDoリスト外の割り込みタスクがちょくちょく入ってくる状況なので、粒度を細かくするとタスクの組み替えが面倒になる気がして、躊躇しているのです。

そこまで細かくしなくても、ちゃんと役に立っているので、まぁいいかなと。

タスクの見直しは通勤中に。

毎朝、私は今日やるタスクに星をつけています。(フラグのようなものです)ToDoリストは、星・期限順で並べていて、終わったタスクはチェックをつけて消し込みます。

通勤中、電車の中でToodledoのiPhoneアプリを開いて、今日やることをチェックしたり、もっと効果的な順番にできないか考えたり、追加すべきタスクや漏れているタスクがないか思い返したりしています。

 

 

 

みなさんは、日々のタスクをどう管理していますか?