StyTr^2:Image Style Transfer with Transformers
2022CVPR Yingying Deng StyTr2 :Image Style Transfer with Transformers
文章目錄
- 主要工作
- 介紹
- 面臨的困難
- 主要貢獻
- 相關工作
- 圖像風格遷移
- transformer架構
- 位置編碼
- Functional positional encoding
- Parametric positional encoding
- 模型架構
- 方法
- CAPE:Content-Aware Positional Encoding
- 1.生成patches的embed
- 2.CAPE
- Style Transfer Transformer
- Transformer encoder
- Transformer decoder
- AT,Auto-Regressive
- 與NAT的對比:
- CNN decoder
- 網絡優化
- 實驗
主要工作
消除基于CNN的風格遷移方法的有偏問題,并提出新的使用transformer的風格遷移框架。
介紹
該基于transformer的框架(StyTr2StyTr^2StyTr2)包含兩個不同的transformer的encoder,以分別為內容和樣式生成特定域的序列。encoder之后,decoder分別地逐步生成圖像patches的輸出序列。可以看作是圖像patches的sequence-to-sequence的生成。
面臨的困難
主要貢獻
- 提出基于transformer👍的圖像風格遷移框架StyTr2StyTr^2StyTr2,生成具有良好保存的結構和輸入內容圖像細節(防止內容有偏的風格遷移)的樣式化結果。
- 提出一種尺度不變(針對不同分辨率大小的圖像)的內容感知位置編碼(CAPE👍,content-aware positional encoding)方案。
相關工作
圖像風格遷移
總而言之,言而總之,與全卷積網絡相比,基于transformer的網絡可以利用自注意機制捕獲輸入圖像的長期依賴性。在本文中,我們引入基于transformer的樣式遷移任務的結構,將圖像風格遷移任務看作是圖像patches的sequence-to-sequence的生成。
transformer架構
位置編碼
Functional positional encoding
通過預定義的函數來計算,如Attention?Is?All?You?Need\text {Attention Is All You Need}Attention?Is?All?You?Need中:
- PE(pos,2i)=sin(pos/100002i/dmodel)\color{black}PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}})PE(pos,2i)?=sin(pos/100002i/dmodel?),偶數位置
- PE(pos,2i+1)=cos(pos/100002i/dmodel)\color{black}PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}})PE(pos,2i+1)?=cos(pos/100002i/dmodel?),奇數位置
其中,pos是一句話中某個字的位置,dmodeld_{model}dmodel??表示將一個詞表示為一個向量的長度,2i表示這個向量的每個維度。代碼實現,見:
E:\pycharm\learn_pytorch\src\position_encoding_transformer.pyParametric positional encoding
通過網絡訓練得到,如:BERT
模型架構
方法
CAPE:Content-Aware Positional Encoding
1.生成patches的embed
給定輸入圖像,首先對圖像做transform,變成256*256大小:
def train_transform():transform_list = [transforms.Resize(size=(512, 512)),transforms.RandomCrop(256),transforms.ToTensor()]return transforms.Compose(transform_list)然后把輸入圖像分成L個8*8大小的patches,每個patch的維度是C,即,每個patch由3維變為C維,然后經過一個線性投影層。其實就是經過一個conv(indim:3,outdim:512,kernelsize:8,stride:8)\color{black}conv(in_dim:3, out_dim:512, kernel_size:8, stride:8)conv(ind?im:3,outd?im:512,kernels?ize:8,stride:8),變成512x32x32大小的特征。生成序列特征編碼sigma,C是sigma的維度。
self.proj = nn.Conv2d(in_chans,embed_dim,kernel_size=patch_size,stride=patch_size) #N 32 32 512 ... ... x = self.proj(x)2.CAPE
重新縮放為18*18,并通過一個維度不變的1x1卷積用作訓練出來的位置編碼,然后插值為256x256。
self.new_ps = nn.Conv2d(512, 512, (1,1)) self.averagepooling = nn.AdaptiveAvgPool2d(18) # content-aware positional embedding content_pool = self.averagepooling(content) #18 18 512 pos_c = self.new_ps(content_pool) pos_embed_c = F.interpolate(pos_c, mode='bilinear',size= style.shape[-2:]) # N C:512 H:256 W:256Style Transfer Transformer
Transformer encoder
StyTr2StyTr^2StyTr2有兩個transformer encoder去編碼特定域(內容和風格)的特征。通過自注意力機制與前饋神經網絡對其進行編碼。
其中,對輸入的style圖像做embedding時,不需要考慮位置編碼,因為我們不需要在輸出中維護輸入style圖像的結構特征。
Transformer decoder
與自回歸(AT,Auto-Regressive)處理方式不同,本文decoder一次將所有的連續的小塊作為輸入來預測輸出。
AT,Auto-Regressive
與NAT的對比:
CNN decoder
transformer的輸出序列是HW64×C\frac{HW}{64} × C64HW?×C的形狀。本文沒有直接上采樣輸出序列來構建最終結果,而是使用三層CNN解碼器來細化transformer decoder的輸出。對于每一層,本文采用一系列的操作,包括3×3Conv+ReLU+2×upsample來擴大輸出尺寸。最后可以得到H×W×3的分辨率的最終結果。
網絡優化
使用VGG網絡提取的特征計算loss。
①:Lc=1Nl∑i=0Nl∥?i(Io)??i(Ic)∥2\color{black}{ L } _ { c } = \frac { 1 } { N _ { l } } \sum _ { i = 0 } ^ { N _ { l } } \| \phi _ { i } ( I _ { o } ) - \phi _ { i } ( I _ { c } ) \| _ { 2 }Lc?=Nl?1?i=0∑Nl??∥?i?(Io?)??i?(Ic?)∥2?
LcL_cLc?是由VGG提取輸入內容圖像與輸出圖像的特征,并計算它們之間每一層的歐氏距離。
②:Ls=1Nl∑i=0Nl∥μ(?i(Io))?μ(?i(Is))∥2+∥σ(?i(Io))?σ(?i(Is))∥2\color{black}\begin{array} { l } { { L } _ { s } = \frac { 1 } { N _ { l } } \sum _ { i= 0 } ^ { N _ { l } } \| \mu ( \phi _ { i } ( I _ { o } ) ) - \mu ( \phi _ { i } ( I _ { s } ) ) \| _ { 2 } } { + \| \sigma ( \phi _ { i } ( I _ { o } ) ) - \sigma ( \phi _ { i } ( I _ { s } ) ) \| _ { 2 } } \\ \end{array}Ls?=Nl?1?∑i=0Nl??∥μ(?i?(Io?))?μ(?i?(Is?))∥2?+∥σ(?i?(Io?))?σ(?i?(Is?))∥2??
LsL_sLs?是最小化由VGG提取的輸出圖像與輸入的風格圖像的每一層特征的均值和方差。
③:Lid1=∥Icc?Ic∥2+∥Iss?Is∥2\color{black}{ L } _ { i d 1 } = \left\| I _ { c c } - I _ { c } \right\| _ { 2 } + \| I _ { s s } - I _ { s } \| _ { 2 } Lid1?=∥Icc??Ic?∥2?+∥Iss??Is?∥2?,其中IcI_cIc?是輸入圖像,IccI_{cc}Icc?是輸出圖像。
? Lid2=1Nl∑i=0Nl∥?i(Icc)??i(Ic)∥2+∥?i(Iss)??i(Is)∥2\color{black}{ L } _ { i d 2 } = \frac { 1 } { N _ { l } } \sum _ { i = 0 } ^ { N _ { l } } \| \phi _ { i } ( I _ { c c } ) - \phi _ { i } ( I _ { c } ) \| _ { 2 } + \| \phi _ { i } ( I _ { s s } ) - \phi _ { i } ( I _ { s } ) \| _ { 2 } Lid2?=Nl?1?i=0∑Nl??∥?i?(Icc?)??i?(Ic?)∥2?+∥?i?(Iss?)??i?(Is?)∥2?
同時當輸入的內容和風格圖像一樣(同時是風格圖\同時是內容圖)時,需要保證此時的輸出圖像與輸入圖像歐氏距離最小;并且此時從輸入與輸出提取出來的特征的歐氏距離也應該最小。
④:最后的loss由下式表出:
L=λcLc+λsLs+λid1Lid1+λid2Lid2\color{black}{ L } = \lambda _ { c } { L } _ { c } + \lambda _ { s } { L } _ { s } + \lambda _ { i d 1 } { L } _ { i d 1 } + \lambda _ { i d 2 } {L } _ { i d 2 } L=λc?Lc?+λs?Ls?+λid1?Lid1?+λid2?Lid2?
其中λc,λs,λid1,λid2\lambda_c,\lambda_s,\lambda_{id1},\lambda_{id2}λc?,λs?,λid1?,λid2?分別設置為10,7,50,1。
實驗
content:MS-COCO style:WiKiArt
訓練時所有輸入圖像隨機裁切成256*256大小;測試時支持任何大小分辨率
總結
以上是生活随笔為你收集整理的StyTr^2:Image Style Transfer with Transformers的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [密码学][困难问题][常见规约]密码学
- 下一篇: 问题:从键盘读取特定类型的数据(使用Sc