SPP Layer
對RoI進行pooling的操作最早由SPPNet中的SPP layer提出:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMyYTMvw1dvwlMvwlM3VWaWV2Zh1Wa-cmbw5iZ6NHMylGZ4cWNvwFN5EzM0QzMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
對RoI進行pooling,使得檢測網絡可以輸入任意size的圖檔。因為從輸入圖檔到fc之間契入了對RoI的pooling,使得fc的存在也無法寫死輸入圖檔的size。
RoIPooling
2015年,Ross Girshick大神在Fast R-CNN中繼承了SPP layer的精髓,并簡化了該設計,提出了RoIPooling。旨在滿足一次性訓練 feature map的前提下,替代 R-CNN 中 wraped region 的功能:
方位
在 Faster R-CNN 中,anchor經過優勝劣汰更新為RoI ,之後 輸入 RoIPooling 進行 size歸一化 。其中,RoIPooling 的 位置 如下:
缺陷
百密一疏。由于 RoIPooling 采用的是 INTER_NEAREST(即最近鄰插值) ,即在resize時,對于 縮放後坐标不能剛好為整數 的情況,采用了 粗暴的四舍五入,相當于選取離目标點最近的點。
RoIAlign
誕生
Kaiming He 在他的論文Mask RCNN裡指出,這樣做會在一定程度上損失 空間對稱性(Alignment),是以他們把 最近鄰插值 換成了 雙線性插值 。換完插值法的 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] 圖像處理: 五種 插值法