作者 | ronghuaiyang
來源 | AI公園
導讀:這是眾多Anchor Free中比較有影響力的一篇文章,不光是效果好,而且思路清楚,簡單,不需要任何trick,並將眾多的視覺任務統一到了一個框架中,值得一看。
介紹
基於anchor的物體檢測器的缺點,這個基本上每篇anchor free的文章都會列一遍。
檢測性能依賴於anchor的尺寸,比例,數量,這些都需要非常精細的設計。一旦anchor設計好了,尺寸,比例就固定了,在物體的尺寸和比例多樣性非常大的時候會有困難,特別是小物體。預設的anchor的泛化能力也有限,對於新的任務,需要重新去設計anchor。為了有高recall,需要設計非常密集的anchor,FPN中的anchor數量就超過了160k,而且大部分都是負樣本,正負樣本非常的不均衡。在計算的時候需要計算IOU,非常的複雜。現在的各種計算機視覺的任務,比如分割,深度預測,關鍵點加測,計數等等,都是全卷積的結構,就物體檢測是個例外。那麼,很自然的就有了一個問題:我們能不能把物體檢測也變成類似分割那樣的逐像素的預測問題呢?這樣的話,這些視覺相關的任務就都統一成了一個架構了,所以說,這篇文章就是幹了這麼個事情。
之前也有過類似的嘗試,直接再feature map的每個空間位置上回歸出一個4D Vector,外加一個類別,不過這些方法在文本檢測中用的較多,因為當物體間的包圍框重疊比較多的時候,某一個點就不知道去回歸哪一個了。如圖1:
圖1:左邊是FCOS預測的4個向量,右邊是當特徵圖的某個位置同時位於兩個物體內部的時候,這個位置就不知道去回歸哪個物體了。
我們仔細的研究了這個問題,發現使用全卷積的方案是可以很大程度上解決的,後面我們具體去看。我們的新框架的優點如下:
將物體檢測和其他視覺任務的框架進行了統一檢測不需要建議區域,也不需要anchor了。由於不需要anchor了,所以也沒有了IOU之類的複雜計算了,訓練更快了,所需要的的內存也更少了。我們得到了STOA的結果,而且FCOS也可以用到二階段的檢測方案中,而且效果比基於anchor的方案更好。我們覺得可以重新考慮下anchor在物體檢測中的必要性。可以非常方便的將檢測框架擴展到分割,關鍵點檢測等其他視覺任務上。
方法
全卷積一階段物體檢測
我們把第i層的特徵圖記做Fi,它相對於輸入圖像的stride為s,輸入圖像的groundtruth bbox記為{Bi},Bi=(x0,y0,x1,y1,c),其中(x0,y0)和(x1,y1)分別為左上角和右下角的坐標,c為物體的類別。對於Fi的每個位置(x,y),我們可以映射會輸入圖像中,映射成一個範圍(s/2+xs, s/2+ys),對於基於anchor的物體檢測方法,我們把這個位置作為anchor box的中心點,然後去回歸目標box相對於這些anchor box的偏差。而我們這裡直接在這個位置上回歸目標box,換句話說,我們在訓練中是把這些位置當成是樣本,而不是anchor box,這個和分割是一樣。
如果位置(x,y)落入到某個groundtruth box中,而且類別也和groundtruth box的類別一樣,那它就是正樣本,否則就是負樣本,而且c=0(背景)。除了類別標籤之外,我們在這個位置上還會回歸一個4D的向量,t=(l,t,r,b),其中,l,t,r,b分別是這個位置點到bbox的4個邊的距離,如圖1(左)所示。如果這個位置同時落入到好幾個bbox中,那這種就認為是模糊樣本。我們簡單的選擇一個面積最小的bbox作為它回歸的目標。下面,我們會展示一個多level的預測方法,這種模糊樣本的數量會大大的減少,這樣幾乎不會影響檢測的性能。這樣,如果位置(x,y)和一個bbox Bi相關聯起來,那麼在訓練的時候,我們的回歸目標可以這樣來表示:
這裡值得注意的是,FCOS可以利用任意多的前景樣本來訓練這個回歸,而基於anchor的方法只選取哪些和groundtruth box的IOU大於一定閾值的anchor作為正樣本進行訓練。我們認為這也許是FCOS效果比anchor based的模型好的原因之一。
網絡的輸出 對於coco的數據集,有80個類,我們需要輸出一個80維的分類向量和一個4維的t=(l,t,r,b),分類的時候,我們沒有用多分類的方法,而是訓練了C個二分類器,參考了RetinaNet,我們主幹feature map後面對於分類和回歸分別加了4個卷積層,作為兩個不同分支。由於回歸的目標值永遠是正的,我們用exp(x)將輸出映射到(0, ∞)。值得注意的是,FCOS的輸出要比基於anchor的方法(使用9個anchor)小了9倍。
損失函數 定義如下:
其中Lcls是focal loss,Lreg是UnitBox中使用的IOU loss,Npos表示正樣本的數量,λ用來做loss之間的平衡,文中用的值是1。
推理 推理的時候很直接,我們可以每個位置的類別預測pxy和每個位置的回歸預測txy,我們選擇p>0.05的作為正樣本,將其回歸值轉化為bbox的預測。
使用FPN進行多level的預測
這裡我們解決了FCOS的兩個問題:
在最後的特徵圖中,大的stride,比如16,對於anchor based檢測器,這樣會導致較低的best possible recall(BPR),但是對於FCOS,大的stride不會降低BPR,而且,使用了multi-level FPN來預測的話,還可以進一步提升BPR。重疊的物體會導致模糊匹配,這也可以通過multi-level FPN來很好的解決。我們用FPN在不同的level上檢測不同尺寸的物體,具體結構如圖2,
和基於anchor的方法通過在不同的level上設置不同尺寸的anchor的方式,將不同尺寸的物體分配到不同level的特徵圖上去檢測。我們這裡更加直接一點,直接對每個level限制物體尺寸的範圍。具體來說,我們首先在每個位置上都計算出目標的l,t,r,b,如果max(l,t,r,b) > mi,或者max(l, t, r, b) < mi-1的話,就將這個位置設置為負樣本。這裡mi是在第i個level上需要去回歸的最大距離。這裡,我們將m2,m3,m4,m5,m6,m7設置為0,64,128,256,512和∞。這樣一來,不同尺寸的物體就被分配到了不同的level的特徵圖上去進行檢測了,由於大部分overlap的都是不一樣的尺寸,所以不會出現模糊匹配的問題。如果還是有某個位置匹配到多個groundtruth的情況,那麼我們就匹配面積最小的那個。
最後,我們對於不同level的特徵圖,共享同一個檢測頭,如圖2,但是,由於不同的level回歸的是不同的尺寸,共享同一個檢測頭貌似不是很合理,所以我們又做了點修改,將exp(x)修改為exp(six),加入了一個可訓練的尺度參數si,自動的調整exp的輸出大小,這個改動對檢測性能有小的提升。
FCOS的Center-ness
我們發現,在訓練的時候,會出現大量的距離物體中心點很遠的低質量的預測框。這會降低模型的性能。我們用了一個簡單有效的方法來抑制這種低質量的預測框。我們加了一個分支來預測位置的center-ness,這個center-ness描述了負責檢測這個物體的位置到這個物體的中心的歸一化的距離,計算方式如下:
用sqrt來減慢center-ness的衰減,center-ness的範圍是0~1,用二分類交叉熵來訓練。測試的時候,通過它乘上類別得分來對檢測出的bbox進行排序,這樣,遠離中心的那些預測框的分數會減小,這樣做nms的時候,就可以去過濾掉這些檢測框,顯著提升檢測性能。
還有種center-ness的替代方案,就是只使用中心區域作為groundtruth,但是這樣需要一個超參數,將這兩種方式結合起來,可以得到更好的結果。
實驗
消融實驗
使用FPN進行Multi-level的預測對於BRP的效果:
對模糊樣本的影響:
是否使用Center-ness使用了Center-ness前後的效果:
anchor base的檢測器RetinaNet使用了2個閾值來進行正負樣本的選擇,如果同時使用center-ness和閾值的話,還能提升性能,下面給出了一些額外的優化方法及其效果:
和anchor based的檢測器的比較和RetinaNet的比較見上面的圖3。
和其他的檢測器的比較
擴展到RPN上
用FCOS來代替FPN中的RPN網絡的效果: