羅可昕,邢 晨
(浙江水利水電學(xué)院 信息與藝術(shù)工程學(xué)院,浙江 杭州 310018)
圖像風(fēng)格遷移,就是把圖像A的風(fēng)格遷移到圖像B中去,得到新的圖像C。其中C中既包含圖像B的內(nèi)容,也包含圖像A的風(fēng)格。這項(xiàng)技術(shù),已經(jīng)運(yùn)用在我們的日常生活中,像prisma,style2paints,neuralstyler,ostagram等照片編輯軟件就是運(yùn)用神經(jīng)網(wǎng)絡(luò)和風(fēng)格遷移,把普通的照片變成其他藝術(shù)風(fēng)格,從而實(shí)現(xiàn)藝術(shù)價(jià)值的提升。
在人工智能深度學(xué)習(xí)實(shí)現(xiàn)之前,人們通常利用圖片紋理手動(dòng)建模來實(shí)行風(fēng)格遷移,這樣合成的圖片往往要根據(jù)不用的場(chǎng)景而改變,且人工建模成本巨大。這種方法在提取圖像底層特征時(shí),因只能提取顏色、紋理和形狀這幾種特征組合,所以最終合成的圖片效果十分粗糙,不能很好的滿足人們更高的藝術(shù)需求,同時(shí)該方法合成效率較低[1]。隨著深度學(xué)習(xí)的興起,GATYS等人提出了利用VGG卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行風(fēng)格遷移[2]。該方法的核心是利用卷積層提取內(nèi)容圖像和風(fēng)格圖像的中間特征值,借助梯度下降算法,利用這些特征值來合成新風(fēng)格的圖像[3]。
如圖1所示,圖1(a)的內(nèi)容圖像是埃菲爾鐵塔,圖1(b)的風(fēng)格圖像是蒙克的名作《吶喊》,圖1(c)是由計(jì)算機(jī)生成的一張新的圖像,既保留了埃菲爾鐵塔建筑的形狀信息,也兼具《吶喊》風(fēng)格的圖片。本文基于Johnson[4]等人提出的快速圖像風(fēng)格遷移方法實(shí)現(xiàn)了基于VGG網(wǎng)絡(luò)的圖像風(fēng)格遷移,再運(yùn)用Apple公司提供的轉(zhuǎn)換工具coremltools導(dǎo)出成iOS支持的coreML格式,幫助用戶可以在移動(dòng)端短時(shí)間內(nèi)實(shí)現(xiàn)圖片風(fēng)格遷移合成的目的。
圖1 圖像風(fēng)格遷移展示
為了計(jì)算不同過濾器通道之間的相關(guān)性,通過計(jì)算兩個(gè)過濾器激活向量之間的點(diǎn)積,得到gram矩陣,公式為:
Gl∈RNl×Nl
總風(fēng)格損失為:
代價(jià)函數(shù)公式可以表示如下:
前文提到的算法每當(dāng)生成一張圖片時(shí)都需要進(jìn)行一次風(fēng)格遷移訓(xùn)練,整個(gè)過程比較耗時(shí)。2016年,斯坦福大學(xué)的JOHNSON等人提出了快速風(fēng)格轉(zhuǎn)移算法,只需要訓(xùn)練一個(gè)網(wǎng)絡(luò)模型就可以對(duì)任意一張圖片進(jìn)行風(fēng)格遷移??焖俎D(zhuǎn)移算法包含兩個(gè)網(wǎng)絡(luò)。一個(gè)為圖片轉(zhuǎn)換網(wǎng)絡(luò)(image transform network),一個(gè)為損失網(wǎng)絡(luò)(loss network)[4]。圖片轉(zhuǎn)換網(wǎng)絡(luò)是一個(gè)多層卷積神經(jīng)網(wǎng)絡(luò),它將一張輸入的原始圖片轉(zhuǎn)換成為一張生成圖片。損失計(jì)算網(wǎng)絡(luò)是一個(gè)VGG-16網(wǎng)絡(luò),用于計(jì)算圖片轉(zhuǎn)換網(wǎng)絡(luò)生成圖片對(duì)于輸入的風(fēng)格圖和原圖之間的損失大小。該算法在訓(xùn)練階段利用大量?jī)?nèi)容圖片進(jìn)行訓(xùn)練以得到某個(gè)風(fēng)格特定模型,在測(cè)試階段將將內(nèi)容圖片經(jīng)過模型就能實(shí)時(shí)得到一張經(jīng)過該風(fēng)格渲染之后的合成圖片[7]。
如圖2所示,圖像S為風(fēng)格圖像,C為內(nèi)容圖像。圖片X為需要進(jìn)行風(fēng)格遷移的圖像,將其丟入網(wǎng)絡(luò)F進(jìn)行風(fēng)格遷移。K表示風(fēng)格遷移后的圖片,即風(fēng)格遷移的結(jié)果圖。右側(cè)是一個(gè)已被訓(xùn)練好的VGG-16網(wǎng)絡(luò),它能夠很好地提取輸入圖像的內(nèi)容特征和風(fēng)格特征,當(dāng)S、C以及K被輸入后,該網(wǎng)絡(luò)將提取它們的特征用于計(jì)算左側(cè)網(wǎng)絡(luò)對(duì)X進(jìn)行風(fēng)格遷移后的損失[8]。
圖2 快速風(fēng)格遷移網(wǎng)絡(luò)模型
基于同一風(fēng)格,如果運(yùn)用GATYS的模型進(jìn)行圖像風(fēng)格遷移,每生成一張圖片,就相當(dāng)于要訓(xùn)練一次模型,這中間可能會(huì)迭代幾百幾千次,會(huì)造成圖像制作成本和效率上的不足。而運(yùn)用JOHNSON的網(wǎng)絡(luò)技術(shù)模型,在進(jìn)行圖片風(fēng)格轉(zhuǎn)換時(shí),相對(duì)GATYS的模型,生成圖的速度快上三個(gè)數(shù)量級(jí)。原因在于:快速風(fēng)格遷移又重新訓(xùn)練了一個(gè)神經(jīng)網(wǎng)絡(luò),如圖2風(fēng)格遷移網(wǎng)絡(luò)F,這個(gè)網(wǎng)絡(luò)是一個(gè)深度殘差網(wǎng)絡(luò),每當(dāng)向該網(wǎng)絡(luò)輸入內(nèi)容圖像訓(xùn)練集,通過計(jì)算生成圖與原圖的內(nèi)容損失以及生成圖與風(fēng)格圖的風(fēng)格損失大小來判斷生成圖的質(zhì)量。通過不斷迭代計(jì)算來減少損失,反向傳播到圖片轉(zhuǎn)換網(wǎng)絡(luò)并對(duì)其進(jìn)行優(yōu)化,最終得到合格的圖片風(fēng)格轉(zhuǎn)換模型。訓(xùn)練完成后,只需要輸入任意的圖像x在風(fēng)格遷移網(wǎng)絡(luò)中前向傳播一次,便可在幾秒內(nèi)內(nèi)合成出一張不錯(cuò)的風(fēng)格遷移圖像;而GATYS等人提出的風(fēng)格遷移方法中不存在一個(gè)如圖2所示的風(fēng)格遷移網(wǎng)絡(luò)F,只存在圖2的右半部分,其中,K為一張白噪聲圖,對(duì)內(nèi)容圖c與風(fēng)格圖s進(jìn)行合成的過程即是通過不斷地迭代K來減小風(fēng)格遷移損失的過程,迭代結(jié)束后,y便為合成后的圖像。而我們每次對(duì)一張圖像進(jìn)行風(fēng)格遷移都需要經(jīng)過這樣的步驟,這無疑會(huì)耗費(fèi)大量的時(shí)間。
通常情況下,開發(fā)人員可以應(yīng)用python開發(fā)web service來實(shí)現(xiàn)客戶端。但自從iOS 11在2017年推出新的機(jī)器學(xué)習(xí)框架core ML之后,開發(fā)者可以直接通過core ML將已經(jīng)訓(xùn)練好的機(jī)器學(xué)習(xí)模型集成到應(yīng)用程序APP中。本文使用了Apple公司提供的一個(gè)跨框架機(jī)器學(xué)習(xí)模型,既MLModel。它可以協(xié)助開發(fā)者封裝機(jī)器學(xué)習(xí)模型的預(yù)測(cè)方法、配置和模型描述。一個(gè)MLModel文件通常情況下會(huì)包括輸入、輸出、模型各層的描述三個(gè)方面,用戶將數(shù)據(jù)封裝成為輸出文件并交付給MLModel,模型會(huì)進(jìn)行結(jié)果預(yù)測(cè)并輸出預(yù)測(cè)結(jié)果的輸出文件,而后再將預(yù)測(cè)的結(jié)果轉(zhuǎn)換成為使用者需要的數(shù)據(jù)類型。
本文利用python和tensorflow。首先,把輸入的圖像調(diào)整成預(yù)定的格式和大小。首先定義了一個(gè)內(nèi)容損失和風(fēng)格損失,前者為風(fēng)格圖像和輸出圖像之間的距離,后者為輸入圖像和輸出圖像之間的距離。然后運(yùn)用定義的總損失函數(shù)來創(chuàng)建優(yōu)化器[9],具體流程圖(見圖3)。
圖3 定義損失函數(shù)流程圖
當(dāng)設(shè)置了內(nèi)容損失,風(fēng)格損失和總損失函數(shù)之后,就可以將風(fēng)格轉(zhuǎn)移過程轉(zhuǎn)化為優(yōu)化問題。為了最大限度地減少全局損失,本文采用一張隨機(jī)生成的白噪聲圖片進(jìn)行訓(xùn)練,迭代更新風(fēng)格化圖像[4]。在每次迭代中,將會(huì)創(chuàng)建一個(gè)輸出圖像,以便最小化相應(yīng)像素輸出圖像和輸入圖像樣式之間的距離(差異)[10]。最后輸出可視化圖像,具體流程圖(見圖4)。
為了獲取最好的模型效果,本文選擇了不同迭代次數(shù)來獲取風(fēng)格圖片,為了防止出現(xiàn)過擬合與欠擬合的現(xiàn)象(見圖5)。
如果直接在手機(jī)上運(yùn)行模型,將會(huì)消耗大量的手機(jī)內(nèi)存,且用戶等待時(shí)間較長(zhǎng)。所以本文選擇用apple公司提供的core ML框架來封裝已經(jīng)訓(xùn)練好的模型,以提高執(zhí)行效率。通過導(dǎo)入core ML tools轉(zhuǎn)換器,并根據(jù)對(duì)應(yīng)模型的第三方工具包c(diǎn)onverters.caffe.convert,將已經(jīng)訓(xùn)練好的模型通過調(diào)用轉(zhuǎn)換器工具將結(jié)果保存為core ML模型格式(.mlmodel),大致流程圖如圖6所示。然后在xcode上集成,實(shí)現(xiàn)其他相關(guān)視圖組件。
圖4 訓(xùn)練過程流程圖
圖5 不同迭代次數(shù)后得到的風(fēng)格圖
圖6 MLmodel結(jié)構(gòu)
用戶能夠通過該APP從相冊(cè)或者拍照獲取圖片,將該照片裁剪成預(yù)設(shè)圖片格式大小,之后利用選擇的風(fēng)格模式在后臺(tái)進(jìn)行風(fēng)格轉(zhuǎn)換,最后將結(jié)果圖返回給用戶。
在對(duì)移動(dòng)端進(jìn)行測(cè)試時(shí),選擇電腦配置為處理器1.6 GHz Intel Core i5+4 GB內(nèi)存+1 600 MHz DDR3,并且選擇xcode9.2版本,iPhone 8plus,iOS系統(tǒng)為11.1為移動(dòng)客戶端進(jìn)行測(cè)試。對(duì)傳入的圖片進(jìn)行測(cè)試時(shí),能在2 s內(nèi)獲得風(fēng)格遷移圖片,測(cè)試結(jié)果(見圖7)。
圖7 圖像合成結(jié)果
本文實(shí)現(xiàn)了在python中運(yùn)用tensorFlow進(jìn)行神經(jīng)風(fēng)格遷移的算法,并成功運(yùn)用到移動(dòng)端上。但因?yàn)橄到y(tǒng)后臺(tái)迭代的次數(shù)是已經(jīng)確定的,所以生成的圖片偶爾會(huì)遷移過度或者遷移風(fēng)格不夠的情況,還需改進(jìn)。通過相關(guān)實(shí)驗(yàn)測(cè)試,此方法能夠在iOS系統(tǒng)的手機(jī)實(shí)現(xiàn)較好的風(fēng)格遷移效果。