Help us understand the problem. What is going on with this article?

YOLOの進化系YOLACT,YOLOACT++の徹底解説

「YOLACT++: Better Real-time Instance Segmentation」(arXiv, 3 Dec 2019)を頑張ってまとめましたが、理解できない箇所がいくつかあったので(?)をつけてます。そこが理解できた方、もしくは、間違いを見つけた方はコメントよろしくお願いします🥺

目次

  1. どんなもの?

  2. 先行研究と比べてどこがすごい?

  3. 技術や手法のキモはどこ?
      A. アーキテクチャ
       a. Backbone検出器
       b. protonet
       c. Prediction Head
       d. NMS; Fast NMS
       e. Assembly
       f. Crop
       g. Thereshold
       h. Fast Mask Re-Scoring Network; YOLACT++のみ
     B. 損失関数
     C. 最適化手法

  4. どうやって有効だと検証した?

  5. 議論はある?

  6. 次に読むべき論文は?


1. どんなもの?

  • YOLACT (You Only Look At CoefficienTs)… 高速な Instance Segmentation モデル (図1)
  • YOLACT++… YOLACTの精度を向上させたモデル

※ どちらも One-Stage型 Instance Segmentation モデル(図2)

image.png
☝︎
図1: 物体検出の種類 (The Modern History of Object Recognitionより)

image.png
☝️
図2: YOLACT,YOLACT++までの流れ


2. 先行研究と比べてどこがすごい?

精度を保ったままリアルタイムで実行できる最初のInstance Segmentationモデル

  • Mask-RCNN: Two-Stage型のため、画像サイズが小さくてもリアルタイムに対応できない
  • Straight to Shapes, Box2Pix: リアルタイムだが精度が低すぎる

👉 YOLACT, YOLACT++: COCOで約30maskmAP(=mAP)を達成した初のリアルタイム(>30FPS) アプローチ

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_391968_110bfcbe-4943-0737-dab6-af3c4f04173c.png
図3: COCO でのさまざまな Instance Segmentation手法 の速度と精度 (トレードオフ関係)


3. 技術や手法のキモはどこ?

Instance Maskの作成を2つの並列タスクに分解

  1. 「Prototype Mask」集合の生成
  2. それらの重要度「Mask係数」の学習

➡️ その後、NMSで生き残った各Instanceについて、上の2つを線型結合することで、そのInstance Maskを構築

YA_アーキテクチャParallel.png


詳細A. アーキテクチャ


a. Backbone検出器

ResNet-101とFPNに基づいたRetinaNetと同様に、P2を生成しないようFPNを修正し、以下を手順で特徴抽出する。
1. P5(C5でなく)からストライド2の3×3conv層を通して連続的にP6およびP7を生成
2. それぞれにアスペクト比[1、1/2、2]の3つのアンカーボックスを配置

  • Input:
    • 画像 (図では 550×550)
  • Output:
    • 特徴マップ (図では P3,P4,P5,P6,P7)

※ P3のアンカーボックスの面積は24ピクセルの正方形で、後続のすべての層のスケールは前の2倍(スケール[24、48、96、192、384])

[YOLACT++のみ] Deformable Convolution with Intervals

DCNv2による設計に従い、各ResNetブロックの3x3conv層をC3からC5の3x3 deformable畳み込み層に置き換える。
※ 推論時間を増加させないように、修正されたdeformableモジュールは使用しない。

[YOLACT++のみ] アンカーボックスのハイパラ探索

アンカーボックスのスケールやアスペクト比などのハイパーパラメータを適切に選択しなければならないため、2つのパターンを実験する。(前者と後者では、YOLACTの元の構成に比べてアンカーの数がそれぞれ5/3倍と3倍に増加)
1. RetinaNetより: アスペクト比を[1、1/2、2]から[1、1/2、2、1/3、3]に増やしながらスケールを変更せずに維持
2. RetinaMaskより: FPNレベル12あたりのスケールを3倍([$1x$, $2^{1/3}x$, $2^{2/3} x$])増やしながらアスペクト比を変更せずに維持


b. Protonet

k個のPrototype Maskを予測する。
FCN(Fully Convolutional Network)として実装し、下図の矢印は3×3conv層を意味する(ただし最後のconv層は1×1)。また、サイズの増加は、アップサンプルの後にconv層が続く。

  • Input:
    • Backboneから出力された最大特徴マップ (図では P3)
  • Output:
    • k個のPrototype Maskの行列(図では k=4,Prototype Maskサイズ138×138,実験では k=32?)

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_391968_b76b2517-a2c1-48f1-b1ac-58df34802ece.png

