Semantic Instance Segmentation with a Discriminative Loss Function
元画像のpixelごとの特徴量をDNNで抽出し, その座標を学習することでsegmentationを行う手法を学んだ.
今回は以下のリンク先を非常に参考にしています. 画像は論文より引用.
元論文の概要
目的はinstance segmentationのアプローチの提案. 現在主流となっているinstance segmentationの方法はMask-RCNNなどのproposal-basedな方法で, まずオブジェクトのありそうな領域を抽出してからそれぞれの領域に対してsemantic segmentationを行う(前面と背景を分ける). それに対して論文では, それぞれのピクセルの隠れ特徴ベクトル(embeddingsと英語で言う?)をネットワークで出力する方法をとっている. 同じインスタンスのピクセル同士のembeddingsは似たものになるはずだし別のインスタンスのピクセル同士は離れるはず. そういった引力と斥力のようなloss functionを定義することでinstance segmentationを行っている.
loss functionは以下
はそれぞれ引力, 斥力, 正則化のイメージ.
はそれぞれ同じインスタンスの点が集まってほしい半径, 違うインスタンスの点が離れてほしい半径を表すハイパラメータ.
うまく学習させると重なりなどに強いsegmentationが可能になるっぽい.
今回の実験
今回はsemantic気味に円と四角と背景を分けてみる. 合計6つの図形をランダムで作成し, その白黒画像を入力として用いる. 論文ではsemantic segmentationで背景と物体を分けてから物体に対してsegmentationを行っていたが実験では背景も一つのインスタンスとみて分けてみる. ネットワークの出力であるembeddingsはプロットできるように2次元で行った.
nyoki-mtl様の実装と違うところ
- クラスタリングはk平均法ではなく, 物体数がわからないという前提のもとmeanshift法でクラスタリングを行う.
- 論文では元の入力に座標情報を表すチャンネルを加えるcoordconvという方法を採用しているので加える.
- 実装例では教師ラベルが1データに対してインスタンスの数だけ存在しているが, 今回の実験では例えば6個全部四角だった場合に円のラベルが0となりうまく学習されないことがあるので, 1枚のチャンネルに1,2,3と番号を割り当てる方式にした(わかりにくくてすみません). 実装面からみても, 1枚で固定されるこちらの方法の方がよさそう.
ーSGDではなく論文通りにAdamを使用.