2013年12月17日火曜日

NetBeans IDE7.4でOpenCVのプロジェクトをビルドする

ここからC++専用を選択してダウンロードを行う

ダウンロード後に実行権を付与し、インストールを行う

新規のC++のプロジェクトを作成

インクルードパスの設定
メニュー > ツール > オプションを選択
コード支援 > C++のタブを選択
追加ボタンを押し、 /usr/local/includeを指定




ライブラリの設定
プロジェクトを選択し、右クリックでメニューを表示 プロパティを選択
リンカーを選択し、すべての構成にする

追加のライブラリディレクトリに、/usr/local/libを追加する
また、ライブラリにOpenCVを追加する


その後main内部にプログラムを記述し、プロジェクトの実行を指示

以上

2013年12月16日月曜日

Ubuntu 12.10 64bitにOpenCV2.4.7の環境を構築した

ここからファイルをダウンロードし、homeにopencv247として展開する

事前にここのページやOpenCVプログラミングブックを参考に必要な環境をインストールする

cd opencv247 に移動

今回は、デフォルトの設定で構築

cmake -DCMAKE_BUILD_TYPE=RELEASE
make
sudo make install
sudo ldconfig

cmakeのオプション -Dのあとにスペースを入れるとエラーとなる
デフォルトでは、OpenCV関連のファイルは、以下のディレクトリーにコピーされる
/usr/local/include
/usr/local/lib
/usr/local/share

jpgファイルを表示させるプログラムのビルドしてみる

#include <opencv2/opencv.hpp>

int main( int argc, char** argv )
{
  cv::Mat mat = cv::imread( "/home/hoge/opencv247/samples/cpp/baboon.jpg");
  cv::imshow( "Color Image", mat );

  cv::waitKey(0);

  return 0;
}

ビルド
g++ -o a.out test.cpp -I/usr/local/include -L/usr/local/lib -lopencv_highgui -lopencv_core

実行
./a.out

以上

OpenCV 2.4.7.2のリリースがアナウンスされた

ようやく公式ページで2.4.7.2のリリースがアナウンスされた。
2.4.7.2はWindows版のみで、Change Logsに記載されていなく、アナウンスに書かれているOpenCLとVS2013対応のみのようだ

2013年12月13日金曜日

OpenCVのopencv_traincascadeの辞書属性を調べる

CascadeClassifierで辞書を読み込んだ場合、辞書の属性を取得するためのメソッドを調べてみたが、getFeatureTypeとgetOriginalWindowSizeしか提供されていない

また、getFeatureTypeの戻り値がintなので、変換が必要となる
 (システム定数として HAAR 0 LBP 1 HOG 2とcv::FeatureEvaluatorに定義いる)

他の属性は、辞書のXMLファイルを読み込み、自分で解析するしかない。
以下のコードで、
  • featureType
  • stageNum
  • boostType
を得ることができる

 cv::FileStorage fs(filename, CV_STORAGE_READ);
 cv::FileNode topnode(fs.fs, NULL);

 cv::FileNode cnode = topnode[std::string("cascade")];
 cv::FileNode cn1 = cnode[std::string("featureType")];
 std::cout << "FeatureType : " << (std::string)cn1 << std::endl;

 cv::FileNode cn2 = cnode[std::string("stageNum")];
 std::cout << "Stage Number : " << (int)cn2 << std::endl;

 cv::FileNode cnode2 = cnode[std::string("stageParams")];
 cv::FileNode cn3 = cnode2[std::string("boostType")];
 std::cout << "boostType : " << (std::string)cn3 << std::endl;


以上

2013年12月12日木曜日

OpenCVで検出器用の辞書を作成してみた

OpenCVが提供している分類器 CascadeClassifier用の辞書を作成してみた。
前回学習方法を訳してみたが、実際にを動かしてみると、相違点や問題点が見つかったので、メモしておく

1 特徴量は、HAAR、LBPだけでなくHOGが使用できる
  -featureType HOGで指定する

