FCOS:全卷積目標檢測

今天我繼續來介紹一個Anchor-Free新的算法(它是基于密集采樣的AF),這個文章我看下來個人覺得非常有意思。因為它將語義分割的思想用來做檢測了。在學校期間,我的研究方向就是語義分割。在公司做檢測的時候,我也思考過:除了在特征融合以及backbone方面,在核心思想兩者能否互相借鑒一下,比如用分割思想去解決檢測;用檢測去輔助分割(畢竟分割是檢測更深一層次)。這篇文章很好的解答了我的一些疑惑,下面就來對這個文章進行一下分享吧。

1.網絡整體介紹

本文提出了一種全卷積one-stage目標檢測算法(FCOS),以逐像素預測的方式解決目標檢測問題,類似于語義分割。目前最流行的不論是one-stage目標檢測算法,如RetinaNet,SSD,YOLOv3,還是two-stage目標檢測算法,如Faster R-CNN。這兩類算法大都依賴于預定義的錨框(anchor boxes)。相比之下,本文提出的目標檢測算法FCOS不需要錨框。通過消除預定義的錨框,FCOS避免了與錨框相關的復雜計算,例如在訓練期間計算重疊等,并且顯著減少了訓練內存。更重要的是,FCOS還避免了設定與錨框相關的所有超參數,這些參數通常對最終檢測性能非常敏感。FCOS算法憑借唯一的后處理:非極大值抑制(NMS),實現了優于以前基于錨框的one-stage檢測算法的效果。

其實最著名的無anchor的目標檢測網絡是YOLOv1算法(可以算是鼻祖啦),YOLOv1算法告訴大家,回歸網絡也可以進行目標檢測,但是該網絡由于其召回率過低而使其并無太多實用價值,因此YOLO作者在其基礎上提出了基于anchor的YOLOv2,v3算法。而本文提出的FCOS算法相當于保留了無anchor機制,并且引入了逐像素回歸預測,多尺度特征以及center-ness三種策略,主要流程框架如下圖所示,最終實現了在無anchor的情況下效果能夠比肩各類主流基于anchor的目標檢測算法。


2、為什么要提出FCOS以及FCOS的優勢在哪?

作者為什么要提出anchor-free算法FCOS呢,主要的原因如下所示:

??? anchor會引入很多需要優化的超參數, 比如anchor number、anchor size、anchor ratio等;

??? 為了得到一個較高的召回率,基于anchor的檢測器需要在輸入圖像上密集的設置anchors,其中大部分anchor被標記為negative,加劇了正負樣本之間的不平衡問題;

??? 在訓練的時候,需要計算所有anchor box同ground truth boxes的IoU,計算量較大;

FCOS屬于anchor-free類別的算法,且效果在anchor-free派系中算SOTA了。它的主要優點如下:

??? 因為輸出是pixel-based預測,所以可以復用semantic segmentation方向的相關tricks; (這點很討喜)

? ? 可以修改FCOS的輸出分支,用于解決instance segmentation和keypoint detection任務;(這點也很討喜,畢竟要恰飯的嗎嘛(發paper))

3、FCOS算法實現細節詳解

1、FCOS算法和基于anchors的檢測算法的不同之處在哪里?

對于基于anchors的目標檢測算法而言,我們將輸入的圖片送入backbone網絡之后,會獲得最終的feature_map,比如說是17x17x256;然后我們會在該feature_map上的每一位置上使用預先定義好的anchors。YOLOv1中也使用了無anchor策略,但基于YOLOv1在預測邊界框的過程中,提出的cell概念,導致YOLOv1只預測了目標物體中心點附近的點的邊界框。這很顯然預測的框少,召回率(Recall)自然也就低了。基于此,本文提出的FCOS算法為了提升召回率,則對目標物體框中的所有點都進行邊界框預測。當然這種逐像素的邊界框預測肯定會導致最終預測得到的邊界框質量不高,因此作者在后續還會提出彌補策略。FCOS目標檢測算法在邊界框預測中使用的策略和YOLOv1有所不同,FCOS的改動點就在這里,它是直接在feature_map上的每一點進行回歸操作。具體的實施思路如下所示:

首先,我們可以將feature_map中的每一個點(x,y)映射回原始的輸入圖片中;

然后,如果這個映射回原始輸入的點在相應的GT的BB范圍之內,而且類別標簽對應,我們將其作為訓練的正樣本塊,否則將其作為正樣本塊;

接著,我們回歸的目標是(l,t,r,b),即中心點做BB的left、top、right和bottom之間的距離(其主要原因是為了后續使用center-ness做準備的),具體如下圖所示:


接著,如果一個位置在多個BB的內部的話(如上圖右側,人手中拿著一個球拍這種情況),我們可以將其看作一個模糊樣本,針對這樣樣本文中采樣的方法是直接選擇擇面積最小的邊界框作為其回歸目標。由于網絡中FPN的存在,導致這樣的模糊樣本的數量大大減少。

