2014年12月22日月曜日

OpenCV4Tegra の configuration 情報を表示させてみた

nVidiaが提供しているJetson k1向けのOpenCV4Tegraに問題があったが最近ようやく修正された。

OpenCV4Tegraは、nVidiaの特別なチューニング(ARM NEON SIMD optimizations, multi-core CPU optimizations and some GLSL GPU optimizations)が施されたバージョンであるとのこと


OpenCV4Tegraが、どのようなconfigurationでビルドされているのか表示させてみた。

nonfreeのモジュールが無効化されているのでsiftが使えない

General configuration for OpenCV 2.4.10.1 =====================================
  Version control:               2.4.10.1

  Platform:
    Host:                        Linux 3.10.40-ge9b32d4 armv7l
    CMake:                       2.8.12.1
    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.8.2)
    C++ flags (Release):         -fweb -fwrapv -frename-registers -fsched2-use-superblocks -fsched2-use-traces -fsched-stalled-insns-dep=100 -fsched-stalled-insns=2   -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 -Wno-narrowing -Wno-delete-non-virtual-dtor -fdiagnostics-show-option -pthread -fomit-frame-pointer -mfpu=neon -ffunction-sections -O3 -DNDEBUG  -DNDEBUG
    C++ flags (Debug):           -fweb -fwrapv -frename-registers -fsched2-use-superblocks -fsched2-use-traces -fsched-stalled-insns-dep=100 -fsched-stalled-insns=2   -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 -Wno-narrowing -Wno-delete-non-virtual-dtor -fdiagnostics-show-option -pthread -fomit-frame-pointer -mfpu=neon -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG
    C Compiler:                  /usr/bin/cc
    C flags (Release):           -fweb -fwrapv -frename-registers -fsched2-use-superblocks -fsched2-use-traces -fsched-stalled-insns-dep=100 -fsched-stalled-insns=2   -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 -Wno-narrowing -fdiagnostics-show-option -pthread -fomit-frame-pointer -mfpu=neon -ffunction-sections -O3 -DNDEBUG  -DNDEBUG
    C flags (Debug):             -fweb -fwrapv -frename-registers -fsched2-use-superblocks -fsched2-use-traces -fsched-stalled-insns-dep=100 -fsched-stalled-insns=2   -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 -Wno-narrowing -fdiagnostics-show-option -pthread -fomit-frame-pointer -mfpu=neon -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG
    Linker flags (Release):    
    Linker flags (Debug):      
    Precompiled headers:         YES

  OpenCV modules:
    To be built:                 core flann imgproc highgui features2d calib3d ml objdetect video contrib legacy photo gpu stitching tegra videostab esm_panorama facedetect imuvstab python superres ts vstab
    Disabled:                    nonfree world
    Disabled by dependency:      -
    Unavailable:                 androidcamera dynamicuda java ocl viz

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

  Media I/O:
    ZLib:                        /usr/lib/arm-linux-gnueabihf/libz.so (ver 1.2.8)
    JPEG:                        /usr/lib/arm-linux-gnueabihf/libjpeg.so (ver )
    PNG:                         /usr/lib/arm-linux-gnueabihf/libpng.so (ver 1.2.50)
    TIFF:                        /usr/lib/arm-linux-gnueabihf/libtiff.so (ver 42 - 4.0.3)
    JPEG 2000:                   /usr/lib/arm-linux-gnueabihf/libjasper.so (ver 1.900.1)
    OpenEXR:                     NO

  Video I/O:
    DC1394 1.x:                  NO
    DC1394 2.x:                  NO
    FFMPEG:                      YES
      codec:                     YES (ver 54.35.0)
      format:                    YES (ver 54.20.4)
      util:                      YES (ver 52.3.0)
      swscale:                   YES (ver 2.1.1)
      gentoo-style:              YES
    GStreamer:                   NO
    OpenNI:                      NO
    OpenNI PrimeSensor Modules:  NO
    PvAPI:                       NO
    GigEVisionSDK:               NO
    UniCap:                      NO
    UniCap ucil:                 NO
    V4L/V4L2:                    NO/YES
    XIMEA:                       NO
    Xine:                        NO

  Other third-party libraries:
    Use IPP:                     NO
    Use Eigen:                   YES (ver 3.2.0)
    Use TBB:                     NO
    Use OpenMP:                  NO
    Use GCD                      NO
    Use Concurrency              NO
    Use C=:                      NO
    Use Cuda:                    YES (ver 6.5)
    Use OpenCL:                  NO

  NVIDIA CUDA
    Use CUFFT:                   YES
    Use CUBLAS:                  NO
    USE NVCUVID:                 NO
    NVIDIA GPU arch:             32
    NVIDIA PTX archs:
    Use fast math:               NO

  Python:
    Interpreter:                 /usr/bin/python2 (ver 2.7.6)
    Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython2.7.so (ver 2.7.6)
    numpy:                       /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.8.2)
    packages path:               lib/python2.7/dist-packages

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

  Documentation:
    Build Documentation:         NO
    Sphinx:                      NO
    PdfLaTeX compiler:           NO

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

  Install path:                  /usr

  cvconfig.h is in:              /hdd/buildbot/slave_jetson_tk1_2/52-O4T-L4T/build
-----------------------------------------------------------------

General configuration for OpenCV4Tegra =====================================
  inner version                  2.4.10.1
  memory allocator               NO
  hardware link                  YES
  compact sources                NO
  logging enabled                NO
-----------------------------------------------------------------

以上

2014年12月21日日曜日

ODROID-XU3 Lite向けにOpenCV2.4.10をビルドした

ODROID-XU3 Liteが入手できたので、OpenCV2.4.10をビルドしてみた。

関連モジュールがすでに整っていたようなので、USB HDDにOpenCV2.4.10のソースを入れて、ODROIDに接続し、

cmake、 make、 make install ldconfigを行うことで使用できるようになった。

cmakeのオプション

cmake -DCMAKE_BUILD_TYPE=RELEASE -DWITH_1394=off -DBUILD_TESTS=off -DBUILD_PERF_TESTS=OFF -DBUILD_DOCS=OFF -DWITH_CUDA=OFF -DWITH_CUFFT=OFF -DWITH_GIGEAPI=OFF -DENABLE_NEON=ON -DWITH_TBB=ON -DBUILD_TBB=ON -DBUILD_GPU=off ..

8コアのため make -j8 の指定で、30分もかからない。基本的なモジュールは動作しているようである。

問題点
cmakeでtbbを指定してみたが、できたものはtbb対応ではなかった。

opencv/3rdparty/tbb/CMakeLists.txtを見てみると

BUILD_TBB option supports Windows on ARM only!
Use regular official TBB build instead of the BUILD_TBB option!

とあり、surfaceしか有効ではな気がする。

tbbが使用できないと8コアの意味がないので引き続き調査する。

todo
OpenCLが使えるか
pythonでimport opencvができな対策

Raspberry Pi のOpenCV configuration情報を表示させてみた

raspberry pi で OpenCVをビルドすると一晩コースと言われている。

簡単に既存のものをインストールするには、
sudo apt-get install libopencv-dev
を実行すれば良い

以前は、2.3系がインストールされたが、最近では、2.4系がインストールされるようになった。
どのようなconfigurationでビルドされているのか表示させてみた。


