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