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) = オレンジ
で構成されていて、結果は良さそう。
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をダウンロードしてくる。
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
のパスを入れる。
あとはメインのAndroidモジュールの方に、モジュール化したv7 appcompat libraryを依存関係に追加する。
自分の環境ではこれだけで動いた……と思うけど、他にも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.properties
のtarget=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
この方法はちょっとイケてなさを感じるので、いい方法があったら教えてください。