General configuration for OpenCV 2.4.1 =====================================

  Platform:
    Host:                        Linux 3.8.0-19-generic 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):         -Wall -pthread -fomit-frame-pointer -ffunction-sections -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2   -DNDEBUG
    C++ flags (Debug):           -Wall -pthread -fomit-frame-pointer -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG -ggdb3
    C Compiler:                  /usr/bin/gcc
    C flags (Release):           -Wall -pthread -fomit-frame-pointer -ffunction-sections -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2  -DNDEBUG
    C flags (Debug):             -Wall -pthread -fomit-frame-pointer -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG -ggdb3
    Linker flags (Release):      -Wl,-z,relro -Wl,--as-needed
    Linker flags (Debug):       

  OpenCV modules:
    To be built:                 calib3d contrib core features2d flann highgui imgproc legacy ml objdetect photo python stitching ts video videostab
    Disabled:                    -
    Disabled by dependency:      gpu(deps: )
    Unavailable:                 androidcamera java

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

  Media I/O:
    ZLib:                        /usr/lib/arm-linux-gnueabihf/libz.so (ver 1.2.7)
    JPEG:                        /usr/lib/arm-linux-gnueabihf/libjpeg.so (ver 80)
    PNG:                         /usr/lib/arm-linux-gnueabihf/libpng.so (ver 1.2.49)
    TIFF:                        /usr/lib/arm-linux-gnueabihf/libtiff.so (ver 42 - 3.9.6)
    JPEG 2000:                   /usr/lib/arm-linux-gnueabihf/libjasper.so (ver 1.900.1)
    OpenEXR:                     /usr/lib/libImath.so /usr/lib/libIlmImf.so /usr/lib/libIex.so /usr/lib/libHalf.so /usr/lib/libIlmThread.so (ver 1.6.1)

  Video I/O:
    DC1394 1.x:                  NO
    DC1394 2.x:                  YES (ver 2.2.0)
    FFMPEG:                      YES
      codec:                     YES (ver 54.35.0)
      format:                    YES (ver 54.20.4)
      util:                      YES (ver 52.3.0)
      swscale:                   YES (ver 2.1.1)
      gentoo-style:              YES
    GStreamer:                   NO
    OpenNI:                      NO
    OpenNI PrimeSensor Modules:  NO
    PvAPI:                       NO
    UniCap:                      NO
    UniCap ucil:                 NO
    V4L/V4L2:                    Using libv4l (ver 1.0.0)
    Xine:                        NO

  Other third-party libraries:
    Use TBB:                     NO
    Use Cuda:                    NO
    Use Eigen:                   NO

  Python:
    Interpreter:                 /usr/bin/python2 (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

  Documentation:
    Build Documentation:         YES
    Sphinx:                      /usr/bin/sphinx-build (ver 1.1.3)
    PdfLaTeX compiler:           /usr/bin/pdflatex

  Tests and samples:
    Tests:                       NO
    Performance tests:           YES
    Examples:                    YES

  Install path:                  /usr

  cvconfig.h is in:              /usr/src/packages/BUILD/opencv-2.4.1+dfsg/obj-arm-linux-gnueabihf
-----------------------------------------------------------------

2014年12月20日土曜日

OpenCVで処理時間を調べる

以前は、処理時間の計測に
cv::getTickCount()
の差分を使用し処理時間の計算をしていた。

しかし、OpenCV2.4系のUtilityモジュールに計測用のクラス cv::TickMeter が準備されている。
なぜか、ドキュメントには記載されていない。

使用例

cv::TickMeter    tmeter; 
tmeter.start();
for (int i = 0 ; i < LOOP ; i++) {
    処理
}
tmeter.stop();
std::cout << tmeter.getTimeMilli() / LOOP;

単位はmsecである。

処理時間にばらつきが生じるので、複数回実行し、平均を求めている。

また、小数点1桁表示には
std::cout << cvRound(time / LOOP * 10.0)/ 10.0 << std::endl;
とすればよい。

残念ながら、3.0betaでは、使用できないので注意

OpenCVの計算の並列化

2.4.10では、IPPに対応していないが、TBBを使用することができる。

TBBを有効にしていないと、opencv_traincascadeでの学習時間が非常にかかってしまう。

有効にするには、cmakeのオプションに
 -DWITH_TBB=ON -DBUILD_TBB=ON
を指定すれば良い。途中でソースがダウンロードされ自動でビルドされる。

マニュアルのページでTBBで検索すると、対応しているAPIでは
The function is parallelized with the TBB library
のコメントが記載されている。

2.4.10で対応しているAPIは下記のものである。

CascadeClassifier::detectMultiScale()
solvePnPRansac()
CvDTree::train()
SURF::operator()
detail::FeaturesMatcher::operator()
CvGBTrees::predict()
CvKNearest::find_nearest()
distanceTransform()
calcOpticalFlowPyrLK()
CvANN_MLP::train()
CvNormalBayesClassifier::predict()
CvRTrees::train()
opencv_traincascade

以上

2014年12月15日月曜日

CaffeでMNISTの学習を試してみた。

ここに記載された手順に従い、CaffeでMNISTの学習をさせてみた。


1 データの取得と変換

MNISTのページはここ
手書きデータは、20x20の8bitグレースケールの画像を28x28の中心にanti-aliasingを行い変換したものとのこと

cd $CAFFE_ROOT
スクリプト
data/mnist/get_mnist.sh
の実行により data/mnist/ に、データがダウンロードされる

-rw-r--r-- 1 root root  7840016 Jul 21  2000 t10k-images-idx3-ubyte
-rw-r--r-- 1 root root    10008 Jul 21  2000 t10k-labels-idx1-ubyte
-rw-r--r-- 1 root root 47040016 Jul 21  2000 train-images-idx3-ubyte
-rw-r--r-- 1 root root    60008 Jul 21  2000 train-labels-idx1-ubyte

lmdbへのデータ登録
スクリプト
examples/mnist/create_mnist.sh
の実行により examples/mnist に、2つのlmdbデータができている

drwxr--r--  2 root root  4096 Dec  3 02:08 mnist_test_lmdb
drwxr--r--  2 root root  4096 Dec  3 02:08 mnist_train_lmdb

3 ソルバー定義をCPUに変更に変更
examples/mnist/lenet_solver.prototxt の最後の1行を

# solver mode: CPU or GPU
solver_mode: CPU
に変更

3 学習開始
スクリプト
examples/mnist/train_lenet.sh
を実行する。

train_lenet.sh のスクリプト中身は、
./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt
である。

tools/caffeは、シンボリックリンクであり実体は、
lrwxrwxrwx 1 root root 55 Dec  7 06:39 ./build/tools/caffe -> /home/caffe/caffe-master/.build_release/tools/caffe.bin
である。

テストは、
lenet_solver.prototxtの
# The maximum number of iterations
max_iter: 10000
に記載された回数行われる。

最後のメッセージ

Snapshotting to examples/mnist/lenet_iter_10000.caffemodel
Snapshotting solver state to examples/mnist/lenet_iter_10000.solverstate
Iteration 10000, loss = 0.00377495
Iteration 10000, Testing net (#0)
Test net output #0: accuracy = 0.9907
Test net output #1: loss = 0.0270027 (* 1 = 0.0270027 loss)
Optimization Done.
Optimization Done.

精度は、0.9907となった。
CPUの場合Caffeの計算は、シングルコアで行われており、使用したマシンでは、計算時間に約23分使用した。

生成物
examples/mnist/に4個のファイルができている。

-rw-r--r--  1 root root 1724895 Dec  7 08:26 lenet_iter_10000.caffemodel
-rw-r--r--  1 root root 1724485 Dec  7 08:26 lenet_iter_10000.solverstate
-rw-r--r--  1 root root 1724895 Dec  7 08:14 lenet_iter_5000.caffemodel
-rw-r--r--  1 root root 1724484 Dec  7 08:14 lenet_iter_5000.solverstate

手書き文字の認識には、
MODEL_FILEには、lenet_iter_10000.caffemodelを使用する。

以上

CaffeによるMNISTのLeNetの学習を訳してみた

原文 Training LeNet on MNIST with Caffe は、ここ


Caffeがコンパイルできているものとする。このチュートリアルでは、CAFFE_ROOTにCaffeがインストールされているものとする

データセットの準備

MNISTのWebサイトからデータをダウンロードし変換する必要がある。以下のコマンドを実行する
cd $CAFFE_ROOT
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh

wgetやgunzipをインストールしておくこと コマンド終了後に、mnist_train_lmdb と mnist_test_lmdbのデータができている

LeNet: the MNIST Classification Model

学習プログラムを実行する前に、何が行われるか説明する。数字分類タスクで有名なLeNetを使用する。
オリジナルと若干異なるバージョンを使用する。
sigmoid activationsの代わりに、ニューロン用のRectified Linear Unit (ReLU) activationsを代わりに使用する

LeNetのデザインは、ImageNetのようなおおきなモデルに依然として使用されているCNNの本質を含んでいる。
一般的に、プーリング層に続く畳み込み層、別のプーリング層に続く畳み込み層、従来の多層パーセプトロンに似ている2つの全結合層からなる。
$CAFFE_ROOT/examples/mnist/lenet_train_test.prototxtに、層の定義を行う

MNISTネットワークの定義

MNISTの手書き数字分類タスクのためのLeNetモデル向け、lenet_train_test.prototxt モデル定義の説明を行う。
Google Protobufに関して知っているものとする。また、$CAFFE_ROOT/src/caffe/proto/caffe.proto にある、
Caffeが使用しているprotobufの定義を読んでいるものとする。

具体的には、caffe::NetParameter protobufを記述する

ネットワーク名から始める
name: "LeNet"

データ層の記述

デモで作成したlmdbからMNISTデータを読み込む。データ層に定義される

layers {
  name: "mnist"
  type: DATA
  data_param {
    source: "mnist_train_lmdb"
    backend: LMDB
    batch_size: 64
    scale: 0.00390625
  }
  top: "data"
  top: "label"
}

具体的にはこの層は、data タイプで、mnistの名前を有する。lmdbからデータを読み込む
バッチサイズ64を使用する。入力されるピクセルのレンジが[0,1)にスケーリングする

なぜ、0.00390625なのか、それは、1を256で割った値である。
この層は、データブロブとラベルブロブを出力する。

畳み込み層の記述

最初の畳み込み層を定義しよう

layers {
  name: "conv1"
  type: CONVOLUTION
  blobs_lr: 1.
  blobs_lr: 2.
  convolution_param {
    num_output: 20
    kernelsize: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
  bottom: "data"
  top: "conv1"
}

データ層により与えられるデータブロブを受け取り、conv1層を作成する。畳み込み関数のカーネルサイズ5で、ストライド1で、畳み込まれ、20チャンネルを出力する。
fillerは、ランダムに、重みとバイアスの初期化を行う。weight fillerには、入力と出力ニューロンの数を基準にし、初期化のスケールを決定する、xavierアルゴリズムを使用する。
bias fillerには、デフォルト値0の定数を単純に使用する。
blobs_lrは、層の学習可能なパラメータために、学習率の調整用である。

このケースでは、重み用の学習率を、実行時のソルバーにより与えられた学習率よ同じとし、バイアス学習率は、実行時のソルバーにより与えられた学習率の2倍とする。
通常より良く収束する、

プーリング層の記述

プーリング層の定義は簡単である

layers {
  name: "pool1"
  type: POOLING
  pooling_param {
    kernel_size: 2
    stride: 2
    pool: MAX
  }
  bottom: "conv1"
  top: "pool1"
}

プールカーネルのサイズを2でストライド2(隣の領域との重なりはないことを意味する)として、max poolingを行う。

同様に、2回めの畳込みとプーリングを記述する。詳細は、
$CAFFE_ROOT/examples/mnist/lenet_train_test.prototxt
をみること

全結合層の記述
結合層記述は単純

layers {
  name: "ip1"
  type: INNER_PRODUCT
  blobs_lr: 1.
  blobs_lr: 2.
  inner_product_param {
    num_output: 500
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
  bottom: "pool2"
  top: "ip1"
}

出力500の、内部的事情で、innerproductとcaffeでは呼んでいる全結合層の定義である。ほかは馴染ものものである。

ReLU層の記述
ReLU層の記述は単純

layers {
  name: "relu1"
  type: RELU
  bottom: "ip1"
  top: "ip1"
}

ReLU は要素ごとの操作なので、メモリー節約のために、 in-place操作とする

これは単に、top ブロブと bottomブロブの名前を同じにする。
もちろん、他の層と同じブロブ名を使用しないこと。

ReLU層のあとに、別のinnerproduct層を記述できる

layers {
  name: "ip2"
  type: INNER_PRODUCT
  blobs_lr: 1.
  blobs_lr: 2.
  inner_product_param {
    num_output: 10
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
  bottom: "ip1"
  top: "ip2"
}

Loss層の記述
最後にLoss層

layers {
  name: "loss"
  type: SOFTMAX_LOSS
  bottom: "ip2"
  bottom: "label"
}

Loss層には、softmaxとmultinomial logistic loss (時間の節約と安定性の向上)を定義できる。2つのブロブを持つ。
1つは、予測であり、もうひとつは、データ層により与えられたラベルである。これは、何も出力しない。損失関数の値を計算することではない。
バックプロパゲーションが開始され、ip2に関して勾配を開始した時に報告する。
すべての魔法が始まるところである。

記述ルール
層の定義は、ネットワークの定義の中に、含めるべきかどうか、あるいはいつ含めるかのルールを、下記のように含めることができる。
layers {
  // ...layer definition...
  include: { phase: TRAIN }
}

現在のネットワークの状態に基づき、ネットワーク層のインクルードを制御するルールである。
 $CAFFE_ROOT/src/caffe/proto/caffe.protoを参照すれば、モデルのスキーマと、層のルールの情報を得ることができる。

上記の例では、この層は学習フェーズでインクルードされる。もし、学習をテストに変えれば、テストフェーズのインクルードされるだろう。
デフォルトでは、層のルールがない場合、層は常にネットワークにインクルードされる。
lenet_train_test.prototxtでは、異なるバッチサイズの2つのデータ層を有し、1つは学習用、1つはテスト用である。
lenet_solver.prototxtに定義されているように、テストフェーズだけに含まれる、100回の繰り返しごとに、モデルの精度を報告する、精度層がある。

MNISTソルバーの定義

$CAFFE_ROOT/examples/mnist/lenet_solver.prototxtの各行の説明用のコメントを調べてみて下さい。

(別の機会に)

学習とテストモデル

ネットワーク定義protobufとソルバーprotobufを記述すれば、モデルのテストは簡単である。
train_lenet.shを実行するか、下記のコマンドを実行する。
cd $CAFFE_ROOT
./examples/mnist/train_lenet.sh

train_lenet.shは、簡単なスクリプトであり、簡単な説明を行う。学習用のメインのツールはcaffeであり、学習を行い、solver protobuf ファイルが引数である。

コードを実行すると下記のメッセージが表示され流れていく。このメッセージは、各層の詳細(各層の接続や出力形式)を示しており、デバッグに役立つだろう。

初期化のあと学習が始まる。
I1203 net.cpp:142] Network initialization done.
I1203 solver.cpp:36] Solver scaffolding done.
I1203 solver.cpp:44] Solving LeNet

ソルバーの設定により、100回の繰り返し事に学習ロスが表示される。
そして1000回の繰り返しごとに、ネットワークのテストを行い、下記のようなメッセージを見るだろう。

I1203 solver.cpp:204] Iteration 100, lr = 0.00992565
I1203 solver.cpp:66] Iteration 100, loss = 0.26044
...
I1203 solver.cpp:84] Testing net
I1203 solver.cpp:111] Test score #0: 0.9785
I1203 solver.cpp:111] Test score #1: 0.0606671

