深度學習中處理目標多尺度
本文使用 Zhihu On VSCode 創作併發布
視覺任務中處理多尺度主要有兩類方式:影象金字塔和特徵金字塔。目前的方法大多基於特徵金字塔實現對多尺度目標的處理。
圖1
1 影象金字塔
如圖1a,其核心在於將影象降取樣到不同的尺度,然後分別進行後續的處理。
傳統的影象處理/目標檢測方法多使用影象金字塔處理多尺度問題。早期的深度學習方法也使用這種方法處理多尺度目標。但是對不同尺度的影象分別進行CNN提取特徵會造成較長的耗時和較大的記憶體消耗。
2 多尺度特徵融合
2。1 並行的多分支結構
比如Inception基本模組,使用不同大小的卷積核以及池化,獲得不同大小的感受野,最後對4個通道進行組合。
Inception基本模組
又比如ASPP,使用不同空洞率的空洞卷積獲取不同的感受野,最後將這些不同感受野的圖特徵圖進行組合。
Image
又如在PSPNet中的操作,直接使用不同大小的池化來獲得不同大小的感受野,相比於不同大小卷積核的普通卷積和不同空洞率的空洞卷積,操作更為簡便。
Image
2。2 序列的多尺度結構
這種多尺度結構設計主要透過上取樣後的跨層連線來實現特徵組合,這一點與FPN類似。
例如FCN,不同尺度的特徵圖經過上取樣之後與上一層次的特徵圖進行融合。
FCN網路結構
又如U-Net,低解析度的特徵圖經過上取樣之後與高解析度的特徵圖融合。
U-Net網路結構
一般來說,並行的多尺度結構可以在同一個層級的特徵圖上融合不同感受野的特徵,而序列的多尺度結構是將低解析度的特徵圖融合到高解析度中。
3 多尺度特徵預測:金字塔形狀的特徵分層
這種方法的基本思想是對不同尺度的特徵圖同時進行預測。
如圖1c,每層分別預測對應尺度解析度的檢測結果。這樣做的問題在於直接強行讓不同層學習同樣的語義資訊。而在CNN中,不同層學到的語義資訊不同,淺層更多學到細節特徵,而深層更多學到語義特徵,這樣使用淺層的特徵圖語義資訊較少,雖然框出了小物體,但小物體很容易被錯分。
使用這種方法的網路包括SSD,在不同stride、不同大小的特徵圖上進行預測,低層特徵圖解析度較高,期望檢測處較小的目標;高層特徵圖解析度較低,期望檢測處較大的目標。
4 特徵金字塔(Feature Pyramid Pooling, FPN)
FPN
這種方法類似於將多尺度特徵融合和多尺度預測進行結合。
如圖1d和圖FPN,透過上取樣結合側向連線,實現將高層的語義資訊逐步傳播到低層。具體做法是對較高層的特徵進行2倍上取樣,對較低層的特徵使用
卷積改變通道數,然後將二者的結果進行相加。這樣每一層的特徵圖都相當於融合了不同解析度的特徵,從而對對應解析度大小的物體進行檢測,從而使保證每一層都有合適的解析度以及強語義特徵,這樣既可以檢測小目標,又保證了用於分類的較強語義資訊。
FPN的每一個尺度上的感受野不同,對應到原圖中的大小不同,即可以處理不同尺度的目標。此外,這種方法在原有的網路基礎上增加的時間耗費和計算量消耗很少。
在RPN中,FPN輸出的每一個解析度的特徵圖被獨立地送到後續的流程被用於目標檢測。在Fast R-CNN和Faster R-CNN中,對不同尺寸的RoI,會選用不同尺寸的特徵圖進行檢測。
FPN仍然有一些缺陷,包括:
受上取樣方式所限(最近鄰插值),高層的語義資訊不一定 有效傳播到低層。
經過多次下采樣之後,最高層可能已經丟失了關於小目標的語義資訊。
只使用4個stage的輸出,多尺度資訊不一定夠。