深度学习:用生成对抗网络(GAN)来恢复高分辨率(高精度)图片 (附源码,模型与数据集)
文章目錄
- 前言
- Demo效果
- 鏈接
- 原理分析
- 系統模型
- 損失函數
- 實驗
- 結束
前言
平時生活中,我們經常碰到一些自己喜歡的圖片卻苦于分辨率很低,而原圖又找不太到。 現在,神經網絡可以幫助我們從一張給定的低分辨率圖片恢復出高分辨率的圖片。 這個功能聽上去既炫酷又實用,具體是怎么做的呢,詳見下文!
Demo效果
上圖就是訓練了2000次后的模型的效果,只需要輸入一張左邊的低精度的圖片, 就可以生成右邊的高精度的圖片。肉眼看上去效果還是非常不錯的!
這張GIF則展示了整個訓練過程的變化, 左邊的圖是由神經網絡生成的, 中間的是原始的高精度的圖片, 右邊的是輸入到神經網絡的低分辨率圖片, 神經網絡在整個生成過程中是沒有得到高精度圖片信息的,這里給出高精度圖片只是為了對比體現生成的效果。可以看到在100次epoch迭代之后,性能已經非常不錯了。
鏈接
項目源碼:基于keras的SRGAN實現.
主要參考了著名的keras-GAN這個庫,做了一些小改動使得節目效果更好,適合作為Demo來展示哈哈。如果對你有幫助的話請Star一下哈!
論文地址 被引用了1500多次,很強了!這個代碼也是根據論文里的參數寫的。
數據集地址 這個鏈接給出了百度云和谷歌云盤的下載地址,筆者是用百度云下載的,非會員用戶, 5M/s的速度,很給力!
原理分析
這里提供非常概括性的分析,想深入理解的同學建議參考原文。
系統模型
首先作者使用了非常火熱的GAN生成對抗網絡(對GAN不熟悉的可以百度一下GAN,已經有許多優質的資料)。 生成網絡(上圖上半部)接收低精度圖片作為輸入,通過殘差網絡等,生成高精度圖片。 然后 判別器網絡(上圖下半部)接收一個輸入, 判斷其是否為生成的圖片。 損失函數為:
min?θGmax?θDEIHR~pranin(IHR)[log?DθD(IHR)]+EILR~pG(ILR)[log?(1?DθD(GθG(ILR))]\begin{array}{c}{\min _{\theta_{G}} \max _{\theta_{D}} \mathbb{E}_{I^{H R} \sim p_{\mathrm{ranin}}\left(I^{H R}\right)}\left[\log D_{\theta_{D}}\left(I^{H R}\right)\right]+} {\mathbb{E}_{I^{L R} \sim p_{G}\left(I^{L R}\right)}\left[\log \left(1-D_{\theta_{D}}\left(G_{\theta_{G}}\left(I^{L R}\right)\right)\right]\right.}\end{array} minθG??maxθD??EIHR~pranin?(IHR)?[logDθD??(IHR)]+EILR~pG?(ILR)?[log(1?DθD??(GθG??(ILR))]?
沒有GAN基礎的同學可能比較難理解上述公式,這里深入淺出的通俗解釋下訓練過程其實就是:
如此迭代之后, 判別器再也無法分別真實和生成的圖片,此時就說明生成器生成的圖片已經足夠以假亂真。這里真實的圖片指的就是高精度的圖片,訓練完成后,我們期望生成器可以接收低精度圖片,來生成高精度圖片。
生成器作者主要使用了ResNet來實現。
判別器是使用了常規的卷積神經網絡。
損失函數
與普通的GAN網絡不同的是,這篇文章還考慮了content loss:
lVGG/i.jSR=1Wi,jHi,j∑x=1Wi,jHi,j(?i,j(IHR)x,y??i,j(GθG(ILR))x,y)2\begin{array}{r}{l_{V G G / i . j}^{S R}=\frac{1}{W_{i, j} H_{i, j}} \sum_{x=1}^{W_{i, j} H_{i, j}}\left(\phi_{i, j}\left(I^{H R}\right)_{x, y}\right.} {-\phi_{i, j}\left(G_{\theta_{G}}\left(I^{L R}\right)\right)_{x, y} )^{2}}\end{array} lVGG/i.jSR?=Wi,j?Hi,j?1?∑x=1Wi,j?Hi,j??(?i,j?(IHR)x,y???i,j?(GθG??(ILR))x,y?)2?
意思就是,生成的圖片會和準確的圖片一起,輸入到VGG網絡中,然后得到特征圖。 再將兩者的特征圖求MSE,并訓練生成器縮小該MSE。這就是從內容的角度,讓生成的圖片和準確圖片盡可能的接近。
結合上述的GAN網絡,本文采用的loss是:
lSR=lXSR?content?loss?+10?3lGenSR?adversarial?loss?l^{S R}=\underbrace{l_{\mathrm{X}}^{S R}}_{\text { content loss }}+\underbrace{10^{-3} l_{G e n}^{S R}}_{\text { adversarial loss }} lSR=?content?loss?lXSR???+?adversarial?loss?10?3lGenSR???
也就是說在MSE損失的基礎上,摻入了一點GAN的損失,作者指出這樣會獲得更好的性能。
實驗
上述簡單的概述應該很難讓讀者完全看懂,建議結合論文與代碼一起融會貫通。這里說一下仿真細節:
數據集使用了數據集地址 人臉數據集,因此要恢復的圖片也應該是人像圖才會效果比較好。
筆者的配置是1080Ti + i9-9900k + 48G內存, 因此使用的batch_size為10。配置不夠的同學可以先設為1,確保機器可以跑起來。
具體還可以參見基于keras的SRGAN實現中的readme,有具體的使用方法。
結束
這個Demo非常簡單,但是效果很不錯,適合課堂演示,Presentation之類的。
我給出了自己這邊訓練了2000次后的模型權重,可以從鏈接下載
提取碼:su92
由于訓練的模型固定了輸出的尺寸,因此你自己想輸入的圖片也盡可能取正方形圖片(裁剪一下就行)。
總結
以上是生活随笔為你收集整理的深度学习:用生成对抗网络(GAN)来恢复高分辨率(高精度)图片 (附源码,模型与数据集)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于LM2576的降压电源的分析与设计
- 下一篇: 数值代数课设(99分)--基于Jacob