2  -vec のファイルで指定したサンプルファイルに登録されているpositive画像数を -numPos で指定すると opencv_traincascadeが落ちる
  以前から指摘されているようであり、numPos の数を9割くらいに減らせばよい

3 メモリが少ないと、opencv_traincascadeの起動時にメモリアロケーションエラーで落ちる
  その場合は、-numPosや、-numNegで指定する数を減らす
    -w -hで指定するサイズを小さくする (その場合、vecファイルを作り直す)必要がある

4 それでもステージの途中でメモリ不足で落ちる場合があるが、再度実行すると問題なく終了できる場合がある。

5 選んだ画像によっては、収束しないで無限に計算している場合がある
  (negのカウンタが増えていかない)
  その場合は、パラメータを変える、画像を変えるなどしないといけない
  
  条件やマシンに依存するが、posi 500枚くらいだと 30分くらいで終了する
  
  最初は -numStages を少なくしておき、検出精度をみながら増やしていくとよい

6 検出プログラムは、顔検出用のサンプルなどがそのまま使用できる
  辞書指定で、自作の辞書ファイルのパスを指定すればよい
  positive辞書作成時に使用した画像で、検証すればよい

7 計算時間短縮のためにコンソールから、プログラムを起動するときに start /highを付け加え、プロセスの優先度をあげるとよい
 反面、他の作業に支障が出る場合がある

8 時間がかかる場合、途中で計算を打ち切ることができ、後日、同じコマンドで再開することができる。
  再開時にパラメータが異なると、プログラムは起動後、すぐに終了してしまう
  パラメータを変えたい場合は、辞書保存用のフォルダー内をクリアする必要がある

9 指定する画像のサイズは、最低でも16画素必要である。

追加2013/12/13
10 ファイルのリストは、相対パスでも絶対パスでもよい

11 positive画像に指定した画像をテストした場合、検出できない場合もある
 

 
 

自作辞書の印象だが、誤検出は少ない分、検出できないケースも多い。
 positive辞書に、検出できない状況の画像を登録すればよいが、辞書が爆発することが予測できるので、ある程度妥協が必要である。

2013年12月11日水曜日

OpenCVのカスケード分類器の学習の章を訳してみた

オリジナルはここ
専門用語が理解できていないため、パラメータに関しての訳はかなり怪しい。
また、これだけ呼んだだけでは、各パラメータに指定すべき値が分からないので、辞書作成用のチュートリアルが欲しい。


ここから

カスケード分類器の作業は、学習と検出の2段階です。検出は、OpenCVのドキュメントの検出モジュールに記載されている。ドキュメントには、カスケード分類器の基本情報が記載されている。
ここでは、カスケード分類器の学習方法、学習データの準備とアプリの使用方法を示す。

注意事項
OpenCVは、 opencv_haartraining と opencv_traincascadeの2種類のカスケード分類器の学習アプリケーションがある。opencv_traincascade の方がOpenCVのVer2以降のC++APIで書かれており新しい。
しかし、大きな差異は、opencv_traincascadeは、HaarとLBP特徴量の両方をサポートしている。LBP特徴量は、整数なので、Haarと比較して学習と検出の速度が数倍早い。検出精度は、学習に依存しており、第一に学習用のデータの質であり、その次に学習パラメータである。LBPの分類器でもHaarの分類器と同等の性能を得ることは可能である。

opencv_traincascade と opencv_haartrainingの学習データは、異なるフォーマットで保存される。
新しいインタフェースは、両方のフォーマットをサポートしている。(オブジェクト検出のCascadeClassifier classを参照) opencv_traincascadeは、古いフォーマットで保存することができる。
しかし、opencv_traincascade と opencv_haartraining は、処理の途中で異なるタイプのフォーマットのデータを読み込むことはできない。
TBBオプションでOpenCVをビルドした場合、opencv_traincascadeは、TBBによりマルチコアに対応する。
また、学習用の支援ツールが準備されている。

