FPN詳解


  作者提出的多尺度的object detection算法:FPN(feature pyramid networks)。原來多數的object detection算法都只是采用頂層特征做預測,但我們知道底層的特征語義信息比較少,但是目標位置准確;高層的特征語義信息比較豐富,但是目標位置比較粗略。另外雖然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做預測,而FPN不一樣的地方在於預測是不同特征層獨立進行的

  R-CNN系列在單個scale的feature map做檢測,盡管conv已經對scale有些魯棒了,但是還是不夠。物體各種各樣的scale還是是個難題,尤其是小物體,所以有很多論文在這上面做工作,最簡單的做法就是類似於數據增強了,train時把圖片放縮成不同尺度送入網絡進行訓練,但是圖片變大很吃內存,一般只在測試時放縮圖片,這樣一來測試時需要測試好幾遍實踐就慢了。另一種是SSD的做法,在不同尺度的feature map上做檢測,按理說它該在計算好的不同scale的feature map上做檢測,但是它放棄了前面的low-level的feature map,而是從conv4_3開始用而且在后面加了一些conv,生成更多高層語義的feature map在上面檢測(我猜想是因為這些low-level的feature map一是太大了很大的拖慢SSC最追求的速度,二是這些low-level的語義信息太差了,效果沒太大提升)。所以FPN就想既利用conv net本身的這種已經計算過的不同scale的feature,又想讓low-level的高分辨的feature具有很強的語義,所以自然的想法就是把high-level的地分辨的feature map融合過來

一,FPN初探

1.1 圖像金字塔

圖1,圖像金字塔

圖2 高斯金字塔效果 

  如上圖所示,這是一個圖像金字塔,做CV的你肯定很熟悉,因為在很多的經典算法里面都有它的身影,比如SIFT、HOG等算法。我們常用的是高斯金字塔,所謂的高斯金字塔是通過高斯平滑和亞采樣獲得一些下采樣圖像,也就是說第K層高斯金字塔通過平滑、亞采樣操作就可以獲得K+1層高斯圖像,高斯金字塔包含了一系列低通濾波器,其截止頻率從上一層到下一層是以因子2逐漸增加,所以高斯金字塔可以跨越很大的頻率范圍。總之,我們輸入一張圖片,我們可以獲得多張不同尺度的圖像,我們將這些不同尺度的圖像的4個頂點連接起來,就可以構造出一個類似真實金字塔的一個圖像金字塔。通過這個操作,我們可以為2維圖像增加一個尺度維度(或者說是深度),這樣我們可以從中獲得更多的有用信息。整個過程類似於人眼看一個目標由遠及近的過程(近大遠小原理)。如圖2所示,我們可以看到一個圖像金字塔,中間是原始圖像,最上邊是下采樣后的圖像,最下邊是上采樣后的圖像。你可以將其對應到圖1中的不同層中。

1.2 為什么需要構造特征金字塔

圖3 特征金字塔  

  前面已經提到了高斯金字塔,由於它可以在一定程度上面提高算法的性能,因此很多經典的算法中都包含它。但是這些都是在傳統的算法中使用,當然也可以將這種方法直應用在深度神經網絡上面,但是由於它需要大量的運算和大量的內存。但是我們的特征金字塔可以在速度(cnn隨着網絡層數增加可直接得到特征金字塔)和准確率之間進行權衡,可以通過它獲得更加魯棒的語義信息,這是其中的一個原因。  

  如上圖所示,我們可以看到我們的圖像中存在不同尺寸的目標,而不同的目標具有不同的特征,利用淺層的特征就可以將簡單的目標的區分開來;利用深層的特征可以將復雜的目標區分開來;這樣我們就需要這樣的一個特征金字塔來完成這件事。圖中我們在第1層(請看綠色標注)輸出較大目標的實例分割結果,在第2層輸出次大目標的實例檢測結果,在第3層輸出較小目標的實例分割結果。檢測也是一樣,我們會在第1層輸出簡單的目標,第2層輸出較復雜的目標,第3層輸出復雜的目標。

1.3 為什么要提出FPN算法

