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の出力マップの統合で十分性能がでるのは他のフレームワークでも同様かどうかも気になる. 他でも性能がでるなら今までマルチスケールとか言っていたのはなんだったのか.