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クラスに分類される。

環境

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が競合するらしいのでモジュール名を変更する。

qiita.com

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.pyFCN-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.pyFCN-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.npyout.jpg を出力する。

入力画像

f:id:akiomik:20160110225027p:plain

out.npyを確認してみると、だいたいbicycle(2) = 青person(15) = 水色building(25) = 緑ground(37) = 茶色wall(56) = オレンジで構成されていて、結果は良さそう。