GitHub版DIGITSでセグメンテーションモデルを作成してみた


NVIDIA DIGITS5のリリースが当初予定の12月に行われなかったこともあり、GitHubからクローンした最新のNVIDIA DIGITS (v5.1-dev)でセグメンテーション(segmentation)モデルを作成してみました。

なお、DIGITS4とDIGITS5では、必要なPythonパッケージのバージョンが異なるため、同一Python環境の切り替え運用は出来ません。リポジトリを使ってDIGITSをインストールしている場合、DIGITS5の正式リリースを待つか、Docker上にテスト環境を構築する方が良いと思います。

スポンサーリンク

セグメンテーション

後述の方法により作成したモデルでセグメンテーションを行った例が下の図です。

セグメンテーションでは、下の図の物体検出のようなボックスではなく、ピクセル単位でラベリングを行います。

準備

DIGITS

予め作成しておいたgithubディレクトリに移動して、GitHubのリポジトリ(https://github.com/NVIDIA/DIGITS)をcloneします。

$ cd ~/github
$ git clone https://github.com/NVIDIA/DIGITS

DIGITSディレクトリに移動して、今回cloneしたDIGITSのコミットログを確認します。

$ cd ~/github/DIGITS
$ git log
commit 81be5131821ade454eb47352477015d7c09753d9
Author: Isaac Yang <tchngyang@gmail.com>
Date:   Tue Dec 13 10:41:44 2016 -0800

    Add steps to specify the Python layer file (#1347)
...

今回cloneしたDIGITSのコミットハッシュ値は、81be513…です。

同じくDIGITSディレクトリで、Pythonパッケージのインストール・アップデートを行います。なお、システムのPythonパッケージのバージョンを変更すると、DIGITS4が動作しなくなるので、注意して下さい。

$ sudo pip install -r requirements.txt

PASCAL VOC2012

次に、予め作成しておいたdataディレクトリに移動して、PASCAL VOC2012をダウンロードします。

$ cd ~/data
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar

ダウンロードしたPASCAL VOC2012の解凍を行うために、semantic-segmentationディレクトリに移動し、ダウンロードしたデータと解凍先のパスを引数として、prepare_pascal_voc_data.shを実行します。

$ cd ~/github/DIGITS/examples/semantic-segmentation
$ ./prepare_pascal_voc_data.sh ~/data/VOCtrainval_11-May-2012.tar ./voc-data

FCN-AlexNet

また、AlexNetからFCN-AlexNet(正確には、fcn_alexnet.caffemodel)を生成するために、同じくsemantic-segmentationディレクトリで、net_surgery.pyを実行します。

$ ./net_surgery.py

DIGITS v5.1-dev

DIGITSディレクトリに移動して、digits-devserverを実行します。

$ cd ~/github/DIGITS
$ ./digits-devserver

Firefox等のブラウザを起動し、URLにlocalhost:5000を入力すると、DIGITS「Home」ページが表示されます。

また、DatasetやModelを作成するので、ページ右上の「Login」ロゴをクリックして、予めLoginしておきます。

Datasetの作成

DIGITS「Home」ページで「Datasets」タブを選択し、「New Dataset」下の「Images」ボタンをクリックし、プルダウンメニューから「Segmentation」を選択します。

すると、下の図のような「New Segmentation Dataset」ページが表示されます。

このページでは、「Separate validation images」にチェックを入れ、PASCAL VOC2012の解凍先に作成された4つのディレクトリを指定します。

また、「Class labels (optional)」、「Label Encoding」及び「Enforce same shape」を上の図のように設定し、「Dataset Name」に名前(ここでは、PASCAL-VOC-Segmentation-Class)を入力した後、「Create」ボタンをクリックします。

Modelの作成

DIGITS「Home」ページに戻って「Models」タブを選択し、「New Model」下の「Images」ボタンをクリックし、プルダウンメニューから「Segmentation」を選択します。

すると、下の図のような「New Image Model」ページが表示されます。

このページの上側左の「Select Dataset」は、上で作成したDataset(ここでは、PASCAL-VOC-Segmentation-Class)を選択し、上側中央の「Base Learning Rate」は、0.0001を入力し、上側右の「Subtract Mean」は、「None」を選択します。

このページの下側では、「Custom Network」タブを選択し、サブタブが「Caffe」になっていることを確認した後、semantic-segmentationディレクトリのfcn_alexnet.prototxtの内容をテキストエリアにペーストします。

また、このページの下側の「Pretrained model(s)」は、net_surgery.pyにより生成されたfcn_alexnet.caffemodelを指定し、「Model Name」に名前(ここでは、FCN-Alexnet)を入力した後、「Create」ボタンをクリックします。

今回は、3エポックのトレーニングを行いましたが、lossやaccuracyは、下の図のようになっています。また、トレーニングに要した時間は、約1時間30分です。

Inference

推論を行うため、下の図の「Select Visualization Method」は、「Image Segmentation」を選択し、「Inference Options」下の「Do not resize input image(s)」にチェックを入れます。

「Test a single image」に画像のファイル名を指定し、「Test One」をクリックします。

なお、上の図の画像のファイル名は「2007_000033」となっていますが、最初の画像に対応する画像のファイル名は「2011_003019.jpg」です。

まとめ

GitHubからクローンした最新のNVIDIA DIGITS (v5.1-dev)でセグメンテーション(segmentation)モデルを作成してみました。