学習の繰り返しごとに、lrは、その繰り返しにおける、学習率である。lossは学習関数である。
学習フェーズの出力の場合、 score #0 は、精度で、score #1は、 損失関数である。

数分後に完了する。

I1203 solver.cpp:84] Testing net
I1203 solver.cpp:111] Test score #0: 0.9897
I1203 solver.cpp:111] Test score #1: 0.0324599
I1203 solver.cpp:126] Snapshotting to lenet_iter_10000
I1203 solver.cpp:133] Snapshotting solver state to lenet_iter_10000.solverstate
I1203 solver.cpp:78] Optimization Done.

バイナリーのprotobufファイルとして、lenet_iter_10000にモデルは保存される。
もし、実世界のデータを使用していたなら、あなたのアプリにモデルとして展開できる

CPUでの学習

全ての学習はGPUで行われた。もし、CPUで学習を行う場合、lenet_solver.prototxt ファイルの1行を

# solver mode: CPU or GPU
solver_mode: CPU

に変更すれば良い

MNISTのデータセットは小さいので、GPUは、データの転送のオーバヘッドが大きいので、恩恵が少ない。ImageNetのような巨大なデータセットでは、計算速度は非常に重要である。

以上

2014年12月9日火曜日

Caffeのインストール

一度挫折したが、本家の手順通りにやればほぼ問題なかった。ただし、クリーンなUbuntuを準備し、必要なモジュールは新規にインストールしている。
また、Caffeはmasterを使用している。

本家の手順を見なおしたら、cuDNN Caffeに関しての説明が追加されており、また、cuda関連も変わっている。今回、CUDAを使用せず、CPUモードなので関係がない。

Python版

Caffeのビルドが無事終了すると、Caffeのインストールディレクトリ python/caffe に_caffe.soができている。
pythonのパスに PYTHONPATH=cafferoot/pythonを追加し、python起動後にimport caffeが成功すればよい。

_caffe.soを含む、Caffeのpython一式を他のPCにコピーすれば、他のPCでもすぐにCaffeが使用できるかと一瞬考えたが、関連する共有ライブラリがターゲットのPC側にinstallしていないと結局動作しないことに気付き諦めた。

ldd _caffe.so で依存関係を調べるてみると、多くのモジュールを使用しており、共有ライブラリごとコピーするのも問題を起こしそうだ。

Caffeのmodelデータを取得してみた

モデル配布を行うmodel zooの説明はここ

./modelsには、以下のモデル情報が準備されている

drwxr-xr-x  2 root root 4096 Oct 20 20:53 bvlc_alexnet
drwxr-xr-x  2 root root 4096 Oct 20 20:53 bvlc_reference_caffenet
drwxr-xr-x  2 root root 4096 Oct 20 20:53 bvlc_reference_rcnn_ilsvrc13
drwxr-xr-x  2 root root 4096 Oct 20 20:53 finetune_flickr_style

ダウンロードには、予め
apt install python-yaml
でyamlのインストールが必要

Caffeのrootディレクトリで、model_zooの説明に従い、スクリプトを実行し、各モデルデータを取得する。

  • python scripts/download_model_binary.py models/bvlc_alexnet
  • python scripts/download_model_binary.py models/bvlc_reference_rcnn_ilsvrc13
  • python scripts/download_model_binary.py models/bvlc_reference_caffenet
  • python scripts/download_model_binary.py models/finetune_flickr_style


モデルファイルは、download_model_binary.pyで指定したフォルダーにダウンロードされる。

各モデルのファイルサイズは、以下である。

  • bvlc_alexnet.caffemodel 232M
  • bvlc_reference_rcnn_ilsvrc13.caffemodel 220M
  • bvlc_reference_caffenet.caffemodel 232M
  • finetune_flickr_style.caffemodel 217M

Caffe のモデル配布に関して訳してみた

オリジナルのドキュメントはここ

Caffe Model Zoo

多くの人が、AlexNet-alikesのような単純な回帰から、音声アプリケーションへの画像の類似性のためのSiameseネットワークまで、Caffeを異なる構成のモデル学習に使用し、異なる課題に適用した。これらのモデルの共有の摩擦を少なくするため、モデルZOOのフレームワークを紹介する

  • Caffeモデル情報をパッケージするための共通フォーマット
  • Githubへのモデルのuploadツールや、学習済み.caffemodel binariesのダウンロードツール
  • モデル情報共有のwiki

学習済みデータの取得方法

まずはじめに学習済みのモデルデータを提供する。
scripts/download_model_binary.py <dirname> 
のスクリプトを実行することで各データをダウンロードできる

dirnameは以下のものが使用できる

models/bvlc_reference_caffenet
 BVLC Reference CaffeNet : ILSVRC 2012で学習, NIPS 2012 paperを若干変更.

models/bvlc_alexnet
 BVLC AlexNet : ILSVRC 2012で学習, NIPS 2012とほぼ同じ

models/bvlc_reference_rcnn_ilsvrc13
 BVLC Reference R-CNN ILSVRC-2013 : caffe版のR-CNN

ユーザが作成したモデルは、wiki pageにUPされている。

モデル情報フォーマット

以下の内容を含むディレクトリーでモデルは配布されている
・Solver/model prototxt
・readme.md
 学習用のcaffeのバージョン
 オプション caffemodelのファイルURLとSHA1
 オプション githubのgist id
 何のモデルかの情報
 ライセンス情報
・オプションで、役立つスクリプト

モデル情報のホスティング

Github Gistは、複数のファイルを含むことができ、バージョン管理ができ、ブラウザで見れる記述ができるので、モデル配布に適したフォーマットである。

scripts/upload_model_to_gist.sh <dirname> で、Github Gistへのバイナリーを含まないモデルディレクトリーのファイルをUPし、Gist IDを表示する。
もし、gist_idが、<dirname>/readme.mdのfront matterの一部の場合、従来のものを更新する。

scripts/upload_model_to_gist.sh models/bvlc_alexnet を試してみれば良い。削除を忘れずに
scripts/download_model_from_gist.sh <gist_id> <dirname>でダウンロードできる

学習データのホスティング

Caffe modelファイルのホストは、ユーザ次第である。BVLCのモデルは、我々のサーバを使用している。Dropboxはふさわしいであろう。?dl=1をURLにつけるていることを確認

scripts/download_model_binary.py <dirname> は、<dirname>/readme.md のURLを使用し、Caffe modelをダウンロードし、SHA1の検査を行う。

OpenCV CMakeのTIPS

OpenCVのCMakeを使用してOpenCVのプログラムのビルドする方法は、ここに記載されている。
もし、CMakeで、find_package(OpenCV REQUIRED)のところでエラーになる場合には、