・opencv_createsamplesは、ポジティブデータとテストデータを準備するために使用でき、opencv_haartraining
and opencv_traincascadeの両方で使用できる、ポジティブサンプルのデータを作成する。
出力ファイルの拡張子は、.vecであり、画像データを含むバイナリデータである。
・opencv_performanceは、opencv_haartrainingで作成した分類器の精度を評価するために使用される。事前に準
備したリストを用いて、分類器を実行し、検出できた数、できなかった数、誤検出などの情報を報告する。

opencv_haartraining は、サポートを廃止したので、これ以降、opencv_traincascadeのみ説明する。
opencv_createsamplesは、opencv_traincascadeの学習データの準備に必要なので合わせて説明する。

学習データの準備
学習には、ポジティブ、ネガティブの2種類のデータが必要である。ポジティブ画像は、検出対象の画像であり、ネガティブ画像は、検出対象ではない画像である。ポジティブ画像のデータセットは、opencv_createsamplesで作成できるが、ネガティブ画像のデータセットは手動で準備しなければいけない

ネガティブサンプル
ネガティブ画像は、検出対象を含まない任意の画像である。ネガティブ画像のデータセットのための、専用ファイルが必要である。各ラインに専用ファイルからの相対パスを含むファイル名を記したテキストファイルである。
ネガティブ画像は、背景画像と呼ばれることもあり、本ドキュメントでは、同じ意味である。画像のサイズは異なっていてもよいが、学習ウィンドウサイズよりも大きくなければいけない。
というのは、学習用のサイズに縮小されるためである。

bg.txtとネガティブ画像を格納したimageフォルダーが同じ場所にある場合、
bg.txtの内容は
image/image1.jpg
image/image2.jpg
のようになる

ポジティブサンプル
opencv_createsamplesで作成する。検出対象を含む1枚の画像から、あるいは、ネガティブのように専用ファイルから作ることもできる。ツールを使用する前に、多くのデータを準備する必要がある。

OpenCVのロゴのような剛体の場合、1枚の画像を準備するだけでよいが、顔の場合、百、あるいは、千必要となる。顔の場合、人種、年代、表情、ひげなど考慮しないといけない。

1 単一物体の画像
大量のポジティブサンプルの画像は、与えられた画像を回転させたり、明るさを変えたり、任意の背景の上に重ねたりして作られる

opencv_createsamples utilityの引数により、変化量をコントロールする。

引数
-vec <vec_file_name>
 学習結果出力ファイル名

-img <image_file_name>
 もとになる画像ファイル名

-bg <background_file_name>
 背景に使用される画像ファイルのリストを格納したファイル

-num <number_of_samples>
 作成するポジティブサンプ数

-bgcolor <background_color>
 背景色(現在は白黒を想定)は、透過色を示している 圧縮の影響があるかもしれないので -bgthreshで許容量を指定する。bgcolor-bgthreshとbgcolor+bgthreshの範囲にある画素は、透過色とみなされる
  
-bgthresh <background_color_threshold>

-inv
 指定されると、色が反転される

-randinv
 指定されると、ランダムに色を反転させる

-maxidev <max_intensity_deviation>
 サンプルの明るさの変化の最大値

-maxxangle <max_x_rotation_angle>
-maxyangle <max_y_rotation_angle>
-maxzangle <max_z_rotation_angle>
radiansで指定された最大回転角度

-show
 デバッグオプション 指定すると、各サンプルが表示される Escキー押下で次の画像に移動する

-w <sample_width>
 出力画像の幅

-h <sample_height>
 出力画像の高さ

