223 Views
May 28, 18
スライド概要
2018/05/28
Deep Learning JP:
http://deeplearning.jp/hacks/
DL輪読会資料
Semantic Instance Segmentation with a Discriminative Loss Function 東京大学大学院 情報理工学系研究科 電子情報学専攻 M2 谷合 廣紀
書誌情報 • 論文名 • • 著者 • • Bert De Branbandere, Davy Neven, Luc Van Gool (KU leuven) arXiv • • Semantic Instance Segmentation with a Discriminative Loss Function https://arxiv.org/abs/1708.02551 CVPR2017 workshop
どんな内容? • Instance Segmentationのための損失関数である Discriminative Lossの提案 • 既存のSemantic Segmentation用のネットワークを使うことができる • Object proposalやBounding boxを使わない手法 • 同じ種類の物体がたくさんある場合に強い
背景
Instance Semmentation すごい… From https://github.com/facebookresearch/Detectron
でもこんな画像に対しては? From https://molcyt.org/2013/12/19/insitu/
現実世界では • 世の中Bounding Boxで囲める物体ばかりではない • 実務では1種類の物体がたくさんあって、それらを区別したいときも多い • 医療画像における染色体や細胞核の画像 • 工場のベルトコンベアで流れてくる物体
手法
基本となるアイデア • ネットワークはピクセルごとに n次元の特徴ベクトルを出力する • • 入力が(256, 256, 3)のRGB画像で nを16とすると、出力は(256, 256, 16) ネットワークはこの特徴ベクトルが 次のような性質をもつように学習を行う • 同じインスタンスに属する特徴ベクトルは 近い場所にある • 異なるインスタンスに属する特徴ベクトルは 遠い場所にある
基本となるアイデア • そのような特徴ベクトルを出力できるようになれば 後処理の段階でクラスタリングをすることで Instance Segmentationを実行できる! • そんな特徴ベクトルを学習するための損失関数が Discriminative Loss
Discriminative Lossの3つの要素 • Variance term • • Distance term • • 同じインスタンスに属する特徴ベクトルが近づくようにする引力 異なるインスタンスに属する特徴ベクトルが遠ざかるようにする斥力 Regularization term • ベクトルの正則化のための原点方向への弱い引力
Variance term • 特徴ベクトル𝑥𝑖 とクラスタの中心𝜇𝑐 の距離に対してのLoss • [𝑥]+ はmax(0, 𝑥)を表す • 特徴ベクトル𝑥𝑖 とクラスタの中心𝜇𝑐 の距離が 𝛿𝑣 以下になれば損失は発生しない
Distance term • 異なる2つのクラスタの中心𝜇𝑐𝐴 , 𝜇𝑐𝐵 間の距離に対してのLoss • [𝑥]+ はmax(0, 𝑥)を表す • 中心間の距離が 2𝛿𝑑 以下になれば損失は発生しない
Regularization term • 特徴ベクトルに対する正則化のためのLoss
Discriminative Loss • Discriminative Lossはこれらの重みづけ和 • 論文での値はそれぞれ 𝛼 = 1, 𝛽 = 1, 𝛾 = 0.001
学習経過
学習結果の一例 • Synthetic Scattered Sticks Dataset • • この論文のオリジナルのデータセット? Bounding Boxベースだと難しいタスク
実装
実装方針 • PyTorchで実装 • 既に実装例あり: https://github.com/Wizaron/instance-segmentation-pytorch 環境がPython2 • 微妙に実装が間違っている気がする… • • • というわけで、上記コードを大いに参考にしつつ自分で再実装: https://github.com/nyoki-mtl/pytorch-discriminative-loss Synthetic Scattered Sticks Datasetも実装 • このDatasetに対して学習と推論をした
DiscriminativeLoss • 論文のパラメタをデフォルト引数に • ロスの計算はforwardで呼び出される • input • • ネットワークの出力 • (batch, height, width, feature) • featureは特徴ベクトルの次元数 target • ラベル • (batch, height, width, max_n_clusters) • max_n_clustersはインスタンス数の最大値
_discriminative_loss • Discriminative Lossの本体 • 各ロスの重み付き和を返す
_cluster_means • クラスタの中心を計算 1 𝜇𝑐 = 𝑁𝑐 𝑁𝑐 𝑥𝑖 𝑖=1
_variance_term • 各クラスタの中心への引力
_distance_term • クラスタ間の中心の斥力
_regularization_term • クラスタの大きさを小さくするための 弱い引力
Synthetic Scattered Sticks Dataset • OpenCVで適当な場所に長方形を描画するだけ • 重なった場合、あとから描画される長方形のほうが上
UNet • Semantic Segmentationで よく使われるネットワーク構造 • 今回は入力が256*256 • 出力は最終層直前で分岐させて 2つの出力を出している • SemanticSegmentation用に 256*256*2 (背景+物体) 損失関数はSoftmax • 特徴ベクトル用に 256*256*16 損失関数は Discriminative Loss
Clustering • 今回Synthetic Scattered Sticksの棒の数は8個で固定していて クラスタ数が既知なためKMeansを使った • クラスタ数が未知の場合はMeanShiftを使うといいらしい 詳しくは論文を参照してください
結果
問題点 • • 出力は次の3つが揃ってはじめてうまくいく • 物体領域(Semantic Segmentation) • 各ピクセルの特徴ベクトル • 何個のインスタンスが写っているか インスタンス数を間違えると悲惨
まとめ • Discriminative Lossはピクセルごとに特徴ベクトルを出力するように 学習するための損失関数 • 既存のSemantic Segmentationのネットワーク構造を使うことができる • Bounding Boxベースでないため、Synthetic Scattered Sticks のような データに対してInstance Segmentationを行うことができる • 綺麗に出力を得るためには、物体領域とインスタンス数の情報も必要