0
| 本文作者: AI研習社-譯站 | 2018-04-25 14:20 |
雷鋒網(wǎng)按:本文為雷鋒字幕組編譯的技術博客,原標題GAN with Keras: Application to Image Deblurring,作者為Rapha?l Meudec。
翻譯 | 廖穎 陳俊雅 整理 | 凡江

2014年 Ian Goodfellow 提出了生成對抗網(wǎng)絡(GAN)。這篇文章主要介紹在Keras中搭建GAN實現(xiàn)圖像去模糊。所有的Keras代碼可點擊這里。
可點擊查看原始出版文章和Pytorch實現(xiàn)。
快速回憶生成對抗網(wǎng)絡
GAN中兩個網(wǎng)絡的訓練相互競爭。生成器( generator) 合成具有說服力的假輸入來誤導判別器(discriminator ),而判別器則是來識別這個輸入是真的還是假的。

生成對抗網(wǎng)絡訓練過程—?來源
訓練過程主要有三步
根據(jù)噪聲,生成器合成假的輸入
用真的輸入和假的輸入共同訓練判別器
訓練整個模型:整個模型中判別器與生成器連接
注意:在第三步中,判別器的權重是固定的
將這兩個網(wǎng)絡連接起來是由于生成器的輸出沒有可用的反饋。我們唯一的準則就是看判別器是否接受生成器的合成的例子。
這些只是對生成對抗網(wǎng)絡的一個簡單回顧,如果還是不夠明白的話,可以參考完整介紹。
數(shù)據(jù)
Ian Goodfellow首次使用GAN模型是生成MNIST數(shù)據(jù)。 而本篇文章是使用生成對抗網(wǎng)絡進行圖像去模糊。因此生成器的輸入不是噪聲,而是模糊圖像。
數(shù)據(jù)集來自GOPRO數(shù)據(jù),你可以下載精簡版數(shù)據(jù)集(9GB),也可以下載完整版數(shù)據(jù)集(35GB)。其中包含了來自不同街道視角的人造模糊圖像,根據(jù)不同的場景將數(shù)據(jù)集分在各個子文件夾中。
我們先把圖像分到 A (模糊)和 B (清晰)兩個文件夾。這個 A&B 結構對應于原始文章pix2pix 。我創(chuàng)建了一個 自定義腳本來執(zhí)行這個任務。 看看 README 后嘗試一下吧。
模型
訓練過程還是一樣,首先來看一下神經(jīng)網(wǎng)絡結構。
生成器
生成器要生成清晰圖像,網(wǎng)絡是基于ResNet blocks的,它可以記錄對原始模糊圖像操作的過程。原文還使用了基于UNet的版本,但我目前還沒有實現(xiàn)。這兩種結構都可以很好地進行圖像去模糊。

DeblurGAN 生成器網(wǎng)絡?結構 —? 來源
核心是采用9 個ResNet blocks對原始圖像進行上采樣。來看一下Keras上的實現(xiàn)!

ResNet 層就是一個基本的卷積層,其中,輸入和輸出相加,形成最終輸出。

生成器結構的 Keras 實現(xiàn)
按照計劃,用9個ResNet blocks對輸入進行上采樣。我們在輸入到輸出增加一個連接,然后除以2 來對輸出進行歸一化。
這就是生成器了! 我們再來看看判別器的結構吧。
判別器
判別器的目標就是要確定一張輸入圖片是否為合成的。因此判別器的結構采用卷積結構,而且是一個單值輸出。

判別器結構的 Keras 實現(xiàn)
最后一步就是建立完整的模型。這個GAN的一個特點就是輸入的是真實圖片而不是噪聲 。因此我們就有了一個對生成器輸出的直接反饋。

接下來看看采用兩個損失如何充分利用這個特殊性。
訓練
損失
我們提取生成器最后和整個模型最后的損失。
第一個是感知損失,根據(jù)生成器輸出直接可以計算得到。第一個損失保證 GAN 模型針對的是去模糊任務。它比較了VGG第一次卷積的輸出。

第二個損失是對整個模型輸出計算的Wasserstein loss,計算了兩張圖像的平均差值。眾所周知,這種損失可以提高生成對抗網(wǎng)絡的收斂性。

訓練流程
第一步是加載數(shù)據(jù)并初始化模型。我們使用自定義函數(shù)加載數(shù)據(jù)集,然后對模型使用 Adam 優(yōu)化器。我們設置 Keras 可訓練選項來防止判別器進行訓練。

然后我們進行epochs(一個完整的數(shù)據(jù)集通過了神經(jīng)網(wǎng)絡一次并且返回了一次的過程,稱為一個epoch),并將整個數(shù)據(jù)集分批次(batches)。

最后根據(jù)兩者的損失,可以相繼訓練判別器和生成器。用生成器生成假的輸入,訓練判別器區(qū)別真假輸入,并對整個模型進行訓練。

你可以參考Github來查看完整的循環(huán)。
實驗
我使用的是在AWS 實例(p2.xlarge)上配置深度學習 AMI (version 3.0)進行的 。對GOPRO 精簡版數(shù)據(jù)集的訓練時間大約有 5 個小時(50個epochs)。
圖像去模糊結果

從左到右:原始圖像,模糊圖像,GAN 輸出
上面的輸出結果都是我們用 Keras 進行 Deblur GAN 的結果。即使是對高度模糊,網(wǎng)絡也可以減小模糊,產生一張具有更多信息的圖片,使得車燈更加匯聚,樹枝更加清晰。

左圖: GOPRO 測試圖像,右圖:GAN 輸出結果
因為引入了VGG來計算損失,所以會產生圖像頂部出現(xiàn)感應特征的局限。

左圖: GOPRO 測試圖像,右圖:GAN 輸出結果
希望你們可以喜歡這篇關于生成對抗網(wǎng)絡用于圖像去模糊的文章。 你可以評論,關注我或者聯(lián)系我。
如果你對機器視覺感興趣,我們還寫過一篇用Keras實現(xiàn)基于內容的圖像復原 。下面是生成對抗網(wǎng)絡資源的列表。

左圖: GOPRO 測試圖像,右圖:GAN 輸出結果
生成對抗網(wǎng)絡資源
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
更多文章,關注雷鋒網(wǎng) 雷鋒網(wǎng)雷鋒網(wǎng)
添加雷鋒字幕組微信號(leiphonefansub)為好友
備注「我要加入」,To be an AI Volunteer !

雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權禁止轉載。詳情見轉載須知。