Real-ESRGAN的應用

之前介紹過騰訊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」重複兩次。

https://img-blog.csdnimg.cn/954b03d7dc3c4bd38dc3ea32bb25c7c2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Yeg57u0d2s=,size_20,color_FFFFFF,t_70,g_se,x_16

版本演進

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,會得到一個有兩個畫面的影片,分別為原始及高清化後的。如下影片的截圖: