目前的物件偵測 Object Detection 演算法主要分為兩部分: Two-stage vs One-stage、Anchor-based vs Anchor-free
本文將會介紹一些各自的代表演算法、paper、code,還有我認為不錯的中文介紹。
Two-stage vs One-stage
- Two-stage: 早期演算法以 Two-stage 為大宗,但因為物件位置檢測與分類分開進行,造成速度上有一定的限制,代表演算法有 R-CNN、 Fast-RCNN和 Faster RCNN
🔖 中文介紹: Object Detection : R-CNN, Fast-RCNN, Faster RCNN
- One-stage: 為了改善剛剛說的 Two-stage 檢測速度問題,而有了 One-stage 演算法。作法是將物件位置檢測與分類同時進行,代表演算法有 YOLO、SSD、RetinaNet、EfficientDet
🔖 SSD 介紹
Anchor-based vs Anchor-free
Anchor-based 與 Anchor-free 的區分就在於是否使用 anchor 進行提取目標候選框,而兩者之間的差異可以在 CVPR2020 ATSS 論文中看到。
🔍 張士峰作者在知乎上的回答: 如何評價 zhangshifeng 最新的討論 anchor based/ free的論文?
🔖 中文介紹:
作者比較 RetinaNet (Anchor-based) 和 FCOS (Anchor-free) 的差別,認為主要是來自於正負樣本的選取方式不同,並提出了 ATSS (Adaptive Training Sample Selection) 方法,能夠根據 ground truth 的相關統計特徵選擇合適的 anchor 作為正樣本,大幅提升模型的準確率並且不增加計算量。
📌 Anchor-based
在進行提取目標候選框時,藉由滑窗方式產生 anchor 來預測 offset (座標的偏移值) 與 confidence scores (置信度)
優點:
- 密集產生的 anchor 能提高 recall,在小物體檢測上有不錯的表現
- 因為 anchor 等超參數為人工定義,因此在訓練上更容易訓練外也較穩定
缺點:
- anchor 的尺度與 IOU 閾值是由人工定義的,超參數設置需要較強的先驗知識,並且對於不同的任務都必須要重新調整
- 通常一張圖像的檢測目標並不是太多,而檢測器在每一次檢測時會生成非常多的候選框,在這樣大量產生 anchor 的情況下,容易造成正負樣本不均衡的問題,同時也導致運算複雜度增加
代表演算法有 Faster RCNN、SSD、RetinaNet、YOLOv2~v4、EfficientDet等
📌 Anchor-free
使用類似 segmentation 的方法來進行預測,其關鍵在於如何定義 ground truth。除了早期的 DenseBox (2015)、YOLOv1 (2016)、UnitBox (2016) 之外,目前 Anchor-free 模型主要分為基於 Keypoint 和基於 Anchor-Point
從 CVPR2018 的 CornerNet 拿到 SOTA 開始後,在 2019 年越來越多論文提出使用 Anchor-free 進行物件偵測
優點:
- 不需手動設置 anchor 與 IOU,模型較為簡單
- 避免了大量的 IOU 計算,能夠降低訓練時的記憶體使用率
缺點: (可參考 anchor-free存在什麼缺點?)
- 早期 Anchor-free 方法的準確率不及 Anchor-based,但在 2017 年提出 Feature Pyramid Network (FPN) 與 Focal loss 後,對於 Anchor-free 有很大的幫助
→ 在每個位置只能預測一個框的條件下,藉由 FPN 進行多尺度預測 — 針對檢測物體大小做分配: 在大尺度的特徵圖上預測大物體,小尺度的特徵圖上預測小物體。這樣的方式解決了大小框在同一個中心點或有重合到的情形。
→ Focal loss 使得模型更著重於中心區域的預測,並有效解決了正負樣本嚴重不均勻的問題。
- 容易得到過多的 false positive,而獲得高 recall、低 precision
- 檢測結果較不穩定
代表演算法有分為早期、基於 Keypoint、基於 Anchor-Point 三部分
🔷 早期
DenseBox (2015)
- Paper: https://arxiv.org/abs/1509.04874
- 中文介紹: 人臉檢測之 DenseBox
YOLOv1 (2016)
- 可閱讀這篇文章: YOLOv1、YOLOv2 介紹
UnitBox (2016)
- Paper: https://arxiv.org/abs/1608.01471
- 中文介紹: UnitBox 詳解
🔷 基於 Keypoint
基於關鍵點檢測來處理物件偵測問題,主要思想來自多人姿態估計的論文。
CornerNet (2018)
- 創新點為預測目標物的左上角、右下角,並輸出一個 embedding vector 將這兩個角點組合成目標邊界框,最後再經過 offsets 做調整。此外提出了 corner pooling 用來定位左上角與右下角的角點。
- Paper: https://arxiv.org/abs/1808.01244
- Code: https://github.com/princeton-vl/CornerNet
- 中文介紹: CornerNet 算法解讀
CenterNet (2019)
CenterNet 在同一時期有兩篇論文,分別是 Objects as Points、Keypoint Triplets for Object Detection,其共通點都是基於 CornerNet 做改進
➰ CenterNet :Objects as Points
- 與 CornerNet 不同的地方在於預測目標物的中心點、中心點 offsets 及目標物的寬高。
- Paper: https://arxiv.org/abs/1904.07850
- Code: https://github.com/xingyizhou/CenterNet
- 中文介紹: 扔掉anchor!真正的CenterNet
➰ CenterNet: Keypoint Triplets for Object Detection
- 作者發現 CornerNet 很容易產生錯誤識別或是大量的偏移,原因可能是在於 CornerNet 沒辦法得到目標框內部的訊息,因此這篇 CenterNet 除了預測目標物的兩個角點外,還加入了目標物的中心點,也就是利用這三個點 (左上角、右下角、中心點) 進行預測目標邊界框 (bndBox)。
- 此外,提出了 Center pooling 來捕捉更豐富的訊息以幫助預測中心點,以及使用 Cascade corner pooling 替代原本的 corner pooling 來改善角點對於 bndBox 邊緣較為敏感和內部訊息缺乏的問題。
- Paper: https://arxiv.org/abs/1904.08189
- Code: https://github.com/Duankaiwen/CenterNet
- 中文介紹: CenterNet 閱讀
ExtremeNet (2019)
- 作者認為 CornerNet 的角點通常在物體外圍,沒有強烈的局部特徵,因此將其改為預測目標物的四個極值點,即物體的最上點、最下點、最左點、最右點。
- ExtremeNet 除了預測四個極值點外,還預測了中心點,所以對於每個類別總共預測了五個 heatmap。同時也對四個極值點 heatmap 預測其 offsets
- Paper: https://arxiv.org/abs/1901.08043
- Code: https://github.com/xingyizhou/ExtremeNet
- 中文介紹: 論文學習筆記
CPNDet (Corner Proposal Network,2020)
- CPNDet 以 CornerNet 和 CenterNet 為 baseline,是個 Anchor-free, Two-stage 的網路模型,可以提高召回率及準確率,並且在推理速度上也很快速,該篇文章收錄於 ECCV2020。其做法為以下 Stage1、Stage2
- Stage1 是先藉由 CornerNet 進行角點 (左上角、右下角) 與 offsets 預測,然後選擇其中 top-k 對角點組合成目標候選框 (object proposal),而這兩個角點組合的判斷條件有二個:關鍵點是否屬於同一個類別、左上角點必須在右下角點的左上位置。
- 由於這種提取 proposal 的方式會產生大量的錯誤配對,接著在 Stage2 中採用了兩步的分類方法:先經過輕量二值分類器過濾掉 80% proposal,再將剩餘的 proposal 送入多分類器進行類別預測。
- Paper: https://arxiv.org/abs/2007.13816
- Code: https://github.com/Duankaiwen/CPNDet
- 中文介紹: ECCV 2020 | CPNDet
🔷 基於 Anchor-Point (Dense Prediction,Semantic Segmentation)
借鑑 FCN 的思想採用逐像素 (pixel-wise) 的方式進行預測,類似語義分割。
FCOS (2019)
- 模型輸出有分類與檢測兩個分支,其中 Classification 為預測中心點位置的分類,而 Regression 則是預測該點到檢測框的上下左右距離 (維度為 4 維,有 t, b, l, r 值),並使用 FPN 解決重合的目標框問題。
- 此外,引入 Center-ness 層,其方法為計算目標框中心點與 ground truth 中心點的距離,若距離越大,輸出值越大。最後將其值跟分類相乘來降低錯誤檢測的目標框。
- Paper: https://arxiv.org/abs/1904.01355
- Code: https://github.com/tianzhi0549/FCOS/
- 中文介紹: FCOS 算法詳解
FoveaBox (2019)
- 其架構參考 RetinaNet,由 ResNet + FPN (backbone) 與兩個子網路組成,其中一個子網路負責預測目標中心點分類,另一個子網路則是預測目標框的左上角和右下角 (x1, y1, x2, y2)
- 此外,引入參數 η 對 FPN 上每一層的區域尺度進行動態調節。以及引入 shrunk factor (缩放因子) 設置正負樣本區域。
- Paper: https://arxiv.org/abs/1904.03797
- Code: https://github.com/taokong/FoveaBox
- 中文介紹: FoveaBox: Beyond Anchor-based Object Detector
FSAF (Feature Selective Anchor-Free ,2019)
- 模型架構以 RetinaNet 為基礎再加入 FSAF,目的是為了讓模型自己學習出目標框適合的 FPN 層,該篇文章收錄於 CVPR2019
- 此 FSAF module 是指在每個 FPN 特徵層上加上兩個 anchor-free的分支 – 預測目標中心點分類和該中心點至目標框的距離 (上下左右)
- Paper: https://arxiv.org/abs/1903.00621
- Code (Keras, Tensorflow): https://github.com/xuannianz/FSAF
- Code (Pytorch): https://github.com/hdjang/Feature-Selective-Anchor-Free-Module-for-Single-Shot-Object-Detection
- 中文介紹: CVPR2019 | FSAF:來自CMU的Single-Shot目標檢測算法
Soft Anchor-Point Object Detection (SAPD,2020)
- 作者探討在 Anchor-Point 上訓練結果較差的原因是在於 attention bias 和 feature selection,因此提出了兩種策略方式 soft-weighted anchor points 及 soft-selected pyramid levels,該篇文章收錄於 ECCV2020
- 模型的整體框架與 FSAF 相似,soft-weighted anchor points 為對於每個不同位置的目標物賦予不同的權重;soft-selected pyramid levels 為對於不同解析度下的目標框賦予不同的權重,方法是先將預測目標框分配給各個 FPN 層 (不同解析度),然後利用 RoIAlign 提取特徵後進行 concat,之後送入 meta-selection net 學習出對應的權重。
- Paper: https://arxiv.org/abs/1911.12448
- Code: https://github.com/xuannianz/SAPD
- 中文介紹: 目標檢測 | Anchor free的目標檢測進階版本
📚 RoIPooling、RoIAlign 比較
📚 Anchor-based 與 Anchor-free 比較圖