機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

SOLOv2: Dynamic, Faster and Strongerを読んだのでメモ

はじめに

SOLOv2: Dynamic, Faster and Strongerを読んだのでメモ. Single-stageでinstance segmentationを行うSOLOを精度,速度において改良. 具体的には,S^2個のマスクを生成する部分を畳み込みのカーネルの重みを動的に決定することで精度を向上. Bounding boxでの検出においてはNMSは大した計算コストはないが,instance segmentationではIoUの計算が重いため,Matrix NMSという並列計算可能なNMSを提案.

SOLOv1

ベースとなるSOLOの詳細については過去のブログ参照. SOLOのMaskブランチは特徴マップF\in\mathbb{R}^{H\times W\times E}をフィルタサイズ1\times 1の畳み込みG\in\mathbb{R}^{1\times1\times E\times S^2}でMaskを推論する. ただしEは任意のチャネル数. よってマスクブランチの出力は次のようにかける.

\displaystyle
M=F\ast G

Mask Mの推論結果はめちゃくちゃスパースで冗長であるというのがSOLOの課題として挙げられていた. S^2S次元の積として分解し,コスト削減するDecoupled SOLOも提案されていたが,ここではlocationを条件としてGを決定する.

SOLOv2

Fig. 2(c)にあるようにSOLOv2では特徴マップFを出力するfeature branchと,畳み込みカーネルG\in\mathbb{R}^{S\times S\times D}を出力するkernel branch (CoordConvで構成)から成る. ここでDは畳み込みのカーネルサイズに比例しており,カーネルサイズが1\times 1の時にはD=Eで,3\times 3の時にはD=9Eとなる. このGFを畳み込むことで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に基づいて減衰させて閾値処理というものだが,繰り返しの処理を排除した. マスクi,j間のiouを\mathrm{iou}_{i,j}とすれば適当な関数f(\mathrm{iou}_{i,j})によって減衰係数を決定. f(\cdot)については式(3)~(6)を参照. 通常のNMSより9倍早いとのこと.

まとめ

Matrix NMSの処理はbounding box系の検出に使っても効果的かどうか気になる. また,FPNの出力マップの統合で十分性能がでるのは他のフレームワークでも同様かどうかも気になる. 他でも性能がでるなら今までマルチスケールとか言っていたのはなんだったのか.