Guided Anchoring: 物體檢測器也能自己學 Anchor
雷鋒網 AI 科技評論按,本文作者陳愷,該文首發於知乎,雷鋒網 AI 科技評論獲其授權轉載。
前言
進入圖片物體檢測這個坑也有一年出頭了,而且至少短期內還將繼續待在坑裡而且還拉了同夥入坑。值此新(ji)春(xu)佳(ban)節(zhuan)之際,打算介紹一些做過的工作,寫一下對這個領域的理解,另外有空的話也會講講 mmdetection 的設計和一些實現。
作為開篇,就講一下啟動最早的一個項目,"Region Proposal by Guided Anchoring"。這篇 paper 的方法用在了 COCO Challenge 2018 檢測任務的冠軍方法中,在極高的 baseline 上漲了 1 個點。最近公開在 ArXiv 上,歡迎大家提出意見。
概述
我們提出了一種新的 anchor 生成方法 —— Guided Anchoring,即通過圖像特徵來指導 anchor 的生成。通過預測 anchor 的位置和形狀,來生成稀疏而且形狀任意的 anchor,並且設計了 Feature Adaption 模塊來修正特徵圖使之與 anchor 形狀更加匹配。在使用 ResNet-50-FPN 作為 backbone 的情況下,Guided Anchoring 將 RPN 的 recall(AR@1000) 提高了 9.1 個點,將其用於不同的物體檢測器上,可以提高 mAP 1.2 到 2.7 個點不等。
下圖是我們的方法和傳統 RPN 的性能和速度對比,可以看到要顯著優於傳統 RPN。
下面是應用在不同檢測方法上的結果,backbone 均為 ResNet-50-FPN。
背景
Anchor 是物體檢測中的一個重要概念,通常是人為設計的一組框,作為分類(classification)和框回歸(bounding box regression)的基準框。無論是單階段(single-stage)檢測器還是兩階段(two-stage)檢測器,都廣泛地使用了 anchor。例如,兩階段檢測器的第一階段通常採用 RPN 生成 proposal,是對 anchor 進行分類和回歸的過程,即 anchor -> proposal -> detection bbox;大部分單階段檢測器是直接對 anchor 進行分類和回歸,也就是 anchor -> detection bbox。
常見的生成 anchor 的方式是滑窗(sliding window),也就是首先定義 k 個特定尺度(scale)和長寬比(aspect ratio)的 anchor,然後在全圖上以一定的步長滑動。這種方式在 Faster R-CNN,SSD,RetinaNet 等經典檢測方法中被廣泛使用。
Motivation
通過 sliding window 生成 anchor 的辦法簡單可行,但也不是完美的,不然就不會有要講的這篇 paper 了。首先,anchor 的尺度和長寬比需要預先定義,這是一個對性能影響比較大的超參,而且對於不同數據集和方法需要單獨調整。如果尺度和長寬比設置不合適,可能會導致 recall 不夠高,或者 anchor 過多影響分類性能和速度。一方面,大部分的 anchor 都分布在背景區域,對 proposal 或者檢測不會有任何正面作用;另一方面,預先定義好的 anchor 形狀不一定能滿足極端大小或者長寬比懸殊的物體。所以我們期待的是稀疏,形狀根據位置可變的 anchor。
Formulation
首先我們思考 anchor 是如何生成的。我們通常使用 4 個數 (x, y, w, h) 來描述一個 anchor,即中心點坐標和寬高。我們將 anchor 的分布 formulate 成如下公式。
Anchor 的概率分布被分解為兩個條件概率分布,也就是給定圖像特徵之後 anchor 中心點的概率分布,和給定圖像特徵和中心點之後的形狀概率分布,這也是論文標題中 Guided Anchoring 的由來。Sliding window 可以看成是
是均勻分布而
是衝激函數的一個特例。
根據上面的公式,anchor 的生成過程可以分解為兩個步驟,anchor 位置預測和形狀預測。在這個看起來很簡單的 formulation 上,我們走過一些彎路,討論過一些奇奇怪怪的方法,最後發現大道至簡。
方法
如圖所示,在原始 RPN 的特徵圖基礎上,我們採用兩個分支分別預測 anchor 位置和形狀,然後結合在一起得到 anchor。之後採用一個 Feature Adaption 模塊進行 anchor 特徵的調整,得到新的特徵圖供之後的預測(anchor 的分類和回歸)使用。整個方法可以 end-to-end training,而且相比之前只是增加了 3 個 1x1 conv 和一個 3x3 deformable conv,帶來的模型參數量的變化很小。
位置預測
位置預測分支的目標是預測哪些區域應該作為中心點來生成 anchor,是一個二分類問題。不同於 RPN 或者 segmentation 的分類,這裡我們並不是預測每個點是前景還是背景,而是預測是不是物體的中心。
我們將整個 feature map 的區域分為物體中心區域,外圍區域和忽略區域,大概思路就是將 ground truth 框的中心一小塊對應在 feature map 上的區域標為物體中心區域,在訓練的時候作為正樣本,其餘區域按照離中心的距離標為忽略或者負樣本,具體設計在 paper 里講得比較清楚。通過位置預測,我們可以篩選出一小部分區域作為 anchor 的候選中心點位置,使得 anchor 數量大大降低。在 inference 的時候,預測完位置之後,我們可以採用 masked conv 替代普通的 conv,只在有 anchor 的地方進行計算,可以進行加速。
形狀預測
形狀預測分支的目標是給定 anchor 中心點,預測最佳的長和寬,這是一個回歸問題。按照往常做法,當然是先算出 target,也就是該中心點的 anchor 最優的 w 和 h,然後用 L1/L2/Smooth L1 這類 loss 來監督。然而這玩意的 target 並不好計算,而且實現起來也會比較困難,所以我們直接使用 IoU 作為監督,來學習 w 和 h。既然我們算不出來最優的 w 和 h,而計算 IoU 又是可導的操作,那就讓網路自己去優化使得 IoU 最大吧。後來改用了 bounded IoU Loss,但原理是一樣的。
這裡面還有個問題,就是對於某個 anchor,應該優化和哪個 ground truth 的 IoU,也就是說應該把這個 anchor 分配給哪個 ground truth。對於以前常規的 anchor,我們可以直接計算它和所有 ground truth 的 IoU,然後將它分配給 IoU 最大的那個 gt。但是很不幸現在的 anchor 的 w 和 h 是不確定的,是一個需要預測的變數。我們將這個 anchor 和某個 gt 的 IoU 表示為
當然我們不可能真的把所有可能的 w 和 h 遍歷一遍然後求 IoU 的最大值,所以採用了近似的方法,也就是 sample 一些可能的 w 和 h。理論上 sample 得越多,近似效果越好,但出於效率的考慮,我們 sample 了常見的 9 組 w 和 h。我們通過實驗發現,最終結果對 sample 的組數這個超參並不敏感,也就是說不管 sample 多少組,近似效果已經足夠。
生成 anchor
在得到 anchor 位置和中心點的預測之後,我們便可以生成 anchor 了,如下圖所示。這時的 anchor 是稀疏而且每個位置不一樣的。採用生成的 anchor 取代 sliding window,AR (Average Recall) 已經可以超過普通 RPN 4 個點了,代價僅僅是增加兩個 1x1 conv。
Feature Adaption
故事本可以就此結束,我們用生成的 anchor 和之前的特徵圖來進行 anchor 的分類和回歸,漲點美滋滋。但是我們發現一個不合理的地方,大家都是同一層 conv 的特徵,憑啥我就可以比別人優秀一些,代表一個又長又大的 anchor,你就只能代表一個小小的 anchor。
不合理的原因一方面在於,在同一層 conv 的不同位置,feature 的 receiptive field 是相同的,在原來的 RPN 裡面,大家都表示相同形狀的 anchor,所以相安無事,但是現在每個 anchor 都有自己獨特的形狀大小,和 feature 就不是特別好地 match。另一方面,對原本的特徵圖來說,它並不知道形狀預測分支預測的 anchor 形狀,但是接下來的分類和回歸卻是基於預測出的 anchor 來做的,可能會比較懵逼。
我們增加了一個 Feature Adaption 模塊來解決這種問題。思路很簡單,就是把 anchor 的形狀信息直接融入到特徵圖中,這樣新得到的特徵圖就可以去適應每個位置 anchor 的形狀。我們利用一個 3x3 的 deformable convolution 來修正原始的特徵圖,而 deformable convolution 的 offset 是通過 anchor 的 w 和 h 經過一個 1x1 conv 得到的。(此處應該劃重點,如果是像正常的 deformable convolution 一樣,用特徵圖來預測 offset,則提升有限,因為沒有起到根據 anchor 形狀來 adapt 的效果)
通過這樣的操作,達到了讓 feature 的有效範圍和 anchor 形狀更加接近的目的,同一個 conv 的不同位置也可以代表不同形狀大小的 anchor 了。從表格可以看到,Feature Adaption 還是很給力的,帶來了接近 5 個點的提升。
高質量 proposal 的正確打開方式
故事到這裡其實也可以結束了,但是我們遇到了和之前一些改進 proposal 的 paper 里相同的問題,那就是 proposal 質量提升很多(如下圖),但是在 detector 上性能提升比較有限。在不同的檢測模型上,使用 Guided Anchoring 可以提升 1 個點左右。明明有很好的 proposal,但是 mAP 卻沒有漲很多,讓人十分難受。
經過一番探究,我們發現了以下兩點:1. 減少 proposal 數量,2. 增大訓練時正樣本的 IoU 閾值(這個更重要)。既然在 top300 裡面已經有了很多高 IoU 的 proposal,那麼何必用 1000 個框來訓練和測試,既然 proposal 們都這麼優秀,那麼讓 IoU 標準嚴格一些也未嘗不可。
這個正確的打開方式基本是 Jiaqi 獨立調出來的,讓 performance 一下好看了很多。通過這兩個改進,在 Faster R-CNN 上的漲點瞬間提升到了 2.7 個點(沒有加任何 trick),其他方法上也有大幅提升。
談談 anchor 設計準則
我們在 paper 里提到了 anchor 設計的兩個準則,alignment(中心對齊) 和 consistency(特徵一致)。其中 alignment 是指 anchor 的中心點要和 feature 的位置對齊,consistency 是指 anchor 的特徵要和形狀匹配。
Alignment
由於每個 anchor 都是由 feature map 上的一個點表示,那麼這個 anchor 最好是以這個點為中心,否則位置偏了的話,這個點的 feature 和這個 anchor 就不是非常好地對應起來,用該 feature 來預測 anchor 的分類和回歸會有問題。我們設計了類似 cascade/iterative RPN 的實驗來證明這一點,對 anchor 進行兩次回歸,第一次回歸採用常規做法,即中心點和長寬都進行回歸,這樣第一次回歸之後,anchor 中心點和 feature map 每一個像素的中心就不再完全對齊。我們發現這樣的兩次 regress 提升十分有限。所以我們在形狀預測分支只對 w 和 h 做預測,而不回歸中心點位置。
Consistency
這條準則是我們設計 feature adaption 的初衷,由於每個位置 anchor 形狀不同而破壞了特徵的一致性,我們需要通過 feature adaption 來進行修正。這條準則本質上是對於如何準確提取 anchor 特徵的討論。對於兩階段檢測器的第二階段,我們可以通過 RoI Pooling 或者 RoI Align 來精確地提取 RoI 的特徵。但是對於 RPN 或者單階段檢測器的 anchor 來說,由於數量巨大,我們不可能通過這種 heavy 的方法來實現特徵和框的精確 match,還是只能用特徵圖上一個點,也就是 512x1x1 的向量來表示。那麼 Feature Adaption 起到了一個讓特徵和 anchor 對應更加精確的作用,這種設計在其他地方也有可以借鑒之處。
總結
在 anchor 設計中,alignment 和 consistency 這兩個準則十分重要。
採用兩個 branch 分別預測 anchor 的位置和形狀,不需要預先定義。
利用 anchor 形狀來 adapt 特徵圖。
高質量 proposal 可以使用更少的數量和更高的 IoU 進行訓練。
即插即用,無縫替換。
關於 code
預計在三月底或者四月的某個時候 release 在 mmdetection (https://github.com/open-mmlab/mmdetection) 里,歡迎 watch。
Arxiv 鏈接
https://arxiv.org/abs/1901.03278
※鬧元宵對成語搭上區塊鏈!
※野望粵港澳大灣區未來16年,產業界如何落子?
TAG:雷鋒網 |