FCN(Fully Convolutional Network)のCaffe実装でセマンティック・セグメンテーション(Semantic Segmentation)のデモを試してみました。
セマンティック・セグメンテーション
PASCAL VOC2012データセットには、以下のようなイメージとラベルのペアが格納されています。

イメージ

ラベル
後述の方法により準備したレーニング済みモデル(fcn8s-heavy-pascal.caffemodel)にイメージを入力して、セマンティック・セグメンテーションを行った例が下の図です。
前回の記事で作成したモデル(FCN-AlexNet)によってセマンティック・セグメンテーションを行った下の図と比較すると、より細かくセグメンテーションできています。
準備
予め作成しておいたgithubディレクトリに移動して、GitHubのリポジトリ(https://github.com/shelhamer/fcn.berkeleyvision.org)をcloneします。
$ cd ~/github $ git clone https://github.com/shelhamer/fcn.berkeleyvision.org
fcn.berkeleyvision.org/voc-fcn8sディレクトリにトレーニング済みモデル(fcn8s-heavy-pascal.caffemodel)をダウンロードするため、以下のコマンドを実行します。
$ cd ~/github/fcn.berkeleyvision.org/voc-fcn8s $ wget -i caffemodel-url
他にも、voc-fcn8sと同様に、VGG16をベースとしたvoc-fcn16s・voc-fcn32sや、AlexNetをベースとしたvoc-fcn-alexnetがありますが、voc-fcn8s以外は、deploy.prototxtが準備されていないので、train.prototxtやval.prototxtを参照して、deploy.prototxtを準備する必要があります。
GitHubのREADME.mdによると、FCN用のCaffeは、PR#3613とPR#3570を適用したCaffeを準備する必要があります。現時点のBVLC Caffeのmasterブランチは、上記PRが既に適用されているようです。
最近ビルドし、BVLC Caffeを改良したSingle Shot MultiBox Detector用のCaffe(caffe-ssd)を使用するように、環境変数PYTHONPATHを設定すると、エラーなく動作しました。なお、NVIDIAフォークのCaffe(caffe-nv 0.15.13)だとエラーが発生しました。
$ export PYTHONPATH=/home/sora/github/caffe/python $ python -c "import caffe; print(caffe.__version__)" 1.0.0-rc3
ちなみに、caffe-ssdのバージョンは、上のように1.0.0-rc3となっています。
cloneしたfcn.berkeleyvision.orgディレクトリの中に、推論を行うためのスクリプトinfer.pyがあるのですが、なぜか結果の保存も、画像出力も行っていないので、こちらの記事(https://devblogs.nvidia.com/parallelforall/ai-cat-chaser-jetson-tx1-caffe/)からリンクされている https://github.com/rgbond/chasing-cats のfcnディレクトリからinfer.pyをダウンロードして少し改造し、GPU版のinfer2_gpu.pyとCPU版のinfer2_cpu.pyを作成しました。
セマンティック・セグメンテーションを行うため、以下のコマンドを実行します。
$ python infer2_gpu.py 2011_003019.jpg ... 0.290446 0.18697 0.184922
GPU版における2回目以降の推論時間は、約0.2秒です。
また、CPU版における2回目以降の推論時間は、約26~27秒です。
$ python infer2_cpu.py 2011_003019.jpg ... 28.918379 26.853767 25.9701
まとめ
FCN(Fully Convolutional Network)のCaffe実装でセマンティック・セグメンテーション(Semantic Segmentation)のデモを試してみました。