当前位置: 首页 > article >正文

【论文复现】图像风格迁移技术

在这里插入图片描述

📝个人主页🌹:Eternity._
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述
在这里插入图片描述

❀图像风格迁移技术

  • 概述
    • 内容 & 风格表示
  • 演示效果
  • 核心逻辑
  • 使用方式
  • 部署方式

概述


图像风格迁移是指将一张图像的内容与另一张图像的风格相融合,生成具有新风格的图像。

在这里插入图片描述

风格(style)是指图像中不同空间尺度的纹理、颜色和视觉图案,内容(content)是指图像的高级宏观结构

风格转换这一理念与纹理合成的思路紧密相连,早在2015年神经风格转换技术问世之前,该理念就在图像处理界拥有悠久的过往。然而,实践证明,相较于以往传统的计算机视觉技术手段,基于深度学习的风格转换所达成的效果堪称卓越,且在计算机视觉的创新应用领域内掀起了一场令人瞩目的复兴浪潮。

风格转换的主要应用舞台,诸如在艺术创作领域,能将各式各样的艺术风格巧妙融入图像之中,孕育出别具一格的艺术风貌,为作品赋予全新的视觉维度。又或是在社交平台中作为风格化的滤镜应用,以及图像美化等方面,发挥着重要作用。

内容 & 风格表示


我们需要让输出的目标图像既符合原始图像和目标风格,就需要内容和风格进行表示。

在深度学习实现上,我们需要确定我们的的目标是什么,就是保存原始图像的内容,同时采用参考图像的风格。那么就有一个适当的损失函数将对其进行最小化,如下:
在这里插入图片描述
这里的 distance 是一个范数函数(用来衡量向量或矩阵的大小或长度),比如 L2 范数;content 是一个函数,输入一张图像,并计算出其内容的表示;style 是一个函数,输入一张图像,并计算出其风格的表示。将这个损失最小化,会使得 style(generated_image) 接近于 style(reference_image)、content(generated_image) 接近于 content(generated_image),从而实现我们定义的风格迁移。

内容

在CNN卷积网络进行对象识别任务中,随着层次的加深对象的信息输出更加的明确,较前的层数特征图输出到一些更加通用的结构,比如猫狗分类中的基础边缘线条,而更深的层可以捕捉到更加全局和抽象的结构,如猫耳,猫眼睛。根据这个模式,我们可以通过不同深度的层特征图重建输入图像以可视化层所包含输入图像的信息,如下图可以看到深层的特征图包含了图像中对象的全局排列信息(高级、抽象),但是像素值信息会丢失。浅层的层特征图重建图像几乎是完整的精确像素值。
在这里插入图片描述
这样一来在内容上的损失函数便是在一个预训练模型(需要在大型数据集下训练好的能有效提取特征的模型)同一深的层激活的范式数,这样至少在深的层看来,二者图像的内容是一致的。

风格

同样地,不同深度的层次特征图蕴含了输入图像在不同空间尺度上的信息。基于此,Gatys等人利用格拉姆矩阵(一个描述特征图间相关性的工具)在每一层特征图中,即特征值的内积,来捕捉不同空间尺度下不同滤波器特征图之间的相互关系(或称为纹理),从而获取输入图像的多尺度纹理信息(这一过程并不涉及全局排列信息的捕获)。如上图所示,层激活所蕴含的风格信息(包括颜色和局部排列特征),abcde图展示了来自不同CNN层次子集的风格重建图像效果,从“conv1_1”(a)到逐渐加入“conv2_1”、“conv3_1”、“conv4_1”直至“conv5_1”(e),这一过程输出的图像与参考图像的风格愈发匹配,同时逐渐忽略了其全局排列信息。

通过确保输出图像与风格图像在不同层次的激活特征上具有相似的相互关系,即各尺度上的纹理特征高度一致,即可实现风格的迁移。

此外,在风格的保持与内容的呈现上,我们还需要设定贡献强度,这可以通过调整损失函数中各部分的权重来实现。

通过精心构建并优化这两种损失函数,我们可以确保模型输出的图像在深层次上“感知”到的图像内容保持一致,同时不同层次的特征图内部特征相互关系也保持相似,从而实现将特定风格迁移到内容图像上的目标。

演示效果


原始论文:
在这里插入图片描述
下面是我的头像案例

在这里插入图片描述
在这里插入图片描述

本文所涉及的所有资源的获取方式:这里

核心逻辑


在这里插入图片描述

神经风格迁移流程一般为 计算层激活 -> 计算损失函数 -> 梯度下降最优化损失函数

  1. 网络层激活:输出目标图像,原始图像,参考图像的层激活输出
  2. 计算损失函数: 通过所求的层激活计算对应的内容和风格损失函数
  3. 梯度下降优化:通过梯度下降的方式减小损失函数,训练模型参数使得模型能学习到参考图像风格的纹理和保持内容的不变

