覚え書きブログ

JetsonTX1覚え書き(Faster R-CNN)

Faster R-CNNを動かしてみる。
Faster R-CNNのPython版は以下からダウンロードできるが、CUDA8+CUDNN5.1に対応していないため試行錯誤しながら以下の方法でインストールした。
https://github.com/rbgirshick/py-faster-rcnn#installation-sufficient-for-the-demo

1)py-faster-rcnnのレポジトリをclone

> git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git

2)最新のcaffeをmerge
以下のコメントを参考にした。
https://github.com/rbgirshick/py-faster-rcnn/issues/237

> cd py-faster-rcnn/caffe-fast-rcnn  
> git remote add caffe https://github.com/BVLC/caffe.git  
> git fetch caffe  
> git merge -X theirs caffe/master  

3)Make.configのUSE_CUDNNとWITH_PYTHON_LAYERのコメントを外す

> cp Makefile.config.example Makefile.config
> vi Makefile.config
USE_CUDNN := 1
WITH_PYTHON_LAYER := 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
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

4)python_layer.hppの以下の行をコメントアウト

> vi include/caffe/layers/python_layer.hpp
//self_.attr("phase") = static_cast(this->phase_);

5)make

> make -j4
> make pycaffe

6)libのmake

> cd ../lib
> make

7)学習済みのモデルのダウンロード

> cd ..
> ./data/scripts/fetch_faster_rcnn_models.sh

8)pythonのcv2パッケージをインストール

> sudo apt-get install libopencv4tegra-python

9)pythonのcairoパッケージをインストール

> sudo apt-get install python-gi-cairo

9)pythonのeasydictパッケージをインストール

> pip install easydict

10)demoの実行

> ./tools/demo.py

f:id:hirotaka_hachiya:20170510194710p:plain
f:id:hirotaka_hachiya:20170510194806p:plain
GTX980を搭載したデスクトップPCでは、画像1枚あたり0.2秒で検出処理ができたが、JetsonTX1では、1.5秒程度かかった。
思ったより遅い。。。

さらに、Faster R-CNNの学習をしてみる。
基本的には、下記の著者のgithubを参考にすればよい。
https://github.com/rbgirshick/py-faster-rcnn#installation-sufficient-for-the-demo
ただ、学習中にnumpy関連の以下のエラーがでるため、下記のサイトを参考にして解決した。

  File "/home/hachiya/Works/DeepNet/py-faster-rcnn/tools/../lib/roi_data_layer/minibatch.py", line 100, in _sample_rois
    fg_inds, size=fg_rois_per_this_image, replace=False)
  File "mtrand.pyx", line 1176, in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:18822)
TypeError: 'numpy.float64' object cannot be interpreted as an index

https://github.com/rbgirshick/py-faster-rcnn/issues/481
http://qiita.com/a_hasimoto/items/87778fe2de8fef7abf00

1)まず、Pascal VOC2007のデータをダウンロードし解凍

cd py-faster-rcnn/data
> wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
> wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
> wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
> tar xvf VOCtrainval_06-Nov-2007.tar
> tar xvf VOCtest_06-Nov-2007.tar
> tar xvf VOCdevkit_08-Jun-2007.tar

2)次に、シンボリックリンクを張る

> ln -s VOCdevkit VOCdevkit2007

3)ImageNetで学習済みのVGGのモデルをダウンロードする

> cd ..
> ./data/scripts/fetch_imagenet_models.sh


4)lib/roi_data_layer/minibatch.pyの26行目、lib/datasets/ds_utils.pyの12行目、lib/fast_rcnn/test.pyの129行目、lib/rpn/proposal_target_layer.pyの60行目のnp.roundのfloat型を以下のようにnp.int型に変更する。
Before:

fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)

After:

fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)

5)さらに、lib/roi_data_layer/minibatch.pyの173行目を以下のように変更
Before:

cls = clss[ind]

After:

cls = int(clss[ind])

6)さらに、lib/rpn/proposal_target_layer.pyの125行目を以下のように変更
Before:

cls = clss[ind]

After:

cls = int(clss[ind])

追記:lib/fast_rcnn/train.pyに「import google.protobuf.text_format」を追加する。

7)alternating optimizationを用いた学習をまわす
※Jetson TX1では、snapshot時にメモリエラーが出て、最後まで学習をまわせなかった。。。
以下は、デスクトップPCでの実行結果。

> ./experiments/scripts/faster_rcnn_alt_opt.sh 0 VGG_CNN_M_1024 pascal_voc --set EXP_DIR foobar RNG_SEED 42 TRAIN.SCALES "[400,500,600,700]"

...
Saving cached annotations to /home/hachiya/Works/DeepNet/py-faster-rcnn/data/VOCdevkit2007/annotations_cache/annots.pkl
AP for aeroplane = 0.6542
AP for bicycle = 0.6968
AP for bird = 0.5696
AP for boat = 0.4474
AP for bottle = 0.3407
AP for bus = 0.6699
AP for car = 0.7517
AP for cat = 0.7258
AP for chair = 0.3808
AP for cow = 0.6801
AP for diningtable = 0.6052
AP for dog = 0.6502
AP for horse = 0.7488
AP for motorbike = 0.6454
AP for person = 0.6584
AP for pottedplant = 0.3107
AP for sheep = 0.6062
AP for sofa = 0.5674
AP for train = 0.6903
AP for tvmonitor = 0.6172
Mean AP = 0.6008
~~~~~~~~
Results:
0.654
0.697
0.570
0.447
0.341
0.670
0.752
0.726
0.381
0.680
0.605
0.650
0.749
0.645
0.658
0.311
0.606
0.567
0.690
0.617
0.601
~~~~~~~~