1. 程式人生 > >拍照手抖有救了!DeblurGAN消除運動模糊效果驚人 | 附論文+程式碼

拍照手抖有救了!DeblurGAN消除運動模糊效果驚人 | 附論文+程式碼

拍照手抖有救了!DeblurGAN消除運動模糊效果驚人 | 附論文+程式碼

十圖九糊。

置身異國街道,感受著陌生環境裡熙熙攘攘的街道,你掏出手機想留住這一刻。

好嘞,一、二、三,咔嚓。

由於行人和車輛都在運動,再加上你的手稍微抖了一抖,照片中的景象是這樣的——

640?wx_fmt=png&wxfrom=5&wx_lazy=1

這樣的——

0?wx_fmt=jpeg

和 這樣的——

0?wx_fmt=png

這是什麼AV畫質啊!

0?wx_fmt=jpeg

拍照時手抖,或者畫面中的物體運動都會讓畫面模糊,女友辛辛苦苦擺好的各種Pose也將淹沒在各種模糊的線條中,是時候要有一種新的演算法解救水深火熱中的你了。

近日,烏克蘭天主教大學、布拉格捷克理工大學和解決方案提供商Eleks聯手公佈了一篇論文,文章標題為《DeblurGAN: Blind Motion Deblurring Using Conditional Adversarial Networks》。

這篇文章中,研究人員提出一種基於條件對抗式生成網路和內容損失(content loss)的端對端學習法DeblurGAN,去除影象上因為物體運動而產生的模糊。

效果嘛,可以說好到讓你不太相信自己的眼睛。

比如我們剛剛在異國街頭拍糊了的那張,處理後變成了這樣——

0?wx_fmt=png

爐火純青。

還不來學習一下去糊大法的手藝?

GAN中得到靈感

迴歸我們的終極議題:在沒有提供任何關於核(kernel)或相機的運動資訊的情況下,怎樣去除單張照片中的運動模糊(Motion Blur)呢?

這不禁讓人聯想起生成對抗網路(GAN),因為它能夠儲存高紋理細節,建立的圖案又接近真實影象,所以是影象超解析度和影象修復中的主力軍。

能否將這種方法應用到消除運動模糊的工藝中呢?

可以。模糊處理可以看作是影象轉化中的一個特例,研究人員提出基於條件生成式對抗網路和多元內容損失的DeblurGAN法。

這是種什麼方法?我們繼續往下看。

基本原理

因為目標是把模糊影象IB在沒有提供模糊核的情況下恢復成清晰影象IS,因此,我們需要訓練一個CNN GθG作為生成器。每張IB都對應著一張估計出的清晰影象IS。此外,在訓練階段,我們將引入critic函式DθD,以對抗的方式訓練兩個網路。

0?wx_fmt=jpeg

 DeblurGAN生成網路架構

從上圖的架構中可以看出,DeblurGAN包含兩個1/2間隔的卷積單元、9個剩餘residual單元和兩個反捲積單元。每個ResBlock由一個卷積層、例項歸一化層和ReLU啟用組成。

去除運動模糊的整個流程,如下圖所示:

0?wx_fmt=jpeg

先生成運動模糊影象

想去糊,先得知道怎樣將清晰影象轉換成運動模糊影象,這個準備階段也學問多多。

與超解析度和黑白照片上色等流行的影象到影象(image-to-image)的轉換問題相比,用於訓練演算法的清晰和模糊的影象對(image pairs)難以獲取,一種典型的獲取方法是用高幀頻相機捕捉視訊中清晰的幀模擬模糊影象。

用這種方法建立真實圖片的模糊影象,會將影象空間(image space)侷限在拍攝的視訊中出現的場景,並將資料集變得更復雜。

根據前人的實驗,研究人員提出的方法更真實地模擬了複雜的模糊核(blur kernel)。這種方法遵循了Boracchi和Foi 2012年在論文Modeling the performance of image restoration from motion blur中所描述的隨機軌跡生成的概念,對軌跡向量應用亞畫素插值法生成核。每個軌跡向量都是一個複雜向量,對應著一個連續域中的二維隨機運動物體的離散位置。