CMake関連ファイルを一旦削除し、パスを設定し、
export OpenCV_DIR=/usr/local/share/OpenCV
再度CMake . を実行すれば解決できる

OpenCV 3.0.0でLatentSVMを使用してみた

OpenCV3.0.0betaでは、LatentSVMは、Contribに移動した。モジュール一式は、opencv_contrib-master/modules/latentsvm/にある。

2.4.10との差異

2.4.10では、samples/c++にlatentsvm_multidetect.cppがあったが、3.0.0ではみつからない。
また、2.4.10のマニュアルは、ここにあるが、3.0.0betaでは、ドキュメントのWebページでの検索ではみつからない。一応、ドキュメントは、
opencv_contrib-master/modules/latentsvm/doc/latent_svm_cascade.rst
に準備されているので、概要を知ることができる。

辞書データの差異

2.4.10では、辞書を自分でダウンロードしないと行けない。ブラウザで
https://github.com/Itseez/opencv_extra/tree/master/testdata/cv/latentsvmdetector/models_VOC2007
を開き、対象の辞書をクリックし、右側のRAWのボタンを押すとxmlファイルがダウンロードされる。
3.0.0では、
opencv_contrib-master/modules/latentsvm/testdata/latentsvm/models_VOC2007_cascade/に
予めxmlファイルが準備されている。

試しに3.0.0の辞書データ(xmlファイル)を、2.4.10で読み込んでみると、コンストラクターのところでSegmentation faultになる。

LatentSVMのxmlファイルは、バイナリーデータが埋め込まれているので、エディタやブラウザーではうまく開けないが、それぞれ無理やりcat.xmlデータを開いて比較してみた。

2.4.10版
<Model>
    <!-- Number of components -->
    <NumComponents>2</NumComponents>
    <!-- Number of features -->
    <P>31</P>
    <!-- Score threshold -->
    <ScoreThreshold>-0.9846930000000000</ScoreThreshold>
    <Component>
        <!-- Root filter description -->
        <RootFilter>
            <!-- Dimensions -->
            <sizeX>11</sizeX>
            <sizeY>7</sizeY>
            <!-- Weights (binary representation) -->
            <Weights>

3.0.0版

<Model>
    <!-- Number of components -->
    <NumComponents>6</NumComponents>
    <!-- Number of features -->
    <P>32</P>
<PCAcoeff>

やはりデータフォーマットが異っている。3.0.0では、コンポーネントの数が増えているので性能が上がっているかもしれない。

CaffeのImageNetモデルを使用した分類の説明を訳してみた

Masaki Saito氏が、Caffeのチュートリアルに関する資料を公開してくれたが、理解できないことが多数あったので、本家のドキュメントを訳してみた。
専門家でないので、訳のおかしなところがあるのでご了承を

ImageNetによる分類

Caffeは、python/caffe/pycaffe.pyのcaffe.Netにより、python用のインタフェースを提供している。簡単に既成の分類ができるように、caffe.Classifierクラスと、classify.pyスクリプトを提供している。Python and MATLAB向けのラッパーを提供している。Python ラッパーは多くの特徴を有しており、ここで説明する。MATLAB向けは、matlab/caffe/matcaffe_demo.mを参考に

注意
ソースコードのコメントに、触れられていないが、ソースのコメントは重要である。


In [1]:
 説明なし

In [2]:
ネットワークの読み込みは簡単。caffe.Classifierがすべて面倒を見る
入力の前処理用のパラメータ構成
平均配列(mean)を与えることにより平均値の減算を行う
入力チャネルの入れ替え(channel_swap)は、RGBの並びを、ImageNetのBGR並びにする
スケール変換(raw_scale)は、入力値の[0:1]スケールをImageNet モデルの[0,255]に変更する

In [3]:
テストを行うなうので、フェーズをテストに設定する。最初は、計算をCPUで行う。

In [4]:
Out[4]:
Caffeの読み込みを利用し、サンプル画像を見てみる。


In [5]:
デフォルトでは、入力画像の、中心と4隅を切り出し、また、それぞれ反転画像を使用し、10回予測を行い、平均を計算する。
予測は1000次元で、希薄であることがわかる。予測クラスID281は、Tabby catである。
もし、 ../data/ilsvrc12/get_ilsvrc_aux.shを使用して、imagenetのデータを取得した場合は、我々のモデルは、 ../data/ilsvrc12/synset_words.txtに記されている、synsetのIDを使用している。予測スコアの最大値が示してるものを見ると、猫、キツネ、および他の可愛い哺乳類である。おかしくない結果ではないか

In [6]:
oversamplingをやめて中心の切り取り画像で分類してみよう。これは、1つの入力を示している。もし、モデル定義のprototxtを見てみると、networkのバッチサイズは10であることがわかる。pythonラッパが、バッチの処理を行う。

In [7]:
分類にかかる時間を見ることはできないのか。今回、Intel i5 CPUを使用しており、パフォーマンスの違いを見てみよう。
1回の処理 355msec
若干遅い気がするが、これには、切り出し、pythonインタフェース、10回の計算が含まれている。もう少し予測を速くしたいのであれば、C++で記述し、パイプライン処理を行うとよい。プロトタイプには、これくらいの速度があれば良い

In [8]:
前処理により、1枚の画像で分類してみる。
1回の処理 210msec

In [9]:
GPUを使用した場合はどうか、設定は簡単

In [10]:
Out[10]:
結果が同じか見てみよう。すべて同じである。

In [11]:
GTX 770 GPUを使用した同じマシンで、GPUの処理時間を見てみよう
Full pipeline timing.
1回の処理 174msec

Forward pass timing.
1回の処理 34.2msec

十分速いだろうが、期待した速度ではないかもしれない。Pythonデモで4倍の速度向上を得ている。GPUのコードは、実際とても速いが、データの転送、フォーマット変換などのオーバヘッドに数倍時間がかかっている。

GPUの処理能力を活かすには、
・バッチを大きくする、python呼び出しや、データ転送のオーバヘッドを小さくする
・subprocessに分割し、パイプライン処理を行う
・データセットが大きい場合には、面倒だがC++を使用する

最後に

これは、Pyhonである。十分に使いやすい。boost::pythonのラッパーであり、pycaffe.pyのpython/caffeクラスにメインのインタフェースのソースが書かれている。
また、classifier.pyに、分類用のラッパーがある。
あなた自身のカスタマイズを行うことができるので、改良を行い、我々にpull requestを送って欲しい。

2014年11月28日金曜日

OpenCV 3.0.0betaのデータセットモジュールに関して

最新版のドキュメントはここ

OpenCV 3.0.0では、新たにdatasets moduleが作られ各種データセットを読み込み評価できるようになっている

計画では、
・基本 データの読み込み
・次段階 評価用コードを作成し、アルゴリズムのベンチマークができるようにする
・最終 各タスクの解決ができる最新技術を実装

データセット
ドキュメントでは各データセットへのリンクがはられている

Action Recognition
 HMDB: A Large Human Motion Database [1]
 Sports-1M Dataset

Face Recognition
 Adience
 Labeled Faces in the Wild [1]

Gesture Recognition
 ChaLearn Looking at People
 Sheffield Kinect Gesture Dataset

Human Pose Estimation
 HumanEva Dataset
 PARSE Dataset

Image Registration
 Affine Covariant Regions Datasets
 Robot Data Set

Image Segmentation
 The Berkeley Segmentation Dataset and Benchmark
 Weizmann Segmentation Evaluation Database

Multiview Stereo Matching
 EPFL Multi-View Stereo
 Stereo – Middlebury Computer Vision

Object Recognition
 ImageNet
 MNIST [2]
 SUN Database

Pedestrian Detection
 Caltech Pedestrian Detection Benchmark [2]

SLAM
 KITTI Vision Benchmark
 TUMindoor Dataset

Text Recognition
 The Chars74K Dataset
 The Street View Text Dataset [1]

[1] (1, 2, 3) Benchmark implemented
[2] (1, 2) Not used in Vision Challenge

2014年11月26日水曜日

OpenCV TIPS

現在共有ライブラリーで有効なOpenCVのバージョンを表示する


 pkg-config --modversion opencv


パイソンでOpenCVをインストールした時に有効なバージョンを表示する

print cv2.__version__

OpenCV 3.0.0 betaをubuntuのpythonで使用する (2)


OpenCVを、ubuntu 14.04 64bit上のpythonで使用できるようにする。
OpenCVのバージョンは、 3.0.0betaである。

注意
3.0.0betaには、不具合があり、cv2.soがビルドできる場合とできない場合がある
今回は、ハマりどころの回避策である

準備
2.4.10と同じ

ビルド
2.4.10と異なり、最初のcmakeを行うときに、すべてのパラメータを指定する必要がある

cmake -DCMAKE_BUILD_TYPE=RELEASE -DWITH_OPENCL=off -DWITH_1394=off -DBUILD_TESTS=off -DBUILD_PERF_TESTS=OFF -DBUILD_DOCS=OFF -DWITH_CUDA=OFF -DWITH_CUFFT=OFF -DWITH_GIGEAPI=OFF ..

一旦cmakeによりmake用のファイルを作成後に、ccmake等で修正を行うとうまく行かないことが確認された

問題の箇所は、下記のようにライブラリのpathが設定されなくなる。

--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.6)
--     Libraries:                   NO
--     numpy:                       /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.8.2)
--     packages path:               lib/python2.7/dist-packages

このメッセージは、cmakeの時しか表示されないので、あとで確認するには、
version_string.tmpをみればよい

2014年11月25日火曜日

OpenCVをubuntuのpythonで使用する (1)


OpenCVを、ubuntu 14.04 64bit上のpythonで使用できるようにする。
OpenCVのバージョンは、 2.4.10である。

準備
ubuntuには、あらかじめpythonが使用できるようになっているが、OpenCVをビルドする前に

sudo apt-get install python-dev python-numpy

