圖像太大,顯存放不下?來看看跑FCN網絡的高效方法

2019-12-12     AI公園

作者:Liad Pollak Zuckerman

編譯:ronghuaiyang

導讀

一種使用全卷積網絡的trick,用來跑大尺寸的輸入圖像。

全卷積(deep neural)網絡通常用於計算機視覺任務,如語義分割、超解析度等。它們的最佳屬性之一是,它們適用於任何大小的輸入,例如不同大小的圖像。然而,在大規模輸入(如高解析度圖像或視頻)上運行這些網絡可能會消耗大量GPU內存。在這篇文章中,我將提供一個簡單的方法來緩解這個問題。該算法將GPU內存使用量降低到3-30%。

什麼是全卷積網絡?

全卷積網絡(從現在開始叫做FCN)是一個僅由卷積層組成的網絡。為了簡單起見,在這篇文章中,我們將重點討論圖像,但同樣的方法也適用於視頻或其他類型的數據。

一個全卷積網絡做分割

對於圖像處理中的許多任務,要求輸入和輸出圖像具有相同的大小是很自然的。這可以通過使用FCNs加上適當的填充來實現。由於這是一個標準的程序,從現在開始,我們將假定它成立。

在這種架構下,輸出圖像中的每個像素都是對輸入圖像中相應的patch進行計算的結果。

patch的大小稱為網絡的感受野(RF)。

這是一個關鍵點。我們將很快看到算法如何使用這個屬性。

一層使用3x3卷積的FCN,每個像素的輸出對應輸入圖像的3x3的patch

2層的FCN:每層都是3x3卷積,每個輸出像素對應5x5大小的輸入圖像

上面我們可以看到一個(頂部)和兩個(底部)3x3 conv層FCNs的圖。對於一個層(頂部),右邊的藍色輸出像素是對左邊的藍色輸入塊的計算結果。當有兩個層(底部)時,我們在輸入和輸出之間有一個特徵映射。feature map(中間)中的每個綠色像素都是計算超過3x3的綠色輸入patch(左邊)的結果,就像在單層情況下一樣。類似地,每個藍色輸出像素(右)是計算一個藍色3x3 feature map patch(中)的結果,該patch起源於一個5x5藍色輸入patch(左)。

那麼,問題在哪兒呢?

如前所述,理論上,我們可以將網絡應用於任何輸入大小。然而,實際上,計算通過網絡的前向通道需要在內存中保存大量的特徵圖,這會耗盡GPU資源。

我在研究視頻和3d圖像時遇到了這個限制。網絡無法在我們的NVIDIA v100 GPU上運行,這導致我開發了這個解決方案。

高效的使用FCN處理大解析度圖像

傳統的cnn以全連接的層結束。因此,每個輸出像素都是對整個輸入進行計算的結果。FCNs不是這樣的。正如我們所看到的,只有接收域大小的輸入patch影響單個輸出像素。因此,要計算單個輸出像素,不需要將整個feature map保存在內存中!

換句話說:

我們可以一次計算輸出值的一小部分,同時只從輸入中傳遞必要的像素。這大大降低了GPU的內存使用。

讓我們來看看下面的例子:

我們的輸入是一個28x28的圖像,如下圖所示。由於內存限制,我們可以通過大小為12x12的網絡patch。簡單的方法是從原始輸入輸入12x12個patch(如下圖所示),然後使用12x12個輸出patch構建28x28個輸出圖像。

每個輸出像素是通過網絡的不同patch的結果。例如,橙色像素是傳遞橙色12x12patch的結果。

不幸的是,這種方法不會產生與同時傳遞整個28x28輸入相同的結果。原因是邊界效應。

處理邊界效應

為了理解這個問題,讓我們看看下圖中標記的紅色像素。周圍的紅色方塊代表感受野,在本例中大小為5x5,並跨越藍色和橙色斑塊。為了正確地計算紅色輸出像素,我們需要同時計算藍色和橙色像素。因此,如果我們分別運行藍色和橙色的patch,就像在naive方法中那樣,我們將沒有必要的像素來精確地計算它的值。顯然,我們需要另一種方式。

紅色 :一個邊界上的像素和它周圍的感受野

那麼我們如何才能讓它正確呢?我們可以使用重疊的patch,這樣每個5x5的patch都包含在通過網絡的12x12的patch中。重疊量應比感受野(RF -1)小1個像素。在我們的例子中,感受野RF=5,所以我們需要4個像素的重疊。下面的動畫演示了如何在給定的限制下通過網絡傳遞不同的圖像補丁。它顯示每個12x12輸入patch(邊框)在輸出(填充)中貢獻的像素量更少。例如,藍色正方形的輪廓要比藍色像素填充的區域大。

重疊的patch,例如,橙色像素是傳遞橙色12x12patch的結果。

回到我們標記的紅色像素。現在,如下圖所示,由於重疊,它可以被正確計算。它周圍的5x5的patch完全包含在橙色的12x12的patch中(邊框)。

實際上,每個像素都有一個12x12的patch,其中包含了其感受野大小的周圍像素。通過這種方式,我們可以確保和運行整個28x28圖像的結果是相同的。

紅色 :一個邊界上的像素和它周圍的感受野

結果

下表給出了一些關於GPU內存使用和運行時間的實驗結果。正如承諾的那樣,內存消耗將顯著減少!

注意:雖然每個圖像的運行時間較慢,但使用此方法我們可以並行傳遞多個圖像,因此節省時間。以第三行為例,使用該算法我們可以同時運行13幅圖像,與直接運行6幅圖像所花費的時間相同。

通過使用patch by patch算法,與標準方法相比,GPU的內存使用減少了67%-97%。

實驗在NVIDIA Tesla K80 GPU上進行。

英文原文:https://towardsdatascience.com/efficient-method-for-running-fully-convolutional-networks-fcns-3174dc6a692b

請長按或掃描二維碼關注本公眾號

文章來源: https://twgreatdaily.com/zh/WYUiAW8BMH2_cNUg9FuM.html