2016年1月20日水曜日

dpm(deformable part models)を眺めてみた

OpenCV 2.4系ではLatentSVMと呼ばれていたが、OpenCV 3系からdpmと名称が変更され、モジュールもopencvのcoreからcontirbに移された

LatentSVMは、2.4.3の時に一度試している

2.4系

2.4系のサンプルプログラムは、ここにあり、helpに辞書の場所が書かれている。
(3系がリリースされたことにより、このhelpに書かれたフォルダーはなくなっているので注意)
モジュールの説明はここ

3.1系

3.1系のサンプルプログラムは、ここにある。
モジュールの説明はここ
辞書データは、githubからdownloadする必要がある





両方の説明を比較して見ると、3.0系になり、    劇的に速度が改善されたそうだ。

人以外の物体も多くあるのであとで試してみる

2016年1月17日日曜日

SegNetをUbuntuで試してみた

SegNetは、ケンブリッジ大学が開発した画素単位での識別機能を実現する、deep encoder-decoderである。SegNetに関しては、このページを参照

SegNetのビルド

Caffeベースなので、caffeに必要な環境を準備し、このページからZipファイルをダウンロードし展開する。

展開したフォルダー caffe-segnet-segnet-cleaned に移動しする
CPUベースのみで計算するので Makefile.config の内容を書き換えておく
このあとmake して make runtestでビルドが成功していることを確認し、python関連ファイルをpipでインストールする
make pycaffe を行い、最後にpythonフォルダーを.bashrcに追加しておく

export PYTHONPATH=/home/caffe/caffe-segnet-segnet-cleaned/python:$PYTHONPATH >> /home/caffe/.bashrc

サンプルソースの取得

wget https://github.com/alexgkendall/SegNet-Tutorial/archive/master.zip
でサンプルソースを取得し、展開する
フォイルダー名をSegNetに変えておく

サンプルソースにはモデルファイルが含まれていないので、Example_Modelsに移動し、
wget http://mi.eng.cam.ac.uk/projects/segnet/models/segnet_weights_driving_webdemo.caffemodel
でモデルデータを取得する

サンプルの修正

付属のpythonサンプル SegNet/Script/webcam_demo.py では、カメラ入力画像か、AVIファイルの画像を入力画像として識別しているがこの部分のimreadに差し替えjpgやpngファイルを使用して試してみるように修正する

サンプルの実行結果

python test.py --model SegNet/Example_Models/segnet_model_driving_webdemo.prototxt --weights SegNet/Example_Models/segnet_weights_driving_webdemo.caffemodel --colours SegNet/Scripts/camvid12.png


camvid12.pngは、識別された画素のクラスを示している。
色の意味はここ。


入力画像は、480x360なので事前に試したい画像をトリミングしておく
試した結果を示す。


この画像はテストフォルダーに含まれているもの


この画像は、とある神社の参道、


こちらは、ホテルの近くの道

いずれも計算時間が10秒近くかかっており、CPUだけではつらい


2016年1月8日金曜日

Windows上でOpenCV 3.1で人物を検出してみた

環境
Windows 7 Home 64bit
OpenCV 3.1.0
Visual Studio 2013

これまでなぜかCascadeDetectorに存在していたHOG検出器は削除され、使用不可となった。
(ソースは整理されていなく、いくつ残骸が残っている。Type指定でHOGをはねている)

変わりに、OpenCV 3.1でようやくHOGの説明が設けられた。

使い方

ファイルの読み込み、GRAYへの変換、領域の表示は省略

    cv::HOGDescriptor hog;
    hog.setSVMDetector(hog.getDefaultPeopleDetector());
    std::vector< cv::Rect > locations;
    hog.detectMultiScale(gray, locations);

以上で検出できる。また、detectMultiScaleのパラメータがいくつか省略されており、きちんと書くと

    hog.detectMultiScale(gray, locations, 0, cv::Size(), cv::Size(), 1.05, 2, false);

となる。

DefaultPeopleDetectorの辞書は、INRIAのデータで作成されたもので、2.4のころからなぜかソースに辞書データがハードコーディングされている。画像のサイズは、64x128と大きめである。

アニメの人も検出できるが精度はいまひとつ




また、代わりの辞書としてDaimlerPeopleDetectorも提供されており、こちらの画像のおおきさは、48x96で、使用方法は以下の用である。
   
    hog.winSize = cv::Size(48, 96);
    hog.setSVMDetector(hog.getDaimlerPeopleDetector()));



