RetinaNet

問題提起

  • 2stageモデル(Faster R-CNNなど)は推論速度やモデルの複雑さが課題

  • 1stageモデル(YOLO, SSDなど)は精度がまだまだ

  • 精度を維持したまま1stageモデルを構築したい

  • 1stageモデルの精度が悪いのは、クラス間の不均衡問題が影響しているのではないかと考えた。

    • 2stageモデルは、RPNの段階でバランスをとってサンプリングしている。

    • OHEM(Online hard example mining)などが代表的。

      • hard exampleからサンプリングする(easy negativeを学習に含めない)。

  • これを解決するために、一般的なCE(Cross Entropy)誤差とは異なる損失関数を提案。これがFocal Loss。

Focal Loss

  • CEをサンプルの難易度によって動的に変化させる損失関数。

  • 論文では簡単のためにbinary classificationの問題で、loss関数について説明されています。

  • CEについて

    • 基本のCEはの通り。

    • これはこのように書ける。

    • 実際はこれらを正解ラベルとかけ合わせた和がCE誤差となる。

    CE(y,p) = -\sum_{i}{y_i}\log({p_i})
  • balanced CE

    • 不均衡問題のために重みづけしたCEも一般的に使われる。

    • このαには、クラス数の逆数などがつかわれることがある。

  • focal loss

    • balanced CEでは不均衡問題に対応しているが、easy sampleとhard sampleを区別しない。

    • そのため以下のような式を提案する。

    • この関数は以下のような形状となる。

      • 左側(ptが0に近い)の時は、CEとFLは同じ値。

      • 右側(ptが1に近い)の時は、FLの方が小さくなり重要視されなくなる。

    • 実験によれば、γ=2の場合が最も結果が見られた。

    • また実際には、balancedも組み合わせた以下で最も良い結果が得られている。

    • 実際にfocal lossを用いる場合は、pを計算するためのsigmoid演算をloss関数に組み合わせることで数値的に安定性を高めている。

アーキテクチャ

  • 以下のように1つのバックボーンに対して、2つのサブネットワークを接続する。

  • FPNでは、P2~P6を使ったが、RetinaNetではP3~P7を使う。

    • P7をどうやって作る??

      • 実装例によれば、stride=2の畳み込みによって作るみたい。

  • サブネットのKはクラス数、Aは後述するアンカーボックスの数である。

アンカーボックス

  • FPNと同様、32x32~512x512の範囲のanchor boxをP3~P7に割り当てる。

    • P3 ... 32x32

    • P4 ... 64x64

    • P5 ... 128x128

    • P6 ... 256x256

    • P7 ... 512x512

  • anchor boxは以下の9つとする。(A=9)

    • aspect ratioは、{1:2, 1:1, 2:1}を使う。

    • これに加えて、それぞれ2^0, 2^(1/3), 2^(2/3)のサイズを追加する。

  • ground truthとのIoUが0.5以上のanchor boxが正例に、0.4以下のanchor boxが負例に割り当てられる。

  • anchor boxは最大1つのobjectに割り当てられる。

    • 複数ある場合は、IoUの大きい方だけ?

  • anchorがどちらにも割り当てられない場合、0.4~0.5に存在する場合は、学習データから無視する。

class subnet

  • subnetのパラメータは、すべてのpyramidのレベルで共有される(FPNの論文と同様)。

  • subnetの構成は、conv3x3, 256-channelの畳み込みを4回、conv3x3, KA-channelの畳み込みを1回実施する。

  • 途中のconv3x3はReLUの活性化を用い、最後のconv3x3はsigmoidを用いる(前述の通りFocal lossの安定性のため)。

box subnet

  • ほぼclass subnetと同様の構成で、最終の畳み込みが4A-channelとなる。

  • class subnetと同様の構成ではあるが、パラメーターの共有は行わない。

  • boxパラメータは、R-CNNのstandard box parameterizationを用いる。

    • 最近の研究とは異なり、より少ないパラメーターを使った class-agnostic bounding box regressorを使用する、とのこと。

focal lossの正規化

  • 既に紹介したfocal lossの総和が誤差関数となる。

  • 総和の際の正規化として、大多数のanchorはeasy negativeであり、focal lossでは無視できるlossとなることから、正規化には、anchorの総数ではなく、ground truthに割り当てられたanchorの総数で正規化する。

  • またαとγは同時に調整がひつようであり、γ=2の場合はα=0.25が最適である。

NMS

  • inference時に、IoU=0.5以上の検出は信頼度が高い方にマージされる。

Initialize

  • backboneとなるResNet50,101はImageNet1kで学習される。

  • top downのFPN構造は、FPN論文と同様の初期化が実施される。

  • subnetは最後のconvをのぞき、bias=0, σ=0.01のガウス分布で初期化される。

  • subnetの最後のconvは、 bias=-log((1-π)/π)で初期化し、π=0.01を用いる。これは不均衡問題における初期学習を安定化させる効果がある。

    • 希少クラスの事前分布を低く設定することで、安定的になる効果がある。

参考

  • スライド解説

    • https://www.slideshare.net/DeepLearningJP2016/dlfocal-loss-for-dense-object-detection

  • こちらにも詳しくまとまっている。

    • https://deepsquare.jp/2020/10/retinanet/

    • 実装例も良い感じ

      • https://deepsquare.jp/2020/10/retinanet-handson/

  • 公式実装はdetectronとしてある。

    • https://github.com/facebookresearch/Detectron

Last updated