黃凱怡 姜佳琪 方建文 楊彩云
摘 要:傳統(tǒng)的圖像風(fēng)格遷移程序通過人工建模只能局限于單一風(fēng)格遷移,且資源消耗過大。2015 年jatys 等提出了一種基于卷積神經(jīng)網(wǎng)絡(luò)的圖像風(fēng)格遷移算法,通過這一種算法便能生成各種具有原內(nèi)容和新風(fēng)格的合成圖像。文章利用深度學(xué)習(xí)算法,對卷積神經(jīng)網(wǎng)絡(luò)模型和風(fēng)格遷移算法進(jìn)行圖像風(fēng)格特征提取的研究,在MXNET 深度計(jì)算引擎上開發(fā)圖像風(fēng)格遷移系統(tǒng)(Stvler),將一副圖像的風(fēng)格遷移到另一副圖像,其成果可應(yīng)用到設(shè)計(jì)、娛樂和社交等領(lǐng)域。
關(guān)鍵詞:深度神經(jīng)網(wǎng)絡(luò):圖像風(fēng)格遷移;卷積神經(jīng)網(wǎng)絡(luò):VGG-19 模型
中圖法分類號(hào):TP391文獻(xiàn)標(biāo)識(shí)碼:A
1 引言
藝術(shù)源于人類對生活情趣的探索,它的價(jià)值在于人類的審美意識(shí)。隨著時(shí)代的進(jìn)步與發(fā)展,現(xiàn)代人的基本物質(zhì)需求已經(jīng)得到了滿足。所以,大多數(shù)人會(huì)通過追求藝術(shù)享受來豐富自身經(jīng)歷、提升生活品質(zhì)。即使大部分藝術(shù)在生活中都不具備實(shí)際的功能性,大多數(shù)人卻還是會(huì)愛上各種各樣的藝術(shù),甚至在有些人的心中,藝術(shù)有著不可代替的地位。從古至今,藝術(shù)繪畫大師的作品吸引著千千萬萬的人。人們渴望自己也能夠擁有同樣藝術(shù)風(fēng)格的圖像,圖像風(fēng)格化這一概念由此誕生。
然而,繪制風(fēng)格圖像需要大批相關(guān)技術(shù)人員,并損耗大量資源。20 世紀(jì)90 年代,科研人員相繼提出大量風(fēng)格化算法來完成圖像風(fēng)格化的任務(wù)。傳統(tǒng)圖像風(fēng)格化算法多采用人工建立數(shù)學(xué)和物理模型的方式來模仿圖像風(fēng)格,即一種圖像風(fēng)格對應(yīng)一個(gè)數(shù)學(xué)或統(tǒng)計(jì)模型。這樣做出來效果是不錯(cuò)的,但一個(gè)程序基本只能做一種風(fēng)格或者只針對一個(gè)場景,程序的適用范圍過于局限。本選題基于深度神經(jīng)網(wǎng)絡(luò)來解答人類如何創(chuàng)造和感知藝術(shù)意象并實(shí)現(xiàn)圖像風(fēng)格遷移。這樣一來,用一種算法就可以實(shí)現(xiàn)從任意圖像中提取風(fēng)格并將其應(yīng)用于內(nèi)容完全不同的其他圖像中。
2 系統(tǒng)總體結(jié)構(gòu)設(shè)計(jì)
本系統(tǒng)主要包括圖像輸入、圖像預(yù)處理和圖像后處理、圖像特征提取、損失函數(shù)定義、合成圖像創(chuàng)建、模型訓(xùn)練6 大模塊。本系統(tǒng)的第一步是在圖像輸入模塊中輸入內(nèi)容圖像和樣式圖像,讀取任意圖像后需要進(jìn)行圖像預(yù)處理和后處理,通過標(biāo)準(zhǔn)化處理來增強(qiáng)系統(tǒng)圖像兼容性。第二步是利用VGG?19 網(wǎng)絡(luò)模型的某些層來抽取內(nèi)容和樣式特征。第三步是定義損失函數(shù)。內(nèi)容損失對比保留原始圖像,樣式損失對比合成樣式圖像,而總變差損失則優(yōu)化減少合成圖像中的噪點(diǎn)(圖像顆粒感)。第四步是創(chuàng)建和初始化合成圖像。第五步就是通過迭代來訓(xùn)練模型最終輸出合成圖像??傮w結(jié)構(gòu)設(shè)計(jì)如圖1 所示。
其中,基于VGG?19 卷積神經(jīng)網(wǎng)絡(luò)的遷移方法過程如圖2 所示。圖中輸入的內(nèi)容圖像為作者在舊金山漁人碼頭附近的街道拍攝的照片,輸入的樣式圖像是一幅內(nèi)容為樹木的油畫。最終輸出的合成圖像內(nèi)容還是街景,但是樣式融入了油畫筆觸,同時(shí)整體顏色也更加飽滿鮮艷了。
3 系統(tǒng)實(shí)現(xiàn)
3.1 圖像輸入模塊設(shè)計(jì)
導(dǎo)入程序相關(guān)的包和模塊,例如d2lzh,mxnet 以及time,然后調(diào)用函數(shù)分別讀取任意大小與尺寸的內(nèi)容圖像和樣式圖像,獲取圖像的尺寸和大小。
3.2 圖像預(yù)處理與后處理模塊設(shè)計(jì)
設(shè)計(jì)preprocess 函數(shù)并對輸入圖像進(jìn)行預(yù)處理,將RGB 3 個(gè)通道分別進(jìn)行標(biāo)準(zhǔn)化,使其變成卷積神經(jīng)網(wǎng)絡(luò)所接受的輸入格式。設(shè)計(jì)postprocess 函數(shù)后處理輸出圖像,把圖像的像素值還原回標(biāo)準(zhǔn)化之前的格式,以方便正確輸出圖像。輸出圖像用打印函數(shù)來表示,該函數(shù)要求每個(gè)像素的浮點(diǎn)數(shù)值在0~1 之間,所以clip 函數(shù)用來剔除非0~1 的數(shù)(小于0 的數(shù)取0,大于1 的值分別1)。其中rgb 均值是在imageNet 數(shù)據(jù)集上學(xué)習(xí)到的。
rgb_mean = nd.array([0.485, 0.456, 0.406]
rgb_std = nd.array([0.229, 0.224, 0.225])
def preprocess(img, image_shape):
img = image.imresize(img, ?image_shape)
img = (img.astype('float32') / 255 - rgb_mean)/ rgb_std
return img. transpose ((2, 0, 1)). expand _ dims(axis=0)
def postprocess(img):
img = img[0].as_in_context(rgb_std.context)
return (img.transpose((1, 2, 0)) ? rgb_std +rgb_mean).clip(0, 1)
3.3 圖像特征抽取模塊
本項(xiàng)目使用Gatys 提出的VGG?19 網(wǎng)絡(luò)來抽取圖像特征。經(jīng)過研究者實(shí)驗(yàn),在遠(yuǎn)離輸入層的地方易抽取圖像的全局信息,在靠近輸入層的地方則容易抽取圖像的局部細(xì)節(jié)信息。綜合以上考慮,本設(shè)計(jì)將第5個(gè)卷積塊中的第1 個(gè)卷積層作為樣式層,將第4 個(gè)卷積塊的最后一個(gè)卷積層作為內(nèi)容層,這樣可以得到作者認(rèn)為的最佳效果。在抽取特征時(shí),不需要使用整個(gè)VGG 網(wǎng)絡(luò),只需使用上述的6 個(gè)卷積層。所以需要構(gòu)建一個(gè)新的網(wǎng)絡(luò)net,具體層數(shù)可以從pretrained_net實(shí)例中查看獲取。
3.4 損失函數(shù)定義模塊
損失函數(shù)主要包括內(nèi)容損失函數(shù)、樣式損失函數(shù)、總變差損失函數(shù)。內(nèi)容損失函數(shù)采用平方誤差函數(shù)來匹配合成圖像與內(nèi)容圖像在內(nèi)容特征。樣式損失函數(shù)也是通過平方誤差函數(shù)來優(yōu)化樣式風(fēng)格,具體是對比圖像像素點(diǎn)在每個(gè)通道上的統(tǒng)計(jì)分布。比如,顏色是通過對比RGB 直方圖來匹配2 圖之間的顏色差異;紋理則是通過對比先前用卷積神經(jīng)網(wǎng)絡(luò)中提取的紋理,然后,再用格拉姆(Gram)矩陣來有效地模擬紋理的各種變化,表示紋理信息。實(shí)驗(yàn)中部分內(nèi)容圖像與特征圖像的特征結(jié)合后,其合成的圖像中會(huì)有大量高頻噪點(diǎn),本系統(tǒng)采用總變差損失函數(shù)來降噪??傋儾顡p失(TV loss)約束噪聲的具體方法是通過降低總變差損失來盡可能使鄰近的像素值相近[1~4] 。
3.5 合成圖像創(chuàng)建模塊
在遷移過程中,合成的目標(biāo)圖像是一個(gè)需要一直更新的變量,本系統(tǒng)將合成圖像視為模型參數(shù),通過定義一個(gè)新的GeneratedImage 類來表示。類內(nèi)還需定義一個(gè)前向計(jì)算forward(self)函數(shù)來返回模型參數(shù)。
class GeneratedImage(nn.Block):
def __init__(self, img_shape, ??kwargs):
super(GeneratedImage, self).__init__(??kwargs)
self.weight = self.params.get('weight', shape=img_shape)
def forward(self):
return self.weight.data()
隨后還需定義一個(gè)get_inits 函數(shù)來創(chuàng)建合成圖像的模型實(shí)例,并將其初始化命名為圖像X。
def get_inits(X, ctx, lr, styles_Y):
gen_img = GeneratedImage(X.shape)
gen_ img. initialize ( init. Constant ( X),
ctx = ctx,force_reinit=True)
trainer = gluon. Trainer ( gen _ img. collect _params(), 'adam',{'learning_rate': lr})
styles_Y_gram = [gram(Y) for Y in styles_Y]
return gen_img(), styles_Y_gram, trainer
3.6模型訓(xùn)練模塊
首先,定義train 函數(shù),該函數(shù)有7 個(gè)參數(shù)。X 代表初始化圖像也是最后輸出的合成圖像,contents_Y代表內(nèi)容圖像的內(nèi)容特征,styles_Y 則是風(fēng)格圖像的風(fēng)格特征,ctx 是GPU 相關(guān)參數(shù),lr 即學(xué)習(xí)率(learningrate)。max_epochs 為訓(xùn)練迭代的次數(shù),不斷抽取合成圖像的內(nèi)容特征和樣式特征,并計(jì)算損失函數(shù)來優(yōu)化圖像。在每一個(gè)迭代周期調(diào)用一次同步函數(shù)waitall,可以解決內(nèi)存占用過高問題。每經(jīng)過lr_decay_epoch次迭代,將lr 減少1/10,使得收斂加速。
接著進(jìn)行模型訓(xùn)練。將內(nèi)容圖像和樣式圖像的高和寬調(diào)整為統(tǒng)一像素,大小可以調(diào)節(jié)??梢韵仍O(shè)置小一些的像素,這樣訓(xùn)練速度較快,這里設(shè)置為225×150 像素。訓(xùn)練迭代參數(shù)的設(shè)置是經(jīng)過試驗(yàn)的,參數(shù)過小無法得到清楚結(jié)果,參數(shù)過大會(huì)導(dǎo)致訓(xùn)練時(shí)間過長消耗過大且對結(jié)果影響并不大。代碼如下,其中內(nèi)容圖像content_X 初始化合成圖像,初始學(xué)習(xí)率設(shè)為0.01,迭代次數(shù)設(shè)為500,學(xué)習(xí)率改變的位置設(shè)為每200 次。
將訓(xùn)練好的合成圖像保存為neural?style?1.png。一般而言,這樣的圖像已經(jīng)可以得到遷移到風(fēng)格的新圖像。為了得到更加清晰的合成圖像,可以將上一步的輸出放在更大的像素尺寸上進(jìn)行訓(xùn)練。這里將高和寬放大2 倍,設(shè)置為450×300 的尺寸來初始化合成圖像。將合成圖像保存為neural?style?2.png,初始學(xué)習(xí)率仍設(shè)為0.01,迭代次數(shù)改為300,學(xué)習(xí)率改變的位置設(shè)為每100 次[5~10] 。
3.7 訓(xùn)練結(jié)果分析
本節(jié)圖3(a)為原始內(nèi)容圖像,圖3(b)為原始風(fēng)格圖像。首先,本節(jié)選?。?組圖像對比合成圖像在不同像素情況下的轉(zhuǎn)換情況。圖3(c)為分辨率225×150 像素的合成圖像,圖3(d)為分辨率450×300 像素的合成圖像。原始圖像為巴厘島的某一餐廳外景,模仿到風(fēng)格圖像的紋理后合成圖變得有油畫的筆觸,色塊變得比較大,圖像有點(diǎn)朦朧感,多了些許詩情畫意。
圖4 為控制風(fēng)格權(quán)重變量的結(jié)果圖像對比。圖4(c)、圖4(d)是分辨率為225×150 像素的合成圖像,圖4(c) 的風(fēng)格權(quán)重為103,圖4(d) 的風(fēng)格權(quán)重為104。圖4(e)、圖4(f)是分辨率為450×300 像素的合成圖像,圖4(e)的風(fēng)格權(quán)重為103,圖4(f)的風(fēng)格權(quán)重為104。從藍(lán)天上可以明顯發(fā)現(xiàn)在其他變量不變的情況下,風(fēng)格權(quán)重越大模仿的風(fēng)格特征更明顯。
4 結(jié)束語
本文主要介紹并回答了如何規(guī)定圖像風(fēng)格;如何提取圖像紋理特征而不夾雜內(nèi)容特征;如何提取圖像內(nèi)容特征而不夾雜紋理特征;如何將兩種特征融合生成目標(biāo)圖像。同時(shí),分析并驗(yàn)證深度卷積神經(jīng)網(wǎng)絡(luò)中不同層對于圖像特征表達(dá)的特性。通過反向傳播算法對VGG19 不同層所抽取的特征進(jìn)行反向圖片生成,以可視化的方式驗(yàn)證深層卷積神經(jīng)網(wǎng)絡(luò)中不同層所抽取的特征特性。找到一種基于交替訓(xùn)練的風(fēng)格遷移算法。該算法主要為解決經(jīng)典神經(jīng)風(fēng)格遷移算法中所存在的內(nèi)容細(xì)節(jié)丟失,物體邊緣扭曲以及顏色覆蓋等問題,提出一種交替訓(xùn)練的方式,以盡可能地保留內(nèi)容圖片中的細(xì)節(jié)信息。找到一種基于多路徑前饋神經(jīng)網(wǎng)絡(luò)的實(shí)時(shí)風(fēng)格遷移算法。該算法在編碼器與解碼器之間添加多個(gè)由殘差塊所構(gòu)成的通道,從而提高網(wǎng)絡(luò)收斂速度以及生成圖片的質(zhì)量。找到一種基于多層次特征轉(zhuǎn)換的任意風(fēng)格遷移算法。訓(xùn)練一個(gè)通用的解碼器,通過特征轉(zhuǎn)換的方式直接對編碼器所提取的特征圖進(jìn)行操作,進(jìn)而豐富所需渲染圖片的風(fēng)格。
參考文獻(xiàn):
[1] 黃海新,梁志旭,張東.基于深度學(xué)習(xí)的圖像風(fēng)格化算法研究綜述[J].電子技術(shù)應(yīng)用,2019,45(7):27?31.
[2] 陳淑環(huán),韋玉科,徐樂,等.基于深度學(xué)習(xí)的圖像風(fēng)格遷移研究綜述[J].計(jì)算機(jī)應(yīng)用研究,2019,26(8):2250?2255.
[3] EFROS A A, FREEMAN W T. Image quilting for texturesynthesis and transfer[C]∥Proceedings of the 28th AnnualConference on Computer Graphics and InteractiveTechniques.New York:ACM Press,2001:341?346.
[4] 錢小燕,肖亮,吳慧中.快速風(fēng)格遷移[J].計(jì)算機(jī)工程,2006,32(21):15?17+46.
[5] 阿斯頓·張,李沐,扎卡里·C.動(dòng)手學(xué)深度學(xué)習(xí)[M].北京:人民郵電出版社,2019.
[6] 劉建偉,劉媛,羅雄麟.深度學(xué)習(xí)研究進(jìn)展[J].計(jì)算機(jī)應(yīng)用研究,2014,31(7):1921?1930+1942.
[7] 孫志軍,薛磊,許陽明.深度學(xué)習(xí)研究綜述[J].計(jì)算機(jī)應(yīng)用研究,2012,29(8):2806?2810.
[8] 牟晉娟.基于深度學(xué)習(xí)的圖像風(fēng)格遷移技術(shù)的研究[J].電子元器件與信息技術(shù),2019,3(4):82?85.
[9] 欒五洋.基于深度學(xué)習(xí)的圖像風(fēng)格轉(zhuǎn)換淺論[J].經(jīng)驗(yàn)交流,2018:248?250.
[10] 焦李成,楊媛淑,劉芳,等.神經(jīng)網(wǎng)絡(luò)七十年:回顧與展望[J].計(jì)算機(jī)學(xué)報(bào),2016(8):1697?1716.
作者簡介:
黃凱怡(2001—),本科,研究方向:計(jì)算機(jī)應(yīng)用技術(shù)。
方建文(1972—),博士,教授,研究方向:計(jì)算機(jī)應(yīng)用技術(shù)(通信作者)。