はじめに
この記事は、前前記事、前記事からの続きです。
詳しい話は、そちらを。
改良 (2)
前回は、未使用なGチャンネルに、無視できる小さな値を入れて学習させてみたがうまくいかず、
全体で値がフラットになっているのが問題なのかと思ったので、
今回は、教師データに強制的に値の差をつけてみたらどうかということで、
教師データ(画像)の4辺を最大値で埋めてみることにした。
学習 (2)
前回からの変更点は、
教師画像に対して、各4辺の1pixel幅を255(/255)で埋めて、学習する様にした点。
それ以外は、前々回と同じにして学習。
結果 (2)
目標通りに近い感じの出力になった。
この方法で、うまくいきそう。
ただし、今回の方法では、教師データの周囲4辺1pixelの情報が落ちるので望ましくない。
改良 (3)
ということで、上記の
教師データの周囲4辺1pixelの情報が落ちるので望ましくない。
ここを改善すべく、入力データと教師データを
周囲4辺を1pixel分拡大して、そこを上記のようにMax値で埋めて学習してみることに。
学習 (3)
前回からの変更点は、
教師画像に対して、周囲4辺を1pixel拡大((256, 256, 3) -> (257, 257, 3))し、
拡大した点を255(/255)で埋めて、学習する様にした点。
それ以外は、最初と同じにして学習。
結果 (3)
ということで、期待通りの出力になった。
出力データが、周囲1ピクセル分大きくなっているので、その分をカットして出力すればいい感じなるはず。
さいごに
今回は、ちょっと違った感じでマルチセグメンテーションをしてみた。
最終的には、入力データを拡大し、少し手を入れることで、うまくいった。
このように、入力と教師に何か処理を加えることでうまくいくようになることもあることを覚えておきたい。
ただし、データをいじることで、元データを破壊してはいけないので、
その辺は、気を付けていきたい。
最終的な結果のTest dataに関しては、ある程度学習したデータに似たように推論されているが、まだまだ結果がよくない。
これは、今回認識しようとしたものが、比較的緩い条件(広義的な物体。ある程度形が決まっているが、色や細かい形に自由度が高い)のものであるのに対して、学習に使用したデータの数が少なかったことに起因していると思う。
学習データを十分に増やすor対象物をもう少し厳しい条件にすれば、十分良い結果になっていくだろう。
また、UNetとDeepUNetを使ってみたが、
今回の条件では、UNetの方が良い結果に見える。
学習データが少なかったりと条件が悪いので、もう少ししっかりとした条件で比べたら、DeepUNetの方がよくなるのだろうか...
おまけ
今回使用したUNet, DeepUNetは、自分でKerasで実装してみたものを使用した。
リポジトリは、こちら(UNet, DeepUNet)。
それぞれのブランチは、
(1)の記事:StationaryDetection_cond1
(2)の記事の改良(1):StationaryDetection_cond2
この記事の改良(2):StationaryDetection_cond3
この記事の改良(3):StationaryDetection_cond4
※参考にされる方へ:masterブランチは、調整中なので、動かない可能性があります。無視してください。