この記述は、2010/07/10のものです。内容は古くなっています。

OpenCV関連の記述は、新しいサイトのAIカテゴリーに移動中です、ご了承ください。



何で、地図サイトにOpenCVなの....というと。

ここが気になっているからです--->IM2GPS

カーネギーメロンのプロジェクトのようで、サイトは最近更新されていないので大丈夫かいな、という感じですがやってることは興味津々です。

IM2GPSについては、めも(余談)の中に資料を集めています。参考までに。

SRTMと連動すれば、もっとOpenCVが生きてくるような気もするんですが(CGデータも使えそう、カシミール3Dみたいな)。

まあ、ARともまんざら無関係でもなさそうなので.....。


インストールから運用までの工程を順番に書いておきます

後日、なんかの参考になるでしょう(^^)




前書き

インストール

インストールの確認

顔認識の前にまずは、お顔の検出をやってみる

機械学習をやってみる

物体検出をやってみる

めも(余談)

いろいろなカスケードを試してみる

矩形座標取得(haartraining用)
   一応IEは対応しました。

お顔のパーツを検出

他のOpenCV関連ページ   New




前書き



今更ながらの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




めも(余談)


OpenCVのサンプルにはいくつかおもしろいものがあります。
------------------------------
例えば、delaunay.py
------------------------------

これは、デモではランダムな点を生成してドロネー三角形とボロノイ分割を描画しています。

こんな感じ。





OpenCVはDelaunayとVoronoiのライブラリを持ってるっちゅうことですね。

WisteriaHillでは、ボロノイ分割のページを持っていますが、これは現在Windows用のサービスプログラムを

バックグラウンドで走らせています。そのうち、OpenCVのライブラリを使うことにします。
------------------------------
例えば、camshift.py
------------------------------

これは、接続されたCCDカメラの映像をキャプチャして、任意の部分の色のヒストグラムを取得するデモのようです。 こんな感じ。




WisteriaHillでは、あまぐも(Cバンドレーダー雨量)のページで雨量の表示にヒストグラムを使っています。

これは現在Windows用のサービスプログラムをバックグラウンドで走らせているのですが、OpenCVのライブラリを使うことにします。




OpenCVをVisualStudioでリコンパイル

OpenCVをWindowsで使う場合は、まずはリコンパイルした方がよろしいよ、ということをよく聞きますんで、ここは素直に聞くことにします(^^)。
で、OpenCVを再コンパイルします。用意するものは....

●OpenCV2.0

CMake 2.6.4

●VisualStudio 2005 開発環境

    その他のコンパイラ


OpenCVのインストールは上記のとおり。

OpenCVのフォルダーの中に、再コンパイル用のフォルダー(例:rebuild)を作っておきます。

CMakeはダウンロードして適当にインストール

CMakeを起動しますが、起動は、インストール時に出来たアイコンではなく、Menuの中の「CMake2.6 ->Cmake(cmake-gui)」で起動。

起動したら、OpenCVのフォルダーとビルド先のフォルダーを指定して、「Configure」を実行。

こんな感じ。





今回は、VisualStudio 2005を使うので、以下のようにして「Finish」。





まっかかの画面がでてきます。OpenCVは素でインストールしたままでは、OpenMPは入っていないので、チェックを外して「Configure」します。





で、画面が白っぽくなったら、「Generate」を実行します。これで、VisualStudio用のプロジェクトが作成されます。

VisualStudio2005を起動。

ファイル-->開く-->プロジェクト/ソリューション

OpenCV2.0/rebuild/OpenCV.slnを選んで開きます。

このまま「ビルド」するとDebugモードのみでビルドされてしまうので、「バッチビルド」を開いて、すべて選択してから、ビルドします。

こんな感じ





警告を山ほど吐き出しながら、ながながと実行されて終了。

こんな感じ





OpenCV/rebuild/binフォルダーにDebugモードとReleaseモードの両方作られていますので、適時使い分けてご使用ください。




CMake対応のコンパイラ情報

VisualStudioの場合、以下にも対応

Visual Studio 6
Visual Studio 7
Visual Studio 7 .NET 2003
Visual Studio 8 2005 Win64
Visual Studio 9 2008

VisualStudioは有料なので、他に何かないんかいな....という方に。

Borland Makefiles
MSYS Makefiles
MinGW Makefiles
NMake Makefiles
UNIX Makefiles
Watcom WMake
CodeBlocks - MinGW Makefiles
CodeBlocks - UNIX Makefiles
Eclipse CDT4 - MinGW Makefiles
Eclipse CDT4 - NMake Makefiles
Eclipse CDT4 - UNIX Makefiles


