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はビルドされない。


以下続く

2015年12月28日月曜日

Raspberry Pi 2 で OpenCV 3.1.0 + contrib 3.1.0 をビルドした

2.4.11に関してはここ


最初にraspberry piを更新しておく

sudo rpi-update
sudo apt-get update
sudo apt-get upgrade

ホストPCでOpenCV 3.1.0 と contrib 3.1.0 のソースをダウンロードし、展開して外付けHDDにコピー

USB HDDをRaspberry Pi 2に接続し、3.1.0 のフォルダーにbuildpiを作成し、cd buildpi

OpenCVのコンパイルに必要なファイルは、2.4.11のときにインストールしているが、今回はtesseract-ocrのために
sudo apt-get -y install libtesseract-dev libleptonica-dev
を実行

コンフィグレーションを設定

cmake -DCMAKE_BUILD_TYPE=RELEASE -DENABLE_VFPV3=ON -DENABLE_NEON=ON -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.1.0/modules -DBUILD_DOCS=OFF -DBUILD_TESTS=off -DBUILD_PERF_TESTS=OFF -DBUILD_TBB=ON -DBUILD_opencv_apps=OFF -DWITH_OPENCL=off -DWITH_1394=off -DWITH_CUDA=OFF -DWITH_CUFFT=OFF -DWITH_GIGEAPI=OFF -DWITH_OPENCLAMDBLAS=off -DWITH_OPENCLAMDFFT=off -DWITH_TBB=ON ..

time make -j4でビルドを行う

real    60m20.341s
user    203m50.500s
sys    7m10.870s

最後に
tesseract-ocrの英語辞書をダウンロードし、展開して内容をコピー

sudo cp -r tesseract-ocr/* /usr/share/tesseract-ocr/

以上


以下は、コンフィグレーション情報

General configuration for OpenCV 3.1.0 =====================================
  Version control:               unknown

  Platform:
    Host:                        Linux 4.1.15-v7+ armv7l
    CMake:                       2.8.9
    CMake generator:             Unix Makefiles
    CMake build tool:            /usr/bin/make
    Configuration:               RELEASE

  C/C++:
    Built as dynamic libs?:      YES
    C++ Compiler:                /usr/bin/c++  (ver 4.6.3)
    C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -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 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
    C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -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 -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
    C Compiler:                  /usr/bin/gcc
    C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -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 -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
    C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -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 -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
    Linker flags (Release):     
    Linker flags (Debug):       
    Precompiled headers:         YES
    Extra dependencies:          dl m pthread rt
    3rdparty dependencies:       tbb

  OpenCV modules:
    To be built:                 core flann imgproc ml photo reg surface_matching video dnn fuzzy imgcodecs shape videoio highgui objdetect plot superres xobjdetect xphoto bgsegm bioinspired dpm face features2d line_descriptor saliency text calib3d ccalib datasets rgbd stereo structured_light tracking videostab xfeatures2d ximgproc aruco optflow stitching python2
    Disabled:                    world contrib_world
    Disabled by dependency:      -
    Unavailable:                 cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java python3 ts viz cvv hdf matlab sfm

  GUI:
    QT:                          NO
    GTK+ 2.x:                    YES (ver 2.24.10)
    GThread :                    YES (ver 2.40.0)
    GtkGlExt:                    NO
    OpenGL support:              NO
    VTK support:                 NO

  Media I/O:
    ZLib:                        /usr/lib/arm-linux-gnueabihf/libz.so (ver 1.2.7)
    JPEG:                        libjpeg (ver 90)
    WEBP:                        build (ver 0.3.1)
    PNG:                         /usr/lib/arm-linux-gnueabihf/libpng.so (ver 1.2.49)
    TIFF:                        build (ver 42 - 4.0.2)
    JPEG 2000:                   build (ver 1.900.1)
    OpenEXR:                     build (ver 1.7.1)
    GDAL:                        NO

  Video I/O:
    DC1394 1.x:                  NO
    DC1394 2.x:                  NO
    FFMPEG:                      NO
      codec:                     NO
      format:                    NO
      util:                      NO
      swscale:                   NO
      resample:                  NO
      gentoo-style:              NO
    GStreamer:                   NO
    OpenNI:                      NO
    OpenNI PrimeSensor Modules:  NO
    OpenNI2:                     NO
    PvAPI:                       NO
    GigEVisionSDK:               NO
    UniCap:                      NO
    UniCap ucil:                 NO
    V4L/V4L2:                    NO/YES
    XIMEA:                       NO
    Xine:                        NO
    gPhoto2:                     NO

  Parallel framework:            TBB (ver 4.3 interface 8002)

  Other third-party libraries:
    Use IPP:                     NO
    Use VA:                      NO
    Use Intel VA-API/OpenCL:     NO
    Use Eigen:                   YES (ver 3.1.0)
    Use Cuda:                    NO
    Use OpenCL:                  NO
    Use custom HAL:              NO

  Python 2:
    Interpreter:                 /usr/bin/python2.7 (ver 2.7.3)
    Libraries:                   /usr/lib/libpython2.7.so (ver 2.7.3)
    numpy:                       /usr/lib/pymodules/python2.7/numpy/core/include (ver 1.6.2)
    packages path:               lib/python2.7/dist-packages

  Python 3:
    Interpreter:                 NO

  Python (for build):            /usr/bin/python2.7

  Java:
    ant:                         NO
    JNI:                         NO
    Java wrappers:               NO
    Java tests:                  NO

  Matlab:                        Matlab not found or implicitly disabled

  Tests and samples:
    Tests:                       NO
    Performance tests:           NO
    C/C++ Examples:              NO

2015年12月24日木曜日

OpenCV Advent Calendar 2015に投稿しました。 その2

2回目の投稿です。

タイトル:文字領域検出用のERFilterの使い方です。

 Qiitaでは、記事投稿が予約できますのであと、数分で公開されるかと思います。

実は投稿に失敗しており、朝気づいてやり直しました。


検出結果のサンプルです。

背景が単純なので、簡単に検出できるかと思いましたが縦エッジに影響されやすい気がします。