簡介:FCOS是典型的one-stage和anchor free結合,並且思路和cornerNet系列的尋找corner不同,借鑑了FCN的思想,通過單個feature上的點來做檢測。該算法是一種基於FCN的逐像素目標檢測算法,實現了無錨點(anchor-free)、無提議(proposal free)的解決方案,並且提出了中心度(Center—ness)的思想,同時在召回率等方面表現接近甚至超過目前很多先進主流的基於錨框目標檢測算法。此外,本算法目前已開源。
一、前言
FCOS是一個基於anchor-free的單階段目標檢測算法。單階段檢測算法的最大優勢就是速度快,而雙階段檢測算法的最大優勢就是精度高。但是這幾年,相比於雙階段的目標檢測算法而言,其實單目標檢測算法得到了更大的落地,主要的原因是因為我們需要將目標檢測這個任務應用到很多終端設備上,比如無人機、機器人、攝像頭等等,而這些設備的計算能力有限,大家一般都會優先去選擇速度較快的yolo或者ssd。除此之外,隨著目標檢測算法的發展,單階段目標檢測算法的精度也得到了大幅度的提升,基本上可以和雙階段檢測算法不相上下,代表性的算法包括CornerNet和FCOS。
二、出發點和FCOS的優點
FCOS摒棄了anchor帶來的一些缺點:
- 用anchor的框架對於anchor的尺寸非常敏感,anchor的尺寸會影響檢測的performance。
- anchor尺寸的固定導致了對網絡對特殊形狀的物體魯棒性較差(一旦數據集發生了變化可能面臨要重新設計anchor)。
- 為了獲得高的recall,要非常密集的堆放anchors,通常大多數的anchor都是負樣本,導致了easy example等一系列問題。
- 大量的anchor增加了計算和顯存消耗(尤其是每個anchor都要計算IOU)。
FCOS的優勢:
- 完全proposal free和anchor free,減少了參數量和計算量。
- 能夠達到one-stage的SOTA,尤其是文中提到FCOS甚至可以用於two-stage的RPN中,並且經測試能為two-stage帶來更好的performance。
- 可以用在很多的instance-wise的問題中,如實例分割,關鍵點檢測等。
三、FCOS算法整體框架
整個算法的實現步驟如下所示:
- 步驟1-對輸入的圖片進行預處理操作;
- 步驟2-搭建如圖所示的網絡架構,將輸入數據送入backbone網絡中獲取輸入數據的feature_map,在feature_map的每一點上面進行迴歸操作,進行網絡訓練獲取網絡模型;
- 步驟3-將預訓練的網絡模型應用到測試圖片中,從特徵金字塔的多個Head中獲得預測的結果;
- 步驟4-使用NMS等後處理操作獲得最終的結果。
四、FCOS算法的實現細節
1、逐像素迴歸預測
FCOS的目標框迴歸方式,不同於傳統的中心點+寬高或者座標點的形式,FCOS通過中心點和一個4D vector來預測物體框的位置。
假設F1是用來做分類的feature map,尺寸為H*W*C,其中C為分類的類別數。設(x,y)為feature map上的任意一點,根據的把這點映射到輸入圖像中的位置上(s/2+xs,s/2+ys)。在anchor-based的方法中,通常認為映射到圖像上的點(s/2+xs,s/2+ys)就是anchor的中心點,然後再基於anchor的位置做迴歸。而FCOS中,摒棄了這種方法,當(x,y)(映射回input image中的位置)能夠落入groundtruth當中,那麼對應位置上的類別會被標註成當前groudtruth的類別(如果是背景則標註為0)。
位置迴歸上則通過Regression對應feature map(x,y)位置上4D vector 向量(l*,t*,r*,b*)來預測框形狀。訓練的時候target可以寫成:
可以看到FCOS中,只要feature map某個位置的點落入groundtruth的bbox中就被認為是正樣本,可見用於訓練的正樣本的數量將會非常的多。作者認為這是FCOS能夠趕超anchor-based方法的重要原因之一。
2、損失LOSS
該loss函數如上圖所示,同樣包含兩部分,Lcls表示分類loss,本文使用的是Focal_loss;Lreg表示迴歸loss,本文使用的是IOU loss。其實兩個loss應當是當前最好的配置了。
3、多尺度策略
兩個問題:
- 基於錨框的檢測器由於大的步伐導致低召回率,需要通過降低正的錨框所需的交併比分數來進行補償:在FCOS算法中表明,即使是大的步伐(stride),也可以獲取較好的召回率,甚至效果可以優於基於錨框的檢測器。
- 真實邊框中的重疊可能會在訓練過程中造成難以處理的歧義,這種模糊性導致基於fcn的檢測器性能下降:在FCOS中 ,採用多級預測方法可以有效地解決模糊問題,與基於錨框的模糊檢測器相比,基於模糊控制器的模糊檢測器具有更好的性能。
為了解決真實邊框重疊帶來的模糊性和低召回率,FCOS採用類似FPN中的多級檢測,就是在不同級別的特徵層檢測不同尺寸的目標。
如上圖所示,FCOS算法使用了{P3, P4, P5, P6, P7}這五個尺度的特徵映射。其中P3、P4、P5由主幹CNNs網絡的特徵層 C3、C4、C5經過一個1*1的卷積得到的,而,P6、P7則是接著P5進行了步長為2的卷積操作得到的(相當於降採樣,看註解)。最終對這五個尺度都做逐像素迴歸。
為了能夠更好的利用這種多尺度特徵,在每一個尺度的特徵層都限定了邊界框迴歸的範圍,不讓其野蠻生長。(基於anchor的檢測網絡也有類似策略,比如YOLOv3中將不同大小的anchor分配到不同特徵層級中作迴歸)更具體地說,作者首先計算所有特徵層上每個位置的迴歸目標
- 第一:計算當前層級中的迴歸目標:l、t、r、b。
- 第二:判斷max(l, t, r, b) > mi 或者 max(l, t, r, b) < mi -1是否滿足。
- 第三:若滿足,則不對此邊界框進行迴歸預測。
- 第四:mi是作為當前尺度特徵層的最大回歸距離。
即在FPN結構中,不同大小的目標被分配到不同層的feature做檢測,這樣可以有效的避免目標框重疊的問題。同時FPN可以提高召回率,解決了 low BPR的問題。
4、center-ness
由於FCOS算法使用了逐像素迴歸策略,只要feature上的點落在groundtruth的框內就被認為是正樣本,因此FCOS中採用了大量的正樣本,會產生大量的low-quality 的bounding box,為了解決這個問題,有必要對檢測出的bounding box的質量做一個篩選。基於此,作者提出了一個簡單而有效的策略center ness來抑制這些低質量檢測到的邊界框,且該策略不引入任何超參數。
如上圖所示,center-ness策略在每一個層級預測中添加了一個分支,該分支與分類並行,相當於給網絡添加了一個損失,而該損失保證了預測的邊界框儘可能的靠近中心。該損失的公式如下:
center-ness(可以理解為一種具有度量作用的概念,在這裡稱之為"中心度"),中心度取值為0,1之間,使用交叉熵損失進行訓練。並把損失加入前面提到的損失函數中。測試時,將預測的中心度與相應的分類分數相乘,計算最終得分(用於對檢測到的邊界框進行排序)。因此,中心度可以降低遠離對象中心的邊界框的權重。因此,這些低質量邊界框很可能被最終的非最大抑制(NMS)過程濾除,從而顯著提高了檢測性能。
五、FCOS算法與anchor-based的檢測算法不同之處和相似之處
1、相似之處:
第一點:
- anchor-based算法將輸入圖像上的位置作為錨框的中心點,並且對這些錨框進行迴歸。
- FCOS直接對feature map中每個位置對應原圖的邊框都進行迴歸,換句話說FCOS直接把每個位置都作為訓練樣本,這一點和FCN用於語義分割相同。
第二點:
- 在訓練過程中,anchor-based算法對樣本的標記方法是,如果anchor對應的邊框與真實邊框(ground truth)交併比大於一定閾值,就設為正樣本,並且把交併比最大的類別作為這個位置的類別。
- 在FCOS中,如果位置 落入任何真實邊框,就認為它是一個正樣本,它的類別標記為這個真實邊框的類別。
2、相似處:
FCOS算法訓練的目標函數同樣包括兩個部分:位置損失和類別損失。
網絡效果: FCOS與其他最先進的two-stage或one-stage目標檢測算法的比較。在相同主幹網絡的情況下,FCOS的性能比基於anchor的RetinaNet高出1.9%。FCOS的性能也優於最近推出的無anchor的one-stage檢測網絡CornerNet,且設計複雜度大大降低。
閱讀更多 計算機視覺糖小白 的文章