読者です 読者をやめる 読者になる 読者になる

TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

DCNNによるマンガキャラクターの顔パーツ検出(追試)

前回の日記では正則化など行わずにRMSpropを使用して学習を行ったが、初期値の変更や正則化やBatch Normalizationなどを行った場合にどうなるか試してみた。

初期値の変更

ChainerのConvolution2Dのパラメータの初期値は、デフォルトではHeの初期値で初期化される。
これは活性化関数がReLUの場合に最適な初期値になる。(ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装の解説が分かりやすかった。)
wscaleで初期値の標準偏差の値を変更できる。

wscaleはデフォルトで1.0になっているが、試しに√2にしてみた。

1000エポック学習した後、training lossとtest lossは以下のような結果になった。
※エポック単位でぶれがあるので最後の3エポックの平均値とした。

wscale training loss test loss
1.0 2.97E-05 3.94E-04
√2 3.22E-05 5.18E-04

lossが増えてしまった。
wscaleは下手に変更しない方がよい。

正則化

Chainerでは

optimizer.add_hook(chainer.optimizer.WeightDecay(0.0005))

のように記述することで正則化を行うことができる。

正則化を行うことで汎化性能が向上する場合がある。
正則化を行った場合の、lossは以下のようになった。

正則化 training loss test loss
なし 2.97E-05 3.94E-04
あり 9.16E-04 9.89E-04

正則化を行わない方が、test lossが小さくなっている。
テスト用データは学習用データと分けているが、同じコミックの画像を使っているので、汎化性能の効果が見れていないだけかもしれない。
顔パーツ検出のような回帰問題では、正確な位置が必要なため、正則化が悪影響を与えているかもしれない。
もう少し検証してみる必要がありそうだ。

Batch Normalization

Batch Normalizationを行うことで過学習の抑制ができる。
畳み込み層にBatch Normalizationを入れてみた。

Batch Normalizationを入れた結果、以下のようになった。

Batch Normalization training loss test loss
なし 2.97E-05 3.94E-04
あり 9.14E-05 6.14E-04

training loss、test lossともに悪くなった。
回帰問題には適さないのかもしれない。

フィルター枚数を倍

フィルター枚数を倍にすることでどれくらい精度が上がるか試してみた。

フィルター(1,2,3層目の枚数) training loss test loss
16,32,64 2.97E-05 3.94E-04
32,64,128 2.47E-05 4.65E-04

training lossは下がっているが、test lossは悪化している。
過学習しているのかもしれない。

学習時間は、元は約17分で、フィルター枚数を倍にすると、約37分になった。
学習時間の増加に対して精度が向上してない。
フィルター枚数は倍にする必要はないようだ。

学習アルゴリズムをAdamに変更

AdamはRMSpropより新しいアルゴリズムで最近の研究ではよく使用されているらしい。
学習アルゴリズムをAdamに変更した結果、以下のようになった。

正則化 training loss test loss
RMSprop 2.97E-05 3.94E-04
Adam 2.64E-05 3.78E-04

training loss、test lossともに下がっている。
この問題にはAdamの方が適しているかもしれない。
(下記の他のコミックを混ぜた場合はRMSpropの方が収束が速かったので一概に良いとは言えないようだ。)

他のコミックで試してみる

学習したモデルがどれくらいの汎化性能があるか他のコミックで試してみた。

f:id:TadaoYamaoka:20170206221623p:plain

輪郭、目、口ともに大きくずれてしまっている。
一つのコミックから学習しても、汎化性能は獲得できていないようだ。

学習データに他のコミックを混ぜてみる

学習データの20%くらいに他のコミックの画像を混ぜて学習してみた。
f:id:TadaoYamaoka:20170206221842p:plain
結果、見事に検出できるようになった。この画像以外もかなりの精度で検出している。

1000エポック後のlossの値は大きくなったが、学習に時間がかかるようになるのは直観的に納得できる。

他のコミック training loss test loss
なし 2.97E-05 3.94E-04
あり 3.60E-05 4.97E-04


元のコミックの画像の検出精度は見た目上ほとんど変わっていない。
f:id:TadaoYamaoka:20170206225544p:plain

つまり、顔パーツの特徴をより汎用的に学習できたと言える。

いろいろ試した結果、他のコミックの画像をブレンドするのが一番効果が分かりやすかった。