※ 出力Maskの境界が制限されていない(Prototype Maskサイズは全て同じ)ことにより、非常に自信のあるPrototype(例:明らかな背景)に対して大規模で強力な活性化関数を用いることができる。したがって、ReLUか非線形関数を用いないか(?)選択できる。(実験ではReLU)
* 3×3conv層のpaddingは[1,0]のようなカーネル?(ResNet参考)


c. Prediction Head

a個のアンカーボックスに対してそれぞれ3つのブランチを並行に実行する。
1. 入力画像に存在するクラスを信頼度として予測
2. 入力画像に存在するInstanceの位置(バウンディングボックス)を予測
3. 各Prototype Maskに対応するk個のMask係数を予測
3つのブランチすべてで共有される1つの3×3conv層があり、各ブランチは独自の3×3conv層を並行して取得する。

  • Input:
    • Backboneから出力された特徴マップ ($P_i,\,i=3…7$)
  • Output:
    • c個のクラス信頼度行列($W_i×H_i×ca$)
    • 4つのバウンディングボックス回帰子行列($W_i×H_i×4a$)
    • k個のMask係数行列($W_i×H_i×ka$)

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_391968_ff2deb63-4675-fe48-ed1b-9abd11c24f5b.png

※ ブランチ1,2は典型的なアンカーベースの物体検出器(SSD,OHEM)と同じ。
※ 負の値をもつMask係数が重要であるため、ブランチ3で求めたMask係数にそれぞれ$\tanh$を適用することにより、非線形性がなく、より安定した出力が生成される。(?)


d. NMS (Fast NMS)

NMSよりも高速化したFast NMSで重複検出を抑制する。

  • Input: ($i=3,4,5,6,7$)
    • 全特徴マップのクラス信頼度行列集合($\{W_i×H_i×ca\}_i$)
    • 全特徴マップのバウンディングボックス回帰子行列集合($\{W_i×H_i×4a\}_i$)
    • 全特徴マップのMask係数行列集合($\{W_i×H_i×ka\}_i$)
  • Output: (n: 保持される個数)
    • 重複の弾かれたクラス信頼度行列(n×c)
    • 重複の弾かれたバウンディングボックス回帰子行列(n×4)
    • 重複の弾かれたMask係数行列(C:n×k)
  1. c個のクラスごとに信頼度で降順にソートされた上位n個の検出について、c×n×n個のペアごとのIoU行列$X$を計算する。
  2. 対応するIoUがある閾値$t$より大きく、信頼度の高い検出がある場合、検出を削除する。 下記の下三角行列と対角線を最初に設定することにより、これを効率的に実装する。 $$ X to 0:X_{kij} =0, ∀k,i≥j $$ これは、1回の「triu」呼び出しで実行でき、列ごとの最大値を取得する。 $$ K_{kj} =max_i(X_{kij}), ∀k,j $$ 検出ごとに最大IoU値の行列Kを計算する。 最後に、この行列を$t$($K<t$)で閾値処理すると、各クラスでどの検出を保持するかが示される。

e. Assembly

Prototype Maskと Mask係数を線型結合した後 Sigmoid関数をかけて、Instance mask(仮)を生成する。

  • Input:
    • k個のPrototype Maskの行列(P:w×h×k)
    • NMSから出力されたMask係数行列(C:n×k)
  • Output:
    • Instance Mask (仮)
M=\sigma\left(P C^{T}\right)\\


f. Crop

  • 学習時には、代わりにground truthバウンディングボックスを使用してトリミングし、$L_{mask}$ をground truthボックスの領域面積で割って、Prototype Mask内の小さな物体を保持する。
  • 評価時には、予測されたバウンディングボックスでInstance Mask(仮)をトリミングする。 具体的には、ボックス領域の外側のピクセルにゼロを割り当てる。

g. Thereshold

閾値0.3??


h. [YOLACT++のみ] Fast Mask Re-Scoring Network

グラウンドトゥルースボックスとのmaskIoUに基づいて予測マスクを再スコアリングする。
conv層ごとにReLU非線形関数を持ち、最後にglobal pooling層を持つ6層FCNを構築することにより、各物体カテゴリのmaskIoU行列が算出される。これに対応するクラス信頼度の間の積を取ることにより、各マスクを再スコア化する。
- Input:
- トリミングされたInstance Mask予測(しきい値処理前)
- Prediction Headerで出力されたクラス信頼度行列($W_i×H_i×ca$)
- Output:
- ?

image.png


詳細B. 損失関数

