1. 程式人生 > >【CVPR2017| 人臉解析】Learning adaptive receptive fields for deep image parsing networks

【CVPR2017| 人臉解析】Learning adaptive receptive fields for deep image parsing networks

問題領域:人臉解析(face parsing)
簡述:自適應感受野、人臉解析(face parsing)、全卷積網路(FCN)
原文http://openaccess.thecvf.com/content_cvpr_2017/papers/Wei_Learning_Adaptive_Receptive_CVPR_2017_paper.pdf
發表:CVPR2017
評價:效果好,網路設計有目的性。
原文背景:深度神經網路的感受野表徵的是某個神經元連線到原始影象的畫素數目。影象解析的工作受到感受野的影響非常大。具體地,如果感受野過小,會導致較大物體上出現不一致的結果(個人理解為會出現一些殘缺的小洞);如果感受野過大,會導致一些較小物體被忽略,被當成背景;即便是正常size的物體,也會對不合適的感受野十分的敏感。遺憾的是,自從全卷積網路(FCN)出現以來,在之前的工作中,感受野的大小都是人為設定的,取決於設計的網路的層數和卷積核的大小。這使得必須要人為的仔細篩選網路的各個引數。
此文貢獻

:此文設計了一個策略,可以使得網路通過資料的驅動自己學習最佳感受野的大小。具體地,在原始的全卷積網路中,作者加入了兩個層,一個負責膨脹,一個負責收縮,兩個層都是直接作用在某層的feature map上。通過這種策略,parsing的效能得到了大幅的提升。
相關工作

  1. 全卷積網路。
  2. 空洞卷積(Dilated Convolutions)可以在避免池化的前提下擴大感受野。
  3. 也有人在輸入上做文章,如多尺度輸入和提前找bounding box,總之需要大量的預處理和後處理,計算量大(根據個人曾經實驗,加入後處理往往也使得parsing的結果不夠自然)。
  4. 也有人在網路當中加入放射變換層,有代表性的就是空間變換網路(STN,Spatial Transformer Network)。但是值得注意的是,STN的仿射變換層是受到輸入資料的驅動的,而本文的放縮層在train完過後就是固定的,並不是動態的。另外,本文沒有考慮旋轉問題,這也是和STN的不同之處。

其網路結構如下:
在這裡插入圖片描述

其中,(a)為單通道的網路,(b)為多通道的網路。注意,在FC6之前膨脹,在FC8之後收縮回來。再注意,為了破壞各個支路的對稱性,在(b)的每個支路中加入了weighted gradient 層。

設計思路簡析

  1. 單看圖,網路結構就一目瞭然了。在兩個放縮層之間都是正常操作,只有這倆層是新加入的層。問題就在於如何放?如何縮?答案是:加入一個放縮因子f,就搞定了。具體地,單獨觀察一個放縮層:該層輸出的(H-1)和(W-1)大小均為該層輸入的(H-1)和(W-1)的f倍;而輸出層的每一個點均可以找到輸入層的某個位置進行雙線性插值,計算結果。
  2. 當然,一個膨脹層需要有一個因子f,後面的收縮層還得有一個因子f
    。但是注意到,在膨脹層之前,和收縮層之後的size都是固定的,所以歸根結底,f * f為一個定值,不妨記為F。則f = F / f。歸根結底還是隻有f一個變數。當然,一個膨脹層需要有一個因子f,後面的收縮層還得有一個因子f。但是注意到,在膨脹層之前,和收縮層之後的size都是固定的,所以歸根結底,f * f為一個定值,不妨記為F。則f = F / f。歸根結底還是隻有f一個變數。
  3. 膨脹層和收縮層的操作是一樣的,唯獨不同的就是縮放因子的不同。再者,說是膨脹層,其實縮放因子也可以是小於1的,根據文章中的說法,做人臉解析時,強制設定了f的範圍在[0.25 , 4.0]之間。
  4. 關於求導。由於前向傳播是明確的(第一條所說的雙線性插值),所以求f的導數並不難,也是很明確的表示式。具體式子我就不打了,可以去原文中看,也可以自己腦補下,問題不大。但是值得注意的有幾點:首先,這個導數不能對H和W敏感,所以原文中作者計算f的導數時是除以了H和W的;第二,有兩個層裡包含f(正如上文所說,因為f = F / f),所以在梯度下降的時候,需要將兩者加起來,就可以實現正常的訓練了。
  5. 關於weighted gradient 層。這個其實是有意讓不同的支路去學習不同尺度上的特徵。具體做法就是,將大小類似的類別分到一個支路上,然後加大這幾個類別的通道在該支路上的權重。

本人關於f的一點點疑問和猜想

  1. 關於縮放層,輸出的(H-1)為輸入的(H-1)的f倍,輸出的(W-1)為輸入的(W-1)的f倍,這一點我覺得嚴格做到是不可能的。如果真的是嚴格相等的話,我覺得不提f,這對輸入的(H-1)和(W-1)就提出了很高的要求…至少得有公因子吧?還得剛好是有理數f的分母吧?這太難了,而且最關鍵一點----FCN的輸入size,是不確定的。
  2. 既然做不到,那就得有取近似的過程的存在。個人猜測是這樣的:根據現有的f,對每個訓練樣本計算整數的output size,其實就是輸出的(H-1)和(W-1)近似等於輸入的(H-1)*f和(W-1)*f。也就是說,對於不同的每個樣本,不管train還是test的時候,使用的放縮因子,都是f的一個非常近似的值,而不嚴格等於f。這個其實是說的通的,是有道理的,是可以這麼處理的。

關於程式碼實現

  1. 作者並沒有給出code
  2. 筆者本人也沒有做實現,如果哪天有時間做了的話,再過來貼github地址吧。或者有人復現了這篇文章的,也可以跟我分享下啊。萬分感謝。

歡迎一起討論共同進步。