詳解 ROI Align 的基本原理和實現細節
尊重作者,轉載網址。
ROI Align 是在Mask-RCNN這篇論文裡提出的一種區域特徵聚集方式, 很好地解決了ROI Pooling操作中兩次量化造成的區域不匹配(mis-alignment)的問題。實驗顯示,在檢測測任務中將 ROI Pooling 替換為 ROI Align 可以提升檢測模型的準確性。
1. ROI Pooling 的侷限性分析
在常見的兩級檢測框架(比如Fast-RCNN,Faster-RCNN,RFCN)中,ROI Pooling 的作用是根據預選框的位置座標在特徵圖中將相應區域池化為固定尺寸的特徵圖,以便進行後續的分類和包圍框迴歸操作。由於預選框的位置通常是由模型迴歸得到的,一般來講是浮點數,而池化後的特徵圖要求尺寸固定。故ROI Pooling這一操作存在兩次量化的過程。
- 將候選框邊界量化為整數點座標值。
- 將量化後的邊界區域平均分割成 k x k 個單元(bin),對每一個單元的邊界進行量化。
事實上,經過上述兩次量化,此時的候選框已經和最開始迴歸出來的位置有一定的偏差,這個偏差會影響檢測或者分割的準確度。在論文裡,作者把它總結為“不匹配問題(misalignment)。
下面我們用直觀的例子具體分析一下上述區域不匹配問題。如 圖1 所示,這是一個Faster-RCNN檢測框架。輸入一張800*800的圖片,圖片上有一個665*665的包圍框(框著一隻狗)。圖片經過主幹網路提取特徵後,特徵圖縮放步長(stride)為32。因此,影象和包圍框的邊長都是輸入時的1/32。800正好可以被32整除變為25。但665除以32以後得到20.78,帶有小數,於是ROI Pooling 直接將它量化成20
圖 1
2. ROI Align 的主要思想和具體方法
為了解決ROI Pooling的上述缺點,作者提出了ROI Align這一改進的方法(如圖2)。ROI Align的思路很簡單:取消量化操作,使用雙線性內插的方法獲得座標為浮點數的畫素點上的影象數值,從而將整個特徵聚集過程轉化為一個連續的操作,。值得注意的是,在具體的演算法操作上,ROI Align並不是簡單地補充出候選區域邊界上的座標點,然後將這些座標點進行池化,而是重新設計了一套比較優雅的流程,如 圖3
- 遍歷每一個候選區域,保持浮點數邊界不做量化。
- 將候選區域分割成k x k個單元,每個單元的邊界也不做量化。
- 在每個單元中計算固定四個座標位置,用雙線性內插的方法計算出這四個位置的值,然後進行最大池化操作。
這裡對上述步驟的第三點作一些說明:這個固定位置是指在每一個矩形單元(bin)中按照固定規則確定的位置。比如,如果取樣點數是1,那麼就是這個單元的中心點。如果取樣點數是4,那麼就是把這個單元平均分割成四個小方塊以後它們分別的中心點。顯然這些取樣點的座標通常是浮點數,所以需要使用插值的方法得到它的畫素值。在相關實驗中,作者發現將取樣點設為4會獲得最佳效能,甚至直接設為1在效能上也相差無幾。事實上,ROI Align 在遍歷取樣點的數量上沒有ROIPooling那麼多,但卻可以獲得更好的效能,這主要歸功於解決了misalignment的問題。值得一提的是,我在實驗時發現,ROI Align在VOC2007資料集上的提升效果並不如在COCO上明顯。經過分析,造成這種區別的原因是COCO上小目標的數量更多,而小目標受misalignment問題的影響更大(比如,同樣是0.5個畫素點的偏差,對於較大的目標而言顯得微不足道,但是對於小目標,誤差的影響就要高很多)。
圖 2
圖 3
3. ROI Align 的反向傳播
常規的ROI Pooling的反向傳播公式如下:
這裡,xi代表池化前特徵圖上的畫素點;yrj代表池化後的第r個候選區域的第j個點;i*(r,j)代表點yrj畫素值的來源(最大池化的時候選出的最大畫素值所在點的座標)。由上式可以看出,只有當池化後某一個點的畫素值在池化過程中採用了當前點Xi的畫素值(即滿足i=i*(r,j)),才在xi處回傳梯度。
類比於ROIPooling,ROIAlign的反向傳播需要作出稍許修改:首先,在ROIAlign中,xi*(r,j)是一個浮點數的座標位置(前向傳播時計算出來的取樣點),在池化前的特徵圖中,每一個與 xi*(r,j) 橫縱座標均小於1的點都應該接受與此對應的點yrj回傳的梯度,故ROI Align 的反向傳播公式如下:
上式中,d(.)表示兩點之間的距離,Δh和Δw表示 xi 與 xi*(r,j) 橫縱座標的差值,這裡作為雙線性內插的係數乘在原始的梯度上。