FCNのCaffe実装でセグメンテーションデモを試してみた


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)のデモを試してみました。