2022CVPR Yingying Deng StyTr2 :Image Style Transfer with Transformers
文章目录
主要工作
消除基于CNN的风格迁移方法的有偏问题,并提出新的使用transformer的风格迁移框架。
介绍
该基于transformer的框架( S t y T r 2 StyTr^2 StyTr2)包含两个不同的transformer的encoder,以分别为内容和样式生成特定域的序列。encoder之后,decoder分别地逐步生成图像patches的输出序列。可以看作是图像patches的sequence-to-sequence的生成。
面临的困难
- 与基于逻辑排序的句子不同,图像patches的序列与图像内容的语义信息相关联。
- 图像分辨率的指数级增长将导致位置编码的显著变化,导致位置偏差较大,输出质量较差。
主要贡献
- 提出基于transformer👍的图像风格迁移框架 S t y T r 2 StyTr^2 StyTr2,生成具有良好保存的结构和输入内容图像细节(防止内容有偏的风格迁移)的样式化结果。
- 提出一种尺度不变(针对不同分辨率大小的图像)的内容感知位置编码(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中:
- P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) \color{black}PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel),偶数位置
- P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) \color{black}PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}}) PE(pos,2i+1)=cos(pos/100002i/dmodel),奇数位置
其中,pos是一句话中某个字的位置, d m o d e l d_{model} dmodel表示将一个词表示为一个向量的长度,2i表示这个向量的每个维度。代码实现,见:
E:\pycharm\learn_pytorch\src\position_encoding_transformer.py
Parametric 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维,然后经过一个线性投影层。其实就是经过一个 c o n v ( i n d i m : 3 , o u t d i m : 512 , k e r n e l s i z e : 8 , s t r i d e : 8 ) \color{black}conv(in_dim:3, out_dim:512, kernel_size:8, stride:8) conv(i