Edited at

U-net構造で、画像セグメンテーションしてみた。(2)

U-net構造で、画像セグメンテーションしてみた。(1)

の続き記事です。

(1)の方で、Python(Keras)でU-net構造のネットワークを用意し学習をしてみたが、

結果、出力が真っ白で、学習がうまく進んでいなさそうだった。

ということで、


改良

学習が進んでいなさそうなので、


  • 各MaxPooling前に、BatchNormalizationを追加

  • 各デコード層で、2回目のconvolution後に、BatchNormalizationを追加

  • 2層目、3層目のデコード層の最後に、Dropoutを追加


学習

改良前と同じく

バッチサイズ : 5

エポック : 100

で学習実行

学習曲線は、こんな感じ

LearningCurve_2.png

おぉ、今回は、下がって行ってる。

下がり切ってはなさそうですが。


結果


学習に使ったデータ

neko_01.pngneko_06.pngneko_17.pngneko_60.png

neko_01.pngneko_06.pngneko_17.pngneko_60.png

neko_01.pngneko_06.pngneko_17.pngneko_60.png

それぞれの列で、上から順に、入力/出力/理想(教師)

今回は、学習が進んでいそう。

2枚目とかは特にいいとこまで来てる。

学習曲線的にも下がり切ってないので、エポック数が足りなかった感じだろうか。


検証用データ(学習に使用しなかったデータ)

neko_67.pngneko_72.pngneko_76.pngneko_79.png

neko_67.pngneko_72.pngneko_76.pngneko_79.png

neko_67.pngneko_72.pngneko_76.pngneko_79.png

それぞれの列で、上から順に、入力/出力/理想

学習が仕切ってなさそうな割に、3枚目,4枚目あたりは結構いい感じ。


再度学習

バッチサイズ : 5

エポック : 500

で学習実行

学習曲線は、こんな感じ

LearningCurve_3.png

だいぶ、下がってきてますね


再度結果


学習に使ったデータ

neko_01.pngneko_06.pngneko_17.pngneko_60.png

neko_01.pngneko_06.pngneko_17.pngneko_60.png

neko_01.pngneko_06.pngneko_17.pngneko_60.png

それぞれの列で、上から順に、入力/出力/理想(教師)

ほぼ理想の出力になってますね!


検証用データ(学習に使用しなかったデータ)

neko_67.pngneko_72.pngneko_76.pngneko_79.png

neko_67.pngneko_72.pngneko_76.pngneko_79.png

neko_67.pngneko_72.pngneko_76.pngneko_79.png

それぞれの列で、上から順に、入力/出力/理想

3枚目, 4枚目は、100エポックの時と同様なかなか理想に近い形で出てますが、

1枚目, 2枚目は、100エポックの時よりは、いい感じになっていそうだが、まだまだという感じ。

もう少し学習が必要?


まとめ

改良(BatchNormalizationの追加, Dropoutの追加)により、学習が進むようにはなった。

100エポックでは足りず、500エポック程度で、学習に使ったデータに関しては、ほぼ、再現されるようになった。

ただ、検証用データ(学習に使っていないデータ)に関しては、今一つな状態。

あと、Kerasに関しては、

結構簡単にモデルがかけて、使いやすいイメージを抱いた。

今後もうちょっと使っていってみようかと思う。


今後やっていきたいこと。

今回の改良では、一気に、BatchNormalizationの追加, Dropoutの追加を追加してしまったので、

いまいち、それぞれによってどれくらい何が変わっていったかがわからないので、

ちょっとずつ追加して遷移を見てみたい。

また、検証用データに関して、あまり結果が良くないので、さらに条件を変えて学習を試していきたい。


追記

ソースは、こちら

[2019/07/08 追記] masterソースを変更してしまったので、上記リンクは、当時のソースになっていません。(時間があるときに復旧しておきます。)