はじめに
先のページで Chainer を用いてシーン認識を行った。今回は、簡略化した Fully Convolutional Networks(FCN) を Chainer を使って実装してみる。(ここに追記した。)
計算機環境
これまでと同じく、Amazon EC2 にある g2.2xlarge を利用した。GPU を搭載したインスタンスである。
データセット
今回使うデータセットは VOC2012 である。以下のような領域分割用の教師データも含まれている。 領域分割の教師データの数は2913枚、これを4:1に分割し、前者を訓練データ、後者をテストデータとした。
| number of train | number of test |
|---|---|
| 2330 | 580 |
訓練データ数は10で、テストデータ数は5で割り切れるように端数を切り捨てた(それぞれ訓練時のミニバッチサイズである)。文献のアルゴリズムは任意サイズの画像を受け付けるが、ここでの実装では、簡単のため、固定サイズ(224$\times$224)に制限した。これに伴い、入力画像をあらかじめこのサイズに変換した。 画像の中心部分に収まる最大の正方形をリサイズしただけである。VOC2012では、以下の21クラスを扱う。
| label | category |
|---|---|
| 0 | background | 1 | aeroplane | 2 | bicycle | 3 | bird | 4 | boat | 5 | bottle | 6 | bus | 7 | car | 8 | cat | 9 | chair | 10 | cow | 11 | diningtable | 12 | dog | 13 | horse | 14 | motorbike | 15 | person | 16 | potted plant | 17 | sheep | 18 | sofa | 19 | train | 20 | tv/monitor |
ネットワークの構造
ネットワークの構造は以下の通りである。文献では、pool5 の後ろにも層は存在するが、簡単化のため、これらを削除した。
- name: 層の名前
- input: 入力featureマップの1辺のサイズ
- in_channels: 入力featureマップ数
- out_channels: 出力featureマップ数
- ksize: カーネルのサイズ
- stride: ストライドのサイズ
- pad: paddingのサイズ
- output: 出力featureマップの1辺のサイズ
ネットワークの実装
上記の構造をそのままChainerで記述する。
-- myfcn.py -- ラベルは0から20までであるが、物体の境界線には-1を配置し、softmax_cross_entropyの計算時に境界の寄与を無視するようにした(Chainerの仕様ではラベルが-1の画素は評価されない)。また、関数calculate_accuracyでも、境界線上の画素を省くようにしてある。3つのデータを加算する関数 add の定義は以下の通りである。
-- add.py --
訓練
訓練時のスクリプトは以下の通りである。
-- train.py -- -- mini_batch_loader.py --
関数 copy_model はここに掲載されているものを利用した。VGGNet.pyはここからダウンロードした。train.pyでしていることは、
- オブジェクトmini_batch_loaderを作る。
- VGGNet.pyで定義されたネットワークのオブジェクトを作る。
- MyFcn.pyで定義されたネットワークのオブジェクトを作る。
- VGGNetのパラメータをMyFcnにコピーする。
- 最適化アルゴリズムとして MomentumSGD を選択する。
- あとは、通常の訓練過程である。
結果
62エポックで計算を打ち切った。学習時の精度と損失は以下の通りである。
-- 訓練画像-- -- テスト画像 -- 1枚の画像の中で何%の画素が正解したかを計算し(境界線上の画素は除く)、全画像について平均したものを正解率(accuracy)と定義した。訓練画像に対しては理想的な振る舞いを示すが、テスト画像に対しては損失が途中から上昇し始めている。過学習しているように見える。最終的な正解率は、訓練画像で0.99、テスト画像で0.82程度である。以下に入力画像、予測画像、教師画像の例を示す。数値はこの画像の正解率である。 以下に、その他の画像の予測例を示す。予測画像と教師画像を並べてある。
-- 訓練画像--
-- テスト画像--
背景で精度を稼いでしまうので、満足の行く結果とするには90%以上の精度を実現する必要がある。

















