图像风格迁移

news2024/11/26 15:47:43

一、简介

图像风格迁移是指,将一副内容图的内容,和一幅或多幅风格图的风格融合在一起,从而生成一些有意思的图片。

我们使用 TensorFlowKeras 分别来实现图像风格迁移,主要用到深度学习中的卷积神经网络,即CNN

二、准备

安装包。

pip install numpy scipy tensorflow keras

再准备一些风格图片,和一张内容图片。

三、原理

为了将风格图的风格和内容图的内容进行融合,所生成的图片,在内容上应当尽可能接近内容图,在风格上应当尽可能接近风格图。因此需要定义 内容损失函数风格损失函数,经过加权后作为总体损失函数


实现步骤如下:
- 随机产生一张图片
- 在每轮迭代中,根据总体损失函数,调整图片的像素值
- 经过多轮迭代,得到优化后的图片

四、内容损失函数

  1. 两张图片在内容上相似,不能仅仅靠简单的纯像素比较。
  2. CNN 具有抽象理解图像的能力,因此可以考虑将各个卷积层的输出作为图像的内容。
  3. 以 VGG19 为例,其中包括了多个卷积层、池化层,以及最后的全连接层。

CNN是一类深度学习模型的统称,而VGG是其中一种经典的卷积神经网络模型,它在图像分类任务中表现出色,成为了深度学习模型的重要代表之一。

这里我们使用 conv4_2 的输出作为图像的内容表示,定义内容损失函数如下:

这是内容损失函数的公式表示,其中 公式表示如下:

L c o n t e n t ( p ⃗ , x ⃗ , l ) = 1 2 ∑ i , j ( F i j l − P i j l ) 2 \mathcal{L}_{content}(\vec{p}, \vec{x}, l) = \frac{1}{2} \sum_{i,j} (F_{ij}^l - P_{ij}^l)^2 Lcontent(p ,x ,l)=21i,j(FijlPijl)2

  • p ⃗ \vec{p} p 表示参考图片(即内容原图)
  • x ⃗ \vec{x} x 表示待转换成的图片(即生成的图片)
  • l l l 表示卷积神经网络的层数
  • F i j l F_{ij}^l Fijl 表示在第 l l l 层卷积神经网络中
  • x ⃗ \vec{x} x 在位置 ( i , j ) (i,j) (i,j) 的特征图
  • P i j l P_{ij}^l Pijl 表示在第 l l l 层卷积神经网络中
  • p ⃗ \vec{p} p 在位置 ( i , j ) (i,j) (i,j) 的特征图。
  • 公式表示的意义是,计算 x ⃗ \vec{x} x p ⃗ \vec{p} p 在第 l l l 层卷积神经网络中的特征图的差异,以此来衡量两张图片在该层的内容相似程度。因为这里使用了平方差,所以公式中还需要除以 2。

请添加图片描述

  • VGG是用于大规模分类任务的模型,这个模型已经是训练好的,所以里面的参数也是调好的了
  • 图片是RGB三个维度,模型的输入是四维的tensor
    1. 第一维:图片个数
    2. 第二维:图片的高度
    3. 第三维:图片的宽度
    4. 图片的深度(即通道的个数,即特征图的个数)
  • 一开始输入进来的维度,总体上看是比较“薄的”,形状像一本书一样,在这个过程中不断进行图像的抽象,通过不断卷积,宽度和高度不断变小,变得越来越厚(即深度变大,即通道数变多)。
  • 一开始可能看到的是边缘、局部的区域,后面可以慢慢看到一些特征元素,比如:部分五官,甚至整个人脸

五、风格损失函数

风格是一个很难说清楚的概念,可能是笔触、纹理、结构、布局、用色等等。

这里我们使用卷积层各个特征图之间的互相关作为图像的风格,以conv1_1为例:

  • 共包含64个特征图即 feature map,或者说图像的深度、通道的个数;
  • 每个特征图都是对上一层输出的一种理解,可以类比成64个人对同一幅画的不同理解
  • 这些人可能分别偏好印象派、现代注意、超现实主义等不同风格
  • 当图像是某一种风格时,可能这一部分人很欣赏,但那一部分人不喜欢
  • 当图像是另一种风格时,可能这一部分人不喜欢,但那一部分人很欣赏
  • 64个人之间理解的差异,可以用特征图的互相关表示,这里使用 Gram矩阵计算互相关

风格损失函数用于衡量两张图片之间的风格相似程度,可以用于图像风格转换等任务中。下面是风格损失函数的公式表示:

