Sleep like a pillow

Deep Learning関係の話。

論文読み M2Det: A Single-Shot Object Detector based on Multi-Level Feature Pyramid Network

M2Det

今年発表されたone-stage detectorのSOTAで、構造がとてもエレガントです。

arxiv.org

著者によるPyTorch実装 github.com

M2Detとは?

  • 既存のone-stage detectorで用いられているfeature pyramidは、分類タスク用のモデルの特徴マップから構成されているため、物体検出に最適ではない可能性がある。さらに、それぞれの特徴マップは単一のレイヤからしか作られていない。
  • M2Detでは、backbone network中の異なるスケールの2つの特徴マップをconcatしたものをBase featureとして用いる。
  • Base featureに対してU-Net likeなsubnetworkを複数回かけ、それぞれのsubnetworkの特徴マップをfeature pyramidとして用いることで、様々なスケールかつ抽象レベルの特徴マップを持つMulti-level Feature Pyramidを生成し検出に用いる。
  • 精度と実行速度においてSone-stage detectorのSOTAを達成。
  • ベースとなっているのはSSDで、SSDFPNをMulti-level Feature Pyramidで置き換えたイメージ。

Multi-level Feature Pyramid Network (MLFPN)

FFMv1

  • FFMv1では、backboneの特徴マップからBase featureをつくる
  • backbone内の最も小さいスケールの特徴マップの中で最も深いもの(VGG16のconv5_3)と、二番目に小さいスケールの特徴マップの中で最も深いもの(VGG16のconv4_3)をとってきて、convによるチャンネル数の削減とupsampleでconv5_3のスケールをconv4_3に合わせてconcatしたものがBase feature。

TUM

  • TUMはU-Net likeなsubsetwork。
  • U-Netと異なり各ブロックのconvは一層だけ (論文中ではThinと表現されている)。stride2のconvでスケールを落としていく(論文だとスケールは6段階なのでブロック数はencoderとdecoderそれぞれ5)。
  • encoderとdecoderのマージはconcatではなくelement-wise sum。
  • Multi-level Fature Pyramidに用いるために、decode部分の各スケールごとにconv1x1をかけて特徴マップを出力する。
  • TUMは何回か繰り返す(論文だと8回)ことで、異なる抽象レベルの特徴マップを獲得することができる。

FFMv2

  • ひとつ前のTUMの最終層の特徴マップと、Base featureのチャンネル数をconvで削減したものをconcatして、次のTUMに渡す

SFAM

  • SFAMでは複数のTUMから得られる特徴マップを統合してMLFPを生成する。
  • 同一スケールの特徴マップをconcatしてSqueeze & Excitation (SE)ブロックをかける。異なる抽象レベル間の相互依存性を情報としてうまく利用するためか?
  • MLFPの完成。

Implementation details

  • 学習の最初の5epochは小さい学習率から初期lrまで徐々に大きくする。(Warmup, 分散学習でよく使われる)
  • 初期lrは2*10^-3、90epochと120epochで0.1倍して150epochで学習終了。
  • バッチサイズは32。
  • 入力サイズは既存手法に倣って320x320、512x512、800x800の3つ。
  • backboneはVGG-16とResNet-101。

所感

  • CornerNetよりも精度良くて高速、実装が簡単そう
  • 各モジュールの構造と役割が分かりやすい