任鵬博 毛克彪
(*寧夏大學物理與電子電氣工程學院 銀川 750021)
(**中國農(nóng)業(yè)科學院農(nóng)業(yè)資源與農(nóng)業(yè)區(qū)劃研究所 北京 100081)
圖像修復(fù)技術(shù)主要利用缺失區(qū)域周邊或者外部輔助數(shù)據(jù)來對圖片受損區(qū)域進行信息推理和修復(fù)[1]。在實際生活中,圖像修復(fù)的應(yīng)用十分廣泛,比如對象移除、修復(fù)圖像、圖片修飾、文字移除等操作[2]。當前,圖像修復(fù)技術(shù)有2 種,一種是基于傳統(tǒng)的非深度學習算法,另一種是基于深度學習的圖像修復(fù)算法。
基于擴散的方法[3]首次使用數(shù)字修補的方法進行圖像修復(fù),該方法大體上是基于變分方法和偏微分方程理論[4-6]。2000 年,文獻[7]提出了BSCB(Bertalmio Sapiro Caselles Ballester)圖像修復(fù)算法,它是一種基于數(shù)學建模和偏微分方程的方法。2021年,文獻[8]對提出了一種基于向量場和灰度級別的聯(lián)合插值方法來進行圖像填充的技術(shù)。該類方法在要針對較窄或者較小的待修復(fù)區(qū)域,但在面對較大缺失區(qū)域或者圖像紋理結(jié)構(gòu)復(fù)雜時,結(jié)果往往會比較模糊?;诩y理合成的方法是先將圖片生成一個集合,然后設(shè)計一個匹配原則,在修復(fù)圖像時,針對缺失區(qū)域,尋找一個匹配度最高的塊來進行填充[9]。文獻[10]提出了一種紋理合成修復(fù)算法,之后又對該算法進行了改進[11],該方法在對缺失區(qū)域為背景區(qū)域時修復(fù)效果較好,但是當缺失區(qū)域為前景區(qū)域或者紋理結(jié)構(gòu)較為復(fù)雜的區(qū)域時效果不是很理想。基于數(shù)據(jù)驅(qū)動的方法是基于外部數(shù)據(jù)庫,在修復(fù)圖像時,用數(shù)據(jù)驅(qū)動的方式尋找詳細圖像來進行目標圖像的修復(fù)[12-13]。文獻[14,15]提出了一種修復(fù)方法,該方法基于全局優(yōu)化,使修復(fù)的結(jié)果得到了較大程度的改善。
近年來,深度學習技術(shù)發(fā)展迅猛,深度學習用端到端的方式來學習圖像中的先驗語義信息和隱式表達[16]。目前基于深度學習的圖像修補方法主要分為基于自編碼器(auto encoder,AE)和基于生成對抗網(wǎng)絡(luò)(generative adversarial network,GAN)的圖像修補算法。AE 采用卷積神經(jīng)網(wǎng)絡(luò),從圖像中抽取特征信息,并進行降維編碼;譯碼器由反卷積神經(jīng)網(wǎng)絡(luò)構(gòu)成,作用是根據(jù)編碼器提取到的特征信息來重構(gòu)原始圖像。GAN 包括2 個網(wǎng)絡(luò),一個是生成網(wǎng)絡(luò),另一個是判別網(wǎng)絡(luò)。其中生成網(wǎng)絡(luò)用來生成缺失區(qū)域,判別網(wǎng)絡(luò)的功能用來判斷所產(chǎn)生圖像的真?zhèn)?不斷地引導生成網(wǎng)絡(luò)學習訓練和優(yōu)化網(wǎng)絡(luò)。2016 年,文獻[17]提出了一種基于GAN 的上下文編碼器圖像的修復(fù)方法。2017 年,文獻[18]使用上下文編碼器加卷積神經(jīng)網(wǎng)絡(luò)馬爾可夫隨機場(convolution neural network Marcov random field,CNNMRF),
證明了從神經(jīng)網(wǎng)絡(luò)中間層提取的特征信息可以用來重建逼真的圖像和紋理,并使用這些特征來傳遞藝術(shù)風格。同年文獻[19,20]擴展上下文編碼器,首次提出了深度學習圖像修復(fù)模型。2018 年文獻[21]提出了部分卷積這一概念,讓圖像修復(fù)更關(guān)注缺失區(qū)域。2021 年,文獻[22]提出了一種基于多尺度的圖像修復(fù)模型,該模型對圖像大面積缺失包括圖像邊緣缺失都有較好的修復(fù)結(jié)果。
本文在AE 和GAN 的基礎(chǔ)上,將兩者結(jié)合,利用AE 進行圖像的特征學習,推斷生成圖像的缺失區(qū)域,利用GAN 來對生成結(jié)果進行判斷,通過對抗學習優(yōu)化模型。在AE 的編碼器和解碼器之間通過全連接層傳遞信息。該全連接層與傳統(tǒng)全連接層不同,它只在特征圖內(nèi)傳遞信息,而不連接不同特征圖的參數(shù),這樣可以大大減少參數(shù)數(shù)量,之后加入一個步長為1 的卷積層,以在不同信道之間傳播信息。最后對損失函數(shù)進行對比,驗證損失函數(shù)的作用,并用本文模型與其他模型對比,證明本文模型的優(yōu)勢。
卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)是一種多層的監(jiān)督學習神經(jīng)網(wǎng)絡(luò),它的結(jié)構(gòu)主要包括3 個層:卷積層、采樣層(也稱池化層)和全連接層。其中卷積層和采樣層是其關(guān)鍵模塊,用來進行特征提取。
1.1.1 卷積層
卷積層是構(gòu)建CNN 的核心層,通過卷積運算可以提取出圖像的特征。在CNN 中,神經(jīng)元僅與相鄰神經(jīng)元相連。在CNN 的某一個卷積層中,一般含有幾個特征圖,這些特征圖都是由幾個神經(jīng)元構(gòu)成,這些特征圖中的神經(jīng)元共用權(quán)重,而這些權(quán)重被稱為卷積核。卷積核通常是用一個隨機的小數(shù)矩陣來進行初始化,然后通過對網(wǎng)絡(luò)進行訓練,獲得一個適當?shù)臋?quán)重。共享權(quán)值(卷積核)可以有效地減少網(wǎng)絡(luò)中各個層次的聯(lián)結(jié),并減小過度擬合的危險。
圖1 卷積神經(jīng)網(wǎng)絡(luò)
在卷積層之后,一般會跟一個激活函數(shù),用來把卷積的結(jié)果做非線性映射。如果沒有激活函數(shù),每一層的輸出都是線性的,這樣無論有多少層,輸出都是輸入的線性組合,而線性模型的表達能力相當有限,因此引入激活函數(shù)可以使深層神經(jīng)網(wǎng)絡(luò)表達能力更加強大,幾乎可以逼近任意函數(shù)。
1.1.2 采樣層(池化層)
采樣層對每鄰域4 個像素求和變?yōu)? 個像素,然后通過標量Wx+1加權(quán),再增加偏置bx+1,然后通過一個激活函數(shù)產(chǎn)生一個大概縮小4 倍的特征映射圖Sx+1。
卷積之后生成的特征圖中可能包含與識別任務(wù)無關(guān)的冗余信息,對其進行下采樣的目的就是去除這些冗余信息,而不會破壞識別結(jié)果。通常在連續(xù)的卷積層之間會加入采樣層,這樣可以降低各個特征圖的維度,減少網(wǎng)絡(luò)中參數(shù)數(shù)量,同時保留有用信息,減少過擬合。
1.1.3 全連接層
在全連接層中所有神經(jīng)元都有權(quán)重連接,全連接層在整個CNN 中是一個分類器的作用,它一般位于卷積神經(jīng)網(wǎng)絡(luò)尾部,可以將卷積層、采樣層等學到的特征數(shù)據(jù)映射到樣本標記空間。為了提高性能,全連接層中的神經(jīng)元一般都采用ReLU 激活函數(shù)。
生成對抗網(wǎng)絡(luò)(generative adversarial network,GAN)[23]是深度學習中的一個重要網(wǎng)絡(luò),可以同時訓練2 個網(wǎng)絡(luò)(生成器和鑒別器),并在極小極大算法中相互競爭。該方法克服了傳統(tǒng)生成模式在實際應(yīng)用中遇到的難題,巧妙地利用對抗學習的方法逼近某些無法求解的損失函數(shù)。
GAN 主要包括生成器(generator,G)和鑒別器(discriminator,D),生成器用來生成假的數(shù)據(jù),判別器用來判斷生成器產(chǎn)生的數(shù)據(jù)是否為真。這種方法可以被簡單地理解為2個網(wǎng)絡(luò)之間的博弈。在GAN的最初版本中,G和D是2 個多層次的感知網(wǎng)絡(luò)結(jié)構(gòu)。GAN 運行的數(shù)據(jù)可以是很多類型,這里以數(shù)字圖像為參照介紹GAN 網(wǎng)絡(luò)結(jié)構(gòu)。
在圖2 中,z為隨機噪聲。該算法利用原始圖像和生成圖像的數(shù)據(jù),對2 種類型的神經(jīng)網(wǎng)絡(luò)進行訓練。生成器可以通過一系列的隨機數(shù)字,制造出一幅“假圖像”,以此來騙過判別系統(tǒng),而判別系統(tǒng)則負責分辨出這張圖片的真?zhèn)?并給出相應(yīng)的分數(shù)(score)。
圖2 左邊為GAN 網(wǎng)絡(luò),右邊為GAN 訓練,上部分為判別器訓練,下部分為生成器訓練
在訓練D的過程中,直接將上一個周期G生成的照片與真實照片合并成x。再依次排列為0 和1,結(jié)果是虛假圖為0,真實圖為1。然后利用D(x) 產(chǎn)生一個由score 和y構(gòu)成的范圍在0 到1 之間的損失函數(shù),進行梯度反轉(zhuǎn)。
訓練G時,要將G與D視為一體(D_on_G,DG)。整個DG 的輸出還是score。將一套隨機矢量z輸入到DG 系統(tǒng)中,在G上產(chǎn)生一幅圖像,由D對該圖形進行評分,得到一個score 值,即DG 系統(tǒng)的正向處理。DG 系統(tǒng)所要進行的優(yōu)化的最終目的就是讓score 達到1,在這過程中score 的大小與y=1的差值可以構(gòu)成損失函數(shù),從而可以利用逆向傳播梯度來實現(xiàn)。要注意D的參數(shù)在此無法進行訓練,從而確保G的訓練能夠達到D評分的要求,GAN 模型的目標函數(shù)表達式為
其中,D(x) 表示將數(shù)據(jù)x送入判別器D后返回值,G(z) 表示將一個噪聲z送入生成器G后的返回值,Pdata(x)和Pz(z) 為x和z的分布函數(shù)。
在此,對G網(wǎng)絡(luò)的訓練是為了使D(G(z))接近1,對D網(wǎng)絡(luò)的訓練是為了讓D(G(z)) 接近于0。在訓練的時候,一邊固定一個網(wǎng)絡(luò)參數(shù),一邊修改另一個的參數(shù),這樣可以讓對手的錯誤達到最大,這就是一種對抗的理念。
基于上下文編碼器的圖像修復(fù)網(wǎng)絡(luò)結(jié)構(gòu)如圖3所示,其總體架構(gòu)是一個簡單的編碼器-解碼器通道。對于輸入的缺損圖像,通過編碼器得到圖像的特征信息,然后經(jīng)過全通道連接層傳遞到解碼器,解碼器根據(jù)圖像的特征信息生成圖像中的缺失部分,最后將生成部分與真實圖像對比,給出是真或假的結(jié)果。此處的全通道連接層只在特征圖內(nèi)傳遞信息,而不連接不同特征圖的參數(shù),大大減少了參數(shù)量。之后加入一個步長為1 的卷積層,以在不同信道之間傳播信息,若僅僅使用全連接層容易導致參數(shù)爆炸。
圖3 基于上下文編碼器的圖像修復(fù)網(wǎng)絡(luò)結(jié)構(gòu)
編碼器結(jié)構(gòu)源自于AlexNet(Alexnet 模型包括5個卷積層和3 個池化Pooling 層,并且其中還有3 個全連接層),本方法使用的是第5 層卷積層之后的那一層池化層之前的所有內(nèi)容,也就是全連接層之前的AlexNet 架構(gòu),將它提取出來,使用到編碼器里,每一層都使用具有線性矯正單元LeakyReLu 激活函數(shù)。
與AlexNet 體系結(jié)構(gòu)不同,本模型沒有進行ImageNet 訓練,而是從完全隨機初始化的權(quán)重開始訓練的,但是當編碼結(jié)構(gòu)被限制在卷積層中時,它就不能從一個角落向另一個角落傳遞信息。這是由于卷積層把所有的元素映射聯(lián)系起來,但從不直接連接特定特征圖中的所有位置。在當前的架構(gòu)中,這樣的信息傳遞是通過一個全連接層完成的,在這個過程中,所有的激活都會被直接地連接在一起。但是,如果把編碼和譯碼器全部連接起來,那么參數(shù)的數(shù)目就會猛增,并且對現(xiàn)有圖形處理器(graphics processing unit,GPU)進行有效訓練也會變得非常困難。為了解決這一問題,本文采用了一個全通道連接層,把編碼器和譯碼器連接起來。
這一層是對常規(guī)全通道連接層的改進。在常規(guī)全通道連接層中,每一個神經(jīng)元與后一層的所有神經(jīng)元相連接,假設(shè)輸入層是數(shù)量為m大小為n×n的特征圖,輸出為同樣數(shù)量為m大小為n×n的特征圖,那么總參數(shù)量為m×n×n×m×n×n等于m2n4。本文相較于常規(guī)全通道連接層,沒有連接不同特征圖之間的神經(jīng)元映射,而是只連接同一特征圖內(nèi)的神經(jīng)元映射,這樣假設(shè)輸入大小為m×n×n的特征圖,輸出同樣大小為m×n×n的特征圖,總參數(shù)量為m×n×n×n×n等于mn4,大大減少了參數(shù)數(shù)量。然后加入一個步長為1 的卷積層,以達到在不同通道之間進行信息交互的目的。
解碼器利用編碼器所提供的特征信息產(chǎn)生圖像。編碼結(jié)果是由全通道連接層與譯碼器相連的。解碼器是一組上取樣的卷積層,在全通道連接層后面,每個層都是一個上取樣的卷積層,每一層都使用具有線性矯正單元ReLU 激活函數(shù)。先上采樣,然后卷積,這一系列的上卷積加上之前編碼器產(chǎn)生的特征的非線性加權(quán)上采樣,可以隨著訓練生成更高分辨率的圖像,直到達到需要的結(jié)果。
鑒別器是和編碼器結(jié)構(gòu)很類似的卷積層結(jié)構(gòu),是一系列的卷積層,每一層都使用具有線性矯正單元Leaky ReLU 激活函數(shù)。編解碼器共同構(gòu)成生成器,分別輸入解碼器生成的圖片和原圖像,比較判斷結(jié)果是否是真實圖像。
損失函數(shù)一般用于估算預(yù)測結(jié)果與真實數(shù)據(jù)之間的差異,且具有非負性,損失值越低,魯棒性越好。對于圖像修復(fù)來說,修復(fù)的缺失區(qū)域經(jīng)常會生成似是而非的情況。本文的上下文編碼器模型中的損失主要分為兩部分,重建損失(L2)和對抗性損失。重建損失用來捕捉丟失的結(jié)構(gòu)及其與環(huán)境相關(guān)的一致性,它更傾向于取多種模型中的平均值。對抗損失努力讓所預(yù)測的結(jié)果看上去是真實的,并且能夠從分布中選取特定模式。
令輸入圖像為x,通過本文模型輸出的圖像為F(x),為二進制掩膜,對于缺失部分值為1,對于有效的輸入部分值為0。本文將輸入圖片的中心部分設(shè)為缺失部分,掩膜值為1,其他部分掩膜值為0。訓練過程中將自動為每幅圖像生成這些掩膜。
本文使用正則化的掩膜層下的重建損失(reconstruction loss,L2)距離作為重建損失函數(shù)Lrec。
L2 范數(shù)損失函數(shù),也叫做最小平方誤差,它是將預(yù)測值yi和真實值f(xi) 的差值的平方和最小化,定義為
L2 正則定義為
其中,ω為特征系數(shù),λ為用戶自己設(shè)定的正則化系數(shù)。正則化是為了防止過擬合,它通過降低模型的復(fù)雜性來緩解過擬合,對大數(shù)值的權(quán)重進行嚴厲的懲罰,對小數(shù)值的權(quán)重進行鼓勵。如果ω小于1,ω2會更小。
本文的重建損失Lrec定義為
其中·表示矩陣對應(yīng)位置相乘,M表示二值化的掩碼(0 表示有效像素,1 表示缺失區(qū)域),x表示輸入圖像,F表示編解碼器。經(jīng)過這種簡單損失函數(shù)能訓練解碼器生成大致結(jié)果輪廓,但是結(jié)果較模糊,而且不能捕獲較高頻率的細節(jié)信息。這是不可避免的,因為L2 損失函數(shù)在計算時,使用的是平均分布的損失值來進行預(yù)測,這樣能夠使誤差最小化,但是會使生成的圖片模糊。對此本文引入了對抗性損失。
GAN 對抗損失(adversarial loss,adv)的定義如式(1)所示。本文采用了GAN 的框架進行預(yù)測,但是其在上下文編碼器中不易訓練,因為判別器D很容易利用原始圖像和修復(fù)圖像中的不連續(xù)感知來區(qū)分出真實圖像和生成的預(yù)測圖像。因此,對上下文編碼器中的生成器進行調(diào)整,得到的上下文編碼器對抗損失Ladv為
在此,判別器D和函數(shù)F聯(lián)合作用,使用隨機梯度下降進行優(yōu)化,該優(yōu)化可使輸出看起來更加真實,同時去除了輸入中的噪聲矢量z。
聯(lián)合損失(joint loss)就是重建損失和對抗損失的加權(quán),其定義為
其中,λrec和λadv為重建損失和對抗損失的2 個超參數(shù)。
模型的實現(xiàn)基于Keras 框架,模型的輸入圖像Places2 數(shù)據(jù)集中的arch 類圖片共5000 張,這些圖片是256 像素×256 像素的3 通道24 bit 位深度圖,隨機抽取其中500 張作為測試集,訓練集與測試集比例為10 ∶1。
本實驗選擇Adam 優(yōu)化器[24],學習率為0.0001,β1參數(shù)調(diào)整為0.5;在聯(lián)合損失中對重建損失參數(shù)λrec的取值為0.999,對抗損失參數(shù)λadv取值為0.001。訓練中由于條件限制,為了保證訓練效率,將所有圖像掩碼設(shè)定為圖像中心,并根據(jù)掩碼生成缺損區(qū)域。分別設(shè)置掩碼大小為32 ×32,64 ×64,128 × 128。模型總訓練輪數(shù)(epoch)分別為10 000、20 000 和30 000,批大小(batch_size)均設(shè)置為16,即每輪隨機抽取16 張圖片進行訓練,每50輪輸出一次損失值和修復(fù)結(jié)果。損失值的結(jié)果以掩碼大小為64 ×64 為例進行展示。
結(jié)果如圖4 所示,從圖中可以看出,基于上下文編碼器的方法修復(fù)圖像,其損失值在剛開始較大,經(jīng)過訓練逐漸收斂,重建損失最終穩(wěn)定在0.015 左右,對抗損失最終穩(wěn)定在0.014 左右。修復(fù)結(jié)果如圖5所示,可以看出,無論是在紋理上還是在語義信息上,該模型都取得了較好的結(jié)果。根據(jù)訓練次數(shù)可知,對于越小的缺失部分,該模型學習得越快,修復(fù)結(jié)果也越好;對于越大缺失部分的圖像,就需要越多次數(shù)的訓練。
圖4 重建損失和對抗損失
圖5 不同大小掩碼的修復(fù)結(jié)果
4.4.1 損失函數(shù)對比
本文分別單獨使用重建損失和對抗損失,以掩碼大小為64 ×64 為例,分析其輸出結(jié)果的差距。
圖6 和圖7 分別展示了單獨使用重建損失和對抗損失的損失值與修復(fù)結(jié)果。可以看出,單獨使用重建損失,重建損失最終穩(wěn)定在0.018 左右,修復(fù)結(jié)果內(nèi)容良好,但會導致較嚴重的模糊;單獨使用對抗損失,對抗損失并不收斂,并且損失值達到1.3 左右,修復(fù)結(jié)果內(nèi)容雖然清晰,但嚴重不匹配。與重建損失和對抗損失相比,聯(lián)合損失顯著減輕了各自的弱點,改善了修復(fù)效果,生成的紋理細節(jié)更加清晰,與原圖相似度較大,減少了無意義的重復(fù)內(nèi)容,結(jié)構(gòu)更合理,更逼近真實情況。在面對較大待修復(fù)缺損區(qū)域時,結(jié)構(gòu)更加完整,比如圖中的橋、拱門、樓房等。
圖6 單獨使用重建損失的損失值和修復(fù)結(jié)果
圖7 單獨使用對抗損失的損失值和修復(fù)結(jié)果
4.4.2 與其他模型對比
實驗通過計算常規(guī)的評估指標,包括平均絕對誤差(mean absolute error,MAE),峰值信噪比(peak signal-to-noise ratio,PSNR),結(jié)構(gòu)相似性(structural similarity index,SSIM),對比修復(fù)效果的優(yōu)劣,比對的模型是RFR(recurrent feature reasoning)模型[25]和EC(edge connect)模型[26]。
EC 模型使用Adam 優(yōu)化器,學習率為0.0001,β1=0,β2=0.9,batch_size 設(shè)置為16,其他超參數(shù)設(shè)置與原文一致;RFR 模型使用Adam 優(yōu)化器,學習率為0.0001,batch_size 設(shè)置為16,其他超參數(shù)設(shè)置與原文一致。測試圖像采用與本文一致的place2 數(shù)據(jù)集中arch 類的500 張圖片,計算結(jié)果取平均值。對比并未采用掩膜大小為32 ×32 的結(jié)果,因為缺失區(qū)域占比太小,對比差異不大。各模型具體對比結(jié)果如表1 所示。
表1 各模型評估指標對比
由表1 可知,本文所使用的模型在各項指標上與EC 和RFR 模型相比,均有所提升。
圖像修復(fù)是圖像處理領(lǐng)域的一個重要分支,近些年來,隨著深度學習技術(shù)的發(fā)展,圖像修復(fù)方向涌現(xiàn)了許多方法和方向。本文使用結(jié)合自編碼器(AE)和生成對抗網(wǎng)絡(luò)(GAN)的結(jié)構(gòu),基于上下文訓練生成缺失區(qū)域的圖像。本文對殘缺圖像的修復(fù)在主觀效果和各種指標數(shù)據(jù)上均有所提升。
由實驗結(jié)果可以看出,該方法還有很大的改進空間,存在的問題及后續(xù)研究的思路如下。
(1)在修復(fù)的掩膜區(qū)域邊緣,仍有一定程度的截斷感和模糊,如何對這些部分進行優(yōu)化,應(yīng)是未來優(yōu)化的一個重點。
(2)在圖片的尺寸上,本方法輸入的是大小256×256 的圖片,實際中輸入的圖片可能是各種大小和縱橫比,這樣會一定程度影響修復(fù)效果。因此,一種對任意大小輸入圖片都有很好修復(fù)效果的算法,是很必要的。
(3)對于大小不同的缺損區(qū)域,可以看到,在訓練相同次數(shù)時,大缺損區(qū)域修復(fù)效果沒有小缺損區(qū)域修復(fù)結(jié)果好,大缺損區(qū)域的每輪訓練時間也比小缺損區(qū)域長,且需要更多的訓練次數(shù)。如何提高圖像修復(fù)的精度和效率,也是一個很重要的研究方向。