謝卓然 寸怡鵬 姜德航 王 菲
隨著計算機硬件的飛速發展,深度學習的出現使得計算機視覺課題中的許多難題迎刃而解。但即便在這種情形下,要想讓計算機學習并擁有修復一張圖片中的缺失部分的能力依然是一件很有挑戰性的事。而本文討論的圖像修復方法正是結合深度學習中的生成對抗網絡(Generative Adversarial Network,后稱GAN),并以最小二乘作為GAN 損失函數的一種圖像修復方法。我們稱這種網絡結構為:最小二乘生成對抗網絡(LeatSquare GenerativeAdversarial Network,后稱 LSGAN)。
Criminis 算法[1]的本質是將圖像本身的紋理“復制粘貼”到破損區進行修復。

圖 1 Criminisi 修復算法原理
如圖1 所示為Criminis 算法修復殘缺圖片的過程:Ω是圖像中待修補的部分,則可以用?Ω 表示其邊界;Φ 為圖像剩余區域;算法在邊界先選一以p 點為中心的區域Ψp 作為當前修復目標 ,再到已知的Φ 中搜索一與其紋理最為相似的Ψq,如圖1(b)所示。最后復制粘貼到破損部分進行修復形成圖1(c)的結果,以此類推。
數據驅動修復圖像[2]的方法不將圖像修補的素材局限在破損圖像本身,而是利用互聯網上豐富的圖片來解決Criminisi 算法中,不能在剩余圖像中找到與待修復區相匹配的紋理的問題。
該方法首先從互聯網中挑選數百個與待修復圖像最為相似的圖片,并用Oliva A 等人[3]計算圖像匹配特征向量。接著根據上下文的匹配誤差,選擇最佳的補全位置。最后返回20 個最佳補全結果供用戶挑選。
這種方法拋棄了Criminisi 算法中修補材料只能來源于破損圖片的局限性,為如何修復圖像提出了新思路。
繼數據驅動修復之后,Pathak D 等人[4]在2017 年CVPR(IEEE Conference on Computer Vision and Pattern Recognition,IEEE 國際計算機視覺與模式識別會議)上提出,利用卷積神經網絡來學習圖像中的高級特征,再用這些特征來指導圖像破損區域的重新生成。其網絡結構如圖2 所示。

圖2 Pathak.D 等人提出的用修補圖像網絡
Context-Encoder(后稱 CE)將 Encoder-Decoder 網絡和GAN(生成式對抗網絡)相結合:兩個網絡各司其職:Encoder-Decoder 負責實現同時學習圖像特征以及生成修補素材的兩大功能,而GAN 部分則用來判斷修復結果的真實性。當Encoder-Decoder 生成的素材與破損圖像無縫銜接,且GAN 也判斷不出圖像是否為人工合成時,認為該方法達到最佳效果。
與數據驅動法相比,這種方法不需要連接圖片庫,當網絡訓練好以后,它可以省去大量用于圖片搜索的時間。
Criminisi 的算法只能很好的修復含大量重復性紋理的圖像,算法效率較低,且對其他大部分圖片都不適用。
數據驅動算法允許引入更多的外部內容對圖像進行修復,但在修復過程中使用的特征仍然是較低級的特征,在測試場景與數據庫映像有顯著差異時很容易失敗。
CE 算法利用深度卷積神經網絡,克服了前兩種算法中存在的問題。但由于其訓練網絡時,直接將含有固定破損形狀的圖像作為神經網絡的輸入,導致其只能很好的修復某特定類型的破損圖片。當圖像破損部分與用來訓練網絡的圖片的破損形狀不一致時,修復出的結果就很難令人滿意了。
相比之下,本文所使用的方法在這一方面具有顯著優勢:它與CE 同樣用到了GAN 網絡作為模型核心,但它在訓練網絡時不需要加入帶掩碼的圖片,因此對于任意形狀的破損區域,也能獲得較好的修復結果。
生成式對抗網絡的理念起初是在 Ian Goodfellow 等人的開創性論文“Generative Adversarial Nets”[5]中提出的。GAN 網絡原理結構如圖3 所示。其中,G 是圖像生成網絡,向他輸入一單位隨機向量z 以生成圖片G(z)。D 是判別網絡,用于判斷圖片來源的真實性。其輸的圖像x 可以來源于現實環境或生成器G 偽造而成,最終輸出一結果D(x)表示圖像來源為真實圖像的概率。

