深層学習

FCOS

アンカーボックスを置かず、各特徴点から物体の4辺までの距離を直接回帰する一段階検出器です。FPNの層別割り当てと中心度スコアで、低品質な予測を抑えます。

  • B|標準
  • 深層学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

FCOSは、画像上にあらかじめ候補枠を並べず、特徴マップの各位置でクラスと矩形を直接予測するアンカーフリーの一段階検出器です。位置 (x,y)(x,y) から矩形の左・上・右・下の辺までの距離を回帰するため、出力は4値になります。

地図上の各地点に「自分から建物の四つの境界まで何メートルか」を答えさせる方式です。候補枠を何種類も置いて合うものを選ぶのではなく、地点と境界の距離から一つの矩形を組み立てます。

なぜ必要か

アンカーボックス方式では、サイズ・アスペクト比・個数をデータやモデルに合わせて設計し、学習時には候補枠と正解矩形の対応も決めます。FCOSはこの事前設計をなくし、アンカーに関するハイパーパラメータと重なり計算を避けます。したがって、物体の形やデータセットが変わるたびにアンカーを調整する箇所が減ります。

ただし、全位置で同じように回帰すると、大きさの違う物体や重なった物体をどの位置が担当するかが曖昧になります。FCOSはこの問題を、FPNの複数解像度へ回帰範囲を割り当てることで分散し、さらに物体の中心から遠い位置が出す低品質な矩形を中心度で下げます。つまり、アンカーを消すだけでなく、位置の曖昧さと品質のばらつきを別の信号で処理します。

従来の設計上の負担FCOSで対応する設計
候補枠のサイズ・比率・個数を調整する位置から4辺距離を直接回帰する
異なる物体サイズを一つの層で扱うFPNの層ごとに回帰範囲を分担する
中心から遠い位置の粗い矩形が残る中心度で検出スコアを下げる

仕組み

特徴マップ上の位置 (x,y)(x,y) が正解矩形 BiB_i を担当するとき、左上を (x0(i),y0(i))(x_0^{(i)},y_0^{(i)})、右下を (x1(i),y1(i))(x_1^{(i)},y_1^{(i)}) として、教師値を次で作ります。

t∗=(l∗,t∗,r∗,b∗)=(x−x0(i), y−y0(i), x1(i)−x, y1(i)−y)\mathbf{t}^{*}=(l^{*},t^{*},r^{*},b^{*})=(x-x_0^{(i)},\ y-y_0^{(i)},\ x_1^{(i)}-x,\ y_1^{(i)}-y)

ここで l∗,t∗,r∗,b∗l^{*},t^{*},r^{*},b^{*} はそれぞれ左・上・右・下の辺までの距離です。ネットワークはクラス確率と予測値 t=(l,t,r,b)\mathbf{t}=(l,t,r,b) を出し、4距離から矩形を復元します。位置が複数の正解矩形に入る場合は曖昧なサンプルになるため、論文では最小面積の矩形を割り当てます。

FPNでは、各層のストライドに応じて回帰できる最大距離 mim_i を設けます。初版の例では層ごとの上限を 0,64,128,256,512,∞0,64,128,256,512,\infty とし、ある位置の4距離の最大値がその層の範囲外なら負例にします。これで小さい物体は細かい層、大きい物体は粗い層が担当し、重なりの曖昧さも減ります。

中心度は4距離の比から作る教師値です。

c∗=min⁡(l∗,r∗)max⁡(l∗,r∗)⋅min⁡(t∗,b∗)max⁡(t∗,b∗)c^{*}=\sqrt{\frac{\min(l^{*},r^{*})}{\max(l^{*},r^{*})}\cdot\frac{\min(t^{*},b^{*})}{\max(t^{*},b^{*})}}

c∗c^{*} は中心に近いほど1、辺に近いほど0に近づくスコアです。別分岐で予測した中心度を分類スコアと組み合わせ、中心から遠い位置の低品質な矩形の順位を下げます。中心度は矩形そのものを作る値ではなく、候補の信頼度を調整する値です。

試験でどう問われるか

問われ方正解に寄る条件引っかけ
アンカーなしで矩形をどう表すか各位置から4辺までの距離 (l,t,r,b)(l,t,r,b) を回帰する中心座標と幅・高さだけを必ず出すとする
FPNの役割層ごとに回帰距離の範囲を制限し、物体サイズを分担する全層が全サイズを同じ条件で担当するとする
中心度の役割中心から遠い位置の低品質予測をスコア低下させる中心度が矩形座標そのもの、またはクラス分類そのものだとする
FCOSの利点アンカーのサイズ・比率・個数などの設計をなくす後処理のNMSまで不要になるとする

実装で確かめる

4辺距離から矩形を復元し、同じ距離から中心度を計算します。実装で軸の順序を取り違えると、中心度は計算できても矩形の辺が入れ替わるので、両方を同じ順序で扱います。

import numpy as np

xy = np.array([10.0, 20.0])
box = np.array([4.0, 8.0, 28.0, 40.0])  # x0, y0, x1, y1
l, t = xy - box[:2]
r, b = box[2:] - xy
dist = np.array([l, t, r, b])
restored = np.array([xy[0] - l, xy[1] - t, xy[0] + r, xy[1] + b])
centerness = np.sqrt(min(l, r) / max(l, r) * min(t, b) / max(t, b))
assert np.allclose(restored, box)
assert 0.0 <= centerness <= 1.0

取り違えやすいもの

用語FCOSとの切り分け
アンカーベース検出候補枠を事前定義して対応付けるのに対し、FCOSは位置から4辺距離を直接回帰する
セマンティックセグメンテーションどちらも密な位置予測だが、FCOSは各位置から矩形とクラスを出す
中心度回帰した矩形の4辺距離ではなく、予測の品質を順位付けする補助スコア
FPNFCOS固有のアンカーではなく、複数解像度の特徴を物体サイズの担当分けに使う構成

想起チェック

FCOSが各位置で回帰する4値は何か

左・上・右・下の各辺までの距離 (l,t,r,b)(l,t,r,b) です。

FPNの各層に回帰範囲を持たせる理由は何か

物体サイズを層ごとに分担し、重なった正解矩形への割り当ての曖昧さを減らすためです。

中心度は何を改善するためのスコアか

物体の中心から遠い位置が出しやすい低品質な矩形のスコアを下げ、検出順位から抑えやすくするためです。

出典