を行う必要がある

ビルド
OpenCVをビルドする時に、ccmakeを使用し

BUILD_opencv_python が onであることを確認

また、

PYTHON_NUMPY_INCLUDE_DIR 
/usr/lib/python2.7/dist-packages/numpy/core/include が

PYTHON_PACKAGES_PATH 
lib/python2.7/dist-packages

が設定されることを確認する

あとはmake終了後に

sudo make installで

pythonのライブラリ /usr/local/lib/python2.7/dist-packages/cv2.so が
インストールされている。

確認
pythonを起動し
import cv2が成功すれば良い

2014年11月24日月曜日

OpenCV 3.0.0betaのサンプルデータ

これまで、sample言語ごとのフォルダーに分散していた画像やビデオが、3.0.0のベータでは、samples\dataのフォルダーにまとめられている。

画像一覧


ステレオ画像のtsukubaが消えている。

2014年11月20日木曜日

OpenCV 3.0.0 のContribのモジュールが増えている

前のdatasetsモジュールもそうであるが、アルファのリリース時から少しずつ、contribの内容も増えている。
最近ようやく、モジュールの簡単な説明もつくようになった。

説明は、ここで見ることができる

ソースは今も増えており、現時点では、モジュール説明にないlatentsvmも含まれている。

latentsvmは学習ツールを期待したが、残念ながら提供されていない。
VOC2007のカスケードデータは、テスト用に添付されている。

追記
よく見るとモジュール説明のページではなく、cmake時に特定のモジュールをビルドしないようするための説明のページであった。

OpenCV 3.0.0の新機能を試してみた (2)

昨日からコンテストが開始されたが、コンテストに使用するデータは指定されている。
OpenCVでは、指定のデータを扱えるように、3.0のcontribのモジュールにdatasetsが準備されている。

説明は、ここ

とあるデータを試してみたく、そのうちの1つを試してみたが、残念ながらエラーが生じうまくいかなかった。
使い方の説明も少なく、使用方法がわるいのか、OpenCV側が悪いのかいまひとつ切り分けができていない。

ソースもあるので解析もやる気があればできるが、そこまでの気力がないので、しばらく様子を見ることとする。

OpenCV Vision Challengeが開始された

ようやく公式からアナウンスがあり、受付が開始されました。

DARPAとIntelの支援を受け、最新技術のOpenCVのライブラリ拡張のためにchallengeを開始する
賞金$5万は、11のカテゴリの勝者に分配される。
(1) image segmentation
(2) image registration
(3) human pose estimation
(4) SLAM
(5) multi-view stereo matching
(6) object recognition
(7) face recognition
(8) gesture recognition
(9) action recognition
(10) text recognition
(11) tracking.

条件
5人までの優勝者を選定する。参加者は、オリジナルのアルゴリズム、あるいは、他人のアルゴリズムを実装したものでも参加できる
参加するカテゴリを選択する。
カテゴリで優勝すれば賞金$1000を手にする
さらに$7.5kから$9Kまで得るためには、あなたのソースを、BSDライセンスでOpenCVのpull requestを行う必要がある
あなたのコピーライトとともにあなたの貢献は、OpenCVに取り入られる

CVPR 2015やそのWorkShopに提出するコードでもよい、われわれは、CVPRまで公開しない。

勝者と賞品は、委員会の裁量で決められる

期限

参加期間 今から2105/5/8
発表 CVPR 2015の2015/6/8

詳細は以下に
http://code.opencv.org/projects/opencv/wiki/VisionChallenge
http://code.opencv.org/attachments/1672/OpenCVVisionChallenge.pdf

2014年11月18日火曜日

OpenCV 3.0 beta で SIFTを動かした

OpenCV 3.0 では、SIFTはmainから、contribに移され、APIも見直しされている。

アルファ版の記事はここ

contribは開発中なので今後も変更される可能性がある。すでにSIFTも修正されアルファ版のソースではエラーとなってしまった。

3.0 の最新のSIFTの説明は、ここで見れるが、残念ながらalphaの内容と変わらない


SIFTのサンプルを探してみたが、SIFT関連のサンプルが準備されていない。前回と同様にソースを見てみたがうまくいかなかった。
変わりにSURFのサンプルがあったので、それを参考にソースの修正を行うことで動作した。

ベータ版でのSIFTのサンプルコードは、以下のようになる

// main用
#include <opencv2/opencv.hpp>
//
// contribは個別に指定
//
#include <opencv2/xfeatures2d.hpp>

int main( int argc, char** argv )
{
 cv::Mat image, gimage;
 std::string fname = "./opencv/samples/cpp/baboon.jpg";

 cv::Ptr<cv::Feature2D> detector = cv::xfeatures2d::SIFT::create();
 std::vector<cv::KeyPoint> keypoints;

 image = cv::imread(fname);

 cv::cvtColor(image, gimage, cv::COLOR_BGR2GRAY);

 detector->detect(gimage, keypoints);

 cv::drawKeypoints(image, keypoints, image);

 cv::imshow( "sift image", image );

 cv::waitKey(0);

 return 0;
}

以上

2014年11月17日月曜日

OpenCV 3.0 betaの開発環境をWindows7 64bit版に、Visual Studio Community 2013を使用し構築した


検索などでこのページを訪れる人が、数は少ないけど、コンスタントにいる。
ちょうどこの上にあるG+1のボタンを押してもらうと、Goolgeの検索に見つかりやすくなるので、ご協力いただきたい。

2.4.10までは、OpenGL、OpenNI、CUDAを使用しなければ、ダウンロードしたファイルを展開し、設定すれば使用できたが、今回は自分でビルドする必要がある

以下は、Windows7 64bit版上で、Visual Studio Community 2013を使用しOpenCVでプログラムを開発するための環境作成を行う。

1 ソースの取得

ここに移動し、opencv-3.0.0-beta.exeをダウンロードする

ダウンロードサイズは363M、展開すると3.6Gになる
展開したフォルダーは、ソース sourcesとビルド buildに分かれている

buildには、staticなライブラリは準備されているが、共有ライブラリが準備されていないので、自分でビルドしないといけない

先ほど展開したc:\の直下に移動させ、フォルダー名をopencv30bに変更する
また、opencv30bの下に作業用のworkのフォルダーを作成する

2 cmakeの準備と設定

OpenCVのビルドに、cmakeが必要なのでここからVer. 3.0.2のZIP版をダウンロードする

ダウンロードし、zipの展開後に、bin\cmake-gui.exeを起動する

opencvのソースの場所を指定する。
バイナリは、先ほど作成したworkを指定する。

Configureボタンを押下すると、コンパイラの選択ダイアログが表示されるので、Visual staudio 12 2013 Win64を選択する。

Configureが成功し、画面上部にオプションの選択画面が表示される。最初は、赤く表示されるが気にする必要はない

自分の環境にあったオプションを選択する。今回は、1394やcudaやtestを外している。
再度Configureを押し、設定もれがないか確認する。

選択が終わったら、Generateのボタンを押下する。
作業が完了すると、WorkフォルダーにVisualStudio 2013用のプロジェクト一式ができている

3 プロジェクトのビルド
workフォルダーのOpenCV.slnをダブルクリックする
visual studio 2013が起動する。

Solution configrationをリリースに変更しビルドを開始する。マシンの性能に依存するが、約10分で完了する。

4 インストールファイルの作成
Solution explorerのCmakeTargetsのINSTALLを選択し、右クリックでbuildを指示する。



Solution configrationをデバッグに変更し、プロジェクトのビルドと、INSTALLを行う。


プログラム開発に必要なファイルは、C:\opencv30b\work\installに一式準備される。
この後、OSにpathの設定と3.00のプロパティファイルを作成する。

環境構築2に続く

以上

2014年11月11日火曜日

OpenCV 3.0.0 betaをubuntu 14.04 64bitでビルドした (2)

検索などでこのページを訪れる人が、数は少ないけど、コンスタントにいる。
ちょうどこの上にあるG+1のボタンを押してもらうと、Goolgeの検索に見つかりやすくなるので、ご協力いただきたい。

今回は、main + contribをビルドする

mainのみとの差分を記す

  • opencv300bに移動する
  • contribをgitで取得
git clone https://github.com/Itseez/opencv_contrib.git
   取得できるとopencv_contribのフォルダーが作成されている
  • 作業フォルダーを作成 mkdir buildcontrib
 別途作業フォルダーを作成することにより、環境を切り分けることができるが、ディスクの使用量が増える
  • 作業フォルダーに移動 cd buildcontrib
  • cmake .. で一旦makefileを作成する
  • ccmake .でオプションを設定する
  • OPENCV_EXTRA_MODULES_PATHに ~/opencv300b/opencv_contrib/modulesを設定
  • configureすることで、contribのモジュールの選択ができる
          文字認識用のtesseractのライブラリーなどの指定が必要になる
  • generate実行後終了する
  • make -j4
  • sudo make install
  • sudo ldconfig

以上

OpenCV 3.0.0 betaをubuntu 14.04 64bitでビルドした

検索などでこのページを訪れる人が、数は少ないけど、コンスタントにいる。
ちょうどこの上にあるG+1のボタンを押してもらうと、Goolgeの検索に見つかりやすくなるので、ご協力いただきたい。
 
今回は、contribを含まないmainのみ

linuxのソースはここからzipでダウンロードする

  •     ダウンロードしたzipファイルを展開し、フォルダー名をopencv300bに変更する
  •     先ほど展開したフォルダーをhomeの下に移動させる
  •     opencv300bに移動し、作業フォルダーを作成
  •     作業フォルダーに移動
  •     cmakeで一旦makefileを作成する cmake ..
ccmake .でオプションを設定する
    設定後一旦、configureを行い、genarateする
  •     make -j4
  •     sudo make install
  •     sudo ldconfig


make install のあとにldconfigを行わないと、共有ライブラリが更新されず、コアダンプを起こす
また、ldconfigを行うと、以前のopencvの共有ライブラリが使用できなくなるので注意

