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) = オレンジで構成されていて、結果は良さそう。

intellijでv7 appcompatを使う

最近はintellij + scala + sbtでandroidアプリを書いたりしているのですがハマるところ多すぎじゃね?という感じです。

で、タイトルの通りandroid support libraryのv7 appcompat libraryをintellij ideaで使う方法なんですが、scalaとかsbtとかあんまり関係ない話です。

試した環境

手順

v7 appcompat libraryのインストール

Android SDK ManagerでAndroid Support Libraryをダウンロードしてくる。

f:id:akiomik:20150311033143p:plain

v7 appcompat libraryを依存関係に追加

build.sbtに以下のように追加する。

resolvers += "Local android extras" at s"file:///${System.getenv("ANDROID_HOME")}/extras/android/m2repository"

libraryDependencies ++= Seq(
  "com.android.support" % "appcompat-v7" % "21.0.3"
)

v7 appcompat libraryのモジュール化

v7に含まれているリソースを利用するためにこの作業が必要。 同じsupport libraryでも、リソースがないv4などではこの作業は不要。

Fileメニュー > Import Module...を選択し、出てきたダイアログに$ANDROID_HOME/extras/android/support/v7/appcompatのパスを入れる。

f:id:akiomik:20150311033740p:plain

あとはメインのAndroidモジュールの方に、モジュール化したv7 appcompat libraryを依存関係に追加する。

f:id:akiomik:20150311035619p:plain

自分の環境ではこれだけで動いた……と思うけど、他にもproguardの設定とかなんかあるかも。

エラーが出るとき

API Levelに合わせて正しいSDKを設定していないとエラーが出てビルドできません。例えばAndroid 4.4.2のSDK(API Level 19)でAndroid 5.0.1のライブラリ(API Level 21)を利用しようとすると以下のようなエラーが大量に出ました。

Error:(75, -1) android-apt-compiler: [android-support-v7-appcompat] /usr/local/opt/android-sdk/extras/android/support/v7/appcompat/res/values-v21/styles_base.xml:75: error: Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.ActionButton'.

project.propertiestarget=android-**は変えても変えなくても動くっぽいけど、念のため合わせておいたほうが良さそう。

参考

bundlerのプロジェクトでローカルのgemをリポジトリ内に含めて管理する

非公開のgemに依存しているプロジェクトがあって、そのgemの管理方法にちょっと悩んだのでメモ。

最初考えたのは普通にGemfile内でgemへのパスを指定する方法。

gem 'hoge-fuga', '= 1.0.0', path: 'vendor/gems'

これでgemをvendor/gems/hoge-fuga-1.0.0.gemのように配置すればめでたくbundle installできるようになる。 が、bundle isntallすると、vendor/gems/hoge-fuga-1.0.0.gemが消えてしまう。ゴウランガ!

そこでgemをvendor/cache/hoge-fuga-1.0.0.gemに配置して、Gemfileを以下のように編集した。

gem 'hoge-fuga', '~> 1.0.0'

この状態でbundle installすれば、ちゃんとインストールされるし、gemファイルも消えなくなる。

あとは.gitignoreに他のキャシュされてるgemをリポジトリで管理しないように設定すればOK。

vendor/cache
!vendor/cache/hoge-fuga-1.0.0.gem

この方法はちょっとイケてなさを感じるので、いい方法があったら教えてください。