影像分割 | Context Prior CPNet | CVPR2020

忽逢桃林發表於2021-02-26
  • 文章轉自微信公眾號:「機器學習煉丹術」
  • 文章作者:煉丹兄(已授權)
  • 作者聯絡方式: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.

相關文章