ふぁむたろうのブログ

機械学習系のお話やポエムを投稿します

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

注意

  • 元論文:https://qijiezhao.github.io/imgs/m2det.pdf
    • 本記事中の図はここを参照しています
  • この解説は元論文の Google 日本語訳に対し毛が生えたようなものです
    • ですので可能な限り元論文を読むことを推奨します
    • 綺麗にまとめた訳ではないので似たような文が何度か繰り返される箇所があります
    • 真剣に読んでまとめましたが間違えてる可能性はあります。マサカリください
  • Experiments, Discussion, Conclusion については本記事では扱ってません
    • M2Det って何?構造上これまでのモデルと何が違うのか?をしっかりまとめたかったので
    • Experiments は後日追記するかもしれません

導入

2018年の物体検出では、速度精度の両方を見た場合 YOLOv3 が最もインパクトが大きかったと思います。 特に機械学習触ったことがない人にとって比較的導入しやすい(導入しやすいとは言っていない)のもポイントだったと思います。

そんな YOLOv3 に対し M2Det は もっと速くてもっと精度良い らしいです。 元論文は AAAI2019 にも採択されたらしいです。 今回はそんな M2Det の論文を頭からしっかり読んでいきます。

f:id:fam_taro:20190219202350p:plain:w600

  • 詳細な論文の訳が知りたい人は下記の内訳を確認してください。
  • scale と level について
    • 論文内では scale と level の 2つの観点で feature を分けています
      • scale: 画像内での大きさ、scale が大きい -> 画像内で対象の占める面積が大きい
      • level: 特徴としての抽象度や複雑度
        • level が低い feature -> より単純な特徴
        • level が高い feature -> より複雑な特徴や、抽象度が高い特徴
  • base feature について
    • この論文内での base feature は、backbone となるネットワーク (VGG16 とか) から得た feature を FFMv1 モジュールによって統合したものです

ぶっちゃけ何がすごいの?

  • YOLOv3 より速くて精度良い
  • multi-level な特徴を multi-scale に扱えるようにした
  • 過去のメジャーなモデルほとんでについて実験してる
    • すごすぎる
    • ここまでやれば AAAI 通るのか…

論文内訳

1. 著者情報

  • 著者一覧
    • Qijie Zhao(1)
    • Tao Sheng(1)
    • Yongtao Wang(1)
    • Zhi Tang(1)
    • Ying Chen(2)
    • Ling Cai2 and Haibin Ling(3)
  • 著者所属
    • 1: Institute of Computer Science and Technology, Peking University, Beijing, P.R. China
    • 2: AI Labs, DAMO Academy, Alibaba Group
    • 3: Computer and Information Sciences Department, Temple University

中国すご…

2. Abstract

  • Feature pyramids めっちゃ流行ってるよな
    • one-stage object detectors (e.g., DSSD, RetinaNet, RefineDet)
    • two-stage object detectors (e.g., Mask R-CNN, DetNet)
  • でも上記のモデルたちは backbone のタスク(classification) 用のマルチスケール feature 使ってるからある程度制限かかってるよな?
    • 🤔
  • 俺らは "Multi-Level Feature Pyramid Network (MLFPN)" を提案するぜ
    • 上記より detection に特化した feature pyramids だぜ
  • 以下 3 step で作るぜ
    • base feature として extract した fuse multi-level features (i.e. multiple layers) を融合する
    • 以下2つ
      • base feature を次の2つを組み合わせたブロックに入れる
        • Thinned U-shape Modules
        • Feature Fusion Modules
      • また U-shape module の decoder layers は Object detection 時に活用する
    • 同じ scale(size) の decoder layer を集約して Detection 用の feature pyramid を作る
      • どの feature map も multiple-level な layer(feature) を含む
      • だから精度上がってる???
  • 上記の MLFPN を SSD アーキテクチャに組み込んだものを M2Det と呼ぶことにするわ
  • 性能は one-stage detector 間で SOTA だぜ
    • MS-COCO benchmark
    • AP of 41.0 at speed of 11.8 FPS with single-scale inference strategy
    • AP of 44.2 with multi-scale inference strategy
    • 上記2つの strategy の違いは???
  • コードは GitHub - qijiezhao/M2Det: M2Det: A Single-Shot Object Detector based on Multi-Level Feature Pyramid Network にあるぜ
    • 4月頃コードが載るらしい?

3. Introduction

  • Object detection において scale variation はメジャーなテーマ
  • scale variation は大きく 2つの戦略がある
    • 1: image pyramid
      • いろいろなサイズに resize してコピーしたイメージ群等
      • test 時にしかできないぞ
      • もちろんメモリ使用量や計算量は増えるぞ
      • よって効率はめっちゃ悪くなるぞ
    • 2: detect objects in a feature pyramid extracted from the input image
      • train 時も test 時も使えるぞ
      • 1 に比べてメモリ使用量や計算量が少ないぞ
      • feature pyramid は SOTA detection model への統合が楽にできるぞ

