论文简读:Memory-guided Unsupervised Image-to-image Translation

一篇用内存思想来完成Instance-level i2i translation工作的文章。全名是memory-guided unsupervised I2I translation (MGUIT)。

至于这个memory network是什么,后文再说。

Related works就不多介绍了,无非就是:

  • 传统的I2I工作在图像具有多实例的时候表现比较差,因为没有考虑instance-level的信息;
  • 当然也有一些Instance-level image-to-image translation工作,但表现仍然比较差,原因不限于仅仅在训练阶段使用instance-level的信息、翻译时只考虑global style不考虑instance style、翻译时会丢失instance style等等。
  • 然后是memory network,更具体地,作者用的是key-value memory network。给出一个query,用key去检索需要的信息,并返回相应的value,就是计算机组成原理那些东西,甚至还要简单。

 

来康康具体的结构叭:

 

 

 实际上去掉那个class-aware memory network,整个网络是用的DRIT的结构。

其中$E_{c} = \{E_{c}^{x}, E_{c}^{y}\}$是一对content encoder,$E_{s} = \{E_{s}^{x}, E_{s}^{y}\}$是一对style encoder,$G^{x}$和$G^{y}$分别是两个domain的decoder。

图像I可以通过相应domain的两个encoder编码为domain-agnostic的内容特征c和domain-specific的风格特征s。

区别于之前的方法,简单交换两个s再通过G完成翻译,MGUIT使用的s是通过读取memory的一些信息重组的:

 

 

 关键就是解释Class-aware Memory Network如何记录、更新信息,并从里面读取想要的信息来构成重组后的s。


 

 

class-aware memory network的存储方式就是这样的。

每个class下面有$N_{k}$个item,而整个memory有N个item,满足$\sum_{k=1}^{K} {N_{k}} = N $,其中K是class的种类,等于前景目标的种类数+1(后景)

每个class下有$N_{k}$个item其实也很好理解,以汽车为例,汽车的轮胎、玻璃、车身存储起来的特征明显是不一样的,不能用不同的风格来翻译,因此至少需要3个item。

每个item的内容是a pair of 1 × 1 × C的向量$(k, v^{x}, v^{y})$。这个a pair of是真的迷惑,应该是triplet才对吧。总之这三个大小都是1 × 1 × C的,C为通道数。

$k$用来检索item,其中的内容也是编码后的content feature

$(v^{x}, v^{y})$保存的是每个item在两个domain的style feature。

训练的时候,会用到数据集中的object annotations(比如物体的种类,物体的框的位置)来辅助。每张图的特征$(c, s)$会被聚类为K类:

${(c_{1}, s_{1}), · · · ,(c_{K}, s_{K})}$

这些聚类后的信息用来更新和读取memory。

来解释一下具体的readh和update操作:

Read:

简单来说,就是用一个$c_{p}$与每个$k$计算相似度来查询。但并不是找出相似度最高的直接作为返回的value,而是用相似度作为权重,对所有的kv加权求和。

首先是求权重:

 

其中$c_{p}$代表每个像素点的content feature,也是1 × 1 × C大小,C为通道数。$(p = 1, ..., P)$,P是c中的像素数(应该是c的特征图中H × W的值)

d是通过余弦相似度来定义的:

 

让每个像素的c与k求相似度,并在n的维度上求softmax作为每个k的权重,最终返回值为加权求和后的结果:

 

 

 这一操作对每个p都会重复,最后组成一个聚合后的特征图。

Update:

update也是求权重然后按权重更新,只不过是给出$(k, v^{x}, v^{y})$来修改存储的所有item。

给出的$(k, v^{x}, v^{y})$是整个feature map的,所以这里求的是每个像素的权重:

 

可以看到这里是在p的维度上求权重,与read时操作的维度不同。

最后按照下面的式子更新:

 

 因为k保存的内容c是两个domain共享的,所以一起更新,而v保存的s是两个domain单独的,所以分开更新。

总的更新步骤也可以看图:

 


 

结构上的原理已经整理完了,另一部分重要的就是loss function:

以下的部分是在DRIT的基础上额外增加的一些loss。

Reconstruction loss: 

 

 

 Adversarial loss:

  两对额外的content discriminator和domain discriminator,分别在$c_{x}$和$c_{y}$之间计算$L_{c}^{adv}$,以及在两个domain之间计算$L_{d}^{adv}$

 KL loss:

  我没太明白这一项有什么用,作者的解释是让style的分布更接近高斯分布。应该是让style更均匀分布?

 Latent regression loss:

  让style与image之间的映射是可逆的。

以上的几项是针对encoder和decoder的,作者提出了一个新的Feature contrastive loss用来优化memory network:

 

 对于每一个$c_{p}$或者$s_{p}$,把距离他们最近的另一个作为正例,其余的作为负例来让特征的分布更合适,并且提升聚类的效果。


 

最后一部分当然是结果,这里就简单放一些图自己看吧~

 

 

 

其中a:input b:DUNIT c:MGUIT

 

 有趣的一点是,这个对于影子的翻译好像都是一样的,不管影子是来自路灯还是太阳,翻译后都还在。

 

posted @ 2021-05-05 17:38  myweihp  阅读(673)  评论(0编辑  收藏  举报