ホームページはここ

デモの実行まで

CUDAをinstall

$ sudo dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda

cuDNN ver.4 を使用

$ tar xvzf cudnn-7.0-linux-x64-v4.0-prod.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/* /usr/local/cuda/lib64/
$ git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git

cython module のコンパイル

$ cd py-faster-rcnn/lib
$ make

「ここで

  File "setup.py", line 10, in <module>
    from setuptools import setup
ImportError: No module named setuptools

のようなエラーが出るときは、

$ pushd ~/Downloads
$ sudo apt-get install curl
$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ sudo python get-pip.py 
$ pip install --upgrade pip

などDeep Learning関係も参考に色々実行し、最終的にpipのバージョンが8程度に上がればOK

$ pip -V
pip 8.1.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)

setuptools などを install

$ sudo pip install --upgrade pip
$ sudo pip install --upgrade setuptools
$ sudo pip install numpy
$ sudo pip install h5py
$ sudo pip install --upgrade cython

py-faster-rcnn/lib に戻ってmake

$ popd
$ make

改造caffeのコンパイル

$ cd ../caffe-fast-rcnn
$ cp Makefile.config.example Makefile.config

Makefile.configを修正

USE_CUDNN := 1
CUSTOM_CXX := g++-4.6
WITH_PYTHON_LAYER := 1

src/caffe/test/test_smooth_L1_loss_layer.cpp の11行目をコメントアウト

//#include "caffe/vision_layers.hpp"
$ make clean
$ make -B
$ make test -B
$ make runtest

pycaffe をmakeする

$ sudo apt-get install python-dev python-pip python-numpy python-skimage gfortran
$ sudo pip install -r ~/caffe/python/requirements.txt
$ make pycaffe

caffemodelをdownload

$ cd ..
$ ./data/scripts/fetch_faster_rcnn_models.sh

デモを実行

$ ./tools/demo.py

「 この時エラーが出るようなら、

$ sudo pip install easydict
$ sudo apt-get install python-opencv

環境変数(もしかしたら必要?)

# for Caffe
export LD_LIBRARY_PATH=/usr/local/cuda/lib64
export PATH=/usr/local/cuda/bin:$PATH
export CUDA_PATH=/usr/local/cuda

# for pycaffe
export PYTHONPATH=~/caffe/python/

training

$ ./data/scripts/fetch_imagenet_models.sh

訓練データ PASCAL VOC 2007 をdownload

$ cd 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
$ mv VOCdevkit VOC2007
$ ln -s VOC2007 VOCdevkit2007
$ cd ..

「PASCAL VOC 2012 のダウンロードは

$ cd data
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCdevkit_18-May-2011.tar
$ tar xvf VOCtrainval_11-May-2012.tar
$ tar xvf VOCdevkit_18-May-2011.tar
$ mv VOCdevkit VOC2012
$ ln -s VOC2012 VOCdevkit2012
$ cd ..

おそらく data/VOCdevkit2012/VOC2012/ImageSets/Main/test.txt がないはず。 ⇒trainval.txt 以外として作る。

$ ls data/VOCdevkit2012/VOC2012/JPEGImages | sed -e 's/\.jpg//' > data/VOCdevkit2012/VOC2012/ImageSets/Main/all.txt
$ comm -13 data/VOCdevkit2012/VOC2012/ImageSets/Main/trainval.txt  data/VOCdevkit2012/VOC2012/ImageSets/Main/all.txt > data/VOCdevkit2012/VOC2012/ImageSets/Main/test.txt

画像のを確認すると、

$ ls data/VOCdevkit2012/VOC2012/JPEGImages | wc
  17125   17125  274000
$ cat data/VOCdevkit2012/VOC2012/ImageSets/Main/trainval.txt | wc
  11540   11540  138480
$ cat data/VOCdevkit2012/VOC2012/ImageSets/Main/test.txt | wc
   5585    5585   67020

正式には、 http://host.robots.ox.ac.uk:8080 からVOC2012test.tarをダウンロード(ユーザ登録などが必要で、そこそこ面倒)

$ mkdir tmp
$ tar xvf VOC2012test.tar -C tmp
$ cp -rp tmp/VOCdevkit/VOC2012/* data/VOCdevkit2012/VOC2012/
$ rm -rf ./tmp

「COCO のダウンロードはここからで、具体的には、

$ cd data
$ wget http://msvocds.blob.core.windows.net/coco2014/train2014.zip
$ wget http://msvocds.blob.core.windows.net/coco2014/val2014.zip
$ wget http://msvocds.blob.core.windows.net/coco2014/test2014.zip
$ wget -O zipfile.py 'http://www.cs.gunma-u.ac.jp/~nagai/wiki/index-write.php?plugin=attach&pcmd=open&file=zipfile.py&refer=py-faster-rcnn%20%B3%D0%A4%A8%BD%F1%A4%AD'
$ python zipfile.py -e train2014.zip COCO2014/images/
$ python zipfile.py -e val2014.zip   COCO2014/images/
$ python zipfile.py -e test2014.zip  COCO2014/images/
$ ln -s COCO2014 coco
$ wget http://msvocds.blob.core.windows.net/annotations-1-0-3/instances_train-val2014.zip
$ wget http://msvocds.blob.core.windows.net/annotations-1-0-3/person_keypoints_train+val5k2014.zip
$ wget http://msvocds.blob.core.windows.net/annotations-1-0-3/captions_train-val2014.zip
$ wget http://msvocds.blob.core.windows.net/annotations-1-0-4/image_info_test2014.zip
$ python zipfile.py -e instances_train-val2014.zip ./coco/
$ python zipfile.py -e person_keypoints_train+val5k2014.zip ./coco/
$ python zipfile.py -e image_info_test2014.zip ./coco/
$ python zipfile.py -e captions_train-val2014.zip ./coco/
$ wget http://www.cs.berkeley.edu/~rbg/faster-rcnn-data/instances_minival2014.json.zip
$ wget http://www.cs.berkeley.edu/~rbg/faster-rcnn-data/instances_valminusminival2014.json.zip 
$ unzip instances_minival2014.json.zip
$ unzip instances_valminusminival2014.json.zip
$ mv instances_minival2014.json instances_valminusminival2014.json ./coco/annotations/
$ cd ..

実際に必要なのは instances_train-val2014.zip だけかも。

この時点での data/coco/ の中の構造は

coco/
coco/annotations/
coco/annotations/captions_train2014.json
coco/annotations/captions_val2014.json
coco/annotations/image_info_test2014.json
coco/annotations/instances_train2014.json
coco/annotations/instances_val2014.json
coco/annotations/person_keypoints_train2014.json
coco/annotations/person_keypoints_val5k2014.json
coco/images/
coco/images/train2014/
coco/images/test2014/
coco/images/val2014/

各zipが含むファイルは、

$ python zipfile.py -l instances_train-val2014.zip 
File Name                                             Modified             Size
annotations/instances_train2014.json           2015-07-22 20:51:46    371051092
annotations/instances_val2014.json             2015-07-22 20:53:24    179537701
$ python zipfile.py -l person_keypoints_train+val5k2014.zip
File Name                                             Modified             Size
annotations/                                   2016-07-20 17:32:06            0
annotations/person_keypoints_train2014.json    2016-07-20 17:54:52    165731312
annotations/person_keypoints_val5k2014.json    2016-07-20 17:30:24      9672033
$ python zipfile.py -l image_info_test2014.zip
File Name                                             Modified             Size
annotations/image_info_test2014.json           2015-11-11 02:11:40      7859905
$ python zipfile.py -l captions_train-val2014.zip
File Name                                             Modified             Size
annotations/captions_train2014.json            2015-07-22 20:45:36     65359682
annotations/captions_val2014.json              2015-07-22 20:45:44     31887262

尚、

http://www.cs.berkeley.edu/~rbg/faster-rcnn-data/instances_minival2014.json.zip に含まれる5000枚の画像が 'minival' で、

http://www.cs.berkeley.edu/~rbg/faster-rcnn-data/instances_valminusminival2014.json.zip に残りの35504枚の画像あり。(data/README.md を参照)

(これらのjsonファイルは画像そのものは含まない。ファイル名、元々のURL、解像度などのテキスト情報のみ)

画像はすべて val2014.zip に含まれる。(全部で40504枚)

msvocds.blob.core.windows.net からダウンロードした zip ファイルは特殊なフォーマット(?)なので特殊な解凍の仕方をしている。

zipfile.py は https://svn.python.org/projects/python/trunk/Lib/zipfile.py のものを修正して使用。

実際にはもっといい方法があるだろう。 」

end2end と alt opt の2種類のプログラムあり。 end2end の方が良さげ。論文は alt opt (4-step alternating training)

$ ./experiments/scripts/faster_rcnn_end2end.sh 0 ZF pascal_voc
$ ./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc

引数は GPU_ID NET DATASET EXTRA_ARGS

  • GPU_ID は0
  • NET は {ZF, VGG_CNN_M_1024, VGG16}から選べるが、ZF以外は学習できていない←気のせいだった。学習速度が遅いだけ。
  • DATASET は { pascal_voc, coco } から選べる。coco+ZFの組み合わせはダメ。models/coco/ZF/faster_rcnn_end2end/solver.prototxtがないから

下記のような shell script を用意すると便利。

$ ./run.sh

run.sh

#!/bin/bash

GPU=0

NET=ZF
#NET=VGG_CNN_M_1024
#NET=VGG16

DATASET=pascal_voc
#DATASET=pascal_voc_2012
#DATASET=coco

HOST=`hostname`

NO=1

LOG=log.faster_rcnn_end2end.$NET.$DATASET.$HOST.$NO
OUTPUT_DIR=output.faster_rcnn_end2end.$NET.$DATASET.$HOST.$NO

(time ./experiments/scripts/faster_rcnn_end2end.sh $GPU $NET $DATASET) 2>&1 | tee $LOG
mv output $OUTPUT_DIR

PASCAL VOC 2012 を実行できるように experiments/scripts/faster_rcnn_end2end.sh のcase文に下記を追加

   32	  pascal_voc_2012)
   33	    TRAIN_IMDB="voc_2012_trainval"
   34	    TEST_IMDB="voc_2012_test"
   35	    PT_DIR="pascal_voc"
   36	    ITERS=70000
   37	    ;;

trouble shooting

caffe/vision_layers.hpp がないとのエラー

make testで出る。

src/caffe/test/test_smooth_L1_loss_layer.cpp:11:35: fatal error: caffe/vision_layers.hpp: No such file or directory

src/caffe/test/test_smooth_L1_loss_layer.cpp の該当行をコメントアウト

//#include "caffe/vision_layers.hpp"

Cublasが使えないとのエラー

make runtest で苦しむことがある。

Cannot create Cublas handle. Cublas won't be available.
Cannot create Curand generator. Curand won't be available.

CUDA, cuDNN ver.4 をもう一度ダメ押しのinstallをして再起動。 これで回避。

$ sudo dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
$ tar xvzf cudnn-7.0-linux-x64-v4.0-prod.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/* /usr/local/cuda/lib64/
$ sudo shutdown -r now

ImportError: No module named _caffe

make pycaffe を忘れている

$ cd py-faster-rcnn/caffe-fast-rcnn
$ make pycaffe

改造caffe のmake時に .build_release/lib/libcaffe.so: undefined reference to cv::imread(cv::String const&, int)'

Makefileに下記を追加

408:LIBRARIES += opencv_imgcodecs

デバッグ中の注意

デバッグ中は時々 data/cache/*を削除すると良い(データに関する部分を修正した場合は特に)

同様に、data/*/annotations_cache/annots.pklも削除

