2015年2月27日金曜日

OpenCV 2.4.11がリリースされた

議事録に記載されていないのに 2.4.11版が突然リリースされた。

現時点では、windowsとLinuxのみ

差分の記述がないのでMeld差分ビューワーでフォルダーを比較して気づいた点

CMakeLists.txt
デフォルトでNEONがONになっている

Haarcascadeのデータ形式が新フォーマットに

モジュールの修正が多いが、ほとんどtipoや細かいバグの修正

GPU sampleの修正が多い


全文サーチでNEONを調べるてみたが、ファイルが1個増えているが、どれか不明
oclのファイルの数は変化なし

明日といっても今日になっているが、ビルドしてパフォーマンスを見てみる

2015年2月23日月曜日

OpenCV 3.0betaでは、tbbが無効である

先週ベンチマーク用に、masterのソースを取得し、ビルドしてみたが、以前として、tbbが有効にならない

configrationでは、tbbが認識されソースもダウンロードされており、ビルドも成功するが
できた自作のベンチのスコアが芳しくない

そこでライブラリの依存関係を見てみると、3.0betaでは、tbbがリンクされていない

ldd /usr/local/lib/libopencv_core.so
    linux-vdso.so.1 =>  (0x00007fff039fe000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f1914166000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1913f62000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1913d43000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f1913b3b000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1913835000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1913530000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f191316a000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1912f54000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f1915049000)

ちなみに2.4.10の場合
ldd /usr/local/lib/libopencv_core.so
    linux-vdso.so.1 =>  (0x00007ffff31db000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f35ce7ec000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f35ce5ce000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f35ce3c5000)
    libtbb.so => /usr/local/lib/libtbb.so (0x00007f35ce19a000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f35cde94000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f35cdb8f000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f35cd7c9000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f35cd5b3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f35ceed4000)

と正しくリンクされている。

その他
3.0rcのリリース時期が、議事録では1/26日から2weeks以内と見積もりされているが、この調子では、かなり延期するのではと思われる。

OpenCV3.0betaで、HOG+SVMの辞書を作成

OpenCV 3.0 betaのサンプルのcppにtrain_HOG.cppがあるのを見つけた。
中を見てみると自分でHOGの辞書を作ることができるようだ

ソースの内容は大きく分けると

データの読み込み
ファイルリストを読み込みpositive, negativeの画像を読み込む。

ただし、この部分はINRIAデータに依存した記述になっている。
また、INRIAデータの解釈を間違っており、サンプルのままでは、よくない結果となるよ予想される。INRIAの画像は、4方に16画素のマージンが含まれており、実際の画像は、64x128が正しい

特徴量の計算
各画像のHOG特徴量を計算し、gradient_lstに格納している
hog.compute( gray, descriptors, Size( 8, 8 ), Size( 0, 0 ), location );

const vector<Point>& locationsに座標が格納されている場合は、その座標で計算する
locations.sizeが0の場合、決められた座標で計算する

SVMによる学習
SVM::Params paramsにパラメータをセットし、
Ptr<SVM> svm = StatModel::train<SVM>(train_data, ROW_SAMPLE, Mat(labels), params);
で学習を行なう

3.0はいろいろ問題があるので、2.4.10でビルドできないか試したところ、読み込みと特徴量のところは問題がなかったが、2.4.10では、mlクラスはないので、この部分を自分でlibLinearに置き換えれば、2.4.10で自分の辞書ができそうである。

2.4.10のHOGのソースの場所
opencv2410/modules/objdetect/src/hog.cpp

3.0のpython版による手書き数字識別のチュートリアル
OCR of Hand-written Data using SVM

2015年2月20日金曜日

OpenCV 3.0betaの変更点

自作のベンチマークで使用している関数が、3.0betaでエラーとなったので修正した。
いずれも3.0のマニュアルを見てもよくわからなかったので、メモを残しておく

1 TickMeter
  3.0から削除されているので2.4.10のソースからそのままコピーした
  • opencv2410/modules/contrib/include/opencv2/contrib/contrib.hpp
  • opencv2410/modules/contrib/src/spinimages.cpp

2 ORB

 コンストラクター
 cv::Ptr<cv::ORB> detector = cv::ORB::create();
 
 キーポイント
    detector->detect(gray1, keypoint1);
 
 特徴量
    detector->compute(gray1, keypoint1, descriptor1);

3 StereoBM
  コンストラクター
  cv::Ptr<cv::StereoBM> bm = cv::StereoBM::create();

 差分
    bm->compute(mat2, mat3, tmp);

以上

2015年2月17日火曜日

OpenCVのNEON対応を調べてみた

2.4.10と3.0beta(2/15日取得)のソースでNEONで全文検索(Catfish)を試してみた

moduleの下のソースで含まれていたものをそれぞれ示す
coreモジュールの対応が増えているので期待できそうである

2.4.10
 

3.0 beta

Raspberry Pi 2のOpenCVのパフォーマンスの改善を試みた

OpenCVのオプション、-DENABLE_VFPV3=ONを設定し、OpenCVをビルドしなおしてみた。

残念ながら、自作のベンチマークの処理時間は、誤差ぐらいの時間しか違いがなかった。


configureの設定のコンパイラ部分を参考に載せておく
ここに、-march=armv7-a mfpu=neon-vfpv4 がつけば良いのだが、現状-mfpu=neonだけで、ENABLE_VFPV3の設定も行われていない気がする。


C++ Compiler:                /usr/bin/c++  (ver 4.6.3)
C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -fdiagnostics-show-option -pthread -fomit-frame-pointer -mfpu=neon -ffunction-sections -O3 -DNDEBUG  -DNDEBUG

C Compiler:                  /usr/bin/gcc
C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -fdiagnostics-show-option -pthread -fomit-frame-pointer -mfpu=neon -ffunction-sections -O3 -DNDEBUG  -DNDEBUG


2/17追加

opencv2410/cmake/OpenCVCompilerOptions.cmakeを見てみると

   if (ENABLE_NEON)
    add_extra_compiler_option("-mfpu=neon")
  endif()
  if (ENABLE_VFPV3 AND NOT ENABLE_NEON)
    add_extra_compiler_option("-mfpu=vfpv3")
  endif()

となっており、NEONの場合、VFPV3は有効にならない設定である

OpenCVのビルド時間の短縮

強力なIntelマシンだとビルド時間は気にならない程度であるが、raspberry pi 2では、HDDを使用していても、ビルド時間が長く感じられる。

ビルド時間短縮ためにいつも、ドキュメント、テスト、パフォーマンステスト、サンプルなどを外し、さらに、GPUやOpenCLなど対応していない機能も外している。

それでも長いため、さらなる時間の短縮のために、最後にビルドされる opencv_traincascade などのアプリをビルドしないように試してみた

単純にapps/CMakeLists.txtを別名にしただけでは、cmakeの時にエラーが生じる。

そこで、CMakeLists.txtの名前を変え、CMakeLists.txtのからファイルを作成することでビルドされないことが確認でき、最後の数分を短縮することができた。

2/17追加
上記のようにしなくても、単に BUILD_opencv_apps を off にすればよい