用Keras实现图片风格迁移的算法详解

深度学习(python)-Keras-4 风格迁移 Keras实践深度学习中的风格迁移 风格迁移可以将一张图片中的风格迁移到另一张图片上。 风格迁移 用以下代码来实现风格迁移 给出要改变图像的路径,给出风格图像,设置迭代次数。 from keras.preprocessing.image import load_img,img_to_array import numpy as np from keras.applications i... 阅读详情

【摘要】详细分析了基于Keras实现图片风格迁移的生成算法,提供了GUI实现工具;同时,比较了生成式深度学习跟常规深度学习的差异,拓展对神经网络的认识。

 

一. 图片风格迁移生成算法详解

该实现算法及代码,主要取自Keras 之父写的 《Python 深度学习》,有推荐价值。在此基础上,本人开发了一个用tkinter写的实用小工具,通过设置目标图片,风格图片,按开始转换,即可生成风格迁移后的新图片。

源代码可通过以下Github地址获取

https://github.com/EdwinZhang1970/Python/tree/master/Netural%20Style%20Transfer

1. 算法要达到的目标

  1. 提供目标图片,风格图片,产生一个新的生成图片
  2. 生成图片需要尽量保留目标图片的内容;同时应用风格图片的风格

2. 如何定义和获得图片的内容特征值,风格特征值

  1. 根据对深度学习神经网络模型的研究分析,模型网络更靠底部(靠近输入端)的层激活包含了图片的局部,具体信息;更靠顶部(靠近输出端)的层激活,包含了图片的全局,抽象信息。本例算法采用的是VGG19模型,其模型结构是

2. 取图片在模型中的更靠顶部的层激活信息,作为图片的内容特征值,因为是全局的,因此,可以只取一层就可以了。本例算法取的是conv5_2, 代码中为block5_conv2

content_layer = 'block5_conv2'

3. 取图片在模型中的更靠底部的层激活信息,作为图片的风格特征值,因为是局部的,因此,需要多取几层,以获得更全面的风格特征信息。本例中取的是 conv1_1, conv2_1, conv3_1, conv4_1, conv5_1, 代码中为block1_conv1, block2_conv1, block3_conv1, block4_conv1, block5_conv1

style_layers = ['block1_conv1',
                'block2_conv1',
                'block3_conv1',
                'block4_conv1',
                'block5_conv1']

 

3. 如何让生成图片跟目标图片保持内容相似,跟风格图片保持风格相似

  1. 让生成图片和目标图片,在靠近顶部的所选层的激活信息(内容信息)保持相似,从而做到生成图片和目标图片的内容保持相识。定义的内容损失函数(损失值越小,相似度越高)。直接用层激活的内容进行比较,获得差异损失值
def content_loss(base, combination):
    return K.sum(K.square(combination - base))

    2. 让生成图片和风格图片,在靠近底部依次向上所选的多个层激活(风格信息),让它们在这几个层保持类似的同层相互关系(不是层的具体内容,而是该层元素之间的相互关系),从而做到生成图片与风格图片的风格一致. 

   通过 gram_matrix()函数,可计算获得输入矩阵的格拉姆矩阵,格拉姆矩阵是原始矩阵的相互关系的映射

def gram_matrix(x):
    features = K.batch_flatten(K.permute_dimensions(x, (2, 0, 1)))
    gram = K.dot(features, K.transpose(features))
    return gram

然后以矩阵相互关系,图片的尺寸信息为参数,计算损失值(图片尺寸越大,向量值越多,合计值越大, 除以尺寸信息维度,就有可比性了)

def style_loss(style, combination, img_height, img_width):
    S = gram_matrix(style)
    C = gram_matrix(combination)
    channels = 3
    size = img_height * img_width
    return K.sum(K.square(S - C)) / (4. * (channels ** 2) * (size ** 2))

3. 提高生成图片的空间连续性,让生成图片本身更像完整的图片,而不是单个像素点的随意堆积

def total_variation_loss(x, img_height, img_width):
    a = K.square(
        x[:, :img_height - 1, :img_width - 1, :] - x[:, 1:, :img_width - 1, :])
    b = K.square(
        x[:, :img_height - 1, :img_width - 1, :] - x[:, :img_height - 1, 1:, :])
    return K.sum(K.pow(a + b, 1.25))

这段代码咋看很复杂,细看还是很简单的。简化a, 只需抽取变量a中有变化的第1维进行分析

K.square(x[:img_height-1] – x[1:])
= (x[0]-x[1])**2 +(x[1]-x[2])**2 + … + (x[img_height-1]-x[img_height])**2

可以看出,公式就是图片中,所有点与其相邻点的距离和(不包括最后一条边)。使相邻点的之间的差异损失越小,就达到了使图片像素点越连续的目的。

 4. 总的损失值,是以上三种损失的加权合计结果。本例设置的缺省权重系数为

total_variation_weight = 1e-4
content_weight = 0.025
style_weight = 1.

loss += content_weight * content_loss(target_image_features, combination_features)

for layer_name in style_layers:
    ... ...
    sl = style_loss(style_reference_features, combination_features, img_height, img_width)
    loss += (style_weight / len(style_layers)) * sl

loss += total_variation_weight * total_variation_loss(combination_image, img_height, img_width)

其中,style_weigth表示的是总的风格权重,它将会被平均分配到各个风格层参与计算。

调整权重,可以获得不同的生成结果。比如,加大content_weight, 将会使生成图看起来更像目标图。

 

4. 如何进行学习训练

1. 获得目标图片,风格图片的常量信息(因此整个处理过程,赋值后不会再改变)

target_image = K.constant(preprocess_image(target_image_path, img_height, img_width))

style_reference_image = K.constant(preprocess_image(style_reference_image_path, img_height, img_width))

2. 设置生成图片的占位符。(整个处理过程,都在不断地调整特征值),初始值为生成图片的数据

combination_image = K.placeholder((1, img_height, img_width, 3))


3. 装载预训练的VGG19模型及在imagenet数据集上获得的权重系数

model = vgg19.VGG19(input_tensor=input_tensor,
                    weights='imagenet',
                    include_top=False)

4. 利用预训练模型,提取目标图片,风格图片,生成图片的各层激活值,并根据损失函数的定义,计算损失值和梯度


5. 利用优化函数fmin_l_bfgs_b()进行优化,获得优化结果,优化结果中包括生成图的特征数据。对生成图特征数据进行图片还原处理,即可获得可显示的图片效果。每一轮优化计算都会有一个结果,本文提供的工具将实时显示每轮优化的图片效果。
最核心的大功臣是L-BFGS-B优化算法,感谢科学家设计了各种优化算法,感谢Scipy的大师们实现了这些算法。

 

二. 生成式深度学习跟常规深度学习的比较

1.    应用场景
a)     常规:根据单一样本的特征值,预测其自身的标签值,获得回归,分类信息。实现对现有模式和规则的提取和使用,完成对已生成的样本数据的分析。
b)    此例:综合分析多个相关样本的特征值,生成新的样本特征值。在现有模式和规则的基础上,进行融合,获得新的模式和规则,生成创新的样本数据。


2.    样本特征值的获取
a)    常规:对获得的文本,图片,音频,视频,测量,传感等原始数据,进行清理,数值化,浮点化,归一化等处理,只需要获得数据的基本特征值,然后转成可输入计算模型的向量数据,输入模型进行计算。
b)    此例:提取原始向量数据在预训练模型中的不同层激活输出,并对这些层激活进行建模处理,获得样本的内容特征,纹理风格特征,然后以这些提取的高级特征值为基础,完成接下来的模型优化算法运算。


