2015年8月2日日曜日

Backgammon dice detection with OpenCV

最近、仕事でOpenCVというツールの使い方を少し覚えました。OpenCVというのは、コンピュータビジョン用のライブラリで、様々な画像処理を行うことができます。OpenCVにはいろんな機能があるので、全部分かったなんてことは全く無いのですが、とりあえず使えるようになった機能だけでも、そこそこ役に立つものができそうな雰囲気になってきたので、バックギャモンに応用してみました。


ご覧の通り、ダイスを検出して拡大表示するプログラムです。最近のバックギャモンのネット中継は高画質なので、ダイスの目まではっきり見えます。ただし問題は自分の目が悪いこと。ダイスだけ拡大してくれたらなぁ、と思ったことが多々あるので、自分でやってみました。

現在のプログラムは「背景差分法」というアルゴリズムを使っています。バックギャモンの動画では、ボードが固定されており、動いているのはプレイヤーの手やチェッカー、それと今回検出したい「ダイス」です。背景差分法を使うと、これらの動いている物がどこにあるか検出することができます。それらの物体の中から、ダイスの動きの特徴をするものを取り出す処理を書きました。
「ダイスの動きの特徴」を観察すると、プレイヤーの手やチェッカーに比べて小さい物体が動いてきて、最後には「止まる」ことが分かりました。というのはバックギャモンプレーヤーなら誰でも知っていますが、コンピューターのプログラムにはいちいち教えてやらないといけません。面倒ですね。

これくらいのプログラムでも、ネット中継のエクスペリエンス向上にはちょっと役い立つだろうと思います。
ついでに、今後の開発ロードマップも明らかにしておきましょう。

  1. 検出したダイスの目をコンピュータで認識して、きれいな画像で表示する(現在は動画から切り出して拡大表示)。
  2. タイムラプス動画でもダイスを認識できるようにする

とりあえずここまでです。そうすれば、私の棋譜入力ライフがだいぶ改善するはずです!

やってみて分かったのですが、この処理は計算量が多いので、動画をリアルタイムで処理できません。GPUで処理させればもっと高速に処理できると期待できるのですが、うちにはGPU搭載のパソコンが無いのでした。Macはオシャレ過ぎて役に立た無いことが分かったので、ここはWindowsの”ゲーミングマシン"でも新調しようかと思います。そうすれば、XGの解析もあっという間に終わるんじゃ無いかな。そろそろWindows 8パソコンが投げ売りになってたりするとうれしいのですが。

ダイス画像からの出目認識は、今をときめくDeep learningでやってみようと思います。これが有名な手段の目的化ですね。実際のところ、今回試作したプログラムは、ダイス画像を収集するためのツールとして作ろうと思い立ちました。Deep learningでは学習用に大量のデータが必要だと聞きました。ダイスくらい簡単なものならそれほどデータはいらないのかもしれませんが、所詮Deep learningをやってみたいだけなので気にしないでください。

Deep learningでダイスが判別できるようになれば、背景差分法をタイムラプス動画に適用した場合でも、差分を手当たり次第認識させることでダイス認識がうまくいくんじゃないかと考えています。

0 件のコメント:

コメントを投稿