接著,如果這個位置(x,y)和一個BB關聯的話,該位置處的訓練回歸目標可制定為:其中(x0,y0)和(x1,y1)分別表示BB的左上角和右下角坐標值。


接著,由于FCOS算法是基于目標物體框中的點進行逐像素回歸的,因此執行回歸的目標都是正樣本,所以作者使用了exp()函數將回歸目標進行拉伸,我個人認為此操作是為了最終的特征空間更大,辨識度更強。 由于FCOS可以通過這樣方式獲得很多正樣本塊,然后使用這樣正樣本塊進行回歸操作,因此獲得了比較好的性能提升,而原始的基于anchor的算法需要通過計算預設的anchor和對應的GT之間的IOU值,當該IOU值大于設定的閾值 時才將其看做正樣本塊(這樣計算量太大)。

4. 多尺度策略

對于基于anchor的檢測算法,由于較大的降采樣操作而導致的低召回率可以通過降低正anchor所需的IOU閾值(降低心里水平,總會有合適的嘛)做一定程度上的補償,進行召回率的提升。然而對于FCOS算法,如果降采樣的尺度過大,那么網絡不可能回憶起一個在最終特征圖上沒有位置編碼的對象的初始框的,基于此作者提出了基于FPN的多尺度策略。(雖然作者在文中說,即使沒有FPN策略,逐像素檢測網絡在召回率上表現的也不遜色基于anchor的網絡。,但是我個人覺得這點很重要的)


如上圖所示,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結構來在每一層加以限定,因為這兩者之間的尺度相差較大,文章中共有5個區間來限定[0,64][64,128]等等。如果一個像素點在同一層落到了多個GT區域,這樣也會ambiguous。這是作者簡單的會使用最小區域來作為回歸目標。

? ? Note: 由于作者認為,不同的特征層需要回歸不同的尺寸范圍(例如,P3的尺寸范圍為[0,64],P4的尺寸范圍為[64,128],因此在不同的特征層使用相同的輸出激活是不合理的。因此,作者沒有使用標準的exp(x)函數,而是使用exp(si,x)其中si是一個可訓練的標量si,能夠通過si來自動調整不同層級特征的指數函數的基數,這從經驗上提高了檢測性能。

5.center-ness

作者在使用了多尺度檢測后發現仍然和anchor-based的檢測器有很大差距,然后發現FCOS存在大量的低質量的檢測框。這是由于我們把中心點的區域擴大到整個物體的邊框,經過模型優化后可能有很多中心離GT box中心很遠的預測框,為了增加更強的約束基于此,作者提出了一個簡單而有效的策略center-ness來抑制這些低質量檢測到的邊界框,且該策略不引入任何超參數。


如上圖所示,center-ness策略在每一個層級預測中添加了一個分支,該分支與分類并行,相當于給網絡添加了一個損失,而該損失保證了預測的邊界框盡可能的靠近中心。該損失的公式如下,其中l,r,t,b表示的為如下圖左圖中所示的預測值。,使用BCE

loss對center-cess進行優化!


而該策略之所以能夠有效,主要是在訓練的過程中我們會約束上述公式中的值,使得其接近于0,這就導致如下圖中的藍色框中的短邊能夠向黃邊靠近,使得分布在目標位置邊緣的低質量框能夠盡可能的靠近中心。這樣的話,在最終使用該網絡的過程中,非極大值抑制(NMS)就可以濾除這些低質量的邊界框,提高檢測性能。




6.Loss函數


該loss函數如上圖所示,同樣包含兩部分,Lcls表示分類loss,本文使用的是Focal_loss;Lreg表示回歸loss,本文使用的是IOU loss。其實這兩個loss應當是當前最好的配置啦。

7.網絡效果

FCOS與其他最先進的two-stage或one-stage目標檢測算法的比較。在相同主干網絡的情況下,FCOS的性能比基于anchor的RetinaNet高出1.9%。FCOS的性能也優于最近推出的無anchor的one-stage檢測網絡CornerNet,且設計復雜度大大降低。

首先分析FPN結構


可以看出哪些交疊區域,也就是ambiguous sample大大減少了,因此,其AP也上升了很多!將近一倍!

接著分析Center-ness結構


我們可以看到較大物體的AP顯著提高,這就是由于較大物體的中心偏離比較嚴重,總體AP提高了有3點。

然后分析其樣例總數和內存占用


可以看到,樣例總數減少了9倍,內存占用減少了2倍。

與其他模型的比較


8、個人總結

總體來講,FCOS算法確實不錯,精度提高了不少,敢于突破傳統思維,但是卻讓單階段檢測算法的速度變慢了,和RetinaNet做比較提升了兩個點。畢竟它所用的思想是語義分割這種密集分類定位問題,所以速度肯定有影響。不過基于anchor-free的檢測算法應該是目標檢測算法的一個趨勢吧,期待著更驚艷的單階段目標檢測算法的出現。

One—stage? + Anchor-Free + NMS(個人覺得未來的趨勢)

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容