原文鏈接:https://www.cnblogs.com/harrymore/p/14870198.html
1. RoIPool的不足
首先,不管是ROI Pool還是ROIAlign,目的都是提取輸出特征圖上該ROI坐標所對應的特征。RPN網絡得到的ROI坐標是針對輸入圖像大小的,所以首先需要將ROI坐標縮小到輸出特征對應的大小,假設輸出特征尺寸是輸入圖像的1/16,那么先將ROI坐標除以16並取整(第一次量化),然后將取整后的ROI划分成H*W個bin(論文中是 7*7,有時候也用14*14),因為划分過程得到的bin的坐標是浮點值,所以這里還要將bin的坐標也做一個量化,具體而言對於左上角坐標采用向下取整,對於右下角坐標采用向上取整,最后采用最大池化操作處理每個bin,也就是用每個bin中的最大值作為該bin的值,每個bin都通過這樣的方式得到值,最終輸出的H*W大小的ROI特征。從這里的介紹可以看出ROI Pool有兩次量化操作,這兩步量化操作會引入誤差。
例如:原圖上的bbox大小為665x665,經backbone后,spatial scale=1/32。因此bbox也相應應該縮小為665/32=20.78,但是這並不是一個真實的pixel所在的位置,因此這一步會取為20。0.78的差距反饋到原圖就是0.78x32=25個像素的差距。如果是大目標這25的差距可能看不出來,但對於小目標而言差距就比較巨大了。
圖1
因此運用roipool對小目標的預測偏差較大,更不用說運用到像素級精度的語義分割上面了。
2. RoIAlign的計算方法
ROIAlign不再引入量化操作,對於RPN網絡得到的ROI坐標直接除以縮放倍數(比如16),這個過程不進行量化,因此得到的ROI坐標仍是浮點值,然后將ROI划分成H*W個bin,划分得到的bin坐標也是浮點值,不進行量化,接着通過在每個bin中均勻取4個點,這4個點的值通過該bin所包含的點插值計算得到,最后對這4個點求均值或最大值作為這個bin的值,通過這種方式計算每個bin的值后,最終輸出H*W大小的ROI特征。可以看出ROIAlign整個過程沒有采用量化操作,因此大大減少了量化帶來的誤差。
同樣以圖1為例,去圖中小狗的bbox作為例子。
1) Conv layers使用的是VGG16,feat_stride=32(即表示,經過網絡層后圖片縮小為原圖的1/32),原圖800*800,最后一層特征圖feature map大小:25*25。
2) 圖中有一小狗的region proposal,大小為665*665,這樣,映射到特征圖中的大小:665/32=20.78,即20.78*20.78,此時,沒有像RoiPooling那樣就行取整操作,保留浮點數。
3) 假定pooled_w=7,pooled_h=7,即pooling后固定成7*7大小的特征圖,所以,將在 feature map上映射的20.78*20.78的region proposal 划分成49個同等大小的小區域,每個小區域的大小20.78/7=2.97,即2.97*2.97,如下圖所示。
4) 假定采樣點數為4,即表示,對於每個2.97*2.97的小區域,平分四份,每一份取其中心點位置,而中心點位置的像素,采用雙線性插值法進行計算,這樣,就會得到四個點的像素值,如下圖所示:
上圖中,四個紅色叉叉‘×’的像素值是通過雙線性插值算法計算得到的。
最后,取四個像素值中最大值作為這個小區域(即:2.97*2.97大小的區域)的像素值,如此類推,同樣是49個小區域得到49個像素值,組成7*7大小的feature map。
3. 參考
https://zhuanlan.zhihu.com/p/73662410
https://zhuanlan.zhihu.com/p/73138740
(完)



