FasterRcnn RoiPooling(Pytorch版本)部分幾個問題的解析:
(1)lib/model/roipooling文件夾中幾個子文件夾的內容:
faster rcnn pytorch中的roi pooling簡介
簡述:
1)src文件夾下是C和CUDA版本的源碼,其中roi_pooling的操作的前向傳播有C和CUDA版本,反向傳播只有CUDA版本;
2)ext文件夾下存儲src文件夾中C/CUDA代碼編譯後的文件的,編譯後的文件可以被Funcitons中的roi_pool.py調用;
3)Functions文件夾下的roi_pool.py繼承了torch.autograd.Function類,實現了Roi Pooling層的foward()和backward()函數。
4)Modules文件夾下的roi_pool.py繼承了torch.nn.Modules類,引用了Functions.roi_pool.py,實現了對Roi Pooling層的封裝,使Roi Pooling層可以和ReLU層等一樣被使用。
(2)RoiPooling和RoiAlign的區別:
簡述:
在Roi Pooling中,當Proposals從原圖映射到特徵圖,又從特徵圖上映射到固定大小時,需要進行兩次下采樣,當除得的結果不爲整數時,Poi Pooling在兩次計算過程中,分別對計算結果中的浮點數進行了量化取整操作,最終對各個小區域進行最大池化。這樣計算造成的像素偏差勢必會對後層的迴歸定位產生影響。
而Roi Align對這個過程進行了一些改進,在兩次計算過程中保留浮點數的計算結果,在最大池化前通過雙線性插值法計算計算各個小區域內每塊(如2*2塊)中心位置的像素值,再對各個小區域進行最大池化。
當檢測大目標時兩種方法相差不大,但檢測小目標時,Roi Align更加精準一些。
(3)在roi_pooling.py中爲何用ctx代替常見的self,如下所示。
def __init__(ctx, pooled_height, pooled_width, spatial_scale):
簡述:
ctx是context的縮寫, 翻譯成"上下文/ 環境",ctx專門用在靜態方法中;而self指的是實例對象;
ctx用在靜態方法中, 調用時不需要實例化對象, 直接通過類名就可以調用, 所以self在靜態方法中沒有意義;
自定義的forward()方法和backward()方法的第一個參數必須是ctx;,ctx可以保存forward()中的變量,以便在backward()中繼續使用;