深度卷积网络图像风格转移(一) 需求分析
Taylor Guo , 2017年5月5日
目标
图像风格转移
* 一天内的光照变化,不同天气的变化,四季变化
* 与背景相容的物体风格变化
这里指的是图像风格转移,并没有包含优化抠图与图像分割产生的效果
问题
效果图对比
图像局部扭曲
风格溢出
图像与风格无法匹配
图像与风格无法匹配
由于极端匹配导致失效:比如花与城市场景,沙发与火焰,等等
输入图像与参考图像的内容不同:不相关的内容不在预期范围内
可以使用手动场景分割解决这个问题。
分析
最优化问题 风格转移问题:是利用CNN生成一张新图像,内容和输入图像一样,风格和想要变成的风格的参考图像一致;也可以将这个问题理解成 最优化问题进行数学表示;最优化两个图像之间的内容差别:
图像内容差异最小化为:卷积神经网络中某层滤波后的结果的差的平方的平均值;
最优化两个图像之间的风格差别:
图像风格差异最小化为:卷积神经网络中某层滤波后的结果的差的平方的平均值;其中的格莱姆矩阵是表示图像特征的向量之间的內积。向量內积的几何意义可以理解为两个向量在方向上的接近程度。

采样与传播相结合的方法通常将抠像问题转换为能量函数最小化问题, 能量函数由两部分构成, 一部分为数据能量项, 另外一个部分为光滑能量项, 求解图像的前景掩码层a的一般数学模型如下:
根据Es和E的构造方法的不同, 基于采样与传播相结合的抠像方法有多种。
能量函数也就是损失函数,在抠图里面就是希望前景颜色和背景颜色差异最小化,利用最小化问题求出不透明度值。继而得到前景颜色和背景颜色。图像可以表示成多个图层的合成;每个图层的系数为该层的掩码,这个掩码是稀疏的,图像中的每个像素只受少数几个层的影响,只有少部分像素由多个不同层混合而成。 掩码与拉普拉斯矩阵特征向量之间是线性变换。 这个线性变换矩阵就是不同图像层之间的连通块,由像素子集构成。
拉普拉斯抠图矩阵,可以简单理解为像素之间是否联通的关联矩阵。
拉普拉斯矩阵及局部平滑能量函数
图像抠图算法假设每个像素由前景颜色和背景颜色线性合成,参数为不透明值α。对毛发,烟雾,火焰等无法用单像素表达或半透明的物体,图像抠图相比图像分割有明显优势。
参考:
自然图像抠图技术综述
闭合型抠图的研究与应用
因此,用语义分割算法,对输入图像和风格参考图像生成图像分割遮罩。将遮罩添加到输入图像上作为另外一个通道,增强CNN中的风格算法。
语义分割增强的风格损失函数
c是语义分割遮罩中的通道数量;Ml,c是通道图像。
方案
VGG-19 网络架构
参考代码分析
INPUT: [224x224x3] memory: 224*224*3=150K weights: 0 CONV3-64: [224x224x64] memory: 224*224*64=3.2M weights: (3*3*3)*64 = 1,728 CONV3-64: [224x224x64] memory: 224*224*64=3.2M weights: (3*3*64)*64 = 36,864 POOL2: [112x112x64] memory: 112*112*64=800K weights: 0 CONV3-128: [112x112x128] memory: 112*112*128=1.6M weights: (3*3*64)*128 = 73,728 CONV3-128: [112x112x128] memory: 112*112*128=1.6M weights: (3*3*128)*128 = 147,456 POOL2: [56x56x128] memory: 56*56*128=400K weights: 0 CONV3-256: [56x56x256] memory: 56*56*256=800K weights: (3*3*128)*256 = 294,912 CONV3-256: [56x56x256] memory: 56*56*256=800K weights: (3*3*256)*256 = 589,824 CONV3-256: [56x56x256] memory: 56*56*256=800K weights: (3*3*256)*256 = 589,824 POOL2: [28x28x256] memory: 28*28*256=200K weights: 0 CONV3-512: [28x28x512] memory: 28*28*512=400K weights: (3*3*256)*512 = 1,179,648 CONV3-512: [28x28x512] memory: 28*28*512=400K weights: (3*3*512)*512 = 2,359,296 CONV3-512: [28x28x512] memory: 28*28*512=400K weights: (3*3*512)*512 = 2,359,296 POOL2: [14x14x512] memory: 14*14*512=100K weights: 0 CONV3-512: [14x14x512] memory: 14*14*512=100K weights: (3*3*512)*512 = 2,359,296 CONV3-512: [14x14x512] memory: 14*14*512=100K weights: (3*3*512)*512 = 2,359,296 CONV3-512: [14x14x512] memory: 14*14*512=100K weights: (3*3*512)*512 = 2,359,296 POOL2: [7x7x512] memory: 7*7*512=25K weights: 0 FC: [1x1x4096] memory: 4096 weights: 7*7*512*4096 = 102,760,448 FC: [1x1x4096] memory: 4096 weights: 4096*4096 = 16,777,216 FC: [1x1x1000] memory: 1000 weights: 4096*1000 = 4,096,000 TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd) TOTAL params: 138M parameters
12345678910111213141516171819202122232425262728293031