覚え書きブログ

読者です 読者をやめる 読者になる 読者になる

Jetson TX1の覚え書き(Caffeのipythonサンプル)

最近のCaffeは、ipythonのサンプルコードが用意されている。
ipythonを実行するためには、以下のパッケージをインストールする。

> sudo apt-get install ipython
> sudo apt-get install ipython-notebook

そして、ipythonを実行し、ブラウザ上でcaffe/examples/のipynbファイルを選択するとサンプルコードのデモを実行できる。

> ipython notebook

Jetson TX1の覚え書き(Caffeのインストール)

今回は、先日のJetson TX1にCaffeをインストールした。
hirotaka-hachiya.hatenablog.com

以下の2つのサイトを参考にした。
http://robotics4society.com/2017/04/03/jetson-caffe/
http://hirotaka-hachiya.hatenablog.com/entry/2015/03/20/212247

1)依存する基本パッケージをapt-getでインストールする。
下記のcaffeのページに記載されているコマンドをそのまま実行してみたが、下記のエラーが出た。どうやらJetpackでインストールしたopenCVとlibopencv-devが競合しているようだ。
http://caffe.berkeleyvision.org/install_apt.html

> sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 libopencv-dev : Depends: libopencv-core-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-ml-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-imgproc-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-video-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-objdetect-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-highgui-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-calib3d-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-flann-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-features2d-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-legacy-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-contrib-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-ts-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-photo-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-videostab-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-stitching-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-gpu-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-superres-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libopencv-ocl-dev (= 2.4.9.1+dfsg-1.5ubuntu1) but it is not going to be installed
                 Depends: libopencv2.4-java (= 2.4.9.1+dfsg-1.5ubuntu1) but it is not going to be installed
                 Depends: libopencv2.4-jni (= 2.4.9.1+dfsg-1.5ubuntu1) but it is not going to be installed
                 Depends: libcv-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libhighgui-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
                 Depends: libcvaux-dev (= 2.4.9.1+dfsg-1.5ubuntu1)
E: Unable to correct problems, you have held broken packages.

libopencv-devを外し、さらに「libgflags-dev libgoogle-glog-dev liblmdb-dev」も追加してパッケージをインストールした。また、caffeのページ通りに、libboost-all-devもインストールした。

> sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev
> sudo apt-get install --no-install-recommends libboost-all-dev

2)BLASのパッケージをapt-getでインストールする。これはcaffeのページ通り。

> sudo apt-get install libatlas-base-dev

3)Caffeをgithubからcloneする。

> git clone https://github.com/BVLC/caffe.git
Cloning into 'caffe'...
remote: Counting objects: 38658, done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 38658 (delta 33), reused 18 (delta 18), pack-reused 38611
Receiving objects: 100% (38658/38658), 48.02 MiB | 8.71 MiB/s, done.
Resolving deltas: 100% (25979/25979), done.
Checking connectivity... done.

4)pycaffeを使うので、必要なpythonパッケージをインストールする。パッケージはローカルの/home/ubuntu/.localにインストールされる.

> cd caffe
> sudo apt-get install python-pip
> for req in $(cat python/requirements.txt); do pip install $req; done

5)Makefile.configを、Jetson TX1の環境に合わせて変更する。
Jetson TX1に載っているTegraのアーキ番号を下記のサイトで調べたところ、5.3なのでMakefile.configに、「53」を追加する。
https://developer.nvidia.com/cuda-gpus
また、CUDNNがインストールされているので、「USE_CUDNN」を「1」に設定する。
また、pythonのパッケージが/home/ubuntu/.localにインストールされるので、PYTHON_INCLUDEとPYTHON_LIBにパスを追加する。

> cp Makefile.config.example Makefile.config
> vi Makefile.config
USE_CUDNN := 1
CUDA_ARCH := -gencode arch=compute_30,code=sm_30 \
                -gencode arch=compute_35,code=sm_35 \
                -gencode arch=compute_50,code=sm_50 \
                -gencode arch=compute_52,code=sm_52 \
                -gencode arch=compute_53,code=sm_53 \
                -gencode arch=compute_60,code=sm_60 \
                -gencode arch=compute_61,code=sm_61 \
                -gencode arch=compute_61,code=compute_61
# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/aarch64-linux-gnu/hdf5/serial

PYTHON_INCLUDE := /usr/include/python2.7 \
                /usr/lib/python2.7/dist-packages/numpy/core/include \
                /home/ubuntu/.local/lib/python2.7/site-packages/numpy/core/include

PYTHON_LIB := /usr/lib /home/ubuntu/.local/lib

6)Makeを実行する。
まず、クロック周波数を上げるために、jetson_clocks.shを実行する。そして、CPUのコア数「4」を指定してmakeを実行する。

> sudo ../jetson_clocks.sh
> make -j4
CXX .build_release/src/caffe/proto/caffe.pb.cc
CXX src/caffe/blob.cpp
CXX src/caffe/util/signal_handler.cpp
...

7)PycaffeをMakeする。

> make py -j4
CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp

8)動作確認をする。
「make test」とpythonの「import caffe」を用いて動作確認をする。