0?wx_fmt=png

 生成的相機運動軌跡和模糊核心以及相應的模糊影象示例

軌跡生成由馬爾可夫過程完成、由演算法總結。根據前一個點速度和位置、高斯攝動方程和脈衝攝動,隨機生成下一個點的位置。

打造DeblurGAN

基本思路和運動模糊生成後,可以開始著手訓練模型了。

研究人員用PyTorch中實現了自己的所有模型,整個訓練過程是在一個Titan-X GPU上執行三種不同的資料集。

第一個模型DeblurGANWILD是在隨機裁剪的256x256畫素的GoPro資料集上訓練的;第二個模型DeblurGANSynth在用上文所介紹方法模糊過的MS COCO資料集上訓練;此外,還有一個特殊的模型DeblurGANComb,所用的訓練集中有2/3是合成影象,1/3是高幀率相機拍攝的影象。

由於它們均為全卷積模型,又是在影象patch上訓練的,因此可以應用在任意大小的影象中。

為了進行優化,研究人員在DθD上執行了5次梯度下降,在GθG上執行了1次。最初生成器和判別器設定的學習速率為10-4,經過150次迭代後,在接下來的有一輪150次迭代中將這個比率線性衰減。

6天后,研究人員訓練出一個DeblurGAN網路,最激動人心的部分終於來了。

開始測試!

GoPro資料集

GoPro資料集包含了2103對從不同的場景拍攝的720p的模糊-清晰的影象對。研究人員將模型的結果與標準指標的模型狀態進行比較,並在單個GPU上顯示每個演算法的執行時間,結果如下:

0?wx_fmt=png

 GoPro資料集測試影象的平均峰值信噪比和結構相似度

測試結果表明,DeblurGAN在定性和定量兩方面都表現出優異的結果。它可以處理由相機抖動和物體運動引起的模糊,不會受到通常的核評估方法的影響,同時引數僅為Multi-scale CNN的六分之一,大大加快了推理速度。

不信?那來看看GoPro資料集測試的去模糊影象——

0?wx_fmt=png

 GoPro測試資料集的評估結果/從左到右:模糊影象、Nah演算法處理結果和我們演算法的處理結果

Kohler資料集

Kohler資料集由4張影象組成,每張用12個不同的核模糊影象。這是一個標準的基準資料集,用於評價去模糊演算法。資料集通過記錄和分析真實的相機運動產生,並在機器人載體上回放,這樣在6D相機運動軌跡上會留下一系列清晰的影象。

0?wx_fmt=png

 在Kohler基準資料集上進行的平均峰值信噪比和結構相似度測度結果

YOLO上的目標檢測基準

這項研究中還有一個小彩蛋。

研究人員探索了動態模糊對目標檢測的影響,基於在預訓練的YOLO網路上目標檢測的結果,提出一種評估質量的去模糊演算法的新方式。

通過用高幀率攝像機模擬相機抖動,研究人員構建了一個清晰-模糊的街景資料集。之後,對240fps(每秒顯示幀數-幀率)相機拍攝的5到25幀進行隨機抽樣,並計算中間幀的模糊版作為這些幀的平均值。

總體來說,資料集包括410對模糊-清晰影象,這些影象是從不同街道和停車場拍攝的,包含不同數量和型別的汽車。

0?wx_fmt=png

 在模糊化前後的目標檢測

在recall和F1 socre上,DeblurGAN的表現遠遠超過了競爭對手。

0?wx_fmt=png

去糊寶典

你也想告別AV畫質?

彆著急,論文地址在這:

https://arxiv.org/abs/1711.07064

相關程式碼(PyTorch):

https://github.com/KupynOrest/DeblurGAN

—  —

加入社群

量子位AI社群11群開始招募啦,歡迎對AI感興趣的同學,加小助手微信qbitbot4入群;

 

此外,量子位專業細分群(自動駕駛、CV、NLP、機器學習等)正在招募,面向正在從事相關領域的工程師及研究人員。

 

進群請加小助手微訊號qbitbot4,並務必備註相應群的關鍵詞~通過稽核後我們將邀請進群。(專業群稽核較嚴,敬請諒解)

誠摯招聘

量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話介面,回覆“招聘”兩個字。