L s t y l e ( p ⃗ , x ⃗ ) = ∑ l = 1 L w l ⋅ 1 4 N l 2 M l 2 ∑ i = 1 N l ∑ j = 1 N l ( G i j l − A i j l ) 2 \mathcal{L}_{style}(\vec{p}, \vec{x}) = \sum_{l=1}^{L} w_l \cdot \frac{1}{4N_l^2M_l^2} \sum_{i=1}^{N_l} \sum_{j=1}^{N_l} (G_{ij}^l - A_{ij}^l)^2 Lstyle(p ,x )=l=1Lwl4Nl2Ml21i=1Nlj=1Nl(GijlAijl)2

  • p ⃗ \vec{p} p 表示参考图片(即内容原图)
  • x ⃗ \vec{x} x 表示待转换图片(即生成的图片)
  • L L L 表示卷积神经网络的层数
  • N l N_l Nl 表示第 l l l 层的特征图的通道数
  • M l M_l Ml 表示第 l l l 层的特征图的高度和宽度的乘积
  • G i j l G_{ij}^l Gijl 表示参考图片在第 l l l 层的特征图中
  • 位置 ( i , j ) (i,j) (i,j) 的Gram 矩阵
  • A i j l A_{ij}^l Aijl 表示待转换图片在第 l l l 层的特征图中
  • 位置 ( i , j ) (i,j) (i,j) 的格拉姆矩阵
  • w l w_l wl 表示第 l l l 层所占的权重

Gram 矩阵的计算方法如下:

G i j l = ∑ k = 1 M l F i k l ⋅ F j k l G_{ij}^l = \sum_{k=1}^{M_l} F_{ik}^l \cdot F_{jk}^l Gijl=k=1MlFiklFjkl

  • F i k l F_{ik}^l Fikl 表示参考图片在第 l l l 层的特征图中,
  • 位置 ( i , k ) (i,k) (i,k) 的像素值
  • 格拉姆矩阵表示的是特征图中各个通道之间的相关性。如果有64个特征图,那么 Gram矩阵的大小便是64 x 64,第i行第j列的值表示第i个特征图和第j个特征图之间的互相关,用内积计算。

风格损失函数的含义是,计算参考图片和待转换图片在卷积神经网络的不同层中的 Gram 矩阵之间的差异,以此来衡量两张图片之间的风格相似程度。因为使用了平均平方差,所以公式中没有除以 2。

六、总体损失函数

总体损失函数即内容损失函数和风格损失函数的加权,不同的权重会导致不同的迁移风格效果。

这是图像风格转换任务中的总损失函数,其中 p ⃗ \vec{p} p 表示参考图片, a ⃗ \vec{a} a 表示参考图片的风格, x ⃗ \vec{x} x 表示待转换图片, α \alpha α β \beta β 是两个超参数,公式表示如下:

L t o t a l ( p ⃗ , a ⃗ , x ⃗ ) = α ⋅ L c o n t e n t ( p ⃗ , x ⃗ ) + β ⋅ L s t y l e ( a ⃗ , x ⃗ ) \mathcal{L}_{total}(\vec{p}, \vec{a}, \vec{x}) = \alpha \cdot \mathcal{L}_{content}(\vec{p}, \vec{x}) + \beta \cdot \mathcal{L}_{style}(\vec{a}, \vec{x}) Ltotal(p ,a ,x )=αLcontent(p ,x )+βLstyle(a ,x )

  • 其实就是将内容损失函数和风格损失函数按一定的权重相加
  • 如果 α \alpha α 权重更大,说明对原始内容更看重一些
  • 如果 β \beta β 权重更大,说明对 β \beta β 的style更看重一些

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transformer应用之构建聊天机器人(二)

四、模型训练解析 在PyTorch提供的“Chatbot Tutorial”中,关于训练提到了2个小技巧: 使用”teacher forcing”模式,通过设置参数“teacher_forcing_ratio”来决定是否需要使用当前标签词汇来作为decoder的下一个输入,而不是把d…

Linux:查看进程。

Linux:查看进程。 windows linux TTY如果是?说明是不是终端(控制台)启动的,而是系统内部自己启动的。 TIME是启动Linux后,这个进程一共占用了cpu多少时间00…

《Spring Guides系列学习》guide46 - guide50

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gui…

《Python安全攻防:渗透测试实战指南》极致经典,学完即可包吃包住

前言 网络江湖,风起云涌,攻防博弈,从未间断,且愈演愈烈。从架构安全到被动纵深防御,再到主动防御、安全智能,直至进攻反制,皆直指安全的本质——攻防。未知攻,焉知防! 每一位网络安…

【Python】循环语句 ② ( while 嵌套循环 | 代码示例 - while 嵌套循环 )

文章目录 一、while 嵌套循环1、while 嵌套循环语法2、代码示例 - while 嵌套循环 一、while 嵌套循环 1、while 嵌套循环语法 while 嵌套循环 就是 在 外层循环 中 , 嵌套 内层循环 ; while 嵌套循环 语法格式 : while 外层循环条件:外层循环操作1外层循环操作2while 内存循…

VuePress + GitHub Actions 自动部署