> make test
> export PYTHONPATH=/home/ubuntu/caffe/python:$PYTHONPATH
> python
>>> import caffe

9)画像分類の動作確認
以下を参考にしてcaffenetを用いて画像分類の動作確認をする。
hirotaka-hachiya.hatenablog.com

なお、モデルのダウンロードは、以下のようにdownload_model_binary.pyスクリプトを用いると便利。

> scripts/download_model_binary.py models/bvlc_reference_caffenet/

SLAMの覚え書き(ORB-SLAM)

ORB-SLAMは、ORB特徴量を用いたVisual SLAMの代表的な手法である。ORB-SLAMの論文を読んでみた。
http://webdiis.unizar.es/~raulmur/MurMontielTardosTRO15.pdf

まず、SLAMの構成要素として重要なplace recognitionにおいては、map to mapよりもアピアランスを用いるimage to imageの方がよいとのこと。
http://webdiis.unizar.es/GRPTR/pubs/2008_Williams_RSS_IDA.pdf

ORB(Oriented FAST and Rotated BREIF)特徴量は、ScaleとRotationにinvariantなバイナリ特徴量である。SIFT特徴量の高速版という位置づけで、BRIEF, FASTとそれらを組み合わせたものである。
https://www.willowgarage.com/sites/default/files/orb_final.pdf

1) FAST detector:
FAST-9を使っている。9は、中心ピクセルとcircular ringの半径ピクセル数(以下の図参照)。FASTのスコアはedgeに高くでる傾向があるので、Harris corner filterを用いて、ソートし、edgeを除去しているとのこと。

これをピラミッド画像のレイヤーごとに行うことにより、スケール不変性に対応。
http://www.edwardrosten.com/work/rosten_2006_machine.pdf

FAST自体の説明は、以下が参考になる。
http://www.vision.cs.chubu.ac.jp/flabresearcharchive/bachelor/B12/Paper/hasegawa.pdf
http://www.kochi-tech.ac.jp/library/ron/2014/13/1150321.pdf

以下は、これらの論文から抜粋。
「高速に特徴点を検出するFeatures from Accelerated Segment Test (FAST)が提案されている.FASTは注目画素を中心とする周囲16画素を参照し,周囲16画素の輝 度が注目画素より明るいまたは暗い画素が連続する場合に注目画素をコーナーとして検 出する.しかし,周囲16画素を全て観測するとコーナーの検出に時間が掛かってしまう ため,FASTでは機械学習により決定木を構築し,その決定木でコーナーを検出する.決 定木を用いることで周囲16画素のうち2~3画素を観測してコーナーを検出するため,リアルタイム処理に適した検出速度が得られる.しかし,FASTでは画像中の自然領域(木 の葉,植え込み等が写り込んでいる領域)のようなテクスチャの複雑な領域からコーナーらしくない点を多く検出してしまい,マッチング等に利用する場合,処理時間に影響する 問題がある.」
f:id:hirotaka_hachiya:20170505104108p:plain

2)BRIEF descriptor:
BRIEFは、パッチ内でランダムに選択した2点x,yの輝度値の大小関係を比較(式5)して、比較回数i分シフト(桁上げ)するこよによりバイナリ列を作る(式6)。
f:id:hirotaka_hachiya:20170504132205p:plain

BRIEFの前にガウシアンフィルターで平滑化する。

3) ORB
BRIEFでは、ランダムに輝度値を比較するピクセルを選んでいたが、ORBでは、「パッチ内であり得る全てのペア候補を列挙し,ビット分散が大きく,かつペア同士の相関が低くなるようなペアを貪欲法で選択して絞り込むことで記述能力の高いバイナリコードを生成している。」
http://www.kochi-tech.ac.jp/library/ron/2014/13/1150321.pdf

BRIEFに、上記のFASTのピラミッド画像対応でスケール不変性を加えている。
また、BRIEFに回転不変性を加えるために、以下の処理を加えている。
f:id:hirotaka_hachiya:20170505184531p:plain
ここで、I(x,y)は、画像パッチ上のピクセルx,yの輝度値で、pqは、モーメントのオーダーを表している。式1M_{pq}は、画像パッチ上の輝度値のx^py^qの重みづけ和に対応する。例えば、M_{00}はパッチ上の輝度値の合計に対応していて、M_{10}は、パッチ上の輝度値のx方向の座標の重み付け和に対応する。この表現を用いることにより、式2のように、画像パッチの輝度値の重心を求めることができる。さらに、式3のようにatan2を用いることにより、パッチの原点を中心とする重心の角度を求めることができる。
f:id:hirotaka_hachiya:20170505223554p:plain
このように求めた角度を用いて、BRIEFの輝度値の比較を行うペアを回転し、マッチングを行うことにより回転不変性を導入している。
f:id:hirotaka_hachiya:20170505224419p:plain

ORB-SLAMでは、このORB特徴量を用いて、tracking, local mappingおよびloop closingを下記の3つのスレッドを回して実gンしている。
f:id:hirotaka_hachiya:20170506105754p:plain