以下の4つの損失関数を使用する。(それぞれ重み1、1.5、6.125、1)

  1. 分類損失$L_{cls}$ …softmax cross entropy (SSDより)+ neg:pos=3:1(OHEMより)
  2. ボックス回帰損失$L_{box}$…smooth-L1 loss (SSDより)
  3. マスク損失$L_{mask}$…トリミングされたmask Mとground truth mask M_{gt}の間のピクセルごとのbinary cross entropy ($L_{mask} = \text{BCE}(M,M_{gt}$)
  4. Semantic Segmentation Loss…Backboneの最大の特徴マップ(P3)にc個の出力チャネルを持つ1x1conv層をかけた後、各ピクセルは複数のクラスに割り当てることができるため、Softmaxとc+1個(クラス数+背景)の代わりに、Sigmoidとc個のチャンネルを使用する。

※ RetinaNetと異なり focal loss は使わない。


詳細C. 最適化手法

  • データセット:
    • MS COCO(学習:train2017,評価:val2017+test-dev)
    • Pascal 2012 SBD
  • epoch: 800k
  • 勾配法: SGD
  • 学習率:
    • 初期値: $10^{-3}$
    • epoch 280k、600k、700k、750k ごとに10で割る
  • 重み減衰(weight decay): $5×10^{-4}$
  • 運動量(momentum): 0.9
  • 学習環境: Titan Xp 1つ
  • 学習時間:
    • MS COCO: 4~6日
    • Pascal: 1日未満

4. どうやって有効だと検証した?

  • [定量]他のInstance Segmentationモデルと速度と精度を比較(表1)

image.png
🔺
表1: MS COCO Results (Backbone: ネットワーク(R:ResNet,D,DarkNet)-深さ-出力特徴マップ)

  • [定性]Semantic Segmentationだけでないことを図示(図7,8)

image.png
👆
図7: YOLACT

image.png
⬆️
図8: More YOLACT

  • [定性]大きな物体だと精度が高いことを図示(図9)

image.png
🔼
図9: Mask Quality

  • [定量]Boxの精度と速度をYOLOv3と比較(表4)

image.png
表4: Box Performance on COCO’s test-dev set.


5. 議論はある?

進化した点

  • 速い… one-stage型backbone検出器にわずかな並列構造と非常に軽量なAssemblyプロセスを加えただけ
    • [Backbone検出器] 出力する特徴マップを制限
    • [Backbone検出器(YOLOのみ)] アンカーボックスを固定
    • [NMS]Fast NMSを提案
  • Instance Maskが高品質
    • Maskが画像空間の全範囲を使用するため(図9:特に大きな物体に◎)
    • [Protonet]より小さな物体に対してより高品質のマスクとなるよう、Prototype Maskを入力画像の4分の1の次元にまでアップサンプリングして高解像度に 
    • [Protonet]よりロバストなマスクが生成されるよう、Backboneのより深い特徴マップを入力
  • 一般的…Prototype MaskとMask係数を生成するアイデアはほとんどすべての最新物体検出器に追加可能
  • Prototype Maskの新しく興味深い振る舞い(図5)…Prototype Maskの組み合わせでInstance Maskが生成されるため
    • Prototype1,2,3: 画像を空間的に分割
    • Prototype4: インスタンスを領域推定
    • Prototype5: インスタンスの輪郭を検出
    • Prototype6: 地面(位置依存方向マップ)をエンコード

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_391968_ccfb05bc-9d12-ff1c-0f9d-c1c2c7803e13.png

図5: Prototype Behavior

YOLACT vs. YOLACT++

  • YOLACT
    1. × 重なりに弱い(図7(行1列1))
    2. × 「漏れ」が生じる(図7(行2列4))…バウンディングボックスの精度に依存
  • YOLACT++
    1. アンカーボックスの最適化、Backboneの改善で重なりに対処(図10a)
    2. maskの再スコアリングで「漏れ」を軽減(図10a:左端のキリンのmaskの品質が最高であるはずだが、YOLACTでは画像内のすべての検出で3位,YOLACT++では最高位)

image.png

図10: YOLACT vs. YOLACT++


6. 次に読むべき論文は?

  • Mask R-CNN
  • DCNv2

参考

https://qiita.com/chobaken/items/97e2bf9ad41129045ba0
https://postd.cc/data-learning-and-modeling/
https://xtrend.nikkei.com/atcl/contents/technology/00007/00013/
https://medium.com/@nikasa1889/the-modern-history-of-object-recognition-infographic-aea18517c318
https://www.slideshare.net/DeepLearningJP2016/dlfocal-loss-for-dense-object-detection

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away