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
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 ~~~~~~~~