オムライスの備忘録

数学・統計学・機械学習・プログラミングに関することを記す

【深層学習】U-Net #実装編 #02

この記事の読者

深層学習・ディープラーニングの手法の1つである「U-Net」について知りたい.


キーワード・知ってると理解がしやすい

  • U-Net
  • pix2pix

yhayato1320.hatenablog.com

yhayato1320.hatenablog.com

yhayato1320.hatenablog.com


Index

Task

画像の Instance Segmentation をタスクにします. (#01 では、Semantic Segmentation でした)

yhayato1320.hatenablog.com

Competition

signate のコンペティションを題材に進めてみます.

signate.jp

間取り図を解析して、「建具」や「部屋領域」を検出するのが目的です.

Dataset

権利の都合上表示はできませんが、概要だけでも

  • Image (PNG)

    • Train : 2258
    • Test : 968
  • Label (Json)

    • Train : 2258

Json

{“labels”: 
    {Label Name: 
        Point List
    },
}

Label Name は、7 種類で、Point List はBox か Polygon です.

( GCS へ保存しておくと、やりとり楽そうです. )

Preprocessing

Label データが Json なので画像データを作ります.


Label データの可視化、保存方法としては、2 種類考えました.

  • H x W x 7 (Label 数) の npy file
    • データの読み込みはスムーズ
  • H x W x 1 の jpge file (画像ファイル) x 7 ファイル (ラベル数分)
    • 各ラベルの画像が確認できる

結局あるLabelのみでの学習も視野に入れたい or マスク画像が正常かどうかも瞬時にわかるので、Labelの種類ごとに画像を作りました. 間取り画像データに、あるLabelがない場合は、間取り画像の縦横サイズと同様の真っ黒な画像ができます.

Model

#01 と同様のモデルを利用します.

いくつかの変更点があります.

  • OUTPUT_CHANNELS : 1 or 7 (Label ひとつ or Label すべてか)
  • loss
    • tf.keras.losses.CategoricalCrossentropy : 7 Label 全てに対して同時にLoss 計算
    • tf.keras.metrics.binary_crossentropy : 1 Label のみに対して Loss 計算

Training

最初は、7 Label 同時に学習しましたが、predict mask が真っ黒だったので、いろいろ試しました.

  • アウトプットを 7 Label (Channel) or 1 Label (Channel) への変更
  • Down Sampling / Encoder (学習済みモデル使用の部分) の学習是非の変更

どれも、真っ黒な画像が predict mask で生成され、負値で出力されることが見られた. (Loss は下がりきっても、同様の状態)

まとめ

まとめというか、反省点・疑問点

  • U-Net x Instance Segmentation はそもそもどうなのか / 有効なのか?
  • Instance Segmentation の Loss は何が適切なのか?

参考

  • U-Net: Convolutional Networks for Biomedical Image Segmentation
    • 発表論文

arxiv.org

Web サイト

www.tensorflow.org

towardsdatascience.com