推薦 | 深度學習反卷積最易懂理解
重磅干貨,第一時間送達
本文轉載自:OpenCV學堂
?引言 ·
普通圖像反卷積,跟深度學習中的反卷積是一回事嗎?別傻傻分不清!其實它們根本不是一個概念
圖像反卷積
最早支持反卷積是因為圖像去噪跟去模糊,知道圖像去模糊時候會使用反卷積技術,那個是真正的反卷積計算,會估算核,會有很復雜的數(shù)學推導,主要用在圖像的預處理與數(shù)字信號處理中。本質上反卷積是一種圖像復原技術,典型的圖像模糊可以看成事圖像卷積操作得到的結果,把模糊圖像重新復原為清晰圖像的過程常常被稱為去模糊技術,根據(jù)模糊的類別不同可以分為運動模糊與離焦模糊,OpenCV支持對這兩張模糊圖像進行反卷積處理得到清晰圖像。反卷積的基本原理就是把圖像轉換到頻率域,通過估算圖像的核函數(shù),在頻率域對圖像點乘計算之后,重新獲取圖像信息,轉回為空間域。主要操作都在頻率域,轉換通過離散傅里葉(DFT)變換與反變換,通過維納濾波處理獲取反模糊信息,OpenCV支持反卷積采用維納濾波方式的去模糊,但是參數(shù)調(diào)整事一個大坑,基本上每張圖像的參數(shù)都不一樣,很難有相同的結果。最近這些年,圖像反模糊逐步被深度學習的方法引領,OpenCV提供的那幾個函數(shù)越來越少的人知道,主要是通用性很差。貼一張圖:

OpenCV反模糊之后的效果:

深度學習中的反卷積
深度學習中典型網(wǎng)絡就是卷積神經(jīng)網(wǎng)絡,對圖像分類,對象檢測都可以取得很好的效果。但是在語義分割任務中,網(wǎng)絡模型涉及到上采樣操作,最常見的就是通過填充0或者最近鄰插值的方式來完成上采樣。在ICCV 2015年的一篇論文中提出了可學習的反卷積網(wǎng)絡,不再通過簡單粗暴的填充0或者最近鄰插值方法來完成上采樣,讓整個過程變成可學習,在圖像語義分割網(wǎng)絡中實現(xiàn)了對上采樣過程的訓練。論文中提到的反卷積操作實現(xiàn)上采樣跟圖像處理中反卷積實現(xiàn)圖像去模糊有本質區(qū)別,這里的反卷積更加準確的說法應該是轉置卷積。

?卷積操作?·
圖中第二行就是卷積與反卷積的示意圖,下面通過一個簡單的例子來解釋上圖的內(nèi)容。假設有4x4大小的二維矩陣D,有3x3大小的卷積核C,圖示如下:

直接對上述完成卷積操作(不考慮邊緣填充)輸出卷積結果是2x2的矩陣

其中2x2卷積的輸出結果來自D中第二行第二列像素位置對應輸出,相關的卷積核與數(shù)據(jù)點乘的計算為:
0x3+1x3+2x2+2x0+2x0+0x1+0x3+1x1+2x2=12,可以看出卷積操作是卷積核在矩陣上對應位置點乘線性組合得到的輸出,對D=4x4大小的矩陣從左到右,從上到下,展開得到16個維度的向量表示如下:

我們同樣可以把3x3的卷積核表示如下:

為了獲得卷積核的4x4的向量表示,我們可以對其余部分填充零,那么卷積核在D上面移動的位置與對應的一維向量表示如下:

考慮到卷積核C與D的點成關系,合并在一起還可以寫成如下形式:

把上面卷積核中的字符表示替換為實際卷積核C,得到:

所以上述的卷積操作可以簡單的寫為:

重排以后就得到上面的2x2的輸出結果。
轉置卷積:
現(xiàn)在我們有2x2的數(shù)據(jù)塊,需要通過卷積操作完成上采樣得到4x4的數(shù)據(jù)矩陣,怎么完成這樣的操作,很容易,我們把2x2轉換為1x4的向量E,然后對卷積核C轉置,再相乘,表示為
就得到16維度向量,重排以后就得到了4x4的數(shù)據(jù)塊。這個就是深度學習中的卷積與反卷積最通俗易懂的解釋。
?終極解釋-一維轉置卷積?·
什么!還不明白,那我最后只能放一個大招了!我搞了個一維的轉置卷積的例子:

有個前提,你得先理解什么是卷積跟一維卷積,二維卷積等基本概念。這個例子就很直接,我用Excel繪制的,先看圖:
解釋一下,一維卷積的本來是1xN,轉置變?yōu)镹x1的,然后同樣用輸入的數(shù)據(jù)跟卷積核點乘,點成的方式如上,如果有重疊的部分,就加在一起就好啦,這部分還可以通過代碼來驗證演示一波,pytorch的代碼演示如下:
你好
from?__future__?import?print_function
import?torch
import?numpy?as?np
#?輸入一維數(shù)據(jù)
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("輸入數(shù)據(jù):",?d)
print("輸出上采樣結果:",?ct1d(d))運行結果如下:

根據(jù)我的手繪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》
好消息!?
小白學視覺知識星球
開始面向外開放啦??????
下載1:OpenCV-Contrib擴展模塊中文版教程 在「小白學視覺」公眾號后臺回復:擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺實戰(zhàn)項目52講 在「小白學視覺」公眾號后臺回復:Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學校計算機視覺。 下載3:OpenCV實戰(zhàn)項目20講 在「小白學視覺」公眾號后臺回復:OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學習進階。 交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