$ find ./data -follow -name "*.pkl" 

で確認

$ find ./data -follow -name "*.pkl" -exec rm {} \;

で削除

training の反復回数、使用するデータベースの詳細設定は experiments/scripts/faster_rcnn_end2end.sh

mean の値、入力画像の大きさ、反転するかどうか、などの設定は lib/fast_rcnn/config.py

ZF, VGG16, VGG_CNN_M_1024 などのネットワークの切り替え、データベースの大まかな選択は run.sh

anchorの数を変えたいとき(こっちの方がお薦め)

model/*/*/faster_rcnn_end2end/{train,test}.prototxt の一部を修正

#========= RoI Proposal ============

layer {
  name: 'proposal'
  type: 'Python'
  bottom: 'rpn_cls_prob_reshape'
  bottom: 'rpn_bbox_pred'
  bottom: 'im_info'
  top: 'rois'
  python_param {
    module: 'rpn.proposal_layer'
    layer: 'ProposalLayer'
    param_str: "'feat_stride': 16"  ←ここ
  }
}

param_str: の項目に python/tuple を追加する(train.prototxt は2ヶ所)

   param_str: "'feat_stride': 16 \n'scales': !!python/tuple [4, 8, 16, 32]"

さらに、num_output: (2ヶ所) と dim: (1ヶ所)もそれに伴って適宜修正