文章目录 前言背景GitHub Actions简介基本概念引用 Actionworkflow 文件 自动部署创建 Action权限问题 小结参考文献 前言 我的第二本开源书籍《后台开发命令 365》上线啦。 为了方便阅读,使用 VuePress 将之前记录的后台常用 Linux 命令博文整理成一个系统的开源…

路径规划算法:基于阴阳对优化的路径规划算法- 附代码

路径规划算法:基于阴阳对优化的路径规划算法- 附代码 文章目录 路径规划算法:基于阴阳对优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法…

Compose 没有 inputType 怎么过滤(限制)输入内容?这题我会!

前言 闲话 在我之前的文章 《Compose For Desktop 实践:使用 Compose-jb 做一个时间水印助手》 中,我埋了一个坑,关于在 Compose 中如何过滤 TextField 的输入内容。时隔好几个月了,今天这篇文章就是来填这个坑的。 为什么需要…

Doris

Aggregate 模型 是相同key的数据进行自动聚合的表模型。表中的列按照是否设置了 AggregationType,分为 Key(维度列)和 Value(指标列),没有设置 AggregationType 的称为 Key,设置了 Aggregation…

散列表(哈希表)

目录 散列表 散列函数 散列表常用函数 1. 直接定址法 2. 除留余数法 2.1. exmple 3. 数字分析法 4. 平方取中法 5. 折叠法 处理冲突的方法 1. 开放定址法---线性探测 2. 二次探测法 3. 再Hash法 4. 拉链法(链地址法) 散列表(Hash table,也…

Redis缓存击穿及解决问题

缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个 Key有大量的并发请求过来,这些请求发现缓存过期- -般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把DB压垮。 解决方案有两种…

第五十四天学习记录:C语言进阶:动态内存管理Ⅱ

常见的动态内存错误 1、对NULL指针的解引用操作 int* p(int*)malloc(4); //p进行相关的判断 *p10;//malloc开辟空间失败,有可能对NULL指针解引用 free(p); pNULL;2、对动态开辟的内存的越界访问 int* p(int*)malloc(40);//10个int if(p!NULL) {int i0;//越界for(…

微服务项目租房网

文章目录 一、租房网项目的介绍1、使用的技术介绍2、使用的组件和开发工具的版本以及作用3、项目模块结构4、项目总体架构 二、环境搭建1、启动前端服务2、CentOS7各个组件的安装2.1 安装Docker2.2 安装JDK2.3 安装Redis(6390)2.4 安装FastDFS(8888)2.5 安装MongoDB(27017)2.6 …

Niagara—— 概述

目录 一,核心组件 Systems Emitters Modules Parameters 二,创建系统或发射器向导 System向导 Emetter向导 三,Niagara VFX工作流程 创建系统 创建或添加发射器 创建或添加模块 Niagara是最新一代VFX系统,无需程序员…

Junit测试框架详解

目录 Junit框架 导入Junit到项目 Junit注解 Test Disabled BeforeAll / AfterAll BeforeEach / AfterEach 参数化 单参数 多参数 CSV获取参数 方法获取参数 断言 assertEquals / assertNotEquals assertNull / assertNotNull 用例执行顺序 测试套件Suite 指定…

使用IIS创建WEB服务

文章目录 前言一、Web服务是什么?1.Web服务概述2.如何获取网页资源3.常见Web服务端软件4.什么是IIS 二、安装IIS1.安装Web服务器角色2.准备网页文件3.配置Web站点4.客户端浏览例:配置IIS站点 三、虚拟主机概述1.虚拟Web主机2.虚拟主机的几种类型3.基于端…

软考信管高级——进度管理

进度管理内容 缩短活动工期方法 赶工,投入更多资源或增加工作时间,以缩短关键活动的工期快速跟进,并行施工,以缩短关键路径长度使用高素质的资源或经验更丰富的人员减小活动范围或降低活动要求改进方法或技术,以提高…

活动回顾|解锁 AIGC 密码,探寻企业发展新商机

5月24日,Google Cloud 与 Cloud Ace 联合主办的线下活动顺利落下帷幕。 本次活动,有近 40 位企业精英到场支持。三位 Google Cloud 演讲嘉宾就本次活动主题,为大家带来了比较深度的演讲内容,干货满满。 (*以下的嘉宾演…

期末复习总结【MySQL】聚合查询 + 多表联合查询(重点)

文章目录 前言一、聚合查询1, 聚合函数2, 聚合函数使用示例3, GROUP BY 子句4, HAVING 子句 二、联合查询(重点)1, 笛卡尔积2, 内连接2.1, 示例12.2, 示例22.3, 示例3 3, 外连接4, 自连接 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#…

存量时代下,互联网玩家如何“自我造血”?

毫无疑问,互联网已经进入存量时代。 在过去高增长的增量时代,许多互联网企业追求规模效应,痴迷于“先规模后盈利”的打法,力图用规模构建护城河。然而,随着行业整体增长速度放缓,规模扩张变得更为艰难&…