0
本文作者: AI研習(xí)社-譯站 | 2018-04-25 14:20 |
雷鋒網(wǎng)按:本文為雷鋒字幕組編譯的技術(shù)博客,原標(biāo)題GAN with Keras: Application to Image Deblurring,作者為Rapha?l Meudec。
翻譯 | 廖穎 陳俊雅 整理 | 凡江
2014年 Ian Goodfellow 提出了生成對抗網(wǎng)絡(luò)(GAN)。這篇文章主要介紹在Keras中搭建GAN實現(xiàn)圖像去模糊。所有的Keras代碼可點擊這里。
可點擊查看原始出版文章和Pytorch實現(xiàn)。
快速回憶生成對抗網(wǎng)絡(luò)
GAN中兩個網(wǎng)絡(luò)的訓(xùn)練相互競爭。生成器( generator) 合成具有說服力的假輸入來誤導(dǎo)判別器(discriminator ),而判別器則是來識別這個輸入是真的還是假的。
生成對抗網(wǎng)絡(luò)訓(xùn)練過程—?來源
訓(xùn)練過程主要有三步
根據(jù)噪聲,生成器合成假的輸入
用真的輸入和假的輸入共同訓(xùn)練判別器
訓(xùn)練整個模型:整個模型中判別器與生成器連接
注意:在第三步中,判別器的權(quán)重是固定的
將這兩個網(wǎng)絡(luò)連接起來是由于生成器的輸出沒有可用的反饋。我們唯一的準(zhǔn)則就是看判別器是否接受生成器的合成的例子。
這些只是對生成對抗網(wǎng)絡(luò)的一個簡單回顧,如果還是不夠明白的話,可以參考完整介紹。
數(shù)據(jù)
Ian Goodfellow首次使用GAN模型是生成MNIST數(shù)據(jù)。 而本篇文章是使用生成對抗網(wǎng)絡(luò)進(jìn)行圖像去模糊。因此生成器的輸入不是噪聲,而是模糊圖像。
數(shù)據(jù)集來自GOPRO數(shù)據(jù),你可以下載精簡版數(shù)據(jù)集(9GB),也可以下載完整版數(shù)據(jù)集(35GB)。其中包含了來自不同街道視角的人造模糊圖像,根據(jù)不同的場景將數(shù)據(jù)集分在各個子文件夾中。
我們先把圖像分到 A (模糊)和 B (清晰)兩個文件夾。這個 A&B 結(jié)構(gòu)對應(yīng)于原始文章pix2pix 。我創(chuàng)建了一個 自定義腳本來執(zhí)行這個任務(wù)。 看看 README 后嘗試一下吧。
模型
訓(xùn)練過程還是一樣,首先來看一下神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。
生成器
生成器要生成清晰圖像,網(wǎng)絡(luò)是基于ResNet blocks的,它可以記錄對原始模糊圖像操作的過程。原文還使用了基于UNet的版本,但我目前還沒有實現(xiàn)。這兩種結(jié)構(gòu)都可以很好地進(jìn)行圖像去模糊。
DeblurGAN 生成器網(wǎng)絡(luò)?結(jié)構(gòu) —? 來源
核心是采用9 個ResNet blocks對原始圖像進(jìn)行上采樣。來看一下Keras上的實現(xiàn)!
ResNet 層就是一個基本的卷積層,其中,輸入和輸出相加,形成最終輸出。
生成器結(jié)構(gòu)的 Keras 實現(xiàn)
按照計劃,用9個ResNet blocks對輸入進(jìn)行上采樣。我們在輸入到輸出增加一個連接,然后除以2 來對輸出進(jìn)行歸一化。
這就是生成器了! 我們再來看看判別器的結(jié)構(gòu)吧。
判別器
判別器的目標(biāo)就是要確定一張輸入圖片是否為合成的。因此判別器的結(jié)構(gòu)采用卷積結(jié)構(gòu),而且是一個單值輸出。
判別器結(jié)構(gòu)的 Keras 實現(xiàn)
最后一步就是建立完整的模型。這個GAN的一個特點就是輸入的是真實圖片而不是噪聲 。因此我們就有了一個對生成器輸出的直接反饋。
接下來看看采用兩個損失如何充分利用這個特殊性。
訓(xùn)練
損失
我們提取生成器最后和整個模型最后的損失。
第一個是感知損失,根據(jù)生成器輸出直接可以計算得到。第一個損失保證 GAN 模型針對的是去模糊任務(wù)。它比較了VGG第一次卷積的輸出。
第二個損失是對整個模型輸出計算的Wasserstein loss,計算了兩張圖像的平均差值。眾所周知,這種損失可以提高生成對抗網(wǎng)絡(luò)的收斂性。
訓(xùn)練流程
第一步是加載數(shù)據(jù)并初始化模型。我們使用自定義函數(shù)加載數(shù)據(jù)集,然后對模型使用 Adam 優(yōu)化器。我們設(shè)置 Keras 可訓(xùn)練選項來防止判別器進(jìn)行訓(xùn)練。
然后我們進(jìn)行epochs(一個完整的數(shù)據(jù)集通過了神經(jīng)網(wǎng)絡(luò)一次并且返回了一次的過程,稱為一個epoch),并將整個數(shù)據(jù)集分批次(batches)。
最后根據(jù)兩者的損失,可以相繼訓(xùn)練判別器和生成器。用生成器生成假的輸入,訓(xùn)練判別器區(qū)別真假輸入,并對整個模型進(jìn)行訓(xùn)練。
你可以參考Github來查看完整的循環(huán)。
實驗
我使用的是在AWS 實例(p2.xlarge)上配置深度學(xué)習(xí) AMI (version 3.0)進(jìn)行的 。對GOPRO 精簡版數(shù)據(jù)集的訓(xùn)練時間大約有 5 個小時(50個epochs)。
圖像去模糊結(jié)果
從左到右:原始圖像,模糊圖像,GAN 輸出
上面的輸出結(jié)果都是我們用 Keras 進(jìn)行 Deblur GAN 的結(jié)果。即使是對高度模糊,網(wǎng)絡(luò)也可以減小模糊,產(chǎn)生一張具有更多信息的圖片,使得車燈更加匯聚,樹枝更加清晰。
左圖: GOPRO 測試圖像,右圖:GAN 輸出結(jié)果
因為引入了VGG來計算損失,所以會產(chǎn)生圖像頂部出現(xiàn)感應(yīng)特征的局限。
左圖: GOPRO 測試圖像,右圖:GAN 輸出結(jié)果
希望你們可以喜歡這篇關(guān)于生成對抗網(wǎng)絡(luò)用于圖像去模糊的文章。 你可以評論,關(guān)注我或者聯(lián)系我。
如果你對機(jī)器視覺感興趣,我們還寫過一篇用Keras實現(xiàn)基于內(nèi)容的圖像復(fù)原 。下面是生成對抗網(wǎng)絡(luò)資源的列表。
左圖: GOPRO 測試圖像,右圖:GAN 輸出結(jié)果
生成對抗網(wǎng)絡(luò)資源
NIPS 2016: Generative Adversarial Networks by Ian Goodfellow
GAN Implementations with Keras by Eric Linder-Noren
A List of Generative Adversarial Networks Resources by deeplearning4j
Really-awesome-gan by Holger Caesar
博客原址 https://blog.sicara.com/keras-generative-adversarial-networks-image-deblurring-45e3ab6977b5
更多文章,關(guān)注雷鋒網(wǎng) 雷鋒網(wǎng)雷鋒網(wǎng)
添加雷鋒字幕組微信號(leiphonefansub)為好友
備注「我要加入」,To be an AI Volunteer !
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。