(3) 位敏得分特征圖(Position-sensitive score maps) 生成和位敏RoI Pooling(Position-sensitive RoI pooling, PSRoIPooling)部分。(劃重點!)
2.2 Position-sensitive score maps(位敏得分特征圖,PSSM)
顧名思義,位敏得分特征圖就是一個對位移敏感的特征圖(廢話,,為啥對位移敏感等會兒會說)。這一步的操作是在特征提取部分網絡輸出的feature map(1024個 w ∗ h w*h w∗h的feature map)後接一個 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)維的 1 ∗ 1 1*1 1∗1卷積層得到 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)個大小為 w ∗ h w*h w∗h的Position-sensitive score maps,這個 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)個score maps代表啥呢?看下圖:
目标檢測——R-FCN
假設将由RPN提取的ROI劃分為 k ∗ k k*k k∗k個bin,使用上述的 1 ∗ 1 1*1 1∗1卷積分别獲得針對每個bin的激活圖(feature map),那麼針對其中某一個類别就将獲得 k ∗ k k*k k∗k個激活圖(feature map),總共有C個類别,加上一個背景類,就将獲得 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)個激活圖,也就是我們說的Position-sensitive score maps。
【舉個栗子】 假設針對“人”這個類别,如下圖所示,劃分為 k ∗ k k*k k∗k個bin(此處假設k=3),那麼每個bin的激活特征是不一樣的,得到的Position-sensitive score map當然也是不一樣的,比如top-left的bin激活的是人的一側肩和頭的部分,bottom-right的bin激活的是人的一條腿的部分。那麼對于一張輸入圖檔将得到 3 ∗ 3 = 9 3*3=9 3∗3=9個bin對應的部分的激活特征圖(9張),也就是對應“人”這個類别的Position-sensitive score maps 。
目标檢測——R-FCN
目标檢測——R-FCN
上面的示例中,針對“人”這一個類别生成了 k 2 ( k = 3 ) k^2(k=3) k2(k=3)張位敏特征圖,那麼擴充到具有C個類别(再加一個背景類)的資料集,就會生成 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)張位敏特征圖(Position-sensitive score maps),把每一個類的相同位置的bin對應的特征圖放在一起就會是下圖所示的樣子啦(比如說所有類的左上角的bin對應的激活圖都放在一起就得到了下圖中深黃色的 ( C + 1 ) (C+1) (C+1) 張Position-sensitive score maps):
目标檢測——R-FCN
2.3 Position-sensitive RoI pooling(PSROIPooling)
說完了得到Position-sensitive score maps的過程,咱們繼續來看看Position-sensitive RoI pooling。根據上面所說的過程,我們得到了 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)張位敏特征得分圖,還通過RPN得到了一系列ROI,很自然的想到,接下來做的就是把這些ROI映射到這一堆Position-sensitive score maps上,根據前面所說我們知道每一張 Position-sensitive score map對應着某一個類别的某一個bin,而Position-sensitive RoI pooling所做的就是把對應着相同類别的Position-sensitive score map在ROI映射區域中的相應的bin提取出來,重新拼成一個完整ROI的激活圖(說白了就是在每個位敏特征圖上提取ROI區域中對應位置bin然後做個重新排列)。這個部分好像說的有點抽象,咱們可以對應論文中的一個示例圖來做了解:
目标檢測——R-FCN
接着前面所說的例子,對于一張輸入圖檔的“人”這一類,我們将得到9張不同位置bin在feature map上的激活圖(位敏特征圖),把提取的ROI映射到這9張位敏特征圖上,然後分别提取對應位置bin在ROI中相應的那一塊,這樣一來就分别從9張圖中“摳”出了9個小塊,然後把這9個小塊分别作average pooling後按照對應位置重新拼成一個 3 ∗ 3 ( k ∗ k ) 3*3(k*k) 3∗3(k∗k)的輸出。那麼拓展到一個具有C個類别的資料集,結果将得到 ( C + 1 ) (C+1) (C+1)個 k ∗ k k*k k∗k的輸出。
2.4 PSSM(位敏得分特征圖)和PSROIPooling後的操作
那麼問題來了,得到了這個 k ∗ k k*k k∗k的輸出後該怎麼用于分類和定位呢?
首先對于分類: 最後這個輸出的每一個類的 k ∗ k ( 3 ∗ 3 ) k*k(3*3) k∗k(3∗3)的輸出直接進行voting得到最後的得分,文中說明的voting操作是将 k ∗ k k*k k∗k個值進行相加。那麼對于每一個ROI的 ( C + 1 ) (C+1) (C+1)個 k ∗ k k*k k∗k輸出,我們最後将得到一個 ( C + 1 ) (C+1) (C+1)維的輸出向量,再使用softmax進行分類。
對于包圍框回歸: 相似的,對于特征提取卷積層輸出的feature map加上一個 4 k 2 4k^2 4k2維的卷積層,得到 4 k 2 4k^2 4k2個用于包圍框回歸的位敏特征得分圖(類似于前面說的 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)個用于分類的位敏得分圖)。然後采用同樣的PSROIPooling操作并進行voting,最後每個ROI得到一個4維的輸出用于包圍框回歸(這4個次元分别對應包圍框的 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h ) (tx,ty,tw,th))。
L ( s , t x , y , w , h ) = L c l s ( s c ∗ ) + λ [ c ∗ > 0 ] L r e g ( t , t ∗ ) L_(s,t_{x,y,w,h}) = L_{cls}(s_{c^*}) + \lambda [c^*>0] L_{reg}(t,{t^*}) L(s,tx,y,w,h)=Lcls(sc∗)+λ[c∗>0]Lreg(t,t∗)
其中 L c l s ( s c ∗ ) = − l o g ( s c ∗ ) L_{cls(s_{c^*})}= -log(s_{c^*}) Lcls(sc∗)=−log(sc∗)是分類部分的交叉熵損失, L r e g L_{reg} Lreg是包圍框回歸部分的損失,采用L1 Smooth。定義 :當對應ground truth的标簽為非背景類時 [ c ∗ > 0 ] = 1 [c^*>0]=1 [c∗>0]=1,當标簽訓示為背景類時 [ c ∗ > 0 ] = 0 [c^*>0]=0 [c∗>0]=0 。RPN産生的區域建議當ROI與ground truth的IOU大于0.5時樣本标為正例。
有意思的是,這篇文章裡邊再一次提到了難例挖掘(hard example mining,OHEM)。原文的描述是:假設對一張輸入圖像提取得到了N個proposals,經過前向運算計算所有N個proposals的損失,然後按損失将所有ROIs排序,選出損失最高的B個ROIs進行反向傳播。
我們知道,将某個卷積層的步長減小會導緻感受野的減小,如何來彌補這一點呢?在論文 “Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFS” 中作者為了解決這一問題提出了Hole算法,當縮小了步長後,通過“skip”連接配接來保持感受野不變,如下圖所示:
(參考論文:Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFS.