特徵金字塔網路Feature Pyramid Networks
小目標檢測很難,為什麼難.想象一下,兩幅圖片,尺寸一樣,都是拍的紅綠燈,但是一副圖是離得很近的拍的,一幅圖是離得很遠的拍的,紅綠燈在圖片裡只佔了很小的一個角落,即便是對人眼而言,後者圖片中的紅綠燈也更難識別.
說回到cnn,不斷地卷積以後,feature map的尺寸變小.這時候feature map所代表的語義資訊已經很豐富了,如果繪圖繪製出來,可能會看見代表的是某種形狀,顏色,或更高階的更抽象的概念了.但是由於feature map尺寸減小,所以檢測小目標困難.
我們可以用同一圖片,不同尺寸內容相同的同一幅圖分別訓練多個feature map,但是這麼搞會及其耗時,並且需要大量記憶體.在實時性要求高的場景下是不能這麼搞的.這就引入了FPN的概念
Feature Pyramid Networks (FPN)
特徵金字塔網路(FPN)是根據特徵金字塔概念設計的特徵提取器,目的是提高精度和速度.它替代了類如Faster R-CNN中的特徵提取器,並且生成更高質量的特徵圖金字塔.
經過一系列的卷積以後得到了feature map,我們通過上取樣,再一步步還原回去,在保證高階語義資訊沒丟的情況下,還把feature map的size搞大了.然後用大size的feature map去檢測小目標.從而解決小目標難以檢測的問題.
FPN由自下而上和自上而下兩部分構成.自下而上的就是傳統的卷積網路做特徵提取,隨著卷積的深入,空間解析度減少,空間資訊丟失.但是高階語義資訊被更多地檢測到.
ssd從依據多個feature map來做預測,但是底層的layer並沒有選中做object detetion.底層的具有high resolution,但是不具備高階語義high semantic.ssd為了提高速度,在predict的時候不用比較底層的feature map.這一點也導致了它對小目標的檢測效果不好.
FPN提供了一種自上而下的路徑,去構建higher resolution layer from a semantic rich layer.
這樣構建出來的層具有high resolution的同時又有豐富的語義rich semantic.但是由於經過了不斷地上取樣下采樣,object的位置已經不準確了.
所以我們在重新構建出來的層和相應的feature map之間構建橫向連線,以使得檢測器可以更好地預測location.
下面是自下而上和自上而下的路徑圖.P2,P3,P4,P5是object detection所需的金字塔feature map.
FPN with RPN
FPN本身並不是object detetcor.它只是一個feature detetor.下圖顯示FPN在一個object detector中的位置和作用. 每一個feature map(P2到P5)被獨立地送到後續的流程完成object detection.
FPN with Fast R-CNN or Faster R-CNN
通過FPN,生成了feature map的金字塔(也就是一堆不同尺寸的特徵圖,都具有高階語義).然後用RPN生成ROI.然後對不同尺寸的目標,選用不同尺寸的特徵圖去做識別.小目標要用大尺寸的feature map. 大目標用小尺寸的feature map.很好理解,目標很小,你再用小尺寸(低解析度)的feature map,肯定更難看清目標了.
參考:https://medium.com/@jonathan_hui/what-do-we-learn-from-single-shot-object-detectors-ssd-yolo-fpn-focal-loss-3888677c5f4d