サンプル画像の作成のために以下の処理が行われる。
  1. 入力画像を、ランダムの角度で3軸方向に回転させる
  2. bg_color-bg_color_threshold; bg_color+bg_color_thresholdの色が透過色としてみなされる
  3. 白色雑音が、前景に加算される
  4. -invの指定があれば、前景の明るさが反転される
  5. -randinvがあれば、ランダムに色を反転するかどうか決められる
  6. 最後に、作成した画像を任意の画像上に重ねる
  7. -w and -h のサイズに大きさを変える
  8. -vecで指定されたファイルに保存する

2 ポジティブサンプル
ポジティブサンプルは、事前にマークアップした画像からも得ることがきる。サンプル用画像は、背景画像のリストファイルのようなフォーマットでテキストフファイルに記述される。
各行は、画像に対応している。1番目は、ファイル名、2番目は、オブジェクトの数、そのあとは、オブジェクトを示す矩形情報(X座標 Y座標、幅、高さの組み合わせ)をオブジェクトの数だけ

info.datとポジティブ画像を格納したimageフォルダーが同じ場所にある場合、

info.datの内容は
image/image1.jpg 1 140 100 45 45
image/image2.jpg 2  100 200 50 50   50 30 25 25
のようになる

image1.jpgは、1つのオブジェクトを含んでおり、その矩形情報は、 (140, 100, 45, 45)を示す
image2.jpgは、2つのオブジェクトを含んでおり、その矩形情報は、(100 200 50 50) と (50 30 25 25)を示す

サンプル用画像からポジティブサンプルを作成するには、-img の代わりに、-infoを引数とする
-info <collection_file_name>
マークアップした画像情報を格納したファイル名

作成手順は以下様になる
  1. オブジェクトを切り出す
  2. -w, -hのサイズに大きさを変える
  3. -vecで指定されたファイルに保存する

変形処理は行われないので、有効な引数は、-w, -h, -show and -numとなる。
opencv_createsamples は、ポジティブサンプルファイル内のサンプル画像を調べるために使用されるかも知れない。その場合、引数は、-vec, -w and -h を使用する。

opencv/data/vec_files/trainingfaces_24-24.vecは、vec-fileのサンプルである。
window size -w 24 -h 24で顔検出器の学習用に使用される

カスケード学習
次は分類器の学習である。opencv_haartraining か opencv_traincascade のどちらかを使用することができるが、opencv_traincascadeの説明を行う

opencv_traincascade のコマンドラインの引数は、目的別に分類されている。

 1 共通
-data <cascade_dir_name>
 結果ファイルの保存フォルダー名

-vec <vec_file_name>
 opencv_createsamples で作成されたvecファイル

-bg <background_file_name>
 背景ファイルのリストを格納したファイル

-numPos <number_of_positive_samples>
-numNeg <number_of_negative_samples>
 各ステージで使用する、ポジティブ、ネガティブのサンプル数
-numStages <number_of_stages>
 学習ステージ数

-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>
 事前計算した特徴量用のメモリサイズ

-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>
 事前計算した特徴量用のバッファメモリー 多いと計算速度が速くなる

-baseFormatSave
 Haar-like 向けに使用され、古いフォーマットで保存される。

2 カスケードパラメータ
-stageType <BOOST(default)>
 学習ステージのタイプ。現時点ではboostのみサポート 

-featureType<{HAAR(default), LBP}>
 特徴量のタイプ
-w <sampleWidth>
-h <sampleHeight>
 サンプルのサイズ。opencv_createsamplesで使用したサイズを指定すること

3 Boost分類器のパラメータ
-bt <{DAB, RAB, LB, GAB(default)}>
 boost分類器のタイプ
 DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost.

-minHitRate <min_hit_rate>
 各ステージでの最小ヒット率
  min_hit_rate^number_of_stagesで、ヒット率を予測できる

-maxFalseAlarmRate <max_false_alarm_rate>
 各ステージでの最大false alarm率  
 max_false_alarm_rate^number_of_stagesで、false alarm率を予測できる

-weightTrimRate <weight_trim_rate>
 値によりトリミングを行うか指定する
 0.95が好ましい
