- 文章轉自微信公眾號:「機器學習煉丹術」
- 文章作者:煉丹兄(已授權)
- 作者聯系方式:cyx645016617
- 論文名稱:“Context Prior for Scene Segmentation”
0 綜述
先上效果圖,CPNet似乎對一些難樣本有着更好的效果:
文中提到了下面關鍵字:
構建了corresponding prior map(CPmap),然后通過Context Prior Layer(CPLayer)來把這個CPmap融合到網絡中,與此同時,使用Affinity Loss來對應這個CPLayer。
關於上面這句話如何解讀,我先留着疑問。
1 Context Prior
作者提出兩個概念:
- intra-context:同一類別的像素之間的關系;
- inter-context:不同類別的像素之間的關系。
作者說,在圖像分割任務中,每一個圖片都有對應的ground truth,但是ground truth中是每一個像素所屬於的類別,說模型很難從獨立的像素中學習到contextual(上下文)信息,因此需要explicitly regularize network(顯式的規范網絡)。
在論文中,作者使用Affinity Loss來顯式的規范網絡.
For each pixel in the image, this loss forces the network to consider the pixels of the same category (intra-context) and the pixels among the different categories (inter-context).
這個損失可以讓模型考慮同一類別的其他像素和不同類別的其他像素。
2 構建Ideal Affinity Map
在使用Affinity Loss之前,需要先構建Ideal Affinity Map。
- 現在我們有一個圖片,Image,這個圖片的ground truth GT.
- Image經過全卷積網絡,得到尺寸HxW的特征圖;
- GT下采樣到HxW大小,寫作\(\widetilde{GT}\),然后對\(\widetilde{GT}\)做one hot encoding,這樣得到一個HxWxC的張量,其中C為分割的類別數量,對這個張量記做\(\widehat{GT}\)
- 通過reshape的方法,把\(\widehat{GT}\)的shape變成NxC,其中N=HxW,然后通過計算\(\widehat{GT}\widehat{GT}^{\mathrm{T}}\)得到一個NxN的矩陣,這個記做A;
- A就是我們所要的Ideal Affinity Map。
A is our desired Ideal Affinity Map with size N × N , which encodes which pixels belong to the same category. We employ the Ideal Affinity Map to supervise the learning of Context Prior Map.
這個A中每一個1表示這一個像素和其他同一類別的像素,通過這個Ideal Affinity Map來訓練CPMap
3 Affinity Loss
我們用全卷積網絡對Image進行特征提取,得到一個HxW的尺寸的特征圖,這里我們在上文已經說到了,但是沒有說這個特征圖的通道數是多少,看下圖:
通道數是HxW,也就是上面提到的N,這樣對於每一個像素來說,他的特征正好是1xN,這樣和我們得到的Ideal Affinity Map是不是剛好對應上了?
所以這里我們就可以用簡單的二值交叉熵來計算Predicted Prior Map和Ideal Affinity Map的損失:
這就完事了嗎?並不是:
However, such a unary loss only considers the isolated pixel in the prior map ignoring the semantic correlation with other pixels.
直觀上感覺,上面的其實只考慮了兩個像素之間的關系,其實忽視了更多的語義關系。所以還需要另外一部分損失。
a表示Idea Affinity Map中的元素,P表示從X得到的NxN的矩陣。
公式(2)表示,這里有點目標檢測的味道了。
舉個例子,假設總共有5個像素把:
- a = [0,0,1,0,1],表示與同類的像素有第三個和第五個兩個像素;
- p = [0.1,0.2,0.8,0.2,0.9],表示預測出來的像素中,第一個像素有0.1的概率是同類的,第三個像素有0.8的概率是同類的;
- \(\frac{ap}{a}\),剛好就是 真陽/樣本為真的個數,為召回率;
- \(\frac{ap}{p}\),剛好就是 真陽/預測為真的個數,為精准率;
這一塊講解的比較粗糙,因為混淆矩陣,PR曲線,召回率精准率應該是大家了解的內容啦,如果不了解可的話可以閱讀我之前寫過的筆記。(已經記錄了107篇筆記了。。我也懶得找文章鏈接了,抱歉哈哈)
作者原文:
對於公式(4),1-a剛好就是把0和1反過來了,這樣1-a中的1表示的是不同的兩個像素,因此體現的是inter-class 不同類的聯系。
最后的最后,Affinity Loss為:
4 Context Prior Layer
CPLayer的結構如下,突然一看還挺復雜的:
- CPLayer的輸入認為是X,就是\(shape=H\times W \times C_0\);
- X經過一個aggregation module變成了\(shape=H\times W \times C_1的\widetilde{X}\);
這里來看一下aggregation module是如何整合了spatial information:
看起來就是用了兩個並行的1xk和kx1的卷積,OK,這個地方不難。
- \(\widetilde{X}\)經過一個1x1的卷積層和Sigmoid層,變成我們的prior Map (P),這個P的shape=HxWxN;
- 這里的P經過Affinity Loss的監督訓練下,在理想情況下,P體現的就是像素之間的關系
- 之前得到了\(\widetilde{X}\),reshape成\(N\times C_1\)的形狀,(這里的\(C_1\)其實就是最終要分類的類別數)
- 這里可以得到intra-class的信息\(Y=P\widetilde{X}\)
- 也可以得到inter-class的信息\(\bar{Y}=(1-P)\widetilde{X}\)
這里我提示一下,怎么理解這個intra-class呢?從P中,可以找到一個像素和其他同類別的像素,從\(\widetilde{X}\)中,可以找到所有像素預測概率。因此Y中的每一個像素的預測的概率值,其實是考慮了同類別的其他像素的預測值綜合起來的結果。因此這是一個類內上下文的綜合考慮。
- \(F = concat(X,Y,\bar{Y})\)
5 細節
之前計算的affinity Loss在論文中是寫作\(L_p\),
- 其中\(L_u\)是unary loss一元損失,也就是二值交叉熵;
- \(L_g\)是global loss,也就是整體的一個損失;
然后整個模型的損失:
- 除了我們提到的\(L_p\),affinity loss,權重為1;
- \(L_a\)是auxiliary loss ,權重為0.4
- \(L_s\)是主要的main segmentation loss,權重為1.