Borlandは2010/03/01をもってMicroFocusに統合されちゃいました。
ここを見てもわからなかったので、ここからもダウンロードできるようです。

その他、参考までに。

MYS MinGWについては ここ か、 ここ

NMakeについて

Watcomについて

CodeBlocksについて




on IM2GPS

IM2GPS

資料1

資料2

資料3

資料4

資料5


番外編

色情報とエッジ情報を総合的に用いた サッカー画像からの物体検出

球技スポーツ映像の自動解析の研究

動画像からの移動物体の認識技術






矩形座標取得(haartraining用)



ハールトレーニング用のデータを作成する場合の支援ページです。

データの並びは、
<画像パス> <スペース> <取得数> <タブ> <左上(X)> <スペース> <左上(Y)> <スペース> <幅> <スペース> <高さ>

矩形座標取得(haartraining用)
初期画面は、こんな感じ。





正解画像は、「OK」というフォルダーを作って保存。画像はそこから読み込みます。

画像をアップロードして、開始します。

矩形は、左上から右下、という感じで描画してください。

クリックしたままドラッグ。

読み込み時に、表示される数値は画像の左上、右下の座標です。

1つの画像に複数の対象物がある場合は、これを繰り返します。

矩形で範囲指定する必要がなければ、このまま取得。





リセットすれば、この値が再表示されます。

データの取得が終了すると、「収集」ボタンをクリック。
「収集」をクリックすると、順次画像データが追加されます。





クリップボードコピーをクリックすると、コピー画面がでます。ここからデータを保存することもできます。

7000枚の画像は、途中でPCがダウンしたら大変なので、こまめにファイルに保存しておくことをお奨めします。





IE用の場合、半透明の幕がかかっている感じになってますが、仕様です。
Canvas要素の取り扱いが面倒だったもんで....。


NG画像のデータをつくる場合

Webベースでは、セキュリティ上ローカルの情報を収集するのが困難。

Flashベースで、画像のアップロードをマルチでやる手段で実現できるかもしれませんが、面倒です。

WindowsやUnixなどでは、Dir関数が使えると思いますので、それで対処しましょう。

NGフォルダーを作って、そこに非正解画像を集めて、コンソールから、Dir一発で、標準出力で吐き出す。

後はExcelなどで整形。



いろいろなカスケードを試してみる

どれも、精度はいまいちですが、機械学習の可能性は感じられますです、はい。

参考までに、コントラストのはっきりした大き目の画像がいいようです。

お顔を検出

目を検出

口を検出

上半身を検出     (上のA代表の画像でも確かめられます。)


番外編
おっぱいを検出(カスケードのみ)
これはちょっと....これもんなんで、カスケードのURLのみ表示。
いや別に、カスケード自体が「18禁」な訳ではなく、CGiを用意してもいいのですが、それにアップする画像を用意しようとした場合にですね.........うんたらかんたら.........どうしたこうした。
でも、これを作った方は「偉い!」です。ブログを覗いたら、おっぱいの画像を30000枚近くも集めて、そこから1000枚の正解画像を選び出し、しかもhaartraining用に位置特定も行ったそうな。
すごい!
検出率もいいですし、「物体検出」としてはよくできています。
この流れで、「チ○○」検出のカスケードがあれば、”青少年健全育成フィルター”が、できるんじゃないか?
でも管理人にはその気(ケ)はないので、ポジティブ画像を10枚も集めた時点でヘド吐きそう。
だれかやってみてください。


アニメ顔の検出

これをやりたい方は、この方のページを参照してください。
注意書きなども書かれているので、お読みください。
で、それを踏まえてカスケードファイルを使ってみます。

このページ参照
OpenCV 2.3.1でカスケードを作って、Androidで使ってみる




お顔のパーツを検出

iアプリの写真でお顔を認識のWeb版を作りました。


Web Face Detection


こんな感じ。






インクリメントさんのAPIを使っています。

ブラウザーでローカルのWebカメラを使うWeb CAMと連携しています。

お試しください。

追加

描画に、スプライン補間を追加してみました。ただし、IEは未対応です。

画像上で、クリックして制御点を置いて、「Spline補間」ボタンをクリック。

スプライン補間はコントロールが結構難しいのでご注意ください。

こんな感じ。







他のOpenCV関連ページ



OpenCV 2.3.1でカスケードを作って、Androidで使ってみる

アンドロイドでOpenCV(お顔の検出)

アンドロイドでOpenCV(色検出)

アンドロイドでOpenCV(特徴点検出)

Android OpenCV 2.3.1で画像認識

AndroidでOpenCV 2.4.6を使ってみる

OpenCV + NyMMDで初音ミクさんにご挨拶してもらいます

Android OpenCV 2.4.6 の顔検出アプリを一から作ってみる