圖4 不同方案的金字塔

  識別不同大小的物體是計算機視覺中的一個基本挑戰,我們常用的解決方案是構造多尺度金字塔。如上圖a所示,這是一個特征圖像金字塔,整個過程是先對原始圖像構造圖像金字塔,然后再圖像金字塔的每一層提出不同的特征,然后進行相應的預測(BB的位置)。這種方法的缺點是計算量大,需要大量的內存;優點是可以獲得較好的檢測精度。它通常會稱為整個算法的性能瓶頸,由於這些原因,當然很少使用這種算法。

  如上圖b所示,這是一種改進的思路,學者們發現我們可以利用卷積網絡本身的特性,即對原始圖像進行卷積和池化操作,通過這種操作我們可以獲得不同尺寸的feature map,這樣其實就類似於在圖像的特征空間中構造金字塔。實驗表明,淺層的網絡更關注於細節信息,高層的網絡更關注於語義信息,而高層的語義信息能夠幫助我們准確的檢測出目標,因此我們可以利用最后一個卷積層上的feature map來進行預測。這種方法的存在於大多數深度網絡中,比如VGG、ResNet、Inception,它們都是利用深度網絡的最后一層特征來進行分類。這種方法的優點是速度快、需要內存少。它的缺點是我們僅僅關注深層網絡中最后一層的特征,卻忽略了其它層的特征,但是細節信息可以在一定程度上提升檢測的精度,因此有了圖c所示的架構。

  圖c所示架構的設計思想就是同時利用低層特征和高層特征,分別在不同的層同時進行預測,這是因為我的一幅圖像中可能具有多個不同大小的目標,區分不同的目標可能需要不同的特征,對於簡單的目標我們僅僅需要淺層的特征就可以檢測到它,對於復雜的目標我們就需要利用復雜的特征來檢測它。整個過程就是首先在原始圖像上面進行深度卷積,然后分別在不同的特征層上面進行預測。它的優點是在不同的層上面輸出對應的目標,不需要經過所有的層才輸出對應的目標(即對於有些目標來說,不需要進行多余的前向操作),這樣可以在一定程度上對網絡進行加速操作,同時可以提高算法的檢測性能。它的缺點是獲得的特征不魯棒,都是一些弱特征(因為很多的特征都是從較淺的層獲得的)。

  終於輪到FPN啦,它的架構如圖d所示,整個過程如下所示:首先我們在輸入的圖像上進行深度卷積,然后對Layer2上面的特征進行降維操作(即添加一層1*1的卷積層),對Layer4上面的特征就行上采樣操作,使得它們具有相應的尺寸,然后對處理后的Layer2和處理后的Layer4執行加法操作(對應元素相加),將獲得的結果輸入到Layer5中去。其背后的思路是為了獲得一個強語義信息,這樣可以提高檢測性能。認真的你可能觀察到了,這次我們使用了更深的層來構造特征金字塔,這樣做是為了使用更加魯棒的信息;除此之外,我們將處理過的低層特征和處理過的高層特征進行累加,這樣做的目的是因為低層特征可以提供更加准確的位置信息,而多次的降采樣和上采樣操作使得深層網絡的定位信息存在誤差,因此我們將其結合其起來使用,這樣我們就構建了一個更深的特征金字塔,融合了多層特征信息,並在不同的特征進行輸出。這就是上圖的詳細解釋。(個人觀點而已)

二,FPN框架解析

2.1 利用FPN構建Faster R-CNN檢測器步驟

  • 首先,選擇一張需要處理的圖片,然后對該圖片進行預處理操作;
  • 然后,將處理過的圖片送入預訓練的特征網絡中(如ResNet等),即構建所謂的bottom-up網絡;
  • 接着,如圖5所示,構建對應的top-down網絡(即對層4進行上采樣操作,先用1x1的卷積對層2進行降維處理,然后將兩者相加(對應元素相加),最后進行3x3的卷積操作,最后);
  • 接着,在圖中的4、5、6層上面分別進行RPN操作,即一個3x3的卷積后面分兩路,分別連接一個1x1的卷積用來進行分類和回歸操作;
  • 接着,將上一步獲得的候選ROI分別輸入到4、5、6層上面分別進行ROI Pool操作(固定為7x7的特征);
  • 最后,在上一步的基礎上面連接兩個1024層的全連接網絡層,然后分兩個支路,連接對應的分類層和回歸層;

圖5 FPN整體架構

  注:層1、2、3對應的支路就是bottom-up網絡,就是所謂的預訓練網絡,文中使用了ResNet網絡;由於整個流向是自底向上的,所以我們叫它bottom-up;層4、5、6對應的支路就是所謂的top-down網絡,是FPN的核心部分,名字的來由也很簡單。

2.2 為什么FPN能夠很好的處理小目標?

 

圖6 FPN處理小目標

如上圖所示,FPN能夠很好地處理小目標的主要原因是:

  • FPN可以利用經過top-down模型后的那些上下文信息(高層語義信息);
  • 對於小目標而言,FPN增加了特征映射的分辨率(即在更大的feature map上面進行操作,這樣可以獲得更多關於小目標的有用信息),如圖中所示;

四,FPN總結

 

  • FPN 構架了一個可以進行端到端訓練的特征金字塔;
  • 通過CNN網絡的層次結構高效的進行強特征計算;
  • 通過結合bottom-up與top-down方法獲得較強的語義特征,提高目標檢測和實例分割在多個數據集上面的性能表現;
  • FPN這種架構可以靈活地應用在不同地任務中去,包括目標檢測、實例分割等;

以下是FPN網絡的架構細節圖。

 

圖9 Faster R-CNN + FPN細節圖

 

轉自:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM