SPPNet、roi pooling 和 average pooling之間的差別,都是起到對任意大小的輸入産生固定的輸出的作用。其中SPPNet、roi pooling是一樣的。
下面對ROI Pooling 進行詳解:
- ROI是Region of Interest的簡寫,指的是在“特征圖上的框”;
- POOling是一個池化操作。
可以再了解一下這個概念【region proposal】:
給定一張輸入image找出objects可能存在的所有位置。這一階段的輸出應該是一系列object可能位置的bounding box。這些通常稱之為region proposals或者 regions of interest(ROI)。
ROI Pooling的輸入
輸入有兩部分組成:
- 特征圖:通過神經網絡的特征圖feature map;
- rois:在Fast RCNN中,指的是Selective Search的輸出;在Faster RCNN中指的是RPN的輸出,一堆矩形候選框框,size為[1x5x1x1](4個坐标+索引index),其中值得注意的是:坐标的參考系不是針對feature map這張圖的,而是針對原圖的(神經網絡最開始的輸入)左上角和右下角坐标。
ROI Pooling的輸出
輸出是batch個vector,其中batch的值等于RoI的個數,vector的大小為channel * w * h;RoI Pooling的過程就是将一個個大小不同的box矩形框,都映射成大小固定(w * h)的矩形框。
ROI pooling具體操作
- 根據輸入image,将ROI映射到feature map對應位置;
- 将映射後的區域劃分為相同大小的sections(sections數量與輸出的次元相同);
- 對每個sections進行max pooling操作。
下面拿官網的圖來舉個栗子吧~假設我們要對一個8*8大小的feature map進行ROI pooling操作,其1含有一個ROI,需要輸出大小為2*2.
- 輸入的feature map 如下
-
region proposal 投影之後位置(左上角,右下角坐标):(0,3),(7,8)。
我們先把roi中的坐标映射到feature map上,映射規則比較簡單,就是把各個坐标除以“輸入圖檔與feature map的大小的比值”,得到了feature map上的box坐标。
- 将其劃分為(2*2)個sections(因為輸出大小為22),通過第二步,我們可以發現,所得到的矩形框大小為5x7,輸出為2x2,是以在57的特征圖劃分成2*2的時候不是等分的,行是5/2,第一行得到2,剩下的那一行是3,列是7/2,第一列得到3,剩下那一列是4。是以,我們可以把這個矩形這樣劃分:
- 然後對這個2x2的區域進行max pooling操作。
下面是一個動态圖,可以更形象的說明整個roi pooling的過程:
參考:
- Region of interest pooling explained
- ROI Pooling層解析