图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

简介

github项目地址:https://github.com/zhangcliff/style-transfer-of-arbitrary-region

乍一看文章题目,显得有点复杂。先来说一说神经风格转移吧!假设我们现在有两幅图片,一张是梵高的画作,一张是我们的照片。神经风格转移,就是用一个神经网络学习梵高画作的风格,再将这种风格与我们的照片进行结合,最后生成一张带有梵高画作风格的照片,效果如下图所示。

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

下面再来说说指定区域的神经风格转移。假如我只想将下图中的鸟进行风格转移,应该怎么办呢。有人肯定会说,先将整张图片进行风格转移,再用鸟的掩膜(mask)将风格转移后鸟的部分切割出来,与原图的背景进行拼接就行了。这种方法肯定也是可以的,但今天我们讨论另外一种方法。该方法使用了一个有条件输入的转移网络(Conditional transfer network),原图作为主要输入,目标区域掩膜图作为条件输入。转移网络只对目标区域进行风格转移,而保持非目标区域不变,从而达到任意制定区域的神经风格转移。如下图所示。

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)


本文所讨论的方法基于论文:Local Perceptual Loss Function for Arbitrary Region Style Transfer (ICPR2018在审论文)。

github项目地址:https://github.com/zhangcliff/style-transfer-of-arbitrary-region

一、 Conditional transfer network

文章中使用的Conditional transfer network与论文Conditional Fast Style Transfer Network中使用的比较类似,如下图所示。

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

Enconder首先将内容图作为输入,产生特征图。之后将一个掩膜矩阵(Mask matrix)串联在特征图的尾部,通过一个1×1的卷积层进行信息的整合。Deconder将特征信息进行解码,最后生成一张效果图。

从上图中可以看出,作为条件输入的Mask指定图片的左半部分为目标区域,则转移网络只对左半部分进行风格转移,而保持右半部分不变。

二、 Perceptual loss

在论文Perceptual losses for real-time style transfer and super-resolution 中,作者使用Perceptual losses训练了一个transfer network,这种方法可以对图片进行实时的风格转移。

首先我们说一下Perceptual losses,其由两部分组成,content loss 和 style loss。content loss和style loss都是通过一个损失网络(pretrained vgg16)来计算的。

Content loss

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

将生成的图片和内容图通过一个pretrained vgg16网络得到特征图,φ_j (y_c)表示内容图在vgg16第j层的特征,Hj,Wj以及Cj分别表示第j层特征的高、宽和通道数。最小化该损失函数,也就意味着生成图和内容图在vgg16的特征空间中的欧氏距离达到最小,也就能使生成图和内容图在图片内容上保持一致。当两幅图片的内容比较相似时,其通过vgg16产生的特征自然也就比较相似(欧式距离比较小)。

Style loss:

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

在内容损失中,用特征表示图片的内容,那用什么表示图片的风格呢?这里用的是Gram矩阵。Gram矩阵可以通过以下方式进行计算:

(1)  将特征φ reshape,变成如下形状:C×HW

(2)  G(∙)=  (φφ^T)/HCW

通过Gram矩阵表示图片的风格,可以理解为用特征中每个通道之间的分布来表示风格,这在直观上还是比较好理解的。最小化生成图和风格图Gram矩阵之间的欧氏距离,使得生成图和风格图的在风格上保持一致。


三、Local perceptual loss

说完了Perceptual losses,下面我们接着说Local perceptual loss。顾名思义,该损失是在图像的局部计算损失误差。

Localstyle loss

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)
Gram矩阵的计算方式还是一样的,区别在于:对于生成图,我们只计算目标区域的Gram矩阵;对于风格图,依然是计算整张图片特征的Gram矩阵。通过优化这个损失函数,使得目标区域的风格与风格图保持一致。

Local content loss

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

这里将内容损失分成了两部分来计算,一部分是目标区域的内容损失,一部分是非目标区域的内容损失。Mt表示掩膜矩阵,其为二值矩阵,Mt+Mnt=E。E为全1矩阵。最后总的损失函数如下所示。

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

通过文章中定义的Local perceptual loss,可以训练Conditional transfer network捕捉到mask中的空间位置信息,进而对目标区域进行风格转移。

四、试验效果

由Gram的定义我们可以知道,必须要求目标区域是矩形时,才能计算Gram矩阵。因此在训练网络的时候,我们将目标区域都定为矩形。最后得到的效果图如下。看起来效果还是不错的。

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

下面我们使用一些不规则形状作为目标区域,效果图如下。从下图中可以看出,虽然训练时,目标区域只能时矩形,但是测试使用时,目标区域可以是任意形状。因此,可以判断网络在训练中很好的学习到了目标区域的空间位置信息,而不局限于某一特定的形状。

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

但是从效果图中,还是可以看出一些小瑕疵的。在目标区域的边缘有信息损失,会产生白化现象。如果要产生更加美观的图片,我们可能要与原图进行结合,如下所示。效果还是不错的。

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

到了这里,可能有读者就会吐槽了,最后还是要用掩膜(mask)将风格转移后的部分切割出来,与原图的背景进行拼接,为什么要多此一举设计一种算法来进行局部的风格转移呢?

其实呢,方法不同,产生的效果自然就不同。下面给出用论文Perceptual losses for real-time style transfer and super-resolution的方法进行整幅图像的风格转移,再用掩膜(mask)将风格转移后的部分切割出来,与原图的背景进行拼接得到效果图,在与这篇文章的效果图进行对比(右边为我们的效果图)。

图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)图像任意指定区域的神经风格转移(论文解读以及tensorflow实现)

至于左边好看还是右边好看,这完全是仁者见仁智者见智,在这里就不评价了。方法不同,效果就不同。