圖 3 GANs 結構模型
在訓練過程中,D 和G 網絡之間形成動態博弈。生成網絡在一次次訓練中逐漸增加偽造圖像在判別網絡處的得分。而判別網絡則希望將生成網絡合成的圖片和真實的自然圖像準確區分開。我們將上述過程循環執行足夠多的次數,D(G(z))的值將趨近于50%,此時生成網絡合成的圖像已經足夠自然,網絡訓練完成。
文獻[12-13]指出,原始GAN 訓練過程很不穩定,這很大程度上是GAN 使用交叉熵函數(Sigmoid cross entropy)作為判別器損失函數導致的。這將導致那些仍然遠離真實數據的、但又在決策邊界被分類為真的假樣本停止繼續迭代,而這些樣本的梯度是梯度下降的決定方向。于是當我們再用這些樣本反過來更新生成器的時候,訓練過程就變得不穩定了,容易發生梯度消失的現象,導致生成器生成的圖片質量很差。
Mao Xudong 等人[8]提出,用最小二乘函數替換交叉熵做判別器損的失函數可以很好解決這個問題。因為使用最小二乘函數的LSGAN 會對處于判別成真的那些遠離決策邊界的樣本進行懲罰,把遠離決策邊界的假樣本拖進決策邊界,有效避免梯度消失,從而提高生成圖片的質量。
圖4 展示了交叉熵和最小二乘損失函數的區別,可以看出GAN 采用的交叉熵函數右側存在大片梯度為0 的飽和區域,當樣本落入這個范圍時,對生成器不再起到任何更新作用。反觀最小二乘函數,只在1 個點發生飽和,這使LSGAN 的訓練過程可以一直進行下去,生成比GAN 更清晰的結果。
設原GAN 的目標函數如下:

其中,x~pdata表示圖像來源于真實數據,z~pz來表示圖片是偽造生成。對生成器 G,希望 D(G(z))最大,或(1-D(G(z)))最小。而對于判別器D,則希望當數據來源于真實圖像式 D(x)最大。
改進后的損失函數如下:

對上式 a,b,c 有:b-c=1 且 b-a=2。本文選取 a=0,b=1,c=1。
與CE 修復圖像的方法不同,該網絡并不是直接將破損的圖片直接作為輸入來修復,而是先用生成器生成一人臉圖像,將其對應的破損區域剪裁下來并粘貼到破損圖上,用泊松編輯[9]做邊界融合,這使得本文的修復方法將不受到圖像破損形狀的約束,修復效果優于CE。
本文用到的LSGAN 圖像修復網絡結構如圖5 所示。生成網絡G 的輸入是一個從[-1,1]之間的均勻分布繪制的隨機100維矢量,經過數次微步幅卷積運算,最終生成64*64*3 的圖像。鑒別模型D 與生成模型G 呈現鏡像:輸入層是尺寸為64*64*3的圖像,隨后是一系列卷積運算,最后經最小二乘函數輸出一個0 到1 之間的單值作為概率。
此外,我們還在卷積神經網絡的結構上做了一些調整,以提高樣本的質量和收斂的速度,包括:

圖4 交叉熵損失與最小二乘損失對比

圖5 LSGAN 圖像修復網絡結構
(1)將所有池化層都改為帶步長卷積運算。這能讓網絡學習到自己去學習一種采樣方式。
(2)用全局平均池化(global average pooling)替換全連接層,這雖然會影響收斂速度但是能增加模型的穩定性。
(3)使用批歸一化,使輸入到每一個節點的數據的平均值都為0,方差都為1,從而穩定訓練。這個方法能防止模型只輸出相同的樣本,又稱為Helvetica Scenario 現象,而這個現象是GAN 在實際使用中遇到的最大的問題。
(4) 生成模型中除了輸出層的激活函數使用tanh 以外,其余激活函數都用ReLU。這能夠讓模型在訓練中更快地達到飽和并且能對彩色圖片有更好的處理效果。
(5)用Adam 優化算法[7]代替梯度下降法。原始的隨機梯度下降算法在更新參數的過程中學習率始終保持不變,當研究非穩態或非線性問題時性能差。而Adam 算法結合了AdaGrad 和RMSProp 算法最優的性能,能為不同的參數設計獨立的自適應性學習率,調參過程簡單,默認參數就可以處理絕大部分的問題。
假定現在網絡生成了一個G(z)'能與破損圖像完美拼合。設圖片待修復區域為y,并用一個與y 相同大小二進制掩碼M來標注破損區域,破損區域的值均為0,其余部分為1,則我們可以用下列算式來表示修補后的圖像。