さらに、3.1からは、辞書の作成方法もサポートされるようになり、

opencv31\sources\samples\cpp\train_HOG.cpp

を使用すれば自分で辞書を作成することができる。

注意

リリースモードでは、なぜか落ちるのでdebugで使用している。ubuntuで確認してみる

以上

2016年1月7日木曜日

ubuntu 14.04上でsfmを試してみた その2

昨日の続き

Vizの事前準備

terminalで
sudo apt-get -y install libvtk5-dev
を実行し、再度OpenCVをビルドする

これでサンプルがコンパイルできるようになると思った。

罠2

通常
g++ -o $1 $1.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`
を記載したshell scriptを呼び出してコンパイルしているが、今回

trajectory_reconstruccion.cppをコンパイルすると

#include <opencv2/sfm.hpp>
で呼び出す、sfm.hppの依存headerで

#include <Eigen/Core>

が見つからないとの警告が出る

対処

コンパイル用のスクリプトファイルに
-I/usr/include/eigen3
を追加

罠3

149行の reconstruct でそんな関数はメンバーにいないとのエラーが

reconstruct は、 opencv_contrib-3.1.0/modules/sfm/include/opencv2/sfm/reconstruct.hpp に確かに定義されている。

散々悩んでopencv2/sfm.hppを見たところ

#if CERES_FOUND
#include <opencv2/sfm/reconstruct.hpp>
#include <opencv2/sfm/simple_pipeline.hpp>
#endif

と定義されており、フラグを設定していないと読み込まれない

対処

コンパイル用のスクリプトファイルに
-DCERES_FOUND=1
を追加

これでようやく trajectory_reconstruccion.cpp のコンパイルができるようになった。

最終スクリプト
g++ -o $1 $1.cpp `pkg-config --libs opencv` -I/usr/local/include -I/usr/include/eigen3 -DCERES_FOUND=1

 

サンプルの実行

terminlで以下を実行すると
./trajectory_reconstruccion desktop_tracks.txt 1914 640 360

----------------------------

Reconstruction:
============================
Estimated 3D points: 26
Estimated cameras: 239
Refined intrinsics:
[1018.232765405989, 0, 601.2589725784402;
 0, 1018.232765405989, 360.3785586127441;
 0, 0, 1]

3D Visualization:
============================
Recovering points  ... [DONE]
Recovering cameras ... [DONE]
Rendering Trajectory  ...
Press:                      
 's' to switch the camera pov
 'q' to close the windows

とメッセージが表示され下記画像が表示される


感想

Vizで画面でマウスのドラッグで視点を変更することができるが、思うような構図にできない

2016年1月6日水曜日

ubuntu 14.04上でsfmを試してみた その1

opencv_contribのモジュールをいろいろ試してみようと考えているが、日本語のドキュメントなどはなく、各モジュールがどのようなものか今ひとつ感じがつかめない。

sfmは、複数の画像から3次元情報を取得するためのものとわかっていたが、以前からsfmのソースのビルドを試みたが、幾度が挫折した。

今回3.1がリリースされ、OpenCVでのビルドが一応保証されるようになったので、ビルドを試みてみたが、それでも苦戦した。

ビルド方法は、ここにある。

依存関係に関して

必須:
  • Eigen 3.2.2 以降
  • GLog 0.3.1 以降
  • GFlags.
オプション
  • Ceres Solver. Bundle Adjustmentをとくために必要 (ないと再構築の機能が無効化される)

 事前準備

ターミナルで以下のコマンドを実行する

sudo apt-get install libeigen3-dev libgflags-dev libgoogle-glog-dev libatlas-base-dev libsuitesparse-dev

git clone https://ceres-solver.googlesource.com/ceres-solver
cd ceres-solver
mkdir build && cd build
cmake ..
make -j4
make test
sudo make install


makeテストの結果

66/67 Test #66: visibility_based_preconditioner_test ........   Passed    0.00 sec
      Start 67: system_test
67/67 Test #67: system_test .................................   Passed    0.01 sec

100% tests passed, 0 tests failed out of 67


OpenCVのビルド

この後OpenCV+contribをビルドする


カメラ軌跡推定のsampleプログラムの実行

解説はここ

自分でopencv_contrib-3.1.0/modules/sfm/samplesのtrajectory_reconstruccion.cppをビルドを試みたが、ここでハマってしまった。

まず、表示のためにVizが必要であるが、Installation in Linuxの説明では、Vizはビルドされない。


以下続く