Fully Convolutional Networks for Semantic Segmentationのcaffe実装を試す
概要
Fully Convolutional Networks for Semantic Segmentation (PDF)のcaffe実装を動かしてみる。 モデルは学習データとstrideの組み合わせによって幾つか公開されている。
このうち、今回はFCN-8s PASCAL-Contextを試す。 pascal-contextでトレーニングされたモデルは59のオブジェクトと1つの背景、計60クラスに分類される。
環境
- ubuntu 14.04.3 LTS
caffeのインストール
本家がマージしていない幾つかのPRをマージしたブランチを使う必要があるとのことで、cloneしてくる。
git clone git@github.com:longjon/caffe.git
caffeの通常のインストール手順の通りに必要なパッケージを入れる。
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler sudo apt-get install --no-install-recommends libboost-all-dev sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
makeする準備を行う。
cd caffe cp Makefile.config.example Makefile.config
cudaをセットアップ済みの環境だけど、make中に面倒くさそうなエラーが出たので今回はcpuオンリーでビルドとする。
8c8 < # CPU_ONLY := 1 --- > CPU_ONLY := 1
手順通りビルドしてテストする。
make all make test make runtest
pycaffeのビルド。numpyなど、別途aptで入れる必要があるパッケージがあるかもしれない。
make pycaffe sudo pip install -r python/requirements.txt
import caffe
できるようにするためにpycaffeにパスを通す。
export PYTHONPATH=~/src/caffe/python
PASCAL datasetのダウンロード
いたるところでリンク切れになっていたので、これもいずれアクセスできなくなるかも。
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2010/VOCtrainval_03-May-2010.tar tar xvf VOCtrainval_03-May-2010.tar
FCN-8s PASCAL-Contextのインストール
必要そうなパッケージを適当に入れていく。過不足があるかも。
sudo pip install numpy sudo apt-get install gfortran sudo pip install scipy sudo pip install scikit-image
numpyとcaffeが競合するらしいのでモジュール名を変更する。
aftfile="caffe_io" for file in `find . -name "*.py"`; do; cat $file | sed -e "s/import [\w\.]*io/import $aftfile/g" | sed -e "s/caffe\.io/caffe\.$aftfile/g" > $file".tmp";mv $file".tmp" $file; done mv "caffe/io.py" "caffe/"$aftfile".py"
eval.py
はFCN-32s PASCAL-Context
から持ってくる。
wget https://gist.github.com/shelhamer/80667189b218ad570e82/raw/077494f215421b3d9383e1b1a3d75377344b1744/eval.py
モデルと.prototxtはFCN-8s PASCAL-Context
から持ってくる。
wget https://gist.github.com/shelhamer/91eece041c19ff8968ee/raw/829ca42202f21c884c13953dd0f1d484593f1b27/deploy.prototxt wget http://dl.caffe.berkeleyvision.org/fcn-8s-pascalcontext.caffemodel
実行
eval.py
をFCN-8s PASCAL-Context
用に書き換えて、ついでに結果も出力するように変更する。
7c7 < im = Image.open('pascal/VOC2010/JPEGImages/2007_000129.jpg') --- > im = Image.open('VOCdevkit/VOC2010/JPEGImages/2007_000129.jpg') 14c14 < net = caffe.Net('deploy.prototxt', 'fcn-32s-pascalcontext.caffemodel', caffe.TEST) --- > net = caffe.Net('deploy.prototxt', 'fcn-8s-pascalcontext.caffemodel', caffe.TEST) 20c20,28 < out = net.blobs['score'].data[0].argmax(axis=0) \ ファイル末尾に改行がありません --- > out = net.blobs['score'].data[0].argmax(axis=0) > # save prediction > np.save('out.npy', out) > > # save as image > palette_base = [i for i in xrange(0, 256, 255 / 3)] > palette = [(palette_base[i], palette_base[j] , palette_base[k]) for i in xrange(4) for j in xrange(4) for k in xrange(4)] > colors = numpy.array(palette, dtype=numpy.uint8)[out] > Image.fromarray(colors).save('out.png', 'PNG')
実行する。
python eval.py
実行が終わると、out.npy
とout.jpg
を出力する。
out.npy
を確認してみると、だいたいbicycle(2) = 青
、person(15) = 水色
、building(25) = 緑
、ground(37) = 茶色
、wall(56) = オレンジ
で構成されていて、結果は良さそう。