之前介紹過騰訊ARC Lab的GFPGAN,該開源專案針對模糊、低解析人臉的還原效果相當不錯,而這次要介紹的Real-ESRGAN也是由騰訊ARC Lab團隊開發開源,強調僅需使用模擬資料來訓練出的模型,就能將圖片解析度擬真擴大到四倍,此外它還能與GFPGAN聯用,同時將圖像中的人物及物件,轉換成超解析度(Super Resolution)的圖像。
模擬低解析度圖片
要訓練一個Super Resolution GAN,最困難的其實不在於模型本身而是實際資料的取得,因為,我們很難剛好會有一對一低解析與高解析度圖片for相同的物品場景,一般作法都是透過影像處理方式(如OpenCV或Pillow)直接將圖片尺寸縮小來作為低解析度相片,但是這樣方式所訓練出的模型與不同環境下產生的低解析/模糊圖片pattern還是有所不同,因此訓練出的結果往往不是很讓人滿意,最主要原因是現實生活中有不同的來源及因素造成影像的品質不佳,例如,圖片壓縮、網路傳輸、加密解碼、晃動移動及振動、噪點、…這些不同來源的因素混雜所造成的低品質影像特徵,非單純的影像尺寸縮小便可模擬,因此,要訓練出一個能將低解析還原成高解析影像的Super Resolution模型,效果與其訓練使用的dataset有相當大關係。
作者在論文中提出了稱為「high-order」的dataset處理方式,並將傳統作法稱為「first-order」。所謂的「high-order」是指進行多次、而非傳統一次的blur + resiae + add noise + JPEG壓縮等流程。據作者的實驗結果,這個重複次數若為兩次可得到最佳的模擬低解析度圖像結果。故「high-order」其實是指將「first-order」重複兩次。
版本演進
Real-ESRGAN是一系列版本改進的結果,前幾代的演進歷程是SRCNN🡪 SRGAN🡪 ESRGAN,其與前一代ESRGAN最大差異,在於:
針對GAN Generator的改良
- 刪除Residual Block中的BN layer
針對GAN Discriminator的改良
提出Relativistic Discriminator的方式,Discriminator的輸出改以相對值而非0與1,來作為判別Generator產生的圖片標準。
Loss的改良:導入Adversarial loss以及Content loss
其它Real-ESRGAN的說明,可參考:
安裝Real-ESRGAN
cd Real-ESRGAN
由於Real-ESRGAN可引用GFPGAN針對臉孔特別處理,因此相片處理效果會比起僅處理臉部的GFPGAN方便也比較自然。如下圖左:Real-ESRGAN 右:GFPGAN,兩者相比會發現Real-ESRGAN將紅框處的背景也清晰化了。
將Video轉為高清影片
下方我撰寫一支程式,只要輸入影片的path便能將影片轉成四倍解析度,例如原本為480P(720×480)的影片,轉換後變成接近2K(2880×1920)的高解析度影。
處理流程:
Moviepy安裝
OpenCV僅能處理影片中的影格,聲音的部份,除了常使用的ffmpeg外推薦可用moviepy,該tool可同時針對影像及聲音進行處理。
pip install moviepy
示範:下方的程式可將原始影片的聲音檔放到另一個影片中。
from moviepy.editor import *
inclip = VideoFileClip(inVideoFile) 🡪 載入原始的影片檔
audioclip = inclip.audio 🡪 取得影片中的聲音內容
outClip = VideoFileClip(tmpVideoFile) 🡪 載入完成的高解析影片
videoclip = outClip.set_audio(audioclip) 🡪 將原始影片的聲音內容,加到高解析影片
videoclip.write_videofile(outVideoFile,fps=fps) 🡪 產生有聲音的影片
模糊影片轉高清的程式使用方法
在main.py 中設定好如下參數:
inVideoFile = r’demotest.mp4′ #需要轉高清的影片path
outVideoFile = r’up_demotest.mp4′ #需出高清影片的輸出path
comobine_new_old_frame = True #需出的影片是否for比對用(同時將新舊結果放在同一畫面中作比對)
combine = ‘H’ #輸出的兩個比對畫面,要橫排還是直排方式排列。
moduleUpsamplePath = ‘/DS/frameworks/video_upsampling/Real-ESRGAN’ # Real-ESRGAN的安裝path
python_path = ‘/home/chtseng/envs/AI/bin/python’ #python執行檔的安裝path
tmp_path = ‘/CDS/temp/demotest’ #暫存空間用path
執行結果
如果comobine_new_old_frame設為True,會得到一個有兩個畫面的影片,分別為原始及高清化後的。如下影片的截圖: