盛夏,闲鱼式的生活也越发充满味道。烈日,在高高的天上散发着火炉的气息。小浪怀念着在海边度假的日子,但是内心的使命感把他拉回了现实。
卷积神经网络可以实现图像风格的转换。小浪也来写个程序,实现下这个功能。
完整代码地址:https://github.com/ADlead/StyleTransfer.git
首先,在个人理解中,图像风格转换,原理大概如下:使用计算机去重构两张图片,在重构生成图像的过程中,把第二张图像重构过程中呈现的风格特征融入到第一张图像内容的重构过程中,就能实现风格的迁移转换 。
在图像重新生成的过程中,取出卷积神经网络中的某一层,用来计算图像重构过程时的内容损失和风格损失,通过损失加权计算得到总损失值,在重构过程中最小化这个总损失值。
其中,内容损失函数和风格损失的计算代码如下
# gram矩阵的计算
def gram_matrix(x):
b, w, h, ch = x.get_shape().as_list()
features = tf.reshape(x, [b, h*w, ch])
gram = tf.matmul(features, features, adjoint_a=True) \
/ tf.constant(ch*w*h, tf.float32)
return gram
# 风格损失的gram矩阵计算
style_gram = [gram_matrix(feature) for feature in style_features]
result_style_gram = [gram_matrix(feature) for feature in result_style_features]
# 计算内容损失
content_loss = tf.zeros(1, tf.float32)
for c, c_ in zip(content_features, result_content_features):
content_loss += tf.reduce_mean((c-c_)**2, [1,2,3])
# 计算风格损失
style_loss = tf.zeros(1, tf.float32)
for s, s_ in zip(style_gram, result_style_gram):
style_loss += tf.reduce_mean((s-s_)**2, [1,2])
# 内容损失和风格损失 加权
loss = content_loss * lambda_c + style_loss * lambda_s
train_op = tf.train.AdamOptimizer(learning_rate).minimize(loss)
从网络上找了一些图片来试验,分别有不同的人物内容图像和一些风格类图像,运行效果如下
效果 1
效果 2
效果 3
通过调整内容损失或风格损失的权重值,以及训练步数、学习率等等,可以获得不同的效果,还可以继续优化。
把照片风格转换之后,还是要继续闲鱼地生活。学归学,浪归浪,不能忘了生活的态度。
交流群:79893083