為使G(z)'生成的圖像與y 有高度相似性,我們定義兩個損失函數Lc與Lp,其中,環境損失Lc表示破損圖與生成器偽造圖像素材的匹配程度,先驗損失Lp表示生成人像的真實程度,有:

損失越小,G 生成的圖像與殘缺圖像剩余的部分越相似,圖像越真實。但在實驗過程中,我們發現公式(5)的設定并不合理,因為它對破損圖像中的所有像素均做等同處理。實際上我們應該使靠近破損區域的像素獲得更高的權重。因此,添加參數W 衡量待修復人像中像素對環境損失的影響大?。?/p>

其中N(i)代表的是像素i 周圍的一個鄰組,它的絕對值則表示該鄰組的像素基數。經試驗發現,范數1 的效果比范數2更佳,因此我們重新定義環境損失為。

現在整個修復圖像過程的損失函數L(z)可以表示。

其中λ 為超參數,當λ 值大于1,說明先驗損失在圖像修補過程中更受重視;當λ 的值小于1 時,則環境損失更受重視。本文選取λ=0.003。
實驗環境為基于Linux 內核的Ubuntu 14 操作系統,采用python3.5 下的Tensorflow 深度學習框架。我們把從CelebA(CelebFaces Attributes Dataset)上下載的202 599 張數據集放入一個單獨命名好的文件夾中,表明這個數據集是未經加工的圖片。利用OpenFace 的排列工具,將所有圖像統一處理成64×64像素的大小。再將這些圖片打包分為訓練集、測試集和驗證集。用這些素材訓練LSGAN 生成人臉以及修復圖像,運行50 個周期,每個周期2 000 次,監控圖像修復過程中的參數變化,并將結果與現有的深度學習修復方法相比較,分析不同的網絡的性能差異。
經過5 個周期后,修復效果如圖6 所示。

圖6 LSGAN 修復破損人臉圖像的效果
其生成模型生成人臉的過程,以及對應損失值的變化分別如圖7 和圖8 所示??梢钥闯觯谧畛?50 次損失下降最快,200 個周期以內損失值降為最初損失的一半(紅色虛線標記)。1 個周期之后,損失就已經足夠小了。

表1 質量評價表
將本文對中心區域破損圖像的修復效果與同樣運用了GAN 結構的DCGAN 和CE 方法相比,結果如圖9 所示。表1 展示了每1 000 次修復結果中的平均峰值信噪比PSNR[10]和結構相似性SSIM[11]來定量評價各模型的修復效果。PSNR 是最普遍和使用最為廣泛的一種圖像客觀評價指標,然而它是基于對應像素點間的誤差,即基于誤差敏感的圖像質量評價。SSIM 可以分別從亮度、對比度、結構三方面度量圖像相似性。這兩種指標的數值越大,表示效果越好。
為保證結果客觀,除中心區域破損的圖像修復外,我們也展示了LSGAN 模型對一些特殊圖像的修復,包括戴眼鏡的人像,黑白人像,半張人臉圖像,以及局部破損人像等,并在圖10中展示了一些較理想的修復結果??梢钥闯鲈趹獙Σ煌愋偷男迯腿蝿諘r,本文方法也能提供讓人滿意的效果。
本文提出了一種基于最小二乘生成對抗網絡的圖像修補方法。與傳統的基于紋理的修復方法相比,這種方法彌補了大面積缺失的圖像的復原中找不到匹配紋理的問題;與數據驅動的方法相比,該方法不需要儲存數據庫,且運算速度快;與同樣結合生成對抗網絡的CE 算法和DCGAN 相比,由于采用最小二乘損失,這種方法的訓練過程穩定,判別器分類更加嚴格,因此生成的圖片質量更好。本文在訓練生成網絡時,無需連同遮擋圖像的掩碼一起訓練,能夠很好的解決任意破損區域的修復,這是CE 做不到的。從對中心區域破損的人臉修復實驗的結果來看,本文方法具有更高的峰值信噪比和結構相似度,修復效果更自然。

圖7 LSGAN 生成圖像的過程

圖8 損失值變化曲線(左右分別對應圖6 女性人臉和男性人臉)

圖9 不同模型修復效果比較

圖10 圖片類型或破損區域不同的圖像修復結果