-maxDepth <max_depth_of_weak_tree>
 弱検出器の最大の深さ 1が好ましい

-maxWeakCount <max_weak_tree_count>
 -maxFalseAlarmRateを達成用に必要とされる各ステージでの弱分類器の最大数

4 Haar-like 特徴量用のパラメータ
 -mode <BASIC (default) | CORE | ALL>
 学習に使用する基本特徴量のタイプ
 基本は、直行特徴量のみ使用 ALLの場合、45度回転した特徴量も使用
 詳細は、[Rainer2002]を参照

5 LBP 特徴量用のパラメータ
  なし

 学習が終了したら、-data で指定したフォルダーに、cascade.xml が作成される。途中で中断すると、作業ファイルが作成されるので、手動で削除すること。

以上

2013年12月10日火曜日

OpenCV 2.4.7.2の変更点を少し調べてみた

Build情報を表示させてみた
cv::getBuildInformation()を使用し、windows版のOpenCV2.4.7.2のビルド条件を表示させてみた
Version Controlの値は、2.4.7のままであり、オプションの変更もないと思われる。
Version Vontrolの値は、2.4.7.2になっているが、オプションの変更はないと思われる。

ソースを比較
OpenCL関連が大幅に変更されている。
2.4.7では、いくつかの関数でエラーが出ていたのがこれで治るかも知れない
残念ながら修正されていない。また速度が低下した関数もある。

CMakeを比較
VisualStudio 2013 対応が追加されているようだ
  elseif(MSVC_VERSION EQUAL 1800)
 set(OpenCV_RUNTIME vc12)

サンプルを比較
システム定数が変更されている。
いくつかの関数は頭のcvがなくなっているものもありますが割愛

上が2.4.7 下が2.4.7.2

cvtColor(frame, gray, CV_RGB2GRAY);
cvtColor(frame, gray, COLOR_RGB2GRAY);

cvtColor(image, hsv, CV_BGR2HSV);
cvtColor(image, hsv, COLOR_BGR2HSV);

cvtColor(I, I_YUV, CV_BGR2YCrCb);
cvtColor(I, I_YUV, COLOR_BGR2YCrCb);

putText( img, text.str(), Point(10,25), CV_FONT_HERSHEY_SIMPLEX, 0.8f, WHITE_COLOR, 2 );
putText( img, text.str(), Point(10,25), FONT_HERSHEY_SIMPLEX, 0.8f, WHITE_COLOR, 2 );

namedWindow( winName, CV_WINDOW_AUTOSIZE );
namedWindow( winName, WINDOW_AUTOSIZE );

namedWindow("image", CV_WINDOW_NORMAL);
namedWindow("image", WINDOW_NORMAL);

circle(img_corr, features1[i].pt, 3, CV_RGB(255, 0, 0));
circle(img_corr, features1[i].pt, 3, Scalar(0, 0, 255));

また、CMakeLists.txt にOCLのコンパイルオプションが含められており
points_classifier.cpp
bagofwords_classification.cpp
で、OCLを利用するコードが追加されている

OCLサンプル
facedetect.cpp
でマルチスレッドの使用を追加

以上

OpenCV 2.4.7.2がリリースされた

現時点で公式のアナウンスがありませんが、Windows版が2.4.7.2となっています
ダウンロードはここから
opencv-2.4.7.2.exeファイルサイズは、若干増加している

変更点は、公式のchange logは2.4.7のままなので不明ですが、サンプルの差分を見れば、変更の一部が分かるかもしれません。

2013年12月9日月曜日

OpenCVforAndroid 2.4.7.1のサンプルをビルドしてみた

2.4.6の記事はここ

最初に
ubuntuの更新
Android SDKの更新
をしておく

NDKの更新方法がわからないので古いのをそのまま使用している
あとで削除して最新に入れ替えてみる

OpenCV-2.4.7.1-android-sdk.zipをここからダウンロード

ファイルサイズが97.2Mから、117.3Mに増加している