デフォルトのインストール先は/usr/localである。変更する場合は、ccmakeでインストール先を変更する

以上

OpenCV 3.0.0 betaがリリースされた

ホームでのアナウンスはないが、ひっそりと3.0.0のベータがリリースされている。
少しの時間差で公式にアナウンスがありました

winodws版はここ、iOS版はここ、Unix版はここから取得できる


3.0alphaからの変更点が、ここに公開されている


OpnCL
Intel Iris あるいは Iris Proのグラフィックスカードで
Canny edge detector, Laplacian, StereoBM, BruteForceMatcher, BackgroundSubtractorMOG2, StitchingWarpersなど
10%-230%の性能改善

 HoughLines, HoughLinesP, cvtColor (selected modes), Gemm, DFTがカーネルに追加

NEON
約40の関数がNEON対応により最適化された

JAVA
JAVAとのIFが大幅に改善
features2d, background subtractor classes, a part of opencv_contribのAPIを更新

IPP
AVX2対応のIPP 8.2.1 のサブセットを採用

GitHUB
200以上のpull requestを採用

以上

2014年10月15日水曜日

UbuntuでFaceTrackerを動かしてみた。

動かしたのは、ずいぶん前だが、再度動かしたのでメモを公開しておく

FaceTrackerは、「pyFaceTracker:顔パーツ追跡「FaceTracker」のpythonラッパー」で存在をしり、作者ページをたどりgithubからソースを取得

今回はZip形式でダウンロードし、適当な場所に展開し、githubの説明そのままにビルドを行った

実行は、binに移動し、
./face_tracker -m ../model/face2.tracker
でOK

約30fpsの速度で検出できる。

使用した感想だが、時折追跡に失敗し(特に顔を左右に回転することで、顔を見失った場合に多い)、関係ない場所を追跡してしまうことがある。その場合は、dキーでリセットされる

プログラムはOpenCVで記載されているので、改造することは可能だが、データを作成することは手間が掛かりそうである
mainは、FaceTracker-master/src/exe/face_tracker.ccである

派生に、java script版もあるが遅延が少し感じられる

以上

OpenCV 2.4.10がリリースされた


公式からの発表はないが2.4.10がひっそりとリリースされている
リリースされたのは、以下のもの




change log が更新されていなく、変更点は不明だが、残念ながら、IntelIPPには対応していない

2014年9月17日水曜日

Caffeで手軽に画像分類を試してみた(1)  泥沼だ


昨日公開されたすばらしい記事に従い試してみたが、泥沼にはまってしまった。

Windowsの環境を変えたくなかったのでUbuntu14.04で試している。

最初に本家のインストール方法のページを見てみる。

事前準備
 必要なモジュール
  • CUDA library
  • BLAS (provided via ATLAS, MKL, or OpenBLAS).
  • OpenCV.
  • Boost (>= 1.55, although only 1.55 is tested)
  • glog, gflags, protobuf, leveldb, snappy, hdf5, lmdb
  • Python 2.7, numpy (>= 1.7), boost-provided boost.python

最初 GPUを使用しないためCUDAをinstallしなかった(第1の間違い)
OpenCVは、3.0alphaの環境が使用可能なので放置(第2の間違い)

BLASは、素直にATRASを使用
  Ubuntu: sudo apt-get install libatlas-base-dev

その他
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libboost-all-dev libhdf5-serial-devでinstall

Ubuntu 14.04追加
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
memo
  • libprotobuf-dev                serializing structured data
  • libleveldb-dev                mapping from string keys to string values
  • libsnappy-dev                very high speeds and reasonable compression7
  • libboost-all-dev            Boost development environment
  • libhdf5-serial-dev            Hierarchical Data Format 5 (HDF5) - runtime files
  • libgflags-dev                commandline flags processing
  • libgoogle-glog-dev            google-glog
  • liblmdb-dev                    Lightning Memory-Mapped Database
  • protobuf-compiler
cp Makefile.config.example Makefile.config の後、CPU-only Caffe は、Makefile.config の the CPU_ONLY := 1をコメントアウト

PIPをinstallし、


sudo apt-get install python-pip

pip install -r python/requirements.txt
を実行


そして、いよいよmake allを実行したが、STUB_GPU_FORWARDが定義されていないよのエラーで停止。

続く

cv::Matに関する情報の取得方法


若干ややこしいのでメモ

elemSize()
 1画素のデータサイズ : チャンネル数を考量
 CV_16SC3の場合 6 = (2x3)

elemSize1()
 1画素のデータ長 : チャンネル数は考量されない
  CV_16SC3の場合 2

depth()
 1画素の深度のindexを返す
 下記固定値と比較して判定する必要あり

CV_8U - 8-bit unsigned integers ( 0..255 )
CV_8S - 8-bit signed integers ( -128..127 )
CV_16U - 16-bit unsigned integers ( 0..65535 )
CV_16S - 16-bit signed integers ( -32768..32767 )
CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )

channels()
 チャンネル数を返す

OpenCV 3.0 alphaのADASに関して

事前の案内では、ADAS用のモジュールが追加されるとあり期待していたが、いざリリースされると、contribにADAS.cppが存在するが中身はない。それどころか、自動車の検出用の辞書さえも存在していないのは、残念な結果となった。




よく調べてみると、pencv_contrib/modules/adas/tools/fcw_trainに、辞書作成と、検出のツールのソースが含まれており、contribをビルドすると、ツールができる。使用方法などドキュメントは存在しない。

ソースを見ると、単にcv::xobjdetect::ICFDetectorにパラメータを整えて渡しているだけのようであり、cv::xobjdetect::ICFDetectorのリファレンスには、WaldBoost and Integral Channel Featuresと簡単な説明がある

必要なパラメータは、
pos_path  path to training object samples
model_size  model size in pixels
ぐらいしかない。

cascadeでの辞書作成は、画像のパス、左上座標、サイズを記したファイルを指定していたが、ファイル名しか指定していないので、今回は、自分で事前に指定のサイズにpositive画像を切り抜いておく必要があると推測される

ソースを見ると、読み込んだファイル(jpg, png)を指定のサイズにリサイズしているので、範囲さえあっていればよいみたいである。

negativeは、指定数だけランダムに画像を切る抜いたものを使用している。

その後、パラメータを整えてwaldboostを使用して学習している。

マルチスケールでwaldboostを使用して検出しているが、並列化などの高速化や、検出結果のグルーピングは行われていないので、自力で対応しないといけない

以上

OpenCV 3.0のリファレンスマニュアルは3種類存在する

OpenCVの各バージョンのドキュメントはここからアクセスできる





なぜか3.0は、3つのバージョンが存在しており、masterとalphaは上記からアクセスできるが、trunkは、記載されていない。masterとtrunkの違いが不明


3.0.0 trunk
http://docs.opencv.org/trunk/modules/refman.html
http://docs.opencv.org/trunk/index.html

3.0.0 master
http://docs.opencv.org/master/modules/refman.html
http://docs.opencv.org/master/index.html

3.0.0-alpha
http://docs.opencv.org/3.0-alpha/modules/refman.html
http://docs.opencv.org/3.0-alpha/index.html

OpenCV 3.0 alphaの変更点で気になる点(1)

mainは2.4.9との互換性を保つようになぅっているが、それでもところどころに変更があり、過去のソースを修正しないと3.0alphaでは、動作しない。

特に気になる点

1 cvtColorのcolor space conversion codeの変更
CV_BGR2GRAYのように指定していたが、COLOR_BGR2GRAYに変更された


過去の多くのソースがここでつまずく

2.4.9のリファレンス

3.0 alphaのリファレンス


2 ビデオ出力のコーデック指定用の4文字コードの変更
CV_FOURCC('X','V','I','D')からcv::VideoWriter::fourcc('X','V','I','D')に変更された

特に、3.0alphaのリファレンスでもCV_FOURCC('M','J','P','G')に間違ったままなので注意が必要

以上

OpenCV 3,0 alphaのサンプルを調べてみた


2.4.9のC++のサンプルと3.0alphaのC++のサンプルを比較してみた

いくつか新規に追加されているが、特徴点と特徴量関連のサンプルがなくなっているのが気になる

3.0.0 alphaで追加されたもの
tutorial_code\photo
tutorial_code\video
shape_sample

cloning_demo.cpp
cloning_gui.cpp
create_mask.cpp
dbt_face_detection.cpp
facedetect.cpp
image_alignment.cpp
lsd_lines.cpp
npr_demo.cpp
polar_transforms.cpp
shape_example.cpp
smiledetect.cpp
train_HOG.cpp
tree_engine.cpp
ufacedetect.cpp

airplane.jpg
baboon200.jpg
baboon200_rotated.jpg
box.png
box_in_scene.png
graf1.png
graf3.png
puzzle.png
scene_l.bmp
scene_r.bmp
tree.avi

H1to3p.xml
intrinsics.yml
waveform.data

3.0.0alphaから消去、移動したもの

tutorial_code\contrib
fabmap
matching_to_many_images
Qt_sample
rgbdodometry

bagofwords_classification.cpp
bgfg_gmg.cpp
brief_match_test.cpp
build3dmodel.cpp
calibration_artificial.cpp
chamfer.cpp
descriptor_extractor_matcher.cpp
detection_based_tracker_sample.cpp
detector_descriptor_evaluation.cpp
detector_descriptor_matcher_evaluation.cpp
fabmap_sample.cpp
facerec_demo.cpp
freak_demo.cpp
gencolors.cpp
generic_descriptor_match.cpp
hybridtrackingsample.cpp
latentsvm_multidetect.cpp
linemod.cpp
logpolar_bsm.cpp
matcher_simple.cpp
matching_to_many_images.cpp
meanshift_segmentation.cpp
OpenEXRimages_HDR_Retina_toneMapping.cpp
OpenEXRimages_HDR_Retina_toneMapping_video.cpp
peopledetect.cpp
retinaDemo.cpp
rgbdodometry.cpp
simpleflow_demo.cpp
video_dmtx.cpp