3.    损失函数的设计
a)    常规:统计样本的计算标签值与实际标签值的差异,若标签值为回归值,可用mse, mae;若标签为单标签二分类 或 多标签多分类,可用 binary_crossentropy;  若标签值为单标签多分类,可用categorical_crossentropy
b)    此例:损失函数 = 生成图片跟目标图片的内容损失 * 权重 + 生成图片跟风格图片的风格损失 * 权重  +  生成图片本身的像素化损失 * 权重。 完全是特定场景下的独有损失函数。


4.    优化算法的设计
a)    常规:基于梯度下降的算法及改良算法:SGD, RMSProp, Adagrad, Adam , 
b)    此例:L-BFGS-B算法,适应于有约束的多元函数优化算法。注:scipy中的optimize子包中提供了常用的最优化算法函数实现


5.    模型及学习成果的设计
a)    常规:利用CNN提取样本空间信息,利用RNN提取样本时序信息,利用RPN推荐样本区域位置信息,再利用DNN进行特征值与标签值的线性回归映射等,学习获得使损失函数值最小的模型权重系数值
b)    此例:利用现有的预训练模型提取特征值,并进行建模处理,学习获得使损失函数值最小的样本数据特征值


6.    批量喂入模型的目的(小技巧)
a)    常规:一个批次中的样本是独立的,序号随机,相互没有关系,在训练时,大家共同为减少损失函数值做贡献;在预测时,各顾各计算自己的标签值
b)    此例:借用批次概念,将3个相关样本数据,按规定的次序,放在一个批次中同时计算(而不是分3次分别计算),然后再根据规定的序号取出相应的输出值,用于后续的处理。


7.    计算能力的影响(小感触)
a)    常规:现代神经网络技术的应用和发展,得益于算法改进,计算机算能提高,大数据获得。因此,人工智能企业的价值评估是:研发团队的人才论文情况,看算法能力;GPU服务器的超算集群情况,看计算能力;标注数据的投入情况,看数据能力。
b)    此例:我用64G内存的服务器,一个计算轮次为3~4秒;用8G内存的笔记本,一个计算轮次是800多秒。没有好的计算机,看来不行。

小结:
        深度学习框架提供了大量常规算法模块,使我们可以像搭积木一样,快速搭建神经网络来满足一些常用场景的应用。而更多的实际场景,将需要根据具体的原始业务数据,提取特定的高级样本特征,设计各种特定的损失函数,优化算法,以获得业务所需要的标签数据或特征数据,满足特定场景的业务需要和性能需要。

其中的每个步骤,都是算法在起主导作用。利用常用算法搭积木,设计解决方案,是我们学习的基础。同时,更多的应用场景,要求我们根据具体数据和需求,选用,设计和创建特定算法,以满足产业级应用的需要。

 

 

 

【深度学习 | 风格迁移】从零实现Keras风格迁移:原理剖析与实战代码解析 本文深入解析了基于深度学习的神经风格迁移技术原理,并提供了使用Keras从零实现的完整实战代码。通过剖析VGG19网络提取内容与风格特征、构建格拉姆矩阵计算风格损失等核心步骤,手把手指导读者完成图像风格迁移模型的搭建与调优,帮助开发者掌握这一创造性AI应用。 阅读详情

相关推荐

Pytorch入门+实战系列七:图片风格迁移和GAN

Pytorch官方文档:https://pytorch.org/docs/stable/torch.html? 1. 写在前面 今天开始,兼顾Pytorch学习, 如果刚刚接触深度学习并且想快速搭建神经网络完成任务享受快感,当然是Keras框架首选,但是如果想在深度学习或人工智能这条路上走的更远,只有Keras就显得有点独木难支,这时候我们需要一个更加强大的框架,这里我想学习Pytorch,它代码通俗易懂,接近Python原生,学起来也容易一些,所以接下来会整理自己在快速入门Pytorch道路上的所见所得,

Miracle8070 6956

基于 Keras 实现图像风格转移

 Style Transfer 这个方向火起来是从2015年Gatys发表的Paper A Neural Algorithm of Artistic Style(神经风格迁移) , 这里就简单提一下论文的主要思想。 论文概述   Gatys这篇论文的核心思想就是 —— 图片的内容和风格是可以分离的,可以通过神经网络的方式,将图片的风格进行自由交换。  如果内容和风格是可以分离的,那么风格的迁移即可...

