2017-08-24 135 views
1

所以我正在尋找對RGB圖像執行2D卷積。我的RGB圖像形狀(2592,3888,3)和我的過濾器形狀的(20,20)1卷積可以分成2個卷積嗎?

我想要做的是這樣的:

  • 圖象分成大小相等(1296,3888,3)
  • 的兩半每個執行卷積半
  • 結合卷積結果得到充分的卷積圖像

這可能嗎?

我有兩個GPU。我基本上想要在1個GPU上執行一半的卷積,而在另一個GPU上執行另一半,因此這是此問題的動機。

當我將圖像分解成一半並將每一半進行卷積時,返回的組合維數爲(2554,3869,3),但是如果我一次卷積整個圖像,則返回的(正確)維數爲(2573,3869,3)

是否有我想要做的公式?

+0

https://en.wikipedia.org/wiki/Overlap%E2%80%93add_method –

回答

1

看來你的結果只包含卷積積滿的地方,沒有應用任何零填充或類似的擴展。因此,如果您完全分割,則完整結果的中間缺失。

您可以通過在過濾器大小的分割中間引入重疊來進行更正,即左圖像具有1至1306列,第二個圖像列爲1287至2592(或移位-1如果從0開始計數)。

2

您可以在兩個階段執行卷積,但是圖像中心必須有一個19(或可能20)行的重疊區域才能包含在兩個GPU中。 更好的是,如果卷積程序允許輸出(size + 2k-1),那麼可以通過將這兩個結果相加(正確對齊)來計算中間部分。

1

是的,你可以將你的卷積分成兩半。對於傳統的GPU API,它應該是相當簡單的,假設你的卷積濾波器以直接的方式工作。

您要仔細思考的問題是邊緣效應:GPU將在圖像邊界處做什麼?通常有許多選項,可以根據紋理採樣對象的邊界進行配置,以讀取原始圖像:鏡像,環繞或固定顏色,例如零。

但是,如果雙方都從相同的原始圖像採樣,兩個部分之間的邊界將靠近質感,在邊緣效應不適用的中心!每個半圖像將在其自己的採樣位置應用卷積,而不依賴於另一個。請注意,如果您要在GPU之間分割輸入圖像(例如,爲了最大限度地減少GPU和CPU之間的帶寬),則必須在濾鏡的範圍內擴展每一半的源紋理 - 只需足以避免上面提到的邊緣效應!