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パッケージをインストールしてなかった)、うだうだしている間に時間切れとなりました。