laugh12321的博客 960

图像空间变换:实现MATLAB GUI中的图像处理

上述代码创建了一个GUI窗口,包括一个用于显示图像的面板(imagePanel),以及加载图像和进行变换的按钮(loadButton和transformButton)。变换图像按钮的回调函数(transformImage)将用于实现图像的空间变换。在图像处理中,图像空间变换是一种常见的技术,用于改变图像的外观和特征。点击"加载图像"按钮可以选择一张图像并显示在窗口中,然后点击"图像变换"按钮可以应用所选择的图像的空间变换。你可以根据需要选择不同的变换方法,并观察变换后的图像在GUI窗口中的显示效果。

DevProZ的博客 193

图片风格迁移小应用

先上效果图 原图 效果图 实现思路 其实很简单了,我只是做了个界面而已。这个风格迁移的方法是2016年的老论文,《a neural algorithm of artistic style》貌似叫这个名字。由于时间老旧,所以github上一堆其实现我自己实现了一下,但是效率极其的低。遂找了个其他人的实现,加上自己做的gui,这个小应用就算完成了。 使用的github:这个是链接里面的faste...

Yonggie的博客 1862

基于pytorch实现的、带GUI的图像风格迁移程序.

Numpy wxPython pytorch torchvision PIL Usage: $ python StyleTransferGui.py button: content img:选择内容图片 style img:选择风格图片 Start:启动风格转换程序 Model Choice:选择模型 Preferences->hyper parameter:设置训练超参数

《大明王朝1566》中,朝廷财政危机无法解决的根源分析

财政困局中的财富最终流向三重黑洞:​皇室挥霍​(如嘉靖炼丹修殿)、特权阶层贪腐​(严党年入百万两盐税)、制度性损耗​(宗室供养、低效官僚)。更深层的“钱”其实是被禁锢在道德化治理的牢笼中——当国家用“黄河长江皆可为用”的权术思维替代制度性改革时,财政危机便成为帝制王朝无法逃脱的宿命。

为了小家奋斗 1968

keras使用VGG19网络模型实现风格迁移

风格迁移算法经历多次定义和更新,现在应用在许多智能手机APP上。 风格迁移在保留目标图片内容的基础上,将图片风格引用在目标图片上。风格本质上是指在各种空间尺度上图像中的纹理,颜色和视觉图案;内容是图像的高级宏观结构。实现风格迁移背后的关键概念与所有深度学习算法的核心相同:定义了一个损失函数来指定想要实现的目标,并最大限度地减少这种损失。 知道自己想要实现的目标:在采用参考图像的样式的同时保留原始图像的内容。如果我们能够在数学上定义内容和样式,那么最小化的适当损失函数将是以下内容: loss = distan

爱CV 2741

CTF逆向实战:如何快速识别RC4、TEA和Base64的魔改变种?

本文针对CTF逆向比赛中常见的加密算法魔改问题,详细讲解了如何快速识别和破解RC4、TEA和Base64的变种。通过分析算法核心特征、常见魔改手法,并结合动态调试与脚本编写等实战技巧,帮助逆向分析人员有效应对算法混淆,提升解题效率。

agile9scrum的博客 784

Keras实现风格迁移

风格迁移 风格迁移算法经历多次定义和更新,现在应用在许多智能手机APP上。 风格迁移在保留目标图片内容的基础上,将图片风格引用在目标图片上。 风格本质上是指在各种空间尺度上图像中的纹理,颜色和视觉图案;内容是图像的高级宏观结构。 实现风格迁移背后的关键概念与所有深度学习算法的核心相同:定义了一个损失函数来指定想要实现的目标,并最大限度地减少这种损失。 知道自己想要实现的目标:在采用参...

Viking的博客 2250

