本文標題:對RCF網絡的理解
文章作者:gyro永不抽風
發布時間:2020年08月20日 - 16:08
最后更新:2020年09月22日 - 17:09
原始鏈接:http://hexo.gyrojeff.moe/2020/08/20/%E5%AF%B9RCF%E7%BD%91%E7%BB%9C%E7%9A%84%E7%90%86%E8%A7%A3/
許可協議: 署名-非商業性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0) 轉載請保留原文鏈接及作者!
原論文
網絡架構
下圖為RCF網絡架構:

其建立在VGG16之上,根據其修改而來。與原來的VGG16相比:
- RCF網絡去除了原來所有的全連接層(最后的三個全連接層)以及最后的池化層。這樣做是因為與VGG網絡的設計初衷——圖像分類問題不同,這個網絡旨在邊緣檢測,VGG最后的全連接層得到的$1 \times 1 \times 4096$的輸出是沒有意義的,所以將其刪去。
- 為了進行邊緣信息的提取,所以需要對像素值本身進行重新計算,所以在VGG16的每個卷積層后,都添加了一個$1\times 1 - 21$的卷積層,先升維,后通過$1 \times 1 - 1$進行降維。
- 其在每一個stage的最后添加了cross-entropy loss / sigmoid層以計算損失,更新參數。
- 每一層中有deconv層進行上采樣,將圖像大小映射回原來的大小,最后在fusion部分將每一個stage的輸出疊加,在進行一遍$1\times 1 - 1$的卷積將多通道合並,來達到獲取多種混合信息的能力。
損失函數
由於數據集通常是由多個標記者 (Annotator) 標記的。雖然每個人的認知不同,但是大家的結果都具有很高的一致性。對於每一張圖片,我們將所有人的標記取平均值來生成一個邊緣存在的概率圖。對於每一個點,$0$代表沒有標記者認為這個點是邊緣,$1$則代表所有人都認為這個點是邊緣。這里定義一個超參數$\eta$:如果一個點是邊緣的概率大於$\eta$,則這個點我們認為其是邊緣;若這個點的概率是$ 0 $,則其不是邊緣;此外,認為那些概率介於$ 0 $和$ \eta $之間的點是屬於有爭議的點,不計入損失函數。所以,每一個點的損失函數可以記為:
$$l(X_i; W) = \begin{cases} \alpha \cdot \log (1 - P(X_i; W)) & \text {if } y_i = 0 \\ 0 & \text {if } 0 < y_i \leq \eta \\ \beta \cdot \log P(X_i; W) & \text {otherwise}, \end{cases} $$
其中,
$$ \alpha = \lambda \cdot \frac {|Y^+|} {|Y^+| + |Y^-|} $$
$$ \beta = \cdot \frac {|Y^-|} {|Y^+| + |Y^-|} $$
$|Y^+|$表示圖中一定是邊緣的點的個數,$|Y^-|$表示圖中一定不是邊緣的點的個數,$\lambda$則是超參數。在像素$i$的特征向量和是否為邊緣的事實表示分別為$X_i$和$y_i$,$P(X)$是一個標准的Sigmoid激活函數,$W$則代表網絡中的所有學習參數。所以,整個圖片的損失函數可以記為:
$$ L(W) = \sum _ {i = 1} ^ {|I|} \Big ( \sum _ {k = 1} ^ K l(X_i ^ {(k)}; W) + l(X_i ^ {\text {fuse}}; W)\Big ) $$
其中,$X_i ^ {(k)}$表示stage k的特征向量,$X_i ^ \text {fuse}$表示stage fusion的特征向量,$|I|$代表像素個數,$|K|$代表階段數(此處為5)