SOLOv2: Dynamic, Faster and Strongerを読んだのでメモ
はじめに
SOLOv2: Dynamic, Faster and Strongerを読んだのでメモ.
Single-stageでinstance segmentationを行うSOLOを精度,速度において改良.
具体的には,個のマスクを生成する部分を畳み込みのカーネルの重みを動的に決定することで精度を向上.
Bounding boxでの検出においてはNMSは大した計算コストはないが,instance segmentationではIoUの計算が重いため,Matrix NMSという並列計算可能なNMSを提案.
SOLOv1
ベースとなるSOLOの詳細については過去のブログ参照.
SOLOのMaskブランチは特徴マップをフィルタサイズ
の畳み込み
でMaskを推論する.
ただし
は任意のチャネル数.
よってマスクブランチの出力は次のようにかける.
Mask の推論結果はめちゃくちゃスパースで冗長であるというのがSOLOの課題として挙げられていた.
を
次元の積として分解し,コスト削減するDecoupled SOLOも提案されていたが,ここではlocationを条件として
を決定する.
SOLOv2
Fig. 2(c)にあるようにSOLOv2では特徴マップを出力するfeature branchと,畳み込みカーネル
を出力するkernel branch (CoordConvで構成)から成る.
ここで
は畳み込みのカーネルサイズに比例しており,カーネルサイズが
の時には
で,
の時には
となる.
この
と
を畳み込むことでmaskの生成をする.注意として,畳み込みのカーネルは領域ごとに異なるパラメータを持つ.
さらに高速化のためSOLOでやられていたFPNによるマルチスケールな推論をやめ,FPNのマルチスケールな出力をマージして一つの特徴マップを作る(Fig. 3).
学習は分類のためのFocal lossとマスク推論のためのDice lossの組み合わせ.
推論時には,まず分類スコアが0.1以下のものは破棄し,残ったサンプルに対して今度はmaskのスコアが0.5以上を前景,それ以外を背景としてマスクを生成.
最後にMatrix NMSにより冗長なマスクを統合していく.
Matrix NMSについては文章よりFig. 4のPyTorch-likeな擬似コードがわかりやすいので参照.
関数の頭にtorchをつけてmaxの戻り値に気をつければ基本コピペで動く.
簡単には,soft-NMSのようにスコアをiouに基づいて減衰させて閾値処理というものだが,繰り返しの処理を排除した.
マスク間のiouを
とすれば適当な関数
によって減衰係数を決定.
については式(3)~(6)を参照.
通常のNMSより9倍早いとのこと.
まとめ
Matrix NMSの処理はbounding box系の検出に使っても効果的かどうか気になる. また,FPNの出力マップの統合で十分性能がでるのは他のフレームワークでも同様かどうかも気になる. 他でも性能がでるなら今までマルチスケールとか言っていたのはなんだったのか.