天天看點

深度學習: 從 RoIPooling 到 RoIAlign

SPP Layer

對RoI進行pooling的操作最早由SPPNet中的SPP layer提出:

深度學習: 從 RoIPooling 到 RoIAlign

對RoI進行pooling,使得檢測網絡可以輸入任意size的圖檔。因為從輸入圖檔到fc之間契入了對RoI的pooling,使得fc的存在也無法寫死輸入圖檔的size。

RoIPooling

2015年,Ross Girshick大神在Fast R-CNN中繼承了SPP layer的精髓,并簡化了該設計,提出了RoIPooling。旨在滿足一次性訓練 feature map的前提下,替代 R-CNN 中 wraped region 的功能:

深度學習: 從 RoIPooling 到 RoIAlign

方位

在 Faster R-CNN 中,anchor經過優勝劣汰更新為RoI ,之後 輸入 RoIPooling 進行 size歸一化 。其中,RoIPooling 的 位置 如下:

深度學習: 從 RoIPooling 到 RoIAlign

缺陷

百密一疏。由于 RoIPooling 采用的是 INTER_NEAREST(即最近鄰插值) ,即在resize時,對于 縮放後坐标不能剛好為整數 的情況,采用了 粗暴的四舍五入,相當于選取離目标點最近的點。

RoIAlign

誕生

Kaiming He 在他的論文Mask RCNN裡指出,這樣做會在一定程度上損失 空間對稱性(Alignment),是以他們把 最近鄰插值 換成了 雙線性插值 。換完插值法的 RoIPooling 就有了一個更加高大上的名字 —— RoIAlign :

深度學習: 從 RoIPooling 到 RoIAlign

弊端

SPP Layer及其後繼的RoI Pooling、RoI Align的出現,使得Detection算法可以享受到“共享特征抽取”,進而免去了前半段網絡的重複計算;然而該設計也導緻了一個問題——後半段變成了RoI-wise subnetwork,依然無法共享計算,每輸入一個RoI都需重複一次。

R-FCN針對這個痛病,将處理位置資訊的任務交給了 “ position-sensitive score map ” (位置敏感得分圖) 來做,進而炒了RoI Pooling的鱿魚。

插值法

具體關于 雙線性插值 的介紹可參見我的另一篇部落格:圖像處理: 五種 插值法。

[1] 論文閱讀: R-FCN

[2] 圖像處理: 五種 插值法