點選上方 藍字 關註我們
微信公眾號: OpenCV學堂
關註獲取更多電腦視覺 與深度學習知識
引言 ·
普通影像反摺積,跟深度學習中的反摺積是一回事嗎?別傻傻分不清!其實它們根本不是一個概念
影像反摺積
最早支持反摺積是因為影像去噪跟去模糊,知道影像去模糊時候會使用反摺積技術,那個是真正的反摺積計算,會估算核,會有很復雜的數學推導,主要用在影像的預處理與數位訊號處理中。本質上反摺積是一種影像復原技術,典型的影像模糊可以看成事影像摺積操作得到的結果,把模糊影像重新復原為清晰影像的過程常常被稱為去模糊技術,根據模糊的類別不同可以分為運動模糊與離焦模糊,OpenCV支持對這兩張模糊影像進行反摺積處理得到清晰影像。反摺積的基本原理就是把影像轉換到頻率域,透過估算影像的核函式,在頻率域對影像點乘計算之後,重新獲取影像資訊,轉回為空間域。主要操作都在頻率域,轉換透過離散傅立葉(DFT)變換與反變換,透過維納濾波處理獲取反模糊資訊,OpenCV支持反摺積采用維納濾波方式的去模糊,但是參數調整事一個大坑,基本上每張影像的參數都不一樣,很難有相同的結果。最近這些年,影像反模糊逐步被深度學習的方法引領,OpenCV提供的那幾個函式越來越少的人知道,主要是通用性很差。貼一張圖:
OpenCV反模糊之後的效果:
深度學習中的反摺積
深度學習中典型網路就是摺積神經網路,對影像分類,物件檢測都可以取得很好的效果。但是在語意分割任務中,網路模型涉及到上采樣操作,最常見的就是透過填充0或者最近鄰插值的方式來完成上采樣。在ICCV 2015年的一篇論文中提出了可學習的反摺積網路,不再透過簡單粗暴的填充0或者最近鄰插值方法來完成上采樣,讓整個過程變成可學習,在影像語意分割網路中實作了對上采樣過程的訓練。論文中提到的反摺積操作實作上采樣跟影像處理中反摺積實作影像去模糊有本質區別,這裏的反摺積更加準確的說法應該是轉置摺積。
摺積操作 ·
圖中第二行就是摺積與反摺積的示意圖,下面透過一個簡單的例子來解釋上圖的內容。假設有4x4大小的二維矩陣D,有3x3大小的摺積核C,圖示如下:
直接對上述完成摺積操作(不考慮邊緣填充)輸出摺積結果是2x2的矩陣
其中2x2摺積的輸出結果來自D中第二行第二列像素位置對應輸出,相關的摺積核與數據點乘的計算為:
0x3+1x3+2x2+2x0+2x0+0x1+0x3+1x1+2x2=12,可以看出摺積操作是摺積核在矩陣上對應位置點乘線性組合得到的輸出,對D=4x4大小的矩陣從左到右,從上到下,展開得到16個維度的向量表示如下:
我們同樣可以把3x3的摺積核表示如下:
為了獲得摺積核的4x4的向量表示,我們可以對其余部份填充零,那麽摺積核在D上面移動的位置與對應的一維向量表示如下:
考慮到摺積核C與D的點成關系,合並在一起還可以寫成如下形式:
把上面摺積核中的字元表示替換為實際摺積核C,得到:
所以上述的摺積操作可以簡單的寫為:
重排以後就得到上面的2x2的輸出結果。
轉置摺積 :
現在我們有2x2的數據塊,需要透過摺積操作完成上采樣得到4x4的數據矩陣,怎麽完成這樣的操作,很容易,我們把2x2轉換為1x4的向量E,然後對摺積核C轉置,再相乘,表示為 就得到16維度向量,重排以後就得到了4x4的數據塊。這個就是深度學習中的摺積與反摺積最通俗易懂的解釋。
終極解釋-一維轉置摺積 ·
什麽!還不明白,那我最後只能放一個大招了!我搞了個一維的轉置摺積的例子:
有個前提,你得先理解什麽是摺積跟一維摺積,二維摺積等基本概念。這個例子就很直接,我用Excel繪制的,先看圖:
解釋一下,一維摺積的本來是1xN,轉置變為Nx1的,然後同樣用輸入的數據跟摺積核點乘,點成的方式如上,如果有重疊的部份,就加在一起就好啦,這部份還可以透過程式碼來驗證演示一波,pytorch的程式碼演示如下:
你好
from __future__ import print_function
import torch
import numpy as np
# 輸入一維數據
d = torch.tensor([1.,2.])
# 一維摺積核
f = torch.tensor([3.0,4.0])
# 維度轉換dd
d = d.view(1,1,2)
f = f.view(1,1,2)
# 一維轉置摺積
ct1d = torch.nn.ConvTranspose1d(in_channels=1, out_channels=1, kernel_size=2, stride=2, bias=0)
ct1d.weight = torch.nn.Parameter(f);
# 打印輸出
print("輸入數據:", d)
print("輸出上采樣結果:", ct1d(d))
執行結果如下:
根據我的手繪Excel圖,可以認為:
[x, y] = [1, 2],
摺積核[a, b] = [3, 4],
輸出結果[ax, bx, ay, by] = [3, 4, 6, 8]
這個就是轉置摺積上采樣!這下還不明白我真的沒法啦!
參考:
https://iksinc.online/2017/05/06/deconvolution-in-deep-learning/
2015 ICCV論文【Learning Deconvolution Network for Semantic Segmentation】
OpenCV4系統化學習
深度學習系統化學習
推薦閱讀