OpenCV 覚書
今更ながらのOpenCVですが、とにかく使ってみます。
第一の目標は、もちろん顔認識のWebサービスをやってみる...というところ。
第二の目標は、風景写真の位置特定です....(先は長いですが、できれば年代特定も)。
プラットフォームは、Windows2000/XPという、くそレガシーな環境。
これで動けば、後どこだって動くだろう....という感じです。
組み合わせは、Windows + OpenCV + Python + Apache
Pythonを選んだのは、速いし、ドキュメントも多そう..というだけの理由。
因みに、ローカルでやろうとすれば、MSのVisualStudioのC++なんかがよさげなようです。
バージョンは以下の通り
OpenCV --> 2.0
Python --> 2.6.5
Apache --> 2.2.12
OpenCVの最新は現在(2010/07/10)、2.1ですがインストーラがたまたま2.0だったので、これを使用。
Pythonは2.6.5。これ以外のバージョンでは2.7と2.6.2を試してみましたが、メモリエラーなどが出て、OpenCV2.0との相性がよろしくなさそうだったので、これでいきます。
ダウンロードページは以下の通り
OpenCV(sourceforge)
Python公式ページ
Apache公式ページ
めんどくさい方は、以下から直DLしてください。
OpenCV-2.0.0a-win32.exe(Windowsインストーラー)
Python-2.6.5.msi(Windowsインストーラー)
OpenCVってなんじゃい、というかたはこちら。
TOP
●OpenCVとPythonのインストールはどっちが先でもかまいません。
インストール時にPATHをどうする?と聞いてきますが、all usersに設定しとけばいいです。
確認するところは2つ。
①:Windowsの環境変数に、Pythonのパスを設定
python.exeはPythonのインストールフォルダーの直下にあるので
pathにはC:¥Python26を記述しておきます。
②:PythonにOpenCVを認識させる
Pythonのフォルダーが、C:¥Python26の場合
C:¥Python26¥Lib¥site-packagesフォルダーにOpenCV関連のファイルがあるかどうか確認
ない場合は、OpenCV2.0¥Python2.6¥Lib¥site-packages内の
opencvフォルダーと、cv.pyd、libcv.dll.aの2つのファイルをコピー
●今回は、PythonをApacheのCGIとして使うつもりなので、Apacheのhttpd.confを編集します。
Pythonはcgiとして機能させます。通常、cgiはApacheフォルダー内の、cgi-binに置かれます。
Pythonのファイルの拡張子は、.py ですが、今回の場合、拡張子は、.cgiです。
さらに、cgi-binのままでは不便なので、ドキュメントルートにPythonファイルを置くようにします。
httpd.confを編集します。
以下の3つを追加(最後の1つは任意)
ドキュメントルートが、C:¥docroute、だとします(ここは各自の環境で読み替えてください)。
①
ScriptAlias /cgi-bin/ "C:¥docroute/"
②
<Directory "C:¥docroute">
AllowOverride None
Options +ExecCGI
Order allow,deny
Allow from all
</Directory>
③
DirectoryIndex
index.cgi
TOP
例えば、OpenCVのインストール先フォルダー内の
samples¥swig_python¥delaunay.pyをダブルクリックして実行してみてください。
これは、ドロネー三角形(とボロノイ分割)を描画します。
ウィンドウが開いて、描画が始まればOKです。
(キーを何か押せばクローズします)
TOP
インストール時に用意されているカスケードファイルを使ってみます。
これは「ブーストされた分類器のカスケードを使う」と表現されます。
ブーストはアルゴリズムを指し、分類器のカスケードは、識別器の連結のことです
詳細は別に譲るとして、具体的には、インストールされたOpnCVの中の、data/haarcascadesフォルダー内の
XMLファイルのことです。デフォルトでは19個ほどがインストールされています。
ソースはこんな感じです。
サンプルにも顔検出のコードがありますが、なぜかうまく動きません。
で、主要なコードを抽出してみました。
Pythonは、C:¥Python26
OpenCVは、C:¥OpenCV2.0
にインストールされているとします。
カスケードはhaarcascade_frontalface_default.xml。
faces.jpgというファイルを読んで、検出後、お顔の部分を矩形で囲って、detected_faces.jpgというファイルに吐き出します。
結果はこんな感じ。サンプルのでは、横顔とかは検出できません。
いちおうCGIを謳ってますので、お顔の検出をWebサービスでアップしてみました。
OpenCVのサンプル
お顔の写ったJPEGファイルをアップロードしてみてください
ご注意
このサンプルにはPythonコードにまだ問題があるようで、Windowsのデスクトップのファイルのクエリ送信ではエラーになります。
できれば、どこかのドライブ上にあるファイルでお試しください。
下段に「ファイル参照」のリンクが出ますので、クリックするとお顔検出の結果が見れます。
もし、ファイル参照して、「オブジェクトがないです」という意味のメッセージがでたら、
サーバー側のPythonに問題が起こっていると考えられます。日を改めてチャレンジしてみてください。
CGIのソースは今のところこんな感じ(index.cgi)。
このソースでは、「OpenCV」フォルダーをindex.cgiのホームとします。
実際は、上記の.pyファイルと組み合わせて使います。
(しかし、Pythonは使い慣れないとややこしい)
to be continued.
TOP
カスケードファイルをつくってみることにします。これをやってみないことには先に進めません。
この手の情報は他のサイトにいっぱいあるので、とっととやってみます。
まず、機械学習用の作業領域を作ります(仮に、C:\OpenCV\work)。
OpenCVのインストールフォルダーのbinフォルダーから、以下のファイルをコピー
●opencv_createsamples.exe
●opencv_haartraining.exe
●libcv200.dll
●libhighgui200.dll
●libcxcore200.dll
Windowsの場合、OpenCVは再コンパイルする必要がありますよ...ということでしたが、
インストール時の環境でも問題ないみたいです。
でもコンパイルしておきたいという向きには、以下参照、コンパイル後、Releaseフォルダーのファイルを
workフォルダーにコピー。
このサイトを参考にさせていただきます
ここでは、文字認識のための機械学習をやってます。
で、まずは正解画像を作成してみました。
DOS窓を開いて、作業フォルダーへ移動。
以下のコマンドをたたきます。
opencv_createsamples.exe -img TH400_01.png -vec pos_gihyo.vec -num 4000 -bgcolor 255 -w 44 -h 9
pos_gihyo.vecが作成されます。
こんな感じ。
続いて、ハールトレーニングをやってみます。こんなコマンドです。
opencv_haartraining.exe -data gihyo_logo -vec pos_gihyo.vec -bg NG.txt -npos 4000 -nneg 1685 -w 44 -h 9 -mode ALL
ところがどっこい、エラーになってしまいました。
こんな感じ。
pos_gihyo.vec作成でミスったのか、opencv_haartraining.exeに問題があるのか、現時点では不明。
opencv_haartraining.exeをリコンパイルして、様子をみてみます。
どうも私の理解に問題があったようです(><;)
エラーの内容は、非正解画像がありませんよ、ということのようです。で、試しにnegativeというフォルダーを作って、
そこに4枚ほどの非正解画像を入れてみました(4枚なのは、実行にやたら時間がかかるよ、という話だったのでまずは4枚から)。
で、NG.txtというファイルを作って、以下を記述。
(これをやっておかないと、Runtime Errorがどうしたこうしたと文句を言われます)
negatives/nega1.jpg
negatives/nega2.jpg
negatives/nega3.jpg
negatives/nega4.jpg
コマンドは以下のように変更
opencv_haartraining.exe -data gihyo_logo -vec pos_gihyo.vec -bg NG.txt -npos 4000 -nneg 4 -w 44 -h 9 -mode ALL
走らせてみたところ、機嫌よう走りました。こんな感じ。
結果として、gihyo_logoフォルダーに14個のサブフォルダーが作られ、そこにAdaBoostCARTHarrClassifier.txtというファイルができており、
gihyo_logo.xmlというファイルもできてました。
結果については、また次にということで...
結果は...失敗!やはり、NGサンプルが少なすぎるようで。
で、ここは参照サイトのおおせのとおりに、サンプルデータを使ってフルで実行。めちゃくちゃ時間がかかりそうなので、
とりあえず実行済みのカスケードを使ってみたら、結果はOKでした。
現在実行中のハールトレーニングについては、また次ということで。
サンプルどおりによると、検出器の精度が不足するようです。
で、少々数を増やして実行、で、成功!
結果はこんな感じ。
精度や確度にまだ問題が残っているようです。
どうやったら向上するか、その辺はまた次にということで....
to be continued.
顔以外になんかを検出してみようかな...ということで、テーマは「サッカーボール」...。
ハールトレーニング用のデータ作成支援ページを作ったので、これを使ってみます。
まずは正解画像の収集ですが、
カリフォルニア工科大学のオブジェクト画像データ
を使います。63枚ほどのデータがあります。
で、「OK」というフォルダーを作ってここにダウンロードしておきます。
ハールトレーニング用のデータ作成支援ページを開いて、ひたすらボールを囲ってデータを作ります。
データは、OK.txtというファイルに保存。
さらに、サッカーボールとは無関係のデータを468枚集めて、非正解画像のリストファイル(NG.txt)を作成。
ちなみに、画像の枚数の、63とか468に特に意味はありません。その位の数しか集まりませんでした..ということ。
OK.txtのサンプル
NG.txtのサンプル
以下のようなコマンドをたたいて、vecファイルを作成。
opencv_createsamples.exe -info OK.txt -vec ball.vec -num 63 -bg NG.txt
ハールトレーニングを開始。
opencv_haartraining.exe -data BALL -vec ball.vec -bg NG.txt -npos 63 -nneg 468 -mode ALL
データ数が少ないので、4時間くらいでカスケード作成終了。
以下のような画像でテスト。
結果はこんな感じ。
精度を高めるには、どうしてもトレーニング用の画像数を増やす必要がありますね。
Google Ajax Search API
サッカーボール画像
サッカーボール画像2
どれも、精度はいまいちですが、機械学習の可能性は感じられますです、はい。
参考までに、コントラストのはっきりした大き目の画像がいいようです。
お顔を検出
目を検出
口を検出
上半身を検出
(上のA代表の画像でも確かめられます。)
番外編
おっぱいを検出(カスケードのみ)
これはちょっと....これもんなんで、カスケードのURLのみ表示。
いや別に、カスケード自体が「18禁」な訳ではなく、CGiを用意してもいいのですが、それにアップする画像を用意しようとした場合にですね.........うんたらかんたら.........どうしたこうした。
でも、これを作った方は「偉い!」です。ブログを覗いたら、おっぱいの画像を30000枚近くも集めて、そこから1000枚の正解画像を選び出し、しかもhaartraining用に位置特定も行ったそうな。
すごい!
検出率もいいですし、「物体検出」としてはよくできています。
この流れで、「チ○○」検出のカスケードがあれば、”青少年健全育成フィルター”が、できるんじゃないか?
でも管理人にはその気(ケ)はないので、ポジティブ画像を10枚も集めた時点でヘド吐きそう。
だれかやってみてください。
アニメ顔の検出
これをやりたい方は、この方のページを参照してください。
注意書きなども書かれているので、お読みください。
で、それを踏まえてカスケードファイルを使ってみます。
このページ参照
OpenCV 2.3.1でカスケードを作って、Androidで使ってみる
iアプリの写真でお顔を認識のWeb版を作りました。
Web Face Detection
こんな感じ。
インクリメントさんのAPIを使っています。
ブラウザーでローカルのWebカメラを使うWeb CAMと連携しています。
お試しください。
追加
描画に、スプライン補間を追加してみました。ただし、IEは未対応です。
画像上で、クリックして制御点を置いて、「Spline補間」ボタンをクリック。
スプライン補間はコントロールが結構難しいのでご注意ください。
こんな感じ。