f:id:fam_taro:20190219202527p:plain:w600
これまでの代表的な検出モデル

  • SSD, FPN, RetinaNet, Mask R-CNN 強いよな
  • でもクラス分類用に設計された feature pyramid のせいで限界あるよな
    • 例えば SSD は backbone(VGG16) の層を 2つそのまま使ってる
    • STDN は DenseNet の最後の dense block を使って feature pyramid を作ってる
      • pooling
      • scale-transfer operations
    • FPN は top-down に 浅い層と深い層を融合して feature pyramid を作ってる
  • 一般に上記の feature pyramid 作成方法は 2つの限界がある
    • 1: pyramid 内の feature map の表現力が十分でない
      • Object detection 用として考えると
      • Base net は object classification 用に設計したからね
    • 2: pyramid 内の各 feature map は、主に single-level layer in backbone から構成されている
      • 各 feature map は特定範囲サイズの object detection 用
      • そのため各 feature map は主に single-level の情報のみ含んでいる
  • 一般に high-level feature と low-level feature は以下の違いがある
    • high-level
      • 分類サブタスクに役立つ
      • 複雑な見た目の物体を特徴づけるのに役立つ
    • low-level
      • 物体位置回帰サブタスク(Object Location Regression) に役立つ
      • 単純な見た目の物体を特徴づけるのに役立つ
  • 実際にはサイズが同じでも見た目がかなり違う場合がある
    • 例:「信号機」と「遠くにいる人間」-> サイズは同じくらいでも人間の方がかなり複雑な見た目をしている
    • pyramid 内の各 feature map は全てもしくはそのほとんどが single-level な特徴しか含んでいない
      • -> Detection の performance が準最適(最適ではない)
  • 上記の問題に対処するため以下 3step で M2Det 作った
    • 1: 各 level の feature を混ぜて base feature とした
    • 2: 以下の操作を行う
      • 以下2つを交互に組み合わせたネットワークに入力する
        • Thinned U-shape Modules(TUM)
        • Feature Fusion Modules(FFM)
      • より multi-level, multi-scale な feature を抽出するため
      • 大事なこと:U-shape Module の各 decoder layers が同じ深さを共有している
    • 3: detection 用の feature pyramid を構築するために、同じ scale の feature map を集約する
      • final feature pyramid 内の各 feature map は multi-level decoder layer を含んでいる
      • Hence, we call our feature pyramid block Multi-Level Feature Pyramid Network (MLFPN).

4. Related Work

  • 皆、one-stage や two-stage に限らず、様々な scale に対応するため頑張ってきた。それらは大きく2つの戦略がある

5. Proposed Method

f:id:fam_taro:20190219202625p:plain
ネットワーク全体図

  • M2Det は backbone と Multi-Level Feature Pyramid Network (MLFPN) を使って入力画像から特徴抽出を行っている
    • SSD に似てる
    • 密な bounding-box と category score を出力する
    • その後 NMS をして最終的な結果を出力する
  • Multi-Level Feature Pyramid Network (MLFPN) は以下の 3つのモジュールを含んでる
    • Feature Fusion Module (FFM)
    • Thinned U-shape Module (TUM)
    • Scale-wise Feature Aggregation Module (SFAM)
  • FFMv1 は backbone の特徴を統合することで意味的な情報を強化している
  • 各 TUM は multi-scale features 群を出力し、TUM と FFMv2 を交互に適用することで multi-level で multi-scale な features を抽出している
  • SFAM は scale 毎の feature concat と attention 機能を適用することで各 feature を集約して multi-level feature pyramid を作る

5.1 Multi-level Feature Pyramid Network

  • ネットワーク全体図では MLFPN は 3つのモジュールから構成されれる
    • 1: FFMv1 では base feature 生成用に shallow な feature と deep な feature を統合する
      • 例: VGG16(Simonyan and Zisserman2015) の conv4_3 と conv5_3
      • ココらへんは SSD とかでもよく出てくる
      • これらは MLFPN 用の multi-level な意味的情報を得るのに役立つ
    • 2: いくつかの TUM と FFMv2 を交互に重ねる
      • 特に各 TUM は異なる scale の feature map をいくつか生成する
      • FFMv2 では、base feature と前の TUM から得られた feature map 内で最も大きいものを統合する
      • 統合された feature map は次の TUM の入力となる
      • ただし最初の TUM は他の TUM からの事前知識がないので、{ \textbf{X}_{base} } から学習する
      • multi-level multi-scale features は下記のように計算される
      • f:id:fam_taro:20190219210407p:plain:w400
        • { \textbf{X}_{base} } : base feature
        • { x_{i}^{l}} :  {l} 番目の TUM の  {i} 番目の scale の特徴
        • { \textbf{T}_{l} } :  {l} 番目の TUM の処理
        • { \textbf{F} } : FFMv1 の処理
    • 3: SFAM で multi-level multi-scale features を統合
      • scale をまたいだ concat
      • channel-wise attention