具体在实现上来说流程如下

  1. 使图像尺寸大小相似(如果差异很大,由于模型中尺度变换会使得风格迁移很麻烦)

  2. 读取图像, 加载预训练模型,得到层激活

  3. 根据层激活构建需要最小化的最终损失(需要注意的是在重建图像需要添加总变差损失平滑图像)

  • 在图像重建或图像去噪任务中,通常将总变差损失与其他损失函数(如均方误差损失)相结合,通过权衡平滑性和重建准确性。
  1. 设置梯度下降优化算法(论文所实现的方案为L-BFGS 算法,)

  2. 训练模型

以下为核心代码

from keras import backend as K

# 获取原始图像和参考风格图像 不变设置为常量
target_image = K.constant(preprocess_image(target_image_path))
style_reference_image = K.constant(preprocess_image(style_reference_image_path))

# 目标生成图像占位符(可变)默认为float32 
combination_image = K.placeholder((1, img_height, img_width, 3))

# 合并为一个批量(这里是为了符合VGG19的批次(3,width,height,3)
input_tensor = K.concatenate([target_image,
                              style_reference_image,
                              combination_image], axis=0)

# 官方文档 https://keras.io/api/applications/vgg/#vgg19-function 
model = vgg19.VGG19(input_tensor=input_tensor,
                    weights='imagenet',
                    include_top=False)
print('Model loaded.')
print(model.summary())

outputs_dict = dict([(layer.name, layer.output) for layer in model.layers])

# 内容格式的层激活
content_layer = 'block5_conv4'
# 风格的CNN层激活
style_layers = ['block1_conv1',
                'block2_conv1',
                'block3_conv1',
                'block4_conv1',
                'block5_conv1']
outputs_dict
from scipy.optimize import fmin_l_bfgs_b
# from scipy.misc import imsavefrom  import 
import time

result_prefix = 'style_transfer_result'
iterations = 10 # 更深的轮次 效果越深(风格迁移越强)

# Run scipy-based optimization (L-BFGS) over the pixels of the generated image
# so as to minimize the neural style loss.
# This is our initial state: the target image.
# Note that `scipy.optimize.fmin_l_bfgs_b` can only process flat vectors.
x = preprocess_image(target_image_path)
x = x.flatten()
for i in range(iterations):
    print('Start of iteration', i)
    start_time = time.time()
    x, min_val, info = fmin_l_bfgs_b(evaluator.loss, x,
                                     fprime=evaluator.grads, maxfun=20)
    print('Current loss value:', min_val)
    # Save current generated image
    img = x.copy().reshape((img_height, img_width, 3))
    img = deprocess_image(img)
    fname = result_prefix + '_at_iteration_%d.png' % i
    keras.preprocessing.image.save_img(fname, img)
    end_time = time.time()
    print('Image saved as', fname)
    print('Iteration %d completed in %ds' % (i, end_time - start_time))

使用方式


在线Jupyter notebook代码运行

  1. 修改上传图片路径(内容图像和参考风格图像路径)
  2. 修改损失权重大小比例可实现对应的迁移强度(可选)
  3. 保存迁移后的图片(可选)

需要注意的是这个算法速度较慢,RTX1650几百K数据也要半小时左右,建议电脑空闲时间运行,后续小伙伴们感兴趣推出更高效的算法,
Tips: 我们可以通过花费大量的时间参考某一个固定风格图像批量生成许多输入 - 输出样例图像,并训练一个小型前馈卷积神经网络学习这种变换,就可以非常快速进行这种变换(秒级)

部署方式


版本:Python 3 , Tensorflow 2

参考文献:
Gatys, L. A., Ecker, A. S., & Bethge, M. (2016). A neural algorithm of artistic style. arXiv preprint arXiv:1508.06576.


编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!

更多内容详见:这里


http://www.kler.cn/a/396549.html

相关文章:

  • linux逻辑卷练习
  • 系统架构师考试18天极限备考复盘(2024年11月)
  • 金融领域先锋!海云安成功入选2024年人工智能先锋案例集
  • 【C++】—— map 与 set 深入浅出:设计原理与应用对比
  • 从0学习React(11)
  • Flutter 小技巧之 OverlayPortal 实现自限性和可共享的页面图层
  • 新手教学系列——善用 VSCode 工作区,让开发更高效
  • 自定义实体类中DateTime属性的序列化格式
  • CSP-X2024山东小学组T2:消灭怪兽
  • IO流实用案例:用字节流--输入流(Inpustream)、输出流(OutputStream)写一个拷贝图片的案例--超简单!
  • Oracle故障处理:ora-12514 与 ora-28547
  • npm install命令报错:npm ERR Could not resolve dependency npm ERR peer…
  • Springboot RabbitMq 集成分布式事务问题
  • SQL,力扣题目1194,锦标赛优胜者
  • Java学习Day60:回家!(ElasticStatic)
  • 《Probing the 3D Awareness of Visual Foundation Models》论文解析——多视图一致性
  • 【WPF】Prism库学习(一)
  • Go语言的零值可用性:优势与限制
  • 微服务即时通讯系统的实现(客户端)----(1)
  • lab2:docker基础实战
  • 软件设计师-计算机体系结构分类
  • 前端开发---css实现移动和放大效果
  • 设计模式-Facade(门面模式)GO语言版本
  • React的基础API介绍(二)
  • PHP:通往动态Web开发世界的桥梁
  • Flutter:Dio下载文件到本地