論文筆記:Learning Region Features for Object Detection
中心思想
繼Relation Network實現可學習的nms之後,MSRA的大佬們覺得目標檢測器依然不夠fully learnable,這篇文章類似之前的Deformable ROI Pooling,主要在ROI特徵的組織上做文章,文章總結了現有的各種ROI Pooling變體,提出了一個統一的數學表示式,藉由這個表示式,提出完全可學習,無人工設計的Region特徵,據Han Hu大佬的講座所說,這篇文章現在只是提出了一種行得通的方案,還沒有研究清楚,效能比Deformable Conv那篇文章稍差一點點。
Region特徵提取的總結和統一表達
一般地,region feature \(\mathbf{y}(b)\) 的提取可以統一表達為如下的公式:
\[\mathbf{y}(b) = \text{RegionFeat}(\mathbf{x}, b)\]
這裡x指的是輸入特徵,b是bbox。 \(\mathbf{y}(b)\) 的維度是 \(K\times C_f\) ,通道數與輸入特徵一般相同,為 \(C_f\) 。注意,要特別關注自變數包含哪些東西,這裡x是指整張特徵圖,而不只是box內的特徵,譬如在Deformable ROI Pooling中就用到了box之外的特徵。這個式子可以具體地表達為:
\[\mathbf{y}_k(b) = \sum_{p \in \Omega_b}w_k(b,p,\mathbf{x})\odot \mathbf{x}(p)\]
其中, \(\Omega_b\) 表示支撐區域“supporting region”,也就是Pooling所用到的區域,p為區域中的每個位置, \(\odot\) 表示element-wise相乘,k表示pooling後的第k個位置。也就是說,pooling後的每個位置,都是 \(\Omega_b\) 中每個位置的加權平均。
最原始的RoI Pooling,作者稱之為Regular RoI Pooling,
\[w_k(b, p) = \begin{cases} 1/|R_{bk}| & \text{ if $p \in R_{bk}$} \\ 0 & \text{else} \end{cases}\]
其中, \(R_{bk}\) 是第k個bin的所有位置的幾何。這種pooling的缺點是: 由於空間上的下采樣,難以區分非常靠近的RoIs。譬如,輸入特徵一般比原圖縮小了16倍,如果兩個RoI的距離小於16個畫素,那麼它們的 \(R_{bk}\) 完全相同,特徵也就完全相同。
SPPNet中提出的Spatial Pyramid Pooling,跟原始RoI Pooling差不多,只是用了好幾種bin的劃分。
Aligned ROI Pooling,
\[w_k(b, p) = g(u_p, u_{bk}) \cdot g(v_p, v_{bk})\]
其中, \(g(a,b) = \max(0, 1-|a-b|)\) )表示一維的雙線性插值核, \((u_{bk}, v_{bk})\)表示每個bin的中心點,
\(p=(u_p,v_p)\)
表示整數座標。比較好理解,就是對於某個浮點座標,考慮其與四個相鄰整數座標的距離,再進行加權。注意,以上幾種Pooling方式,權重都只是依賴幾何資訊,並不依賴輸入特徵本身。
Deformable RoI pooling為每個bin的中心學習一個偏移量 \((\delta u_{bk}, \delta v_{bk})\) ,
\[w_k(b,p,\mathbf{x}) = g(u_p, u_{bk} + \delta u_{bk}) \cdot g(v_p, v_{bk} + \delta v_{bk})\]
PSRoI Pooling,與原始RoI Pooling不同的是,每個bin僅與輸入特徵通道的某個子集相關,可以表達為
\[\mathbf{y}_k(b) = \sum_{p \in \Omega_b}w_k(b,p,\mathbf{x}_k)\odot \mathbf{x}_k(p)\]
其中,
\(\mathbf{x}_k\)
僅包含x在通道軸上的某個子集,具體依據k來決定。
學習Region Features
重點來了,說了這麼多,上面的各種變體說到底都是完全hand-crafted的。即使Deformable RoI pooling引入了一個可學習的元件,但其形式也很大程度上受限於一個規則的網路。本文的目標就是最大限度地減少手工的設計。
直覺上,影響 \(w_k\) 的因素有二:一是位置p與RoI box b的幾何關係,例如,b內部的位置理應具有較高的權重;二是影象特徵x應自適應地使用,這一點Deformable中已經做到了。因此,使用下列式子對 \(w_k\) 進行建模:
\[w_k(b,p,\mathbf{x}) \propto \exp(G_k(b,p)+A_k(\mathbf{x},p))\]
其中,第一項用來捕捉幾何關係:
\[G_k(b,p) = \langle W^{\text{box}}_{k}\cdot \mathcal{E}^{\text{box}}(b), W^{\text{im}}\cdot \mathcal{E}^{\text{im}}(p) \rangle\]
這個式子分三步進行。首先,將box和影象座標嵌入到一個高維空間中(Relation Network中也有類似操作)。
\[\mathcal{E}_{2i}(z) = \sin \Large ( \frac{z}{1000^{2i/C_{\mathcal{E}}}} \Large ), \quad \mathcal{E}_{2i+1}(z) = \cos \Large (\frac{z}{1000^{2i/C_{\mathcal{E}}}} \Large )\]
這個操作確實說不出太多道理,作者也說了這問題還沒研究清楚。z是一個標量,ε(z)是一個 \(C_ε\) 維的向量,下標i的取值範圍為0至 \(C_ε/2-1\) 。經過這一操作,一個影象座標p的高維空間嵌入 \(ε^im (p)\) 的維度是 \(2C_ε\) ,一個box b的高維空間嵌入 \(ε^box (b)\)的維度是
\(4C_ε\)
。
而後,使用 \(W^{\text{box}}_{k}\) 和 \(W^{\text{im}}_{k}\) 分別對上面的兩個向量作線性變換,變換到同一維度 \(C_g\) 。注意,這裡k的數值是比較大的,一般是7x7,例項分割任務中甚至會取14x14,這樣搞下來可學習的引數會比較多,所以作者尋思著共享一部分引數, \(W^{\text{box}}_k = \hat{W}^{\text{box}}_k V^{\text{box}}\) , \(V^{\text{box}}\) 沒有下標k,所以是共享的,這樣做也是比較符合直覺的,在保證輸出維度不變的前提下能減少很多引數。
第二項使用影象特徵,跟Deformable那篇是一樣的,
\[A_k(\mathbf{x},p) = W^{\text{app}}_k \cdot \mathbf{x}(p)\]
\(W^{\text{app}}_k\)
代表1x1卷積核的權重。
高效實現
上面這一系列騷操作,乍一看是非常費勁的。但仔細分析之下可以看到, \(A_k(\mathbf{x},p)\) 和 \(W^{\text{im}}\cdot \mathcal{E}^{\text{im}}(p)\) 的計算對所有的RoI是可複用的。所以計算量主要來自計算權重時要跟特徵圖上的所有點兩兩進行計算,所以數量級是H W,可以去看原論文中的表,這裡就不貼出來了,如果用這種naive的實現方式,計算量驚人。怎麼辦呢?很顯然應該從H W上下手,手法是很符合直覺的,就是在RoI內部密集取樣,而在RoI外部稀疏取樣。如下圖所示,數量級可以下降100倍左右!但個人認為不是所有的RoI都需要計算,因為一般只選取k個RoI進入到第二階段,不選的就不必計算了,論文裡好像沒寫這個,不過程式碼裡想必是實現了的。
