小目標檢測很難,爲何難.想象一下,兩幅圖片,尺寸同樣,都是拍的紅綠燈,可是一副圖是離得很近的拍的,一幅圖是離得很遠的拍的,紅綠燈在圖片裏只佔了很小的一個角落,即使是對人眼而言,後者圖片中的紅綠燈也更難識別.網絡
說回到cnn,不斷地卷積之後,feature map的尺寸變小.這時候feature map所表明的語義信息已經很豐富了,若是繪圖繪製出來,可能會看見表明的是某種形狀,顏色,或更高級的更抽象的概念了.可是因爲feature map尺寸減少,因此檢測小目標困難.ui
咱們能夠用同一圖片,不一樣尺寸內容相同的同一幅圖分別訓練多個feature map,可是這麼搞會及其耗時,而且須要大量內存.在實時性要求高的場景下是不能這麼搞的.這就引入了FPN的概念
設計
特徵金字塔網絡(FPN)是根據特徵金字塔概念設計的特徵提取器,目的是提升精度和速度.它替代了類如Faster R-CNN中的特徵提取器,而且生成更高質量的特徵圖金字塔.
通過一系列的卷積之後獲得了feature map,咱們經過上採樣,再一步步還原回去,在保證高級語義信息沒丟的狀況下,還把feature map的size搞大了.而後用大size的feature map去檢測小目標.從而解決小目標難以檢測的問題.blog
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的位置已經不許確了.it
因此咱們在從新構建出來的層和相應的feature map之間構建橫向鏈接,以使得檢測器能夠更好地預測location.
io
下面是自下而上和自上而下的路徑圖.P2,P3,P4,P5是object detection所需的金字塔feature map.
ast
FPN自己並非object detetcor.它只是一個feature detetor.下圖顯示FPN在一個object detector中的位置和做用. 每個feature map(P2到P5)被獨立地送到後續的流程完成object detection.
object
經過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