承上篇: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 的時候也遇到一些光怪陸離的問題,
預計下一篇會來寫這部份。