facerec_at_t.txt
fern_params.xml

3.0.0alphaで修正されたもの

3calibration.cpp
bgfg_segm.cpp
calibration.cpp
camshiftdemo.cpp
connected_components.cpp
contours2.cpp
convexhull.cpp
cout_mat.cpp
delaunay2.cpp
demhist.cpp
dft.cpp
distrans.cpp
drawing.cpp
edge.cpp
em.cpp
fback.cpp
ffilldemo.cpp
fitellipse.cpp
grabcut.cpp
houghcircles.cpp
houghlines.cpp
image.cpp
image_sequence.cpp
imagelist_creator.cpp
inpaint.cpp
intelperc_capture.cpp
kalman.cpp
kmeans.cpp
laplace.cpp
letter_recog.cpp
lkdemo.cpp
minarea.cpp
morphology2.cpp
opencv_version.cpp
openni_capture.cpp
pca.cpp
phase_corr.cpp
points_classifier.cpp
segment_objects.cpp
select3dobj.cpp
squares.cpp
starter_imagelist.cpp
starter_video.cpp
stereo_calib.cpp
stereo_match.cpp
stitching.cpp
stitching_detailed.cpp
tvl1_optical_flow.cpp
videostab.cpp
watershed.cpp

CMakeLists.txt

以上

2014年9月11日木曜日

Windows8.1 64bit版にOpenCV 3.0 alpha の開発環境を構築した(2)  進捗だめです



Windows7と同様にcontribのビルドを行おうとしているが、残念ながらビルドの途中で_popcntが見つからないエラーが出現し、これから試行錯誤しなければいけない

ビルドまでの手順は確立したので公開しようかと考えたが、後で訂正が入りそうなので、解決したらのせることとする。

補足 2014/9/10 1:00

 Visual Studio Express 2013 for Windows Desktopで64bitのプロジェクトがビルドできるとは知らなかった。CMakeのコンパイラをx64に変更すれば、コンパイルのエラーはなくなり、一応の解決を得た。

アプリ動作を確認後手順を載せます。

2014年9月10日水曜日

Windows8.1 64bit版にOpenCV 3.0 alpha の開発環境を構築した(1)

検索などでこのページを訪れる人が、数は少ないけど、コンスタントにいる。
ちょうどこの上にあるG+1のボタンを押してもらうと、Goolgeの検索に見つかりやすくなるので、ご協力いただきたい。

2.4.9までは、OpenGL、OpenNI、CUDAを使用しなければ、ダウンロードしたファイルを展開して、pathの設定すれば使用できたが、今回は自分でビルドする必要があるので手間がかかる。

以下は、Windows8.1 64bit版上で、Visual Studio 2013 Express for Desktopで、OpenCV3.00 alphaのプログラムを開発するための環境を構築する方法である。

今回はメインモジュールのみ contribは後で

ソースの取得

このページに移動し、opencv-3.0.0-alpha.exeをダウンロードする。
ダウンロードサイズは350M、展開すると3.5Gになる。
展開したいフォルダーの構成は、2.4.9と同じくソースとビルドに分けられている。

opencv-3.0.0-alphaのbuildには、staticなライブラリは準備されているが、共有ライブラリが準備されていないので、自分でビルドしないといけない。

先ほど展開したフォルダーをd:\の直下に移動させ、フォルダー名をopencv30alphaに変更する。
また、作業用にopencv30alphaの下にworkのフォルダーを新規に作成する。

cmakeの準備と設定

ビルドには、cmakeが必要なので、このページに移動しzip版をダウンロードする。


ダウンロードしてzipを展開後に、binの下のcmake-gui.exeを起動する。
ソースの場所は、D:\opencv30alpha\sourcesを指定する。
バイナリは、D:\opencv30alpha\workを指定する。

Configureボタンを押下すると、コンパイラの選択ダイアログが表示されるので、Visual staudio 12 2013を選択する。

Configure、画面上部にオプションの選択画面が表示される。赤色の表示だが気にしなくてよい
環境にあったオプションを選択する。今回は、1394やcudaやtestを外している。

選択が終わったら、Generateのボタンを押下する
完了するとD:\opencv30alpha\workに、VisualStudio 2013用のプロジェクト一式ができている

プロジェクトのビルド

workフォルダーのOpenCV.slnをダブルクリック
visual studio 2013が起動する

プロジェクトの構成をリリースに変更しビルドを開始
マシンに依存するが約10分で完了する

alpha版では、ビルドが最後まで終わらないので、以下の作業を手動で行う

ソリューションエクスプローラのINSTALLを選択し、マウス右ボタンでメニューを表示し、ビルドを指示する。


これにより開発に必要なファイル一式がD:\opencv30alpha\work\installの下にコピーされる

リリース版が終わったなら構成をdebugに切り替えて、ソリューションのビルドと、INSTALLのビルドを行う

以上の処理で、2.4.9までと同様の状態になる。このあと、プロパティシートを作成し、環境変数の登録を行えばよい。

以上

つぶやき

いまさらの話ですが、dandelion1124さんが不定期に連載されているOpenCV入門で、末端に紹介されました。

twitterでOpenCV関連のタイムラインがみれます。時々みています。



(業務連絡 うまくいかないようでしたらコメントに書いてください 修正します)

インテル RealSense App Challenge 2014開催

Intel RealSense Developer Kitが買えます

OpenCV Challengeが開催されるとのこと


記事録をみてたらOpenCV Challengeが開催されるとのこと

概要はここ


以下大まかな訳

編集中のようであり、変わる可能性がある。下記内容は9日20時のものである。


下記の6のカテゴリーで、総額5万ドルの実装コンテストを行う

- Image segmentation
- Vision-based Simultaneous Localization and Mapping (SLAM)
- Multi-view stereo matching
- Face recognition
- Gesture recognition
- Action recognition

実装は、C/C++, Matlab/Octave or Pythonで行ってもよいが、賞を得るには、OpenCVに即したC/C++に変換しないといけない

ソースコードのほかに、性能評価の結果を提出する必要がある

参加者が定量的にアルゴリズムの品質と精度を評価するために、指定のベンチマークを使用すること

ベンチマーク用のデータセット

Image Segmentation
* The Berkeley Segmentation Dataset and Benchmark
https://www.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/
SLAM
* KITTI Vision Benchmark
http://www.cvlibs.net/datasets/kitti/eval_odometry.php
Multiview Stereo Matching
* Stereo ? Middlebury Computer Vision
http://vision.middlebury.edu/mview/
Face Recognition
* Labeled Faces in the Wild-a
http://www.openu.ac.il/home/hassner/data/lfwa/
Gesture Recognition
* Sheffield Kinect Gesture Dataset
http://lshao.staff.shef.ac.uk/data/SheffieldKinectGesture.htm
Action Recognition
* HMDB: A Large Human Motion Database
http://serre-lab.clps.brown.edu/resource/hmdb-a-large-human-motion-database/


はじめ方

参加者は登録する必要はない。最初にカテゴリーを選択する。参加国の制限はないが、送金の関係で制約が生じる可能性はある
そのため、参加者は国際銀行の口座が必要である。

データセットを読み込む簡単なツールを準備する。すべてのデータを読み込むだけのものである。
ほかに機能を追加する予定である。ここにツールがあり、ビルドの仕方はここ

質問がある場合には、vision-challenges@opencv.orgにメールを

優勝者の選択方法
OpenCVにより選任された人が、実装を選択する。上記のデータセットで報告された性能を有するものを識別するだろう。
OpenCVは、最新のスコアに近い目標をもうけるだろう。ソースコードと要求された値を超えた性能評価レポートを提出した人が、賞を獲得する資格になる
各分野での優秀者5人が選ばれるだろう。最終選考者は、同じ評価基準でパフォーマンスの測定が行われる

OpenCV は、テストデータを追加するかも知れない。最終的には、速度と精度のトレードオフを考慮して決める

優秀な5つのアルゴリズムは、OpenCVの規則に基づき実装される。OpenCV は、制作者にソースコードを修正するスケジュールの調整を図る。
制作者は、BSDライセンスのもとアルゴリズムをOpenCVのライブラリに組み込む。実装規則は後日Webサイトに公開する

スケジュール
9/5 2014 開始
11/31 2014 締め切り
12/21 2014 結果発表

http://code.opencv.org/projects/opencv/wiki/VisionChallenge
に詳細を公開する

2014年9月2日火曜日

OpenCVのサンプルプロジェクトをGitHubに公開してみた(1)

異なるマシン間でのファイルおよびプロジェクトを共有するために、はじめてGitHubを使用してみた

テストケースとしてWindows7のOpenCV3.0alphae + contirb用の、SIFTのサンプルプロジェクトを作成し、GitHub for Windows経由でサーバにアップしてみた


公開したプロジェクトはここから、ZIPをダウンロードして展開して下さい

自由に使用してもらってもかまいませんが、自己責任で使用してください

注意
このプロジェクトは、Visual Studio 2010 express edition 32bit向けのプロジェクトなので、他のバージョンでの使用には問題があります
(特にOpenCVは、Visual Studio 2010向けにビルドしたものなので他のバージョンでは使用できない可能性が高い)

最初に起動する前に、プロジェクト内のプロパティシートをエディタで開き、自分の環境にあったパスに変更してください
また、プログラム内に固定でファイル名を書いていますので、ここも変更してください



なぜかVisual Studio 2010でダウンロードしたプロジェクトを開くと警告が表示されます


対策方法や、Windows7でのGitHubの使いかなどアドバイスがあればお願いします

OpenCV 関連の洋書 2014の前半

OpenCV Computer Vision Application Programming Cookbook (英語) ペーパーバック
 2014/8/26
中身検索
374ページ 5058円

OpenCV Essentials (英語) ペーパーバック ?
2014/8/25
214ページ 3304円


