前言
平時生活中,我們經常碰到一些自己喜歡的圖片卻苦於分辨率很低,而原圖又找不太到。 現在,神經網絡可以幫助我們從一張給定的低分辨率圖片恢復出高分辨率的圖片。 這個功能聽上去既炫酷又實用,具體是怎麼做的呢,詳見下文!
Demo效果
上圖就是訓練了2000次後的模型的效果,只需要輸入一張左邊的低精度的圖片, 就可以生成右邊的高精度的圖片。肉眼看上去效果還是非常不錯的!
這張GIF則展示了整個訓練過程的變化, 左邊的圖是由神經網絡生成的, 中間的是原始的高精度的圖片, 右邊的是輸入到神經網絡的低分辨率圖片, 神經網絡在整個生成過程中是沒有得到高精度圖片信息的,這裏給出高精度圖片只是爲了對比體現生成的效果。可以看到在100次epoch迭代之後,性能已經非常不錯了。
鏈接
項目源碼:基於keras的SRGAN實現.
主要參考了著名的keras-GAN這個庫,做了一些小改動使得節目效果更好,適合作爲Demo來展示哈哈。如果對你有幫助的話請Star一下哈!
論文地址 被引用了1500多次,很強了!這個代碼也是根據論文裏的參數寫的。
數據集地址 這個鏈接給出了百度雲和谷歌雲盤的下載地址,筆者是用百度雲下載的,非會員用戶, 5M/s的速度,很給力!
原理分析
這裏提供非常概括性的分析,想深入理解的同學建議參考原文。
系統模型
首先作者使用了非常火熱的GAN生成對抗網絡(對GAN不熟悉的可以百度一下GAN,已經有許多優質的資料)。 生成網絡(上圖上半部)接收低精度圖片作爲輸入,通過殘差網絡等,生成高精度圖片。 然後 判別器網絡(上圖下半部)接收一個輸入, 判斷其是否爲生成的圖片。 損失函數爲:
沒有GAN基礎的同學可能比較難理解上述公式,這裏深入淺出的通俗解釋下訓練過程其實就是:
- 固定生成器G (參數爲), 訓練判別器,使得其能夠分辨 真實的圖片和生成器生成的圖片。
- 固定判別器, 訓練生成器, 使得其能夠讓固定的判別器將其判別爲真實的圖片
如此迭代之後, 判別器再也無法分別真實和生成的圖片,此時就說明生成器生成的圖片已經足夠以假亂真。這裏真實的圖片指的就是高精度的圖片,訓練完成後,我們期望生成器可以接收低精度圖片,來生成高精度圖片。
生成器作者主要使用了ResNet來實現。
判別器是使用了常規的卷積神經網絡。
損失函數
與普通的GAN網絡不同的是,這篇文章還考慮了content loss:
意思就是,生成的圖片會和準確的圖片一起,輸入到VGG網絡中,然後得到特徵圖。 再將兩者的特徵圖求MSE,並訓練生成器縮小該MSE。這就是從內容的角度,讓生成的圖片和準確圖片儘可能的接近。
結合上述的GAN網絡,本文采用的loss是:
也就是說在MSE損失的基礎上,摻入了一點GAN的損失,作者指出這樣會獲得更好的性能。
實驗
上述簡單的概述應該很難讓讀者完全看懂,建議結合論文與代碼一起融會貫通。這裏說一下仿真細節:
數據集使用了數據集地址 人臉數據集,因此要恢復的圖片也應該是人像圖纔會效果比較好。
筆者的配置是1080Ti + i9-9900k + 48G內存, 因此使用的batch_size爲10。配置不夠的同學可以先設爲1,確保機器可以跑起來。
具體還可以參見基於keras的SRGAN實現中的readme,有具體的使用方法。
結束
這個Demo非常簡單,但是效果很不錯,適合課堂演示,Presentation之類的。
我給出了自己這邊訓練了2000次後的模型權重,可以從鏈接下載
提取碼:su92
由於訓練的模型固定了輸出的尺寸,因此你自己想輸入的圖片也儘可能取正方形圖片(裁剪一下就行)。