5.1.1 FFMs

  • FFM モジュールは M2Det 内の異なる level の feature を統合する
  • 以下の操作を行う
    • 1x1 Conv 層を使ってチャンネルを圧縮
    • concat で各 feature map をまとめる
  • 特に FFMv1 では backbone 内の scale の異なる 2つの feature map を扱うため、片方に対し upsample を適用して同じ scale にしてから concat する
  • 一方 FFMv2 では base feature と一つ前の TUM で出力された最も大きな feature map を扱い、これらは同じ scale である

f:id:fam_taro:20190219212736p:plain:w600
FFMv1(a) と FFMv2(b)

5.1.2 TUMs

  • FPN(Lin et al.2017a)RetinaNet(Lin et al.2017b) との違いとして TUMは 薄い U型構造となっている(下図)
  • 薄い U型構造?🤔
  • encoder は "3x3 convolution layers with stride 2" 連続でつなげてる
  • decoder は これらを feature map として受け取る
    • FPN(Lin et al.2017a) では last layer of each stage in ResNet backbone
    • 私達はさらに upsample の後に 1x1 の Conv 層を足し、decoder での要素和をとることによって学習能力を高めかつ特徴の滑らかさを保った
  • 各 TUM の decoder の出力は、ある level での multi-scale な feature となります
  • 前から後ろの TUM にかけて low-level な特徴から deep-level な特徴を出力するようになる

f:id:fam_taro:20190219213432p:plain

5.1.3 SFAM

  • 目的: 各 TUM から生成された multi-level multi-scale features を統合して multi-level feature pyramid に集約する

f:id:fam_taro:20190219215432p:plain
SFAM

  • SFAM は大きく分けて 2つのステップがある
    • Step1: 同じ scale の feature をチャンネルも一緒に concat する
      •  {\textbf{X} = [ \textbf{X}_1, \textbf{X}_2, ..., \textbf{X}_i ] }
      •  {  \textbf{X} = Concat(\textbf{x}_i^{1}, \textbf{x}_i^{2}, ..., \textbf{x}_i^{L}) \in \mathbb{R}^{W_i \times H_i \times C}  }
        •  {i} 番目に大きい scale の特徴
      • まとめられた各 feature pyramid は、各 level の feature を含んでいる
      • ただし単に concat するだけでは不十分
    • Step2: channel-wise attention module を使って有用なチャンネルを絞る
      • SENet(Hu, Shen, and Sun2017) で使われた SE ブロックを使う
      • squeeze step では GAP(Global Average Pooling) を使ってチャンネル別統計 { \textbf{z} \in \mathbb{R}^C } を得る
      • 次にチャンネルの依存関係を捉えるため 2つの FC(Fully Connected)層を使って attention を実現する
      • { \textbf{s} = \textbf{F}_{ex}( \textbf{z},  \textbf{W}) = \sigma( \textbf{W}_1 \delta( \textbf{W}_2\textbf{z} ) ) }
    • { \textbf{s} } で重み付けした最終的な出力は以下の通り
      •  { \tilde{\textbf{X}}_{i}^{c}  = \textbf{F}_{scale}(\textbf{X}_i^{c}, s_c) = s_c  \cdot \textbf{X}_{i}^{c}   }
      •  { \tilde{\textbf{X}}_i = [  \tilde{\textbf{X}}_i^{1},  \tilde{\textbf{X}}_i^{2}, ..., \tilde{\textbf{X}}_i^{C} ] }
        • 各 feature は rescale 操作によって強弱がついている

5.2 Network Configurations (ネットワークの設定)

  • M2Det では backbone を 2種類使った(同時ではない)
  • backbone は ImageNet で pre-traine 済
  • デフォルトの MLFPN は以下の構成
    • 8 TUMs
    • 各 TUM は 5 つの Conv 層と 5つの Upsample 層を持つ
  • scale は 6つ
  • 各 scale の TUM feature のチャンネルは 256 のみ(学習パラメータ数を減らすため)
  • 画像サイズは 320, 512, 800 (SSD, RefineDet, RetinaNet を参考に)
  • 6 つの pyramidal features に対し、それぞれ 2 つの Conv 層を加え、detection(location regression と classification ) をできるようにした
  • 各 pyramidal feature の pixel に対し、6つの anchor と 3つの比率(ratios) で候補ボックスを定義した
  • 上記候補ボックスに対する score のしきい値は 0.05 とした
  • 後処理として線形カーネルを使った soft-NMS(Bodla et al.2017) を使ってより正確なボックスを残した
  • しきい値を 0.01 とするとよりよい結果になったけど、推論時間がめっちゃ長くなったので実用上このしきい値は採用しなかった

6. Acknowledgements

  • 全て強い学会のもの
    • ICCV
    • ECCV
    • CVPR
    • ICLR
    • NeurIPS
    • IEEE
    • IJCV
    • CoRR
  • YOLOv3 だけ arxiv
    • v2 や v1 が既に入っているからか…
  • "強い論文は強い論文からしか生まれない" ようなイメージを抱きました