Python mini Hack-a-thon で OpenCVを触ってみた

(第20回)Python mini Hack-a-thon

http://connpass.com/event/545/

参加してきました。3回目。

OpenCVを触ろうと思ってみたのは前日で、なんとなく画像認識をやってみたいというただの思いつき。

自分はボルダリングをやっているのですが、壁の画像からホールドやらを認識させることでなんかおもしろい事ができないかなーというのがきっかけ。

Pythonと画像認識で検索したらOpenCVが出てきたので使ってみることにしました。

インストール

インストールはここを参考に。Ubuntuなのでaptitudeでさくっとできるようです。
http://opencv.jp/opencv2-x-tips/install-linuxubuntu

(実際はsearchして適当にそれっぽいパッケージをインストールしたところ、ここに記載してあるうちのパッケージがいくつか抜けてました)

触ってみる

ちなみにOpenCVについてはこれっぽっちも知識がなかったので、まずは簡単な使い方から試していこうと思い

OpenCVで学ぶ画像認識
http://gihyo.jp/dev/feature/01/opencv

これが比較的易しい感じがしたので、これに沿って進めて行きました。ちなみにOpenCVはC++で書かれたもので、上記の連載の中でもサンプルコードはC++です。
OpenCVは公式にPython APIを用意しているため、一部を除いてほぼ同じ記述で問題なく動作しました。

連載では

  • 画像を読み込んで表示するだけ
  • 画像にエッジ抽出処理をかける
  • 画像を回転させる
  • 画像の中の顔を認識する

という流れでコードを示しながら使い方を説明しています。ハッカソンではこれらのコードをPythonで書き直してました。
https://gist.github.com/2982758

画像からオブジェクトを検出する

連載を読み進めることで、画像からなにか特定のものを認識させたい場合は、まずその対象の特徴を学習させる必要があることを学びました。
顔の認識については既に学習済みの検出器がOpenCVに付属しているのでそれを使うだけでしたが、それ以外についてはまず自分でサンプル画像を用意し、それを以って学習させる(検出器を作る)ことが必要です。

ちなみに、「学習に用いる上で効率的なサンプル数は,正解画像7000枚,非正解画像3000枚」らしいです。

OpenCVには一つの画像から大量のサンプル画像を生成するツールも付属しているので、これを活用して手間を省くのが定石なのかな?

ハッカソンでは、このツールを使おうとしたが見つからず(libcv-devパッケージをインストールしてなかった)、うだうだしている間に時間切れとなりました。

今後の目標

とりあえずはボルダリングのホールド(手や足をかける石)を検出するところまでやってみたいですね。
とはいうものの、ホールドの形は一つ一つ違う上に数も多いので、かなり大変な気がしてます。なんとか手間が省けないものかな。

あと、最終的にこんなのできるといいよね、というアイデアもまわりの人から貰ってきました。
どれも最初に書いたボルダリングの壁画像認識に絡めたものです。

  • 課題の難易度を自動判定する
  • 最適なムーブ(手や足の運び方)をサジェストする
  • 新しい課題を生成する

などなど。まあ、どれもハードル高すぎて無理なんじゃないかと思いつつ、本当にできたら楽しそうなので考えてはみようかと思います。