腾讯云TDSQL MySQL版 - 开发指南兼容性

语言结构 分布式实例支持所有 MySQL 使用的文字格式,包括: String Literals Numeric Literals Date and Time Literals Hexadecimal Literals Bit-Value Literals Boolean Literals NULL Values String Literals String Literals 是一个 bytes 或者 characters 的序列,两端被单引号'或者双引号"包围,TDSQL MySQL版

weixin_43872058的博客 909

修改串口服务器,串口虚拟化 | 串口服务器Nport 5630 设置

原标题:串口虚拟化 | 串口服务器Nport 5630 设置JZGKCHINA项目改造,客户需要对IFix4.5进行升级,并优化通讯,在不改变原来配置的基础上逐步进行替换。需要将IFix升级到IFix5.9,数据库升级为SQL Server 2016,客户现场使用的智能仪表都是支持Modbus RTU协议的,因原来的手拉手的通讯方式的,当一台仪表掉线后,会影响到其他仪表的通讯,所以此次在不改变原有...

weixin_31688465的博客 2408

【深度学习 | 风格迁移】神经网络风格迁移,原理详解&附详细案例&源码

基于深度学习的风格迁移实现得到的结果是无与伦比的,并且还在计算机视觉的创造性应用中引发了惊人的复兴。 风格迁移其主要应用场景如在**艺术创作**场景,将不同艺术风格应用于图像,可以创造出独特的艺术效果,使作品具有新的视觉呈现。或者在社交平台上风格化滤镜,图像增强等。

计算机魔术师的blog 1万+

Aloudata Agent :基于 NoETL 明细语义层的分析决策智能体

这是包括我们在内的一些厂商探索的一个新方向,这种方式先由大模型将自然语言转化为对指标语义层的查询请求(MQL,Metrics Query Language),再由指标平台将指标和维度的查询与计算逻辑转化为准确的 SQL 查询语句。用户查询经大模型语义解析后,将其转换为指标、维度及筛选条件的组合表达,并生成面向指标平台的 MQL,Aloudata CAN 指标平台的语义引擎将 MQL 转换为准确和可执行的查询 SQL,语义引擎内置函数体系与 SQL 解析器,确保语义转换的 100% 准确性。

Aloudata的博客 1663

【实战】图像风格迁移:Keras和TensorFlow在风格迁移中的应用

在深度学习领域,Keras和TensorFlow是两个非常流行的库,它们都提供了强大的工具来构建和训练神经网络。风格迁移是一种计算机视觉技术,它允许我们结合两幅图像——一幅作为内容的主体,另一幅作为风格的来源——生成一种新的图像,它在视觉上类似于内容图像,但风格上则模仿了风格图像。在本文中,我们将探索如何使用Keras和TensorFlow实现风格迁移。风格迁移的概念最早由Gatys et al. (2015)提出。该技术通过优化一个目标函数来实现,该函数由三部分组成:内容损失(content loss)、

qq_36463299的博客 1446

【突变检验合集】含Pettitt突变检验等

突变检验方法合集

WW、forever的博客 3534

181、LLC谐振变换器的PCB设计实战(文件归档)

