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)モデルを作成してみました。