$ grep -C4 tuple  models/*/*/faster_rcnn_end2end/{train,test}.prototxt

の結果が参考になるはず。

ここで設定すると、 lib/rpn/proposal_layer.py や lib/rpn/anchor_target_layer.py で下記のようなことができる

       # parse the layer parameter string, which must be valid YAML
       layer_params = yaml.load(self.param_str_)
       
       self._feat_stride = layer_params['feat_stride']
       anchor_scales = layer_params.get('scales', (8, 16, 32))

ここから、scalesのデフォルト値が (8, 16, 32)ということも分かる。

ちなみに、 lib/rpn/generate_anchors.py の37, 38行目にも次のように設定されている

def generate_anchors(base_size=16, ratios=[0.5, 1, 2],
                     scales=2**np.arange(3, 6)):

anchorの数を変えたいとき

9個⇒3個に変える

lib/rpn/generate_anchors.py の37行目

def generate_anchors(base_size=16, ratios=[0.5, 1, 2],

を次のように修正

def generate_anchors(base_size=16, ratios=[1],
$ mkdir models/pascal_voc/ZF_an3
$ mkdir models/pascal_voc/ZF_an3/faster_rcnn_end2end
$ cp models/pascal_voc/ZF/faster_rcnn_end2end/*  models/pascal_voc/ZF_an3/faster_rcnn_end2end/

models/pascal_voc/ZF_an3/faster_rcnn_end2end/train.prototxt を修正

241:    num_output: 6   # 2(bg/fg) * 3(anchors)
255:    num_output: 12   # 4 * 3(anchors)
325:    reshape_param { shape { dim: 0 dim: 6 dim: -1 dim: 0 } }

models/pascal_voc/ZF_an3/faster_rcnn_end2end/test.prototxt を修正

227:    num_output: 6   # 2(bg/fg) * 3(anchors)
239:    num_output: 12   # 4 * 3(anchors)
266:    reshape_param { shape { dim: 0 dim: 6 dim: -1 dim: 0 } }

rpn_cls_prob_reshape の出力の2軸目を 2xアンカー数にする。

参考)https://github.com/rbgirshick/py-faster-rcnn/issues/161

models/pascal_voc/ZF_an3/faster_rcnn_end2end/solver.prototxt を修正

1:train_net: "models/pascal_voc/ZF_an3/faster_rcnn_end2end/train.prototxt"
$ cp data/imagenet_models/ZF.v2.caffemodel data/imagenet_models/ZF_an3.v2.caffemodel 

run.sh に下記を追加

8:   NET=ZF_an3
$ ./run.sh

デバッグ中の注意⇒#m4d938ba

グレースケール画像での学習 (こっちの方がお薦め)

$ cd py-faster-rcnn
$ wget -O for-grayscale.tar.gz 'http://www.cs.gunma-u.ac.jp/~nagai/wiki/index-write.php?plugin=attach&pcmd=open&file=for-grayscale.tar.gz&refer=py-faster-rcnn%20%B3%D0%A4%A8%BD%F1%A4%AD'
$ tar xvzf for-grayscale.tar.gz

すると、下記のファイルが追加される

tools/create-pretrained-model-gray.py
data/imagenet_models/VGG16_deploy.prototxt
data/imagenet_models/VGG16_gray_deploy.prototxt
data/imagenet_models/VGG16_gray_solver.prototxt
data/imagenet_models/VGG_CNN_M_1024_deploy.prototxt
data/imagenet_models/VGG_CNN_M_1024_gray_deploy.prototxt
data/imagenet_models/VGG_CNN_M_1024_gray_solver.prototxt
data/imagenet_models/ZF_deploy.prototxt
data/imagenet_models/ZF_gray_deploy.prototxt
data/imagenet_models/ZF_gray_solver.prototxt
$ python ./tools/create-pretrained-model-gray.py

すると、下記のファイルが生成される

data/imagenet_models/VGG16_gray.v2.caffemodel
data/imagenet_models/VGG_CNN_M_1024_gray.v2.caffemodel
data/imagenet_models/ZF_gray.v2.caffemodel

lib/fast_rcnn/config.py, lib/fast_rcnn/test.py, lib/utils/blob.py, lib/roi_data_layer/minibatch.py, lib/roi_data_layer/layer.py, run.sh を修正

experiments/scripts/faster_rcnn_end2end.sh はそのまま

$ mkdir models/pascal_voc/ZF_gray
$ mkdir models/pascal_voc/ZF_gray/faster_rcnn_end2end
$ cp -p models/pascal_voc/ZF/faster_rcnn_end2end/* models/pascal_voc/ZF_gray/faster_rcnn_end2end/

models/pascal_voc/ZF_gray/faster_rcnn_end2end/solver.prototxt を修正

1:train_net: "models/pascal_voc/ZF_gray/faster_rcnn_end2end/train.prototxt"
24:snapshot_prefix: "zf_gray_faster_rcnn"

models/pascal_voc/ZF_gray/faster_rcnn_end2end/test.prototxt を修正

4:  input_shape {
5:    dim: 1
6:    dim: 1   ←修正
7:    dim: 224
8:    dim: 224
$ time ./run.sh

で実行

要は、data/imageget_models/以下の pretrained caffemodel から グレースケール用の pretrained caffemodel を作り、 それを初期値として training

グレースケール画像での学習

まずはグレースケールデータを作成

$ cd data
$ mkdir VOC2007-gray
$ mkdir VOC2007-gray/VOC2007
$ cp -rp VOC2007/VOC2007/Annotations VOC2007-gray/VOC2007/
$ cp -rp VOC2007/VOC2007/ImageSets   VOC2007-gray/VOC2007/
$ cp -rp VOC2007/results             VOC2007-gray/
$ mkdir VOC2007-gray/VOC2007/JPEGImages
$ for f in VOC2007/VOC2007/JPEGImages/*.jpg; do g=`echo $f | sed -e 's/VOC2007/VOC2007-gray/'`; convert $f -colorspace gray $g; done
$ ln -s VOC2007-gray VOCdevkit2007
$ cd ..

lib/fast_rcnn/config.py を修正

181:__C.PIXEL_MEANS = np.array([[[10.8]]])

lib/fast_rcnn/test.py を修正

48:          im = cv2.resize(im_orig, None, None, fx=im_scale, fy=im_scale,
49:                          interpolation=cv2.INTER_LINEAR)
             im = im.reshape(im.shape + (1,))    ←追加
50:          im_scale_factors.append(im_scale)
51:          processed_ims.append(im)

254:              box_proposals = roidb[i]['boxes'][roidb[i]['gt_classes'] == 0]
255:  
256:         im = cv2.imread(imdb.image_path_at(i), cv2.IMREAD_GRAYSCALE)  ←修正
             im = im.reshape(im.shape + (1,))  ←追加
257:          _t['im_detect'].tic()
258:         scores, boxes = im_detect(net, im, box_proposals)

lib/utils/blob.py を修正

18:      max_shape = np.array([im.shape for im in ims]).max(axis=0)
19:      num_images = len(ims)
20:      blob = np.zeros((num_images, max_shape[0], max_shape[1], 1),  ←修正
21:                      dtype=np.float32)
22:      for i in xrange(num_images):

lib/roi_data_layer/minibatch.py を修正

135:     im_scales = []
136:     for i in xrange(num_images):
137:         im = cv2.imread(roidb[i]['image'], cv2.IMREAD_GRAYSCALE)  ←修正
             im = im.reshape(im.shape + (1,))  ←追加
138:         if roidb[i]['flipped']:
139:             im = im[:, ::-1, :]

141:         im, im_scale = prep_im_for_blob(im, cfg.PIXEL_MEANS, target_size,
142:                                         cfg.TRAIN.MAX_SIZE)
             im = im.reshape(im.shape + (1,))    ←追加
143:         im_scales.append(im_scale)
144:         processed_ims.append(im)

lib/roi_data_layer/layer.py を修正

93:          # data blob: holds a batch of N images, each with 3 channels
94:          idx = 0
95:          top[idx].reshape(cfg.TRAIN.IMS_PER_BATCH, 1,   ←修正
96:              max(cfg.TRAIN.SCALES), cfg.TRAIN.MAX_SIZE)
97:          self._name_to_top_map['data'] = idx

experiments/scripts/faster_rcnn_end2end.sh を修正

51:  time ./tools/train_net.py --gpu ${GPU_ID} \
52:    --solver models/${PT_DIR}/${NET}/faster_rcnn_end2end/solver.prototxt \
53:    --weights data/imagenet_models/${NET}.v2.caffemodel \  ←削除
54:    --imdb ${TRAIN_IMDB} \
55:    --iters ${ITERS} \

run.sh を修正

8:NET=ZF_gray  ←追加

要は、学習済みcaffemodelを使わない代わりに初期値をガウス分布で設定

$ cp data/imagenet_models/ZF.v2.caffemodel data/imagenet_models/ZF_gray.v2.caffemodel 

が、結局これ↑は使っていない

$ mkdir models/pascal_voc/ZF_gray
$ mkdir models/pascal_voc/ZF_gray/faster_rcnn_end2end
$ cp -p models/pascal_voc/ZF/faster_rcnn_end2end/* models/pascal_voc/ZF_gray/faster_rcnn_end2end/

models/pascal_voc/ZF_gray/faster_rcnn_end2end/solver.prototxt

1:train_net: "models/pascal_voc/ZF_gray/faster_rcnn_end2end/train.prototxt"

models/pascal_voc/ZF_gray/faster_rcnn_end2end/train.prototxt

27:  	      pad: 3
28:  	      stride: 2
 	      weight_filler { type: "gaussian" std: 0.01 }
 	      bias_filler { type: "constant" value: 0 }
29:      }
30:  }

72:          pad: 2
73:          stride: 2
             weight_filler { type: "gaussian" std: 0.01 }
             bias_filler { type: "constant" value: 0 }
74:      }
75:  }

117: 		pad: 1
118: 		stride: 1
		weight_filler { type: "gaussian" std: 0.01 }
		bias_filler { type: "constant" value: 0 }
119: 	}
120: }

137: 		pad: 1
138: 		stride: 1
		weight_filler { type: "gaussian" std: 0.01 }
		bias_filler { type: "constant" value: 0 }
139: 	}
140: }

157: 		pad: 1
158: 		stride: 1
		weight_filler { type: "gaussian" std: 0.01 }
		bias_filler { type: "constant" value: 0 }
159: 	}
160: }

389:    inner_product_param {
390:      num_output: 4096
          weight_filler { type: "gaussian" std: 0.01 }
          bias_filler { type: "constant" value: 0 }
391:    }
392:  }

416:    inner_product_param {
417:      num_output: 4096
          weight_filler { type: "gaussian" std: 0.01 }
          bias_filler { type: "constant" value: 0 }
418:    }
419:  }

models/pascal_voc/ZF_gray/faster_rcnn_end2end/test.prototxt

4:  input_shape {
5:    dim: 1
6:    dim: 1   ←修正
7:    dim: 224
8:    dim: 224
$ time ./run.sh

で実行

学習済みcaffemodelが使えないので収束には時間がかかる?

デバッグ中の注意⇒#m4d938ba

独自のデータでの学習

ここでは、ocrなるキーワードの独自データを追加する。

lib/datasets/coco.py もしくは lib/datasets/pascal_voc.py を元に lib/datasets/ocr.py を作る。(この例では pascal_voc.py から ocr.py を作った)

まず、次のようなデータを用意する。(2007はなくても良かった)

今回の実験用には、hellcat1:~/font-img/extract-letters2A/にて、 ./extract-letters.sh のあと、./gen-html-kokoro-gray2.pl を実行。

その後、~/font-img/create-dataset-letter/にて、 ./create.pl でデータベース生成。./stats.pl で確認。

data/OCRdata をtarで固めて grumman1, 2, 3へコピー。~/caffe-prog6/py-faster-rcnn-ocr/dataからリンクを張った

data/OCRdata/results/set2/2007/Main/dummy
data/OCRdata/set2/Annotations/*.xml
data/OCRdata/set2/ImageSets/Main/{trainval,test}.txt
data/OCRdata/set2/PNGImages/*.png
$ cp lib/datasets/pascal_voc.py lib/datasets/ocr.py

lib/datasets/ocr.py

22: class ocr(imdb):
23:     def __init__(self, image_set, setname, year, devkit_path=None):
24:         imdb.__init__(self, image_set + '_' + setname)
25:         self._year = year
            self._setname = setname
26:         self._image_set = image_set
27:         self._devkit_path = self._get_default_path() if devkit_path is None \
28:                             else devkit_path
            ## self._data_path = 'data/OCRdata/set1'
29:         self._data_path = os.path.join(self._devkit_path, self._setname)
30:         self._classes = ('__background__', # always index 0
31:                          'e381b0', 'e38186', 'e381ab', 'e5b1b1', 'e381a1',
32:                          'e3808d', 'e38182', 'e3828b', 'e6b097', 'e697a5',
33:                          'e8a68b', 'e4b88a', 'e587ba', 'e3818f', 'e381bb',
34:                          'e381a8', 'e8a18c', 'e38082', 'e3828f', 'e69982')
35:         self._class_to_ind = dict(zip(self.classes, xrange(self.num_classes)))
36:         self._image_ext = '.png'
37:         self._image_index = self._load_image_set_index()

66:         image_path = os.path.join(self._data_path, 'PNGImages',
67:                                   index + self._image_ext)

91:         return os.path.join(cfg.DATA_DIR, 'OCRdata') 

98:         cache_file = os.path.join(self.cache_path, 'ocr_' + self.name + '_gt_roidb.pkl')

231:     def _get_voc_results_file_template(self):
232:         # VOCdevkit/results/VOC2007/Main/<comp_id>_det_test_aeroplane.txt
233:         filename = self._get_comp_id() + '_det_' + self._image_set + '_{:s}.txt'
234:         path = os.path.join(
235:             self._devkit_path,
236:             'results',
                 self._setname,
237:             self._year,
238:             'Main',

260:        def _do_python_eval(self, output_dir = 'output'):
261:            annopath = os.path.join(
262:                self._devkit_path,
263:                self._setname,
264:                'Annotations',
265:                '{:s}.xml')
266:            imagesetfile = os.path.join(
267:                self._devkit_path,
268:                self._setname,
269:                'ImageSets',

lib/datasets/factory.pyに追加

14: from datasets.ocr import ocr

    # for OCR
    for setname in ['set1', 'set2', 'set3']:
        for split in ['trainval', 'test']:
            name = 'ocr_{}_{}'.format(setname, split)
            __sets[name] = (lambda split=split, setname=setname: ocr(split, setname, '2007'))

experiments/scripts/faster_rcnn_end2end.sh に追加

47:   ocr)
48:    TRAIN_IMDB="ocr_set2_trainval"
49:    TEST_IMDB="ocr_set2_test"
50:    PT_DIR="ocr"
51:    ITERS=70000
52:    ;;

run.sh に追加

10:DATASET=ocr
$ cp -rp models/pascal_voc models/ocr

models/ocr/solver.prototxt 1:train_net: "models/pascal_voc/ocr/faster_rcnn_end2end/train.prototxt"

lib/fast_rcnn/config.py

61:__C.TRAIN.USE_FLIPPED = False
181:__C.PIXEL_MEANS = np.array([[[102.9801, 115.9465, 122.7717]]]) ←場合によっては修正

experiments/cfgs/faster_rcnn_end2end.yml も必要に応じて修正

$ time ./run.sh

でいけるはず。

cv2.imread()がデフォルトでRGBの3チャンネルに変換して読み込むので、 どんなデータであってもネットワーク回りを修正する必要はない。

デバッグ中の注意⇒#m4d938ba


添付ファイル: filefor-grayscale.tar.gz 98件 [詳細] filezipfile.py 112件 [詳細] filepy-faster-rcnn.tar.gz 59件 [詳細] filecaffe-fast-rcnn.tar.gz 72件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-01-25 (水) 18:54:48 (63d)