PCB设计实战经验总结:LLC谐振变换器的关键要点 本文通过实际案例总结了LLC谐振变换器PCB设计中的核心经验和常见误区。重点包括: 文件命名规范(项目代号_板卡类型_版本号_日期格式) 四层板标准层叠结构设计要点 谐振回路走线原则(宽度、长度控制) 地线处理技巧(功率地/控制地隔离) 散热设计注意事项(MOSFET过孔阵列、变压器布局) 完整的文件归档清单(Gerber、钻孔、装配图等) 作者特别强调,良好的设计归档习惯能显著降低生产问题概率,建议采用双重备份机制。文中多个真实案例(如谐振频率偏移、EM

Jack010169的博客 43

图像风格迁移_图像风格迁移详解

前言Leon A.Gatys是最早使用CNN做图像风格迁移的先驱之一,这篇文章还有另外一个版本[2],应该是它投到CVPR之前的预印版,两篇文章内容基本相同。我们知道在训练CNN分类器时,接近输入层的Feature Map包含更多的图像的纹理等细节信息,而接近输出层的Feature Map则包含更多的内容信息。这个特征的原理可以通过我们在残差网络中介绍的数据处理不等式(DPI)解释:越接近输入层的...

weixin_39844880的博客 4212

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python深度学习——用keras实现神经风格迁移

用keras实现神经风格迁移 from keras.preprocessing.image import load_img, img_to_array import numpy as np from keras.applications import vgg19 from keras import backend as K from scipy.optimize import fmin_l_bfgs_b # from scipy.misc import imsave import imageio impor

u010094573的博客 937

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

keras神经风格迁移_Keras快速风格迁移的实践

实践过程下载并解压该GitHub项目。在images文件夹中新建output文件夹和train文件夹。在train文件夹文件夹中放入你的数据集。在images文件夹中style文件夹放入你的风格图片。导入包:这是我反复测试得到的,pip install scipy==1.2.1和pip install keras==2.1.2,使用这些版本会减少很多报错。训练模型:python train.py ...

weixin_31052141的博客 371

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

神经风格迁移

CNNs 非常有趣的应用是艺术。神经风格迁移 (NST) 指的是一种数字图像处理的技术,以采用另一个图像的外观或风格。有趣的应用是取一张图像让网络学习操作它以采用名画家的风格,像 Van Gogh。 NST使用深度学习,首次出现于2015年 Gatys等的论文里。它是新的技术。Gatys开发的方法使用预训练CNNs模型以从风格中分离出图像的内容。

lishaoan77的专栏 974

实时风格迁移——与Keras一起的创新之旅

实时风格迁移——与Keras一起的创新之旅 在这个数字艺术和图像处理领域日新月异的时代,我们有幸能接触到一个令人振奋的开源项目——实时风格迁移(Real-Time Style Transfer),它利用了强大的深度学习库Keras进行实现。该项目让艺术家和技术爱好者能够在眨眼之间将图像甚至动图转化为各种风格的艺术作品。 项目介绍 这个项目由awentzonline开发,其灵感来源于《Real-Ti...

gitblog_00023的博客 384

[神经风格迁移]用卷积神经网络将艺术照进现实(Keras版本,每行代码都解析的那种噢)

通过卷积神经网络实现神经风格转移。每一句代码基本都有详细解析哈,实现起来简单到复制粘贴。在获得风格照片的同时也能了解到卷积神经网络的魅力。只需有最最基础的Keras功底即可

weixin_58420301的博客 6288

深度有趣 | 04 图像风格迁移

简介 图像风格迁移是指,将一幅内容图的内容,和一幅或多幅风格图的风格融合在一起,从而生成一些有意思的图片 以下是将一些艺术作品的风格,迁移到一张内容图之后的效果 我们使用TensorFlow和Keras分别来实现图像风格迁移,主要用到深度学习中的卷积神经网络,即CNN 准备 安装包 pip install numpy scipy tensorflow keras 再准备一些风格图片,和一张内容...

宏伦工作室 2167

keras神经风格迁移_深度神经风格迁移

介绍(由于近期准备校招,博客暂时不更新)神经风格迁移是我研一研二时期主要的研究方向,而从最初的风格迁移出现已经有较长一段时间了。之所以现在写这个博客,第一是因为我的毕业论文定的方向是风格迁移+情感分析;第二是借这篇博客以及之后的学习,能对深度学习更进一步的理解! 目录什么是风格迁移?最经典的Gatys(paper,code)中给出了风格迁移的流程图,视为最原始的方法。借此图说明风格迁移的基本原理。...

weixin_32021519的博客 462
上一篇: 用tkinter.pack设计复杂界面布局
下一篇: 用简单实例解释说明 yield 的执行方式
快乐清风客
博客等级 码龄19年 191粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值