2.4.6のプロジェクトがあるとややこしくなるので、eclipseのPackage Explorerからすべて削除
Package Explorerを右クリックしimportでOpenCV-2.4.7.1-android-sdk/sdk/javaを登録

その後に、
OpenCV-2.4.7.1-android-sdk/samples/tutorial-1-camerapreview
OpenCV-2.4.7.1-android-sdk/samples/tutorial-2-mixedprocessing
OpenCV-2.4.7.1-android-sdk/samples/tutorial-3-cameracontrol
を順番にimportする

また、tutorial-2のndkのビルド用のバッチがwindows用になっているため、
プロジェクトのプロパティを開きC++buildの
ndk-build.cmdをndk-buildに直す

すべてのソースで
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_7, this, mLoaderCallback);
のバージョンが2.4.3のままなので、2_4_7に直しておく

以上でサンプルアプリができる


エミュレータから、OpenCV Managerをアンインストールし、OpenCV-2.4.7.1-android-sdk/apkの
OpenCV_2.4.7.1_Manager_2.15_armv7a-neon.apkを代わりにインストールする

2.4.6の時エミュレータでもノートPCの内蔵カメラがが利用でき表示も問題なかったが、2.4.7にアプリを2.4.7に変えると表示が乱れるようになった。

あとで実機で確認してみる

2013年12月5日木曜日

OpenCVで計算終了時に一時的に停止させる

OpenCVで何らかの計算を行い、その結果を確認した場合がある。
OpenCVのプログラムが、コンソールベースなので、メイン関数を終了するとコンソールウィンドウが消えてしまし結果を見ることができない。ファイルに出力すればよいのだが、不要なファイルが増えてしまう。

そのような場合、メイン関数終了時に

 cv::Mat disp = cv::Mat::zeros(cv::Size(320, 240), CV_8UC1);
 cv::imshow("dummy", disp);
 int key = cv::waitKey(0);

の3行加えておくと、何らかのキーを押下するまで、コンソールウィンドウが表示させておくことができる。

2013年12月3日火曜日

言う吉くんはOpenCVを使用している

国立印刷局は、アイフォーン用音声式日本銀行券簡易券種識別支援アプリケーション 「言う吉くん(スマホ)」を12月3日より公開とのこと
詳細は こちら

本アプリケーションについて のドキュメント内でOpenCV (Ver 2.3)の使用に関して記載されている

当然、SIFTやSURFを使用していないと思われるが

2013年12月2日月曜日

Cyber Monday SaleでPractical OpenCVが15$

本日限りとのこと
http://www.apress.com/9781430260790

OpenCV2.4.7のリファレンスマニュアルは、2種類あった。

2.4.7のSDKには、11/7のVer2.4.7.0のリファレンスマニュアルのpdfが含まれているが、Tegraに関して説明はない。(当方のSDKダウンロード後に、内容が修正された可能性もある)

doc.opencv.orgで公開されているリファレンスマニュアルにはChap 19 TEGRA-POWERED COMPUTER VISIONが含まれている。こちらのタイトルもThe OpenCV Reference Manual Release 2.4.7.0になっているが、日付は11/09となっている


補足
以前からnVidiaがTegraでのOpenCVをサポートしていたが、本日(12/2)nVidiaからTegra Note 7の国内販売がリリースされ、モバイルでのCVのパフォーマンスの改善が期待できそうな世の中になってきた。

2013年の技術系Advent Calendarがはじまる

とういニュースがありました。

Computer Vision Advent Calendar 2013も紹介されていますが、残念なことに誰もエントリーしていない状況です。 まだ開始されていません。6人の方がエントリーされており、中には、去年に続き今年も参加される人がいます。


昨年も行われています。
Computer Vision Advent Calendar 2012

手を挙げてみようか考慮中


補足
iOS Advent Calendar 2013
の2日目に

「顔以外」のものを画像認識する

が公開されています。