SOLO: Segmenting Objects by Locationsを読んだのでメモ
はじめに
SOLO: Segmenting Objects by Locationsを読んだのでメモ. Instance Segmentationをoneshotかつ高精度におこなったというもの.
YOLO
物自体は単純で,FPNによるobject detectionのbb生成側のブランチをインスタンスマスクに変えたという感じ. この論文ではbackboneはFPNを使い複数の特徴マップから検出を行う. 検出を行うためのブランチはクラス推定とマスク推定の二つからなる. クラス推定ブランチは次元を出力とし,入力に対応する領域のクラスカテゴリを推論する. このは入力の解像度に依存しないもので,実装的にはadaptive poolingで固定の解像度に押し込められる. Table 2でを変えた時(出力は単一の特徴マップから)と複数の特徴マップを利用した場合の精度比較をしている. Pyramidの時の各パラメータはTable 3にある.
マスク側は,クラス推定ブランチの出力に対応する解像度のマスクを生成する. すなわち,クラス推定ブランチの出力の解像度がなのでマスク側は次元の出力を返す. 論文の後半で説明されているが,このままでは冗長な出力が多いのでの出力を二つ作り,それぞれの出力の各チャネルの積の組み合わせでを表現することで冗長性を抑え精度の向上をおこなっている.
マスクを生成する際には畳み込みの位置普遍性が邪魔になるので,SOLOではCoordConvを利用して位置に依存した畳み込みをおこなっている.Figure3のMask Headの(256+2)の2がCoordConvの座標値のこと.
ラベルのグリッドへの割り当ては最近の物体検出で利用されているcenter samplingを採用したとのこと.
基本的にはマスクの重心位置で割り当てを行うはず.
論文には「Given the mass center , width , and of the ground truth mask, the center region is controlled by constant scale factors . We set and there are on average 3 positive samples for each ground truth mask.」と書いてあるがよくわからないので勉強して出直します.
center samplingはマスクの重心に対応するグリッド(ここでは)を中心とした適当な領域(例えば33とか)をpositive sampleとして扱うというもの.
FCOSという論文の実装で図解されてた.
SOLOでは真のマスクの幅と高さに対して固定のスケーリングパラメータを掛けた範囲,すなわちの範囲をpositive sampleとして扱うという.
center samplingの効果はgithubのissueに議論がある.
ただ,center samplingされた領域がマスク間でオーバーラップしてた場合どのようにラベル決めるかが疑問として残る.
損失関数はマスクとクラスに対して存在し,クラス側はfocal lossを利用したとのこと.マスク側の損失は次のように定義される.
はバッチに含まれる全positive sampleの数で,は真値のクラスとマスクを表す. 簡単にいえば,クラス分類ブランチの出力のの中で物体が存在した場合,マスクブランチの出力の対応するチャネルに対して真値と損失を計算するということ. はいろんな選択肢があるが,色々やってDice lossが良かったとのこと.Dice lossは次のように定義される.
学習には8GPUを使ってバッチサイズ16でSGDによって36epoch学習したとのこと.
まとめ
Mask R-CNNからAPが最大で2%程度向上していて(ただしbackboneのアーキテクチャを揃えるとMask R-CNN未満のAP),検出結果も上手くできているなという印象.速度もMSCOCOでAP34.2達成したモデルで22.5FPS出せると書いてあるのでそれなりに高速に動作もするらしい.