圖像分割 | Context Prior CPNet | CVPR2020

  • 文章轉自微信公衆號:「機器學習煉丹術」
  • 文章作者:煉丹兄(已授權)
  • 作者聯繫方式: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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章