A Practical Introduction to Computer Vision with OpenCV (Wiley-IS&T Series in Imaging Science and Technology) (英語) ペーパーバック ?
 2014/5/12

234ページ 7164円
中身検索
中身を見ると10章のVisionProblemsが面白そうである

注意
金額は9/2のもの

Windows7 64bit版にOpenCV 3.0 alpha の開発環境を構築した(5)

前置きは、前の記事と同じなので省略するが、できれば+1を押してほしい。

プロパティシートを使用したOpenCVアプリの開発方法を示す。

 OSの環境変数の設定(要管理者権限)
  コントロールパネル、システムとセキュリティ、システムを開き
  システムの詳細設定の環境変数ボタンを押し
  システム環境変数のPathの編集

  末尾に";C:\opencv30a\work\install\x86\vc10\bin"を追加
 (この作業後、一度ログオフし、再度ログインする)

Visual C++ 2010 Expressのパスの設定を行う

以前の記事では、システム全体のプロパティを書き換えていたが、この方法ではOpenCVに関係ないプロジェクトも影響を受ける

今回は、専用のプロパティシートを作成する。
OpenCV3.0alphaのプログラムを作成する場合は、この作成したプロパティシートを読み込むことで、パスの指定を行うことになる。

プロパティシートを読み込みは、プロジェクト作成後に、メニューの表示でプロパティマネージャを呼び出し、プロジェクト名を選択した状態で、既存のプロパティシートの読み込みボタンを押し、OpenCV30a.propsを読み込む。

プロパティシートの作成

c:\tmpに、エディタを開き以下の内容をコピーし、OpenCV30a.propsという名前でファイルを保存する。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets" />
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup />
  <ItemDefinitionGroup>
    <ClCompile>
      <AdditionalIncludeDirectories>C:\opencv30a\work\install\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
    <Link>
      <AdditionalLibraryDirectories>C:\opencv30a\work\install\x86\vc10\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup />
</Project>

以上

Windows7 64bit版にOpenCV 3.0 alpha の開発環境を構築した(4)

検索などでこのページを訪れる人が、数は少ないけど、コンスタントにいる。
ちょうどこの上にあるG+1のボタンを押してもらうと、Goolgeの検索に見つかりやすくなるので、ご協力いただきたい。

 contribのビルドがうまくいかなかったが、原因が複数あったので再度設定方法を記す。

mainのみのビルドの記事はここ、今回変更部分のみ記載しているので注意


1 contribのソースを取得
 解説では、git cloneで取得するように書かれているが、このページに移動し、右側のdownload zip のボタン押下し、37.4Mのzipファイル opencv_contrib-master.zip をダウンロードする


2 ファイルの展開
OpenCV3.0aのフォルダーの下にzipファイルを展開する
zipの展開を行うと、opencv_contrib-master の下に opencv_contrib-masterのフォルダーができるので注意

3 cmakeの準備と設定
cmake-gui.exeを起動し、オプション指定の、OPENCV_EXTRA_MODULES_PATHに opencv_contrib-master\modulesを指定する


ubuntuと同じ問題が生じるのを回避するために、ここで一旦、C:\opencv30a\opencv_contrib-master\modules\xfeatures2dのCMakeLists.txtのバックアップを作成し、CMakeLists.txtをエディタで開き、opencv_cudaarithm を削除する

再び、cmake-gui.exeに戻り、configureのボタンを押下し、その後、Generateのボタンを押下する
完了するとWorkフォルダーのVisualStudio 2010用のプロジェクト一式が更新されている

4 プロジェクトのビルド
workフォルダーのOpenCV.slnをダブルクリック
visual studio 2010が起動する

この時ソリューションエクスプローラにcontribのモジュールが登録されていることを確認
特にxfeatures2dがあることを確かめること


プロジェクトの構成をリリース変更し、念のために一旦ソリューションのクリーンを行い、その後ビルドを指示する。マシンに依存するが約10分で完了する

ビルドが終了したら、ソリューションエクスプローラのINSTALLを選択し、メニューのビルドからINSTALLのビルドを指示する


INSTALLは、ほぼ一瞬で終了する

OpenCVの開発に必要なファイルがwork\installのフォルダーにできている

プロジェクトの構成をdebugに変更し、リリースと同じ作業を行う

以上 開発環境の構築の前半を終える。
後半は、プロパティシート作成方法について述べる

2014年9月1日月曜日

Windows7 64bit版にOpenCV 3.0 alpha の開発環境を構築した(3)

修正点が多いので ”Windows7 64bit版にOpenCV 3.0 alpha の開発環境を構築した(4)”に書き直しました



mainのみのビルドの記事はここ、今回変更部分のみ記載しているので注意

今回は、contribを含めたOpenCV3.0alphaのビルドの仕方だが、9/1日時点では、ビルドはできるがプログラムが開発できない状況である。
手動だが解決方法が見つかった。手順は明日に

1 contribのソースを取得
 解説では、git cloneで取得するように書かれているが、ここにアクセスし右側のdownloadのボタン押下により、37.4Mのzipファイル opencv_contrib-master.zip がダウンロードできる


2 ファイルの展開
OpenCV3.0aのフォルダーの下にzipファイルを展開する
zipの展開を行うと、opencv_contrib-master の下に opencv_contrib-masterのフォルダーができるので注意

3 cmakeの準備と設定
cmake-gui.exeを起動し、オプション指定の、OPENCV_EXTRA_MODULES_PATHに opencv_contrib-masterを指定



Generateのボタンを押下
完了するとWorkフォルダーのVisualStudio 2010用のプロジェクト一式が更新されている

4 プロジェクトのビルド
workフォルダーのOpenCV.slnをダブルクリック
visual studio 2010が起動する

プロジェクトの構成をリリース変更し、念のために一旦プロジェクトのクリーンを行い、その後ビルドを開始
マシンに依存するが約10分で完了する

注意
サンプルをビルドしようとしたらcontribのincludeファイルの指定方法がわからない

引き続き調査を行う


補足
visual studioでのビルドの最後のエラーが表示されるが、これが関連しているのかは不明




以上

2014年8月28日木曜日

OpenCV 3.0 alpha の新機能を試してみた。(1)

OpenCVの3.0 alphaには、多くの新機能が追加されている。

Windows版の開発環境が正しくできているか確認するために、今回追加された新機能であるAKAZE特徴点検出を試してみた。
説明はここ

C:\opencv30a\sources\samples\cpp\tutorial_code\features2DにAKAZE_match.cppのサンプルが格納されているのでこれを参考にテストプログラムを作成した。

実行結果




開発マシンがOpenCLに対応していないので、エラーをはいている

ソース

#ifdef _DEBUG
//Debugモードの場合
#define CV_VER "300d"
#else
//Releaseモードの場合
#define CV_VER "300"
#endif

#pragma comment(lib, "opencv_core"CV_VER".lib")
#pragma comment(lib, "opencv_imgproc"CV_VER".lib")
#pragma comment(lib, "opencv_highgui"CV_VER".lib")
#pragma comment(lib, "opencv_video"CV_VER".lib")
#pragma comment(lib, "opencv_objdetect"CV_VER".lib")
#pragma comment(lib, "opencv_imgcodecs"CV_VER".lib")
#pragma comment(lib, "opencv_features2d"CV_VER".lib")

#include "stdafx.h"
// main用
#include <opencv2/opencv.hpp>

int main( int argc, char** argv )
{
    std::string fname = "c:\\tmp\\kan.jpg";

    cv::AKAZE akaze;

    std::vector<cv::KeyPoint> keypoints;
    cv::Mat descriptors;

    cv::Mat image, gimage;
    image = cv::imread(fname);

    cv::cvtColor(image, gimage, cv::COLOR_BGR2GRAY);

    akaze(gimage, cv::noArray(), keypoints, descriptors);
   
    cv::drawKeypoints(image, keypoints, image);

    cv::imshow( "AKAZE image", image );

    cv::waitKey(0);

    return 0;
}


以上

Windows7 64bit版にOpenCV 3.0 alpha の開発環境を構築した(2)

変更点が多いので” Windows7 64bit版にOpenCV 3.0 alpha の開発環境を構築した(5)"に書き直した


 OSの環境変数の設定(要管理者権限)
  コントロールパネル、システムとセキュリティ、システムを開き
  システムの詳細設定の環境変数ボタンを押し
  システム環境変数のPathの編集

  末尾に";C:\opencv30a\work\bin\Release;C:\opencv30a\work\bin\Debug"を追加
 (この作業後、一度ログオフし、再度ログインする)

Visual C++ 2010 Expressのパスの設定を行う

以前の記事では、システム全体のプロパティを書き換えていたが、この方法ではOpenCVに関係ないプロジェクトも影響を受ける

今回は、新規にプロパティシートを作成し、OpenCV3.0alphaのプログラムを作成する場合は、作成したプロパティシートを読み込むことでパスの指定を行うことになる。

プロパティシートは、プロジェクト作成後に、メニューの表示でプロパティマネージャを呼び出し、プロジェクト名を選択した状態で、既存のプロパティシートの読み込みボタンを押し、OpenCV30a.propsを読み込む。

プロパティシートの作成

c:\tmpに、エディタを開き以下の内容をコピーし、OpenCV30a.propsという名前でファイルを保存する。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets" />
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup />
  <ItemDefinitionGroup>
    <ClCompile Condition="'$(Configuration)' == 'Release'">
      <AdditionalIncludeDirectories>C:\opencv30a\build\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
    <Link Condition="'$(Configuration)' == 'Release'">
      <AdditionalLibraryDirectories>C:\opencv30a\work\lib\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup>
    <ClCompile Condition="'$(Configuration)' == 'Debug'">
      <AdditionalIncludeDirectories>C:\opencv30a\build\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
    <Link Condition="'$(Configuration)' == 'Debug'">
      <AdditionalLibraryDirectories>C:\opencv30a\work\lib\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup />
</Project>


以上