图像风格迁移_图像风格迁移—谷歌大脑团队任意图像风格化迁移论文详解
AI研習(xí)圖書館,發(fā)現(xiàn)不一樣的世界
風(fēng)格遷移圖像風(fēng)格化遷移是一個很有意思的研究領(lǐng)域,它可以將一張圖的風(fēng)格遷移到另外一張圖像上,由此還誕生了Prisma和Ostagram這樣的商業(yè)化產(chǎn)品。本文,我們將介紹谷歌大腦團(tuán)隊的一篇很有影響力的論文:?Exploring the structure of?a real-time, arbitrary neural artistic stylization network,該論文提出了一種任意內(nèi)容、任意風(fēng)格的圖像風(fēng)格化遷移算法。大佬已經(jīng)將算法demo整合進(jìn)了aizoo.com,歡迎進(jìn)入網(wǎng)址在線體驗(yàn)。
在深度學(xué)習(xí)引進(jìn)圖像風(fēng)格遷移之前,圖像風(fēng)格化一般稱作圖像紋理合成或者圖像紋理遷移。在2015年,Leon Gatys等學(xué)者開始將深度學(xué)習(xí)引入到圖像風(fēng)格合成領(lǐng)域,從那時起,圖像風(fēng)格化遷移這個名字才開始用起來。從2015年到2017年,圖像風(fēng)格化遷移領(lǐng)域經(jīng)過了火箭般的發(fā)展。其發(fā)展路線主要有以下三個階段:
有意思的是,圖像風(fēng)格遷移領(lǐng)域基本是沿著這三個階段一脈相承的發(fā)展下來的,每一代算法都有借鑒前一個階段的算法成果。真正做到了前人的成果,后人的階梯。
雖然本文寫作于2020年2月6日,但今天我們要重點(diǎn)介紹的該論文是谷歌大腦團(tuán)隊2017年8月發(fā)布的。我們參考Reiichiro大神于2018年開源的代碼和模型,我們很快的就將他部署到了我們的網(wǎng)站aizoo.com。但是我并不清楚該算法的原理和細(xì)節(jié),為了弄明白這篇論文,我仔細(xì)閱讀了該論文以及其參考文獻(xiàn)中的部分經(jīng)典、高被引參考論文,結(jié)合谷歌開源的代碼,我才算是真正搞懂了這篇文章。對于如果要研究圖像風(fēng)格化遷移的新手,直接看懂這篇文章還是蠻困難的。所以本文將用清晰、簡潔的方式介紹這篇論文提到核心的算法。
正如上面提到,圖像風(fēng)格化遷移領(lǐng)域的發(fā)展是一脈相承的,該論文也使用了之前兩個階段的其他論文中的很多方法,所以,我們先對圖像風(fēng)格遷移領(lǐng)域的發(fā)展歷程進(jìn)行簡單的介紹。
01單內(nèi)容單風(fēng)格模型顧名思義,這種模型就是對每一張內(nèi)容圖片和每一張風(fēng)格圖片,都需要單獨(dú)建模,一般是對一張隨機(jī)噪聲圖,不斷的迭代優(yōu)化,使生成圖的風(fēng)格類似于給定的風(fēng)格圖,內(nèi)容卻與給定的內(nèi)容圖像一致。Gatys等學(xué)者發(fā)表的Image Style Transfer Using Convolutional Neural Networks是圖像風(fēng)格化遷移領(lǐng)域的開山之作。該論文主要使用預(yù)訓(xùn)練的VGG網(wǎng)絡(luò)來提取特征,一般我們認(rèn)為VGG這類圖像分類網(wǎng)絡(luò),其淺層會更多的保存圖像的紋理信息,而深層更多的是圖像的語義特征。所以,如果兩張圖片內(nèi)容相似,他們的高層特征的歐式距離會比較小;如果兩張圖像的紋理相似,那么它們的低階特征有相同的空間特性。所以,多數(shù)圖像風(fēng)格化模型,都會使用VGG等圖像識別模型的特征來計算紋理相似性和內(nèi)容相似性,并且一般都會使用VGG等網(wǎng)絡(luò)的多個卷積層提取的特征來計算風(fēng)格損失,并使用一個較深的卷積層提取的特征來計算內(nèi)容損失。如下圖所示,對于風(fēng)格圖像S、內(nèi)容圖像C、生成的風(fēng)格化遷移圖像X,分別輸入VGG網(wǎng)絡(luò),并在如圖所示的四個卷積層的特征來計算風(fēng)格損失,使用relu3_3的輸出的特征來計算內(nèi)容損失。對于圖像風(fēng)格損失,一般會將提取到的特征轉(zhuǎn)換為Gram矩陣,用Gram矩陣來表示紋理信息。Gram矩陣計算方法就是將每個卷積層輸出的特征向量(一般為WxHxC維),reshape成WHxC的矩陣,然后該二維矩陣的轉(zhuǎn)置與自身相乘,得到一個CxC的矩陣,使用這個矩陣表示該層的風(fēng)格。則第j層的風(fēng)格損失定義如下:總的風(fēng)格損失定義如下:內(nèi)容損失為內(nèi)容圖像和生成的風(fēng)格化圖像的特征之間的均方誤差,第j層內(nèi)容損失定義為:總的內(nèi)容損失如下:最終的損失為風(fēng)格損失和內(nèi)容損失的一個加權(quán)和(其中λ為內(nèi)容損失的權(quán)重),而網(wǎng)絡(luò)的優(yōu)化方向,就是最小化總的損失。單內(nèi)容、單風(fēng)格模型,很明顯不實(shí)用,因?yàn)槲覀兛偛荒茏層脩裘看屋斎胍粡垉?nèi)容圖和風(fēng)格圖,都用GPU迭代幾分鐘才給出結(jié)果吧。雖然工程上并不實(shí)用,但是該類算法提出使用VGG等預(yù)訓(xùn)練模型的特征進(jìn)而計算風(fēng)格損失和內(nèi)容損失,后面的風(fēng)格化算法損失函數(shù)計算方式基本沿襲于此。02任意內(nèi)容單風(fēng)格模型這類模型是對圖像風(fēng)格遷移網(wǎng)絡(luò)進(jìn)行訓(xùn)練,圖像風(fēng)格遷移網(wǎng)絡(luò)一般是自編碼器架構(gòu)(AutoEncoder),輸入任意一張內(nèi)容圖,模型可以直接輸出風(fēng)格化的圖片。該類算法需要對一張?zhí)囟L(fēng)格圖進(jìn)行訓(xùn)練,在推理的時候,可以對任意內(nèi)容進(jìn)行風(fēng)格化,這類網(wǎng)絡(luò)的推理速度也比較快。但該類模型依舊有缺陷,因?yàn)閷γ總€風(fēng)格都需要建模,如果要做成產(chǎn)品,假設(shè)有1千個風(fēng)格圖,就要訓(xùn)練一千個模型,這樣存儲、調(diào)用起來仍舊不方便。雖然后來有學(xué)者提出了單模型多風(fēng)格的模型,一個典型的論文是A Learned Representation For Artistic Style,模型結(jié)構(gòu)如上圖所示,一個風(fēng)格遷移模型可以存儲幾十種不同的風(fēng)格,但仍舊不能做到風(fēng)格隨意切換。但這篇論文提出的一個條件實(shí)例歸一化方法(conditional instance normalization),對下面要重點(diǎn)介紹的文章是一個非常大的啟發(fā)。還記得我們經(jīng)常用的Batch Normalization嗎?其原理非常簡單,對于每個卷積層中每個通道的特征,我們計算其均值和標(biāo)準(zhǔn)差,然后對每個通道的每個數(shù)值減去均值,除以標(biāo)準(zhǔn)差,然后乘以一個可學(xué)習(xí)的參數(shù)γ,再加上一個可學(xué)習(xí)的偏置β。該論文提出使用這個γ和β來做作為風(fēng)格圖像的特征向量,即使用這γ和β值來作為風(fēng)格遷移網(wǎng)絡(luò)的部分BN層的γ和β值,進(jìn)而控制風(fēng)格遷移網(wǎng)絡(luò)生成符合特定風(fēng)格的圖像。該文章提出可以存儲N個不同風(fēng)格圖像的γ和β矩陣,每次生成不同風(fēng)格的圖像時,只需要切換不同的風(fēng)格對應(yīng)的γ和β矩陣,就可以生成不同風(fēng)格的風(fēng)格遷移圖。03任意內(nèi)容任意風(fēng)格模型后來,有學(xué)者提出了任意圖像的風(fēng)格化,其有多種不同的方法,下面我們介紹一下本文要重點(diǎn)介紹的論文,也就是谷歌大腦團(tuán)隊提出的——Exploring the structure of a real-time, arbitrary neural artistic stylization network.還記得上面剛提到的條件實(shí)例歸一化方法嗎,谷歌大腦團(tuán)隊提出,如果訓(xùn)練一個風(fēng)格預(yù)測網(wǎng)絡(luò),讓它來生成每個風(fēng)格圖像的特征向量(也就是要強(qiáng)加給風(fēng)格遷移網(wǎng)絡(luò)的γ和β),然后輸送給圖像生成模型不就完事了嗎?只要這個風(fēng)格預(yù)測網(wǎng)絡(luò)性能足夠強(qiáng),就可以做到任意風(fēng)格的圖像生成了。這里有一定會讓大家比較迷惑的地方,也是讓筆者一開始自己百思不得其解的地方。我們通常所見的一個模型的結(jié)果作為另一個模型的一個輸入,一般是與其他特征進(jìn)行通道拼接、或者通道逐元素相加,而本篇論文,則是把一個模型的輸出,作為另外一個模型的部分BN層中的γ和β參數(shù)。這是本文一個非常特別的地方。明晰了這一點(diǎn),本篇文章就很好理解了。下面是論文的主體結(jié)構(gòu)圖:其中風(fēng)格轉(zhuǎn)換網(wǎng)絡(luò)是一個AutoEncoder架構(gòu)的網(wǎng)絡(luò),不過這個網(wǎng)絡(luò)只有兩個下采樣層。下表是風(fēng)格轉(zhuǎn)換網(wǎng)絡(luò)的結(jié)構(gòu)組成。其中每個Residual block(殘差塊)由兩個卷積層和一個shortcut組成,而Upsampling(上采樣層)則是由一個最近鄰差值(2倍上采樣)和一個卷積層組成。但別忘了最重要的,每個卷積層的后面都有BN層,其中前三個卷積層是普通BN層,而后面5個殘差塊中的十個卷積層以及兩個上采樣中的兩個卷積層,還有最后一個卷積層,都是使用上文提到的條件實(shí)例歸一化的,也就是這13個歸一化層的β和γ來自于風(fēng)格預(yù)測網(wǎng)絡(luò)。其中風(fēng)格預(yù)測網(wǎng)絡(luò)是Inception V3模型,不過并不是完整的Inception V3模型,而是只使用其截止到名稱為“mixed 6e”的上半部分模型,該部分作為風(fēng)格預(yù)測網(wǎng)絡(luò)的Backbone網(wǎng)絡(luò),然后對輸出進(jìn)行一個全局平均池化,再使用一個1x1的卷積層將通道數(shù)降低為100,其實(shí)這個100就可以作為一個風(fēng)格圖像的特征了。但是,等等,不是說風(fēng)格預(yù)測網(wǎng)絡(luò)的輸出是上述13個卷積層對應(yīng)的歸一化參數(shù)β和γ嗎?是的,所以這個100個通道的卷積層,還要分別再接出來26個1x1的卷積層(分別是13個卷積層的γ和13個卷積層的β矩陣,所以一共26個卷積層),這26個1x1卷積層的通道數(shù)目,對應(yīng)風(fēng)格遷移網(wǎng)絡(luò)中相應(yīng)層的通道數(shù)。26個卷積層輸出的結(jié)果才是最終送到風(fēng)格轉(zhuǎn)換模型的β和γ向量。下表是風(fēng)格生成網(wǎng)絡(luò)的結(jié)構(gòu)圖,其中最后的Matrix multiply其實(shí)是1x1的卷積層,這點(diǎn)還是通過看源碼看到的。明白了網(wǎng)絡(luò)的完整的拓?fù)浣Y(jié)構(gòu),對這篇文章就算有個清晰的理解了。對于訓(xùn)練,就很容易理解了。其損失同樣是上文提到的,通過VGG網(wǎng)絡(luò)提取的特征來計算風(fēng)格損失和內(nèi)容損失,優(yōu)化器優(yōu)化這個總的加權(quán)損失就可以了。該論文在8萬張藝術(shù)畫和6千張視覺紋理圖上訓(xùn)練,最后作者還驗(yàn)證了,風(fēng)格預(yù)測網(wǎng)絡(luò),在網(wǎng)絡(luò)從未見過的風(fēng)格圖片上,仍然具有很好的風(fēng)格建模能力。這點(diǎn)非常類似于人臉識別模型,一個識別模型在成千上萬的人臉圖片上訓(xùn)練好了,對于未見過的人臉,也需要對其進(jìn)行很好的建模,而不能瞎預(yù)測。而一旦訓(xùn)練好了風(fēng)格預(yù)測模型以及風(fēng)格生成模型,網(wǎng)絡(luò)就可以任意輸入一張內(nèi)容圖片,以及一張風(fēng)格圖片,網(wǎng)絡(luò)就可以很快的生成一張風(fēng)格化的圖片了。其實(shí)文章介紹到這里,最難理解的地方就介紹完了,下面是關(guān)于將模型通過TensorFlow.js部署到瀏覽器里面的一些技術(shù)細(xì)節(jié)由于Inception v3模型比較大,Reiichiro將模型進(jìn)行了蒸餾,使用Mobilenet v2替換Inception v3模型作為風(fēng)格預(yù)測網(wǎng)絡(luò),并將圖像風(fēng)格遷移網(wǎng)絡(luò)中部分的卷積層替換為了深度可分離卷積層。從而降低了兩個模型的大小。| 模型名稱 | 模型大小(MB) | 推理時間(s) | |
| 圖像風(fēng)格轉(zhuǎn)換模型 | Inception v3 | 36.3 | 0.439 |
| Mobilenet v2 | 9.6 | 0.047 | |
| 圖像風(fēng)格生成模型 | 標(biāo)準(zhǔn)卷積結(jié)構(gòu) | 7.9 | 2.51 |
| 深度可分離卷積結(jié)構(gòu) | 2.4 | 0.90 |
下面我們實(shí)現(xiàn)的操作頁面,您可以在瀏覽器輸入aizoo.com/style-transfer.html進(jìn)行體驗(yàn)。
我們默認(rèn)使用小的模型,在圖中右側(cè)控制欄,有個“使用大模型”可選項(xiàng),您可以選擇大模型,大模型更‘鮮艷“一些。不過40多M的模型下載可能需要幾秒鐘,而且運(yùn)算量也要大很多,所以相比小模型,速度會慢很多。最后,說一下學(xué)習(xí)風(fēng)格化算法和這篇論文的感悟。
因?yàn)橹安]有深入研究過圖像風(fēng)格化算法,但我為了介紹這個可以跑在瀏覽器里的算法,仔細(xì)看了這篇文章,讀了幾篇其他作者寫的綜述性介紹文章,又閱讀了幾篇該論文里面提到的部分參考文獻(xiàn),最重要的,是看了源碼,才把一些很難想通的點(diǎn)看明白了。所以,開始一個新的研究方向,或許以下三點(diǎn)是入門的一個很好的點(diǎn):1)閱讀綜述性的論文和博客,找出文中重點(diǎn)提到的經(jīng)典論文;2)閱讀該方向經(jīng)典的論文,以及經(jīng)典論文所參考的部分高被引文獻(xiàn);3)閱讀部分經(jīng)典論文的開源代碼;其中,閱讀代碼可能是理解一篇論文最重要的,就像目標(biāo)檢測中的SSD或者Yolo論文,如果看論文,或許有很多點(diǎn)是看不很明白的,只有看代碼,或者真正自己通過寫代碼實(shí)現(xiàn)這個算法,才能徹底搞懂它。最后,歡迎關(guān)注我們的公眾號,如果您想體驗(yàn)跑在您瀏覽器的圖像風(fēng)格化算法,敬請訪問aizoo.com,更多好玩的人工智能算法,在里面等你哦。參考文獻(xiàn):推薦閱讀文章
[1]?AI入門-人工智能的前世今生[2]?AI入門-深度學(xué)習(xí)綜述[3]?AI入門-計算機(jī)視覺學(xué)習(xí)指南[附資源][4]?深度學(xué)習(xí)框架總結(jié)—國際篇[5]?深度學(xué)習(xí)-CNN結(jié)構(gòu)設(shè)計技巧[6]?資源分享-深度學(xué)習(xí)及數(shù)據(jù)分析等資源合集
[7]?今日分享—統(tǒng)計學(xué)習(xí)方法
[8]?算法總結(jié)—人臉檢測算法
[9]?目標(biāo)檢測算法-YOLOv4?
[10]?項(xiàng)目總結(jié)—人臉檢測
[11]?數(shù)據(jù)結(jié)構(gòu)與算法-Python語言案例實(shí)現(xiàn)
[12]?深度學(xué)習(xí)基礎(chǔ)-二十種損失函數(shù)
[13]?深度學(xué)習(xí)-目標(biāo)檢測的十九個研究方向
[14]?項(xiàng)目實(shí)戰(zhàn)-車輛檢測案例實(shí)現(xiàn)
[15]?卷積神經(jīng)網(wǎng)絡(luò)-可變形卷積[上]
[16]?圖像識別—EfficientNet算法詳細(xì)總結(jié)
[17]?世界讀書日—機(jī)器學(xué)習(xí)西瓜書|附下載鏈接
[18]?面試指南-算法崗如何針對性的準(zhǔn)備校招面試
? ?......
點(diǎn)擊"在看"了解更多精彩內(nèi)容轉(zhuǎn)載是一種動力 分享是一種美德公眾號 :AI研習(xí)圖書館CSDN博客:算法之美DLGitHub:statisticszhang關(guān)注AI研習(xí)圖書館,發(fā)現(xiàn)不一樣的精彩世界
總結(jié)
以上是生活随笔為你收集整理的图像风格迁移_图像风格迁移—谷歌大脑团队任意图像风格化迁移论文详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招商银行信用卡境外拨打服务热线方法
- 下一篇: 计算机工程与应用查重吗,计算机工程期刊录