承上篇:Structural Similarity(SSIM) 的 PyTorch 實現

由於我 3D 影像處理做太多(X) 2D 影像處理還沒有恢復記憶(O)

上次在刻高斯濾波的時候忘記 PyTorch Kit 的 Convolution 一個很重要的特性:

PyTorch 會參考其他通道的資訊啊!

其實這點也是無可厚非,畢竟 PyTorch 的初衷是給深度學習用的框架,

韓信點兵多多益善嘛!

所以 PyTorch 的 Convolution 流程大概是這樣:

顯而易見地,沒經過額外處理的話 SSIM值會超出邊界(0,1),

這違反了 SSIM 這項指標的意義。

所以我們要來看一下隔壁棚 2D影像處理套件 – OpenCV 怎麼做 2D 影像的 Convolution?

在 OpenCV 裡面,每個通道都是用同一顆 Kernel,但是會分離通道做 Convolution,

如下圖:

得到這個資訊後,我打算用分 Groups 來解這題。

PyTorch 中的 2D Convolution 有兩種,

一種是 torch.nn.Conv2d

另一是 torch.nn.functional.conv2d

前者只要設定好 Kernel 大小就能動,後者則可以提供使用自己 Kernel 的 API。

筆者這次使用後者,就以後者的 Document 來解釋:

首先我們要知道自己要分幾組 Group?

我們希望每個通道都各自做 Convolution ,而 RGB 圖片有三個通道,

所以我們的 Groups 應該設定三組。

再來需要注意上圖中 torch.nn.functional.conv2d 中的 weight,

這裡的 weight 代表的是 Kernel。

既然改了 Groups ,Kernel 的相應尺寸也要記得改變。

原本是 Kernel.shape = {3, 3, H, W} 要變成 {3, 3/3 = 1, H, W}。

這樣就能開心地模擬 OpenCV 的 2D Convolution 啦!

筆者在手刻 Kernel 的時候也遇到一些光怪陸離的問題,

預計下一篇會來寫這部份。

By wuyiulin

喜歡騎單車的影像算法工程師

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *