毕业设计-机器学习图像卡通动漫化图像风格迁移

news/2024/5/2 18:44:33/文章来源:https://blog.csdn.net/qq_37340229/article/details/128063523

前言


    📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

🚀对毕设有任何疑问都可以问学长哦!

本次分享的课题是

🎯机器学习图像卡通动漫化图像风格迁移

课题背景和意义

人工智能技术,不仅在常规领域能够大放异彩,在一些神奇的领域也会得到意想不到的“妙用”。4月初,就有谷歌利用深度学习探索如何区分日本拉面连锁店中的1170份拉面,并取得了95%的识别度。

如果将这样的技术运用至二次元,又将会有怎样的火花。对于身居重度宅属性但又手残不会画画的二次元来说,有了机器学习,不仅能够AI下棋、开车、吟诗作对,还能将人脸转化成漫画风格的图片。次元壁内的人轻松转化属性,而壁外的小伙伴也可以一窥究竟。本文将介绍如何通过科学的触角,轻叩次元壁,让AI把现实中的人脸转换成漫画风格的图片?

实现技术思路

1 图像风格迁移基础 

1.1 图像风格化

首先我们来看图像风格化,所谓风格化的重点就在于风格,它一定不是普通的图片,而是对普通图片进行处理后,得到的拥有特殊风格的作品,以Photoshop软件为例,很早就内置了非常多的滤镜风格,可以分为两大类。

第一类是基于基于边缘的风格化,可以突出轮廓,创建出特殊的效果,如下图1。

图1 PS的边缘风格

上图展示了Photoshop中几种常见的基于边缘的风格化效果,从左到右分别是原图,查找边缘,等高线,浮雕效果,虽然各自效果有所不同,但是其中最核心的技术仍然是寻找到主体的边缘。为了实现以上的风格,首先要检测到主体边缘,可以使用传统的边缘检测方法,如Sobel、Canny检测算子,也可以采用深度学习方法进行检测。

第二类风格就是基于颜色的风格化,它通过更改像素值或者像素的分布,可以创造出特殊的风格,如油画、波纹,下图2从左到右分别是原图,波纹,凸出,油画效果。

图2 PS的颜色风格

以上的风格化,基于特定的图像算法规则,模式固定,只能处理特定数量的风格。而随着深度学习技术的发展,基于深度学习的风格化方法被广泛研究并且取得了非常好的效果,开启了一个新的研究领域,风格迁移。

1.2 风格迁移

风格迁移的重点在于迁移,它是将一幅图中的风格,迁移到另一幅图中。2015年德国图宾根大学科学家在论文《A Neural Algorithm of Artistic Style》[1]中提出了使用深层卷积神经网络进行训练,创造出了具有高质量艺术风格的作品。

该网络将一幅图作为内容图,从另外一幅画中抽取艺术风格,两者一起合成新的艺术画,从而使得神经网络风格迁移领域( Neural Style Transfer)诞生。

图3 Neural Style Transfer

图3中A图就是内容图,B图左下角就是风格图,B图大图就是融合了A图的内容和风格图的风格,从而可以实现任意风格的迁移,不必局限于特定的算法,下图4展示了一些案例,每一种风格都有着独特的美感,主体和背景的处理都非常好。

图4 多种Neural Style Transfer风格

1.3 风格迁移算法原理

生物学家证明了人脑处理信息具有不同的抽象层次,人的眼睛看事物可以根据尺度调节抽象层次,当仔细在近处观察一幅图时,抽象层次越低,我们看到的是清晰的纹理,而在远处观察时则看到的是大致的轮廓。实际上卷积神经网络就是实现和证明了这样的分层机制的合理性。将各个神经元看做是一个图像滤波器,输出层就是由输入图像的不同滤波器的组合,网络由浅到深,内容越来越抽象。

研究者基于此特点提出图片可以由内容层(content)与风格层(style)两个图层描述,内容层描述图像的整体信息,风格层描述图像的细节信息。

所谓内容,指得是图像的语义信息,即图里包含的目标及其位置,它属于图像中较为底层的信息,可以使用灰度值,目标轮廓等进行描述。

而风格,则指代笔触,颜色等信息,是更加抽象和高层的信息。

图像风格可以用数学式子来描述,其中常用的是格拉姆矩阵(Gram Matrix),它的定义为n维欧氏空间中任意k个向量的内积所组成的矩阵,如下:

基于图像特征的Gram矩阵计算方法如下:

Glij向量化后的第l个网络层的特征图i和特征图j的内积,k即向量的长度。

格拉姆矩阵可以看做特征之间的偏心协方差矩阵,即没有减去均值的协方差矩阵。内积之后得到的矩阵的对角线元素包含了不同的特征,而其他元素则包含了不同特征之间的相关信息。因此格拉姆矩阵可以反应整个图像的风格,如果我们要度量两个图像风格的差异,只需比较他们Gram Matrix的差异即可。

假设我们有两张图,一张是欲模仿的风格图s,一张是内容图c,想要生成图x,风格迁移转换成数学问题,就是最小化下面这个函数。

因此当我们要实现一个滤镜算法时,只需要提取风格图的风格,提取要使用滤镜的图的内容,然后合并成最终的效果图。

基于图像的风格迁移算法

基于图像优化的方法是在图像像素空间做梯度下降来最小化目标函数,以Gary等人提出的经典算法[1]为例,下图5是该算法的原理图。

图5 Neural Style Transfer算法原理

图中包含了2个输入通道,分别用于进行内容重建(Content construction)和风格重建(Style construction)。

(1) 内容重建通道。选择某一个抽象级别较高的特征层计算内容损失,它的主要目标是保留图像主体的内容和位置,损失计算如下,使用了特征的欧式距离,Fijl和Pijl分别是第l层生成图和内容图的特征值。

内容重建之所以不使用多尺度,是因为内容图本身只需要维持可识别的内容信息,多尺度不仅会增加计算量,还引入噪声,抽象层次较低的低尺度关注了像素的局部信息,可能导致最终渲染的结果不够平滑。

(2) 风格重建通道。与内容重建不同,CNN从底层到高层的每一层都会对风格有贡献,因为风格采用格拉姆矩阵进行表述,所以损失也是基于该矩阵计算,每一层加权相加,第l层的损失定义如下。

整个的风格损失函数就是各层相加,

风格重建使用多尺度不仅有利于模型的收敛,而且兼顾了局部的纹理结构细节和整体的色彩风格。

图6 Neural Style Transfer算法优化

当然最原始的迁移算法也存在着一些固有的缺陷,包括无法保持目标的颜色,纹理比较粗糙,无法识别语义内容导致目标风格不完整,或者出现错乱,比如将天空的风格迁移到大地等,后续的研究者们对其提出了许多的改进,其中最具有代表性的是Adobe公司[2]的真实场景风格转换,它们只迁移图像的颜色而不改变纹理,作者称之为照片风格迁移(photo style transfer)。

目前风格迁移主要有两大类方法,基于图像优化的风格迁移算法和基于模型优化的风格迁移算法。

基于模型优化的风格迁移算法

基于图像优化的方法由于每个重建结果都需要在像素空间进行迭代优化,这种方式无法实时,因此研究人员开始研究更加高效的方法,即基于模型优化的方法,它的特点是首先使用数据集对某一种风格的图进行训练得到一个风格化模型,然后在使用的时候只需要将输入图经过一次前向传播就可以得到结果图,根据模型与风格数量可以分为许多方向,下面分别介绍。

3.1  单模型单风格及其改进

Justin Johnson等人提出的方法[3]是一个典型的单模型单风格框架,通过图像转换层(Image Transform Net)来完成整个的渲染过程,在损失网络(VGG16 Loss Network)的约束下,分别学习内容和风格。该模型用于训练的风格图数据集必须属于同一种风格,而内容图则可以任意选择。

与基于图像优化的方法相比,基于模型优化的方法不需要反复地迭代,速度快了两三个数量级,下图8所示是它的模型结构。

图8 基于模型的风格化

这个模型可以分为两部分,Image Transform Net是图像转换网络,VGG16是损失网络。图像转换网络输入x,输出y,它和风格图ys,内容图yc经过同样的网络,分别计算风格损失和内容损失,注意这里的yc实际上就是输入图x。

内容损失采用的是感知损失,风格损失与基于图像优化的方法一样采用Gram矩阵来定义,都已经介绍过许多次了,就不再赘述。

3.2 单模型多风格

单模型单风格对于每一种风格都必须重新训练模型,这大大限制了它们的实用性,因此研究人员很快便开始研究单模型多风格框架。Style bank[4]是其中的一个典型代表,它使用了一个滤波器组来代表多个风格,原理如下图9:

图9 Style bank框架

从图可以看出,输入图I首先输入一个编码器得到特征图,然后和StyleBank相互作用。StyleBank包括n个并行的滤波器组,分别对应n个不同的风格。每一个滤波器组中的每一个通道可以被看作是某一种风格元素,比如纹理类型,笔触类型。

模型总共包含两个分支,第一个是从编码器到解码器,它要求重建的图像O和输入图像I在内容上一致,因此采用的损失函数就是逐个像素的均方误差损失。

另一个分支是从编码器到风格化滤波器到解码器,它要求对于不同的风格生成不同的风格输出。对于这一个分支,包括一个内容损失,一个风格损失,以及一个平滑损失, 具体的内容损失和风格损失与Gatys论文中一样。

在具体训练的时候,针对K个不同的风格,首先固定编解码器分支,对风格化分支训练K轮。然后固定风格化分支,对编码器分支训练1轮。

StyleBank方法的特点是:

(1) 多个风格可以共享一个自编码器(Auto-encoder)。

(2) 可以在不更改自编码器(Auto-encoder)的情况下对新的风格进行增量学习。

另外还有的方法通过学习实例归一化(Instance Normalization)后的仿射变换系数的方法[5]来控制不同风格的图像,实例归一化表达式如下:

取对应某风格的缩放系数和偏移系数就实现了对应风格的归一化。

图10 Instance Normalization

3.3 单模型任意风格

单模型多风格框架在增加新的风格时总需要重新训练模型,单模型多风格算法可以通过学习实例归一化的仿射变换系数来控制多种风格的转换,研究表明[6]这种仿射参数其实可以由风格图本身的统计信息来替代,用风格图图像的方差和均值分别替代,就可以生成任意风格的图像,该层被称为AdaIN层,其定义如下式。

其中x是内容图,y是风格图,可以看出使用了内容图的均值和方差进行归一化,使用风格图的均值和方差作为偏移量和缩放系数,整个模型原理图如下图。

图11 基于AdaIN的风格迁移

损失包括内容损失和风格损失两部分。内容损失的计算是比较AdaIN层的输出与最终的输出图之间的L2损失,风格损失则使用了VGG不同特征层的均值和方差的L2损失而不是使用基于Gram矩阵的损失,形式更加简单。

3.4 小结

目前AdaIN层已经在图像风格化,图像生成等领域中被广泛应用,属于图像风格迁移的标配技术,单模型任意风格在实际应用中也更加有效。

1.下载预训练的vgg网络,并放入到项目的根目录中,选定风格图片和内容图片

# 内容图片路径
CONTENT_IMAGE = 'images/content.jpg'
# 风格图片路径
STYLE_IMAGE = 'images/style.jpg'
# 输出图片路径
OUTPUT_IMAGE = 'output/output'
# 预训练的vgg模型路径
VGG_MODEL_PATH = 'imagenet-vgg-verydeep-19.mat'
# 图片宽度
IMAGE_WIDTH = 450
# 图片高度
IMAGE_HEIGHT = 300
# 定义计算内容损失的vgg层名称及对应权重的列表
CONTENT_LOSS_LAYERS = [('conv4_2', 0.5),('conv5_2',0.5)]
# 定义计算风格损失的vgg层名称及对应权重的列表
STYLE_LOSS_LAYERS = [('conv1_1', 0.2), ('conv2_1', 0.2), ('conv3_1', 0.2), ('conv4_1', 0.2), ('conv5_1', 0.2)]
# 噪音比率
NOISE = 0.5
# 图片RGB均值
IMAGE_MEAN_VALUE = [128.0, 128.0, 128.0]
# 内容损失权重
ALPHA = 1
# 风格损失权重
BETA = 500
# 训练次数
TRAIN_STEPS = 3000

生成图片

def loss(sess, model):"""定义模型的损失函数:param sess: tf session:param model: 神经网络模型:return: 内容损失和风格损失的加权和损失"""# 先计算内容损失函数# 获取定义内容损失的vgg层名称列表及权重content_layers = settings.CONTENT_LOSS_LAYERS# 将内容图片作为输入,方便后面提取内容图片在各层中的特征矩阵sess.run(tf.assign(model.net['input'], model.content))# 内容损失累加量content_loss = 0.0# 逐个取出衡量内容损失的vgg层名称及对应权重for layer_name, weight in content_layers:# 提取内容图片在layer_name层中的特征矩阵p = sess.run(model.net[layer_name])# 提取噪音图片在layer_name层中的特征矩阵x = model.net[layer_name]# 长x宽M = p.shape[1] * p.shape[2]# 信道数N = p.shape[3]# 根据公式计算损失,并进行累加content_loss += (1.0 / (2 * M * N)) * tf.reduce_sum(tf.pow(p - x, 2)) * weight# 将损失对层数取平均content_loss /= len(content_layers)# 再计算风格损失函数style_layers = settings.STYLE_LOSS_LAYERS# 将风格图片作为输入,方便后面提取风格图片在各层中的特征矩阵sess.run(tf.assign(model.net['input'], model.style))# 风格损失累加量style_loss = 0.0# 逐个取出衡量风格损失的vgg层名称及对应权重for layer_name, weight in style_layers:# 提取风格图片在layer_name层中的特征矩阵a = sess.run(model.net[layer_name])# 提取噪音图片在layer_name层中的特征矩阵x = model.net[layer_name]# 长x宽M = a.shape[1] * a.shape[2]# 信道数N = a.shape[3]# 求风格图片特征的gram矩阵A = gram(a, M, N)# 求噪音图片特征的gram矩阵G = gram(x, M, N)# 根据公式计算损失,并进行累加style_loss += (1.0 / (4 * M * M * N * N)) * tf.reduce_sum(tf.pow(G - A, 2)) * weight# 将损失对层数取平均style_loss /= len(style_layers)# 将内容损失和风格损失加权求和,构成总损失函数loss = settings.ALPHA * content_loss + settings.BETA * style_lossreturn loss

实现效果图样例

 

我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。

毕设帮助,疑难解答,欢迎打扰!

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

餐厅食材采购信息管理系统的设计与实现

摘 要 网络的广泛应用给生活带来了十分的便利。所以把餐厅食材采购信息管理与现在网络相结合,利用JSP技术建设餐厅食材采购信息管理系统,实现餐厅食材采购的信息化。则对于进一步提高餐厅食材采购信息管理发展,丰富餐厅食材采购信息管理经验…

R语言对用电负荷时间序列数据进行K-medoids聚类建模和GAM回归

通过对用电负荷的消费者进行聚类,我们可以提取典型的负荷曲线,提高后续用电量预测的准确性,检测异常或监控整个智能电网(Laurinec等人(2016),Laurinec和Luck( 2016)&…

使用vue脚手架快速搭建vue 2项目

简单了解vue-cli 官网地址:https://cli.vuejs.org/zh/guide/browser-compatibility.html 前提 1.安装node(js代码的运行环境)、npm; 2.全局安装vue-cli; 命令创建项目 vue create hello-word 等待项目创建成功即可 开发工具打开刚刚创建的项目 项目结构如图…

TMS Sphinx Alexandria Full Source

TMS Sphinx Alexandria Full Source 用于身份访问管理的TMS Sphinx Delphi框架,包括授权和身份验证。 TMS Sphinx允许您为多个应用程序实现单点登录(SSO):web、本机、移动或机器到机器API通信。它可用于通过登录表单、类似的用户界面和基于服务的身份验证…

Spring - BeanPostProcessors 扩展接口

文章目录PreBean的生成过程org.springframework.beans.factory.config.BeanPostProcessor 介绍ApplicationContext注册Bean PostProcessor源码解析AbstractApplicationContext#refreshAbstractApplicationContext#registerBeanPostProcessorsPostProcessorRegistrationDelegate…

[LeetCode周赛复盘] 第 92 场双周赛20221015

[LeetCode周赛复盘] 第 92 场双周赛20221015 一、本周周赛总结二、 [Easy] 6249. 分割圆的最少切割次数1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6277. 行和列中一和零的差值1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6250. 商店的最少代价1. 题目描述2. 思路分析…

77.【JavaWeb文件上传和邮件发送04】

JavaWeb(二十五)、文件上传1.准备工作2.实用类介绍3.思维导图:4.正戏开始5.完整代码(二十六)、邮箱发送1.邮箱发送的原理:2.服务器的原理3.下载两个jar包4.基本类:5.全部代码(二十七)、网站注册发送邮件实现(二十五)、文件上传 1.首先创建一个empty项目 2.配置project项目中的…

【配送路径规划】基于matlab遗传算法求解静态外卖骑手路径规划问题【含Matlab源码 2248期】

⛄一、遗传算法求解静态外卖骑手路径规划问题 1 模型假设 外卖配送的实际运行是一个复杂的过程, 受诸多因素影响, 为了建立调度模型, 本文做如下假设。 (1) 外卖配送更多的是服务特殊群体, 所以本文认为外卖配送是一种预约型配送, 即在进行调度安排前, 己经获取了所有顾客的地…

版本控制利器——changelog

问题描述 当前,我们项目需要进行版本的确定,人工审核代码已接近尾声,但为了防止后续继续出现该问题,我希望能够做到在每次push到master时,更新changelog 将每一个版本的commit记录下来,类似于下列 解决…

C++_串口编程_官方示例:监视通信事件

这是微软官方的一个例子,这个例子中,如果不做修改,那么他是可以异步运行的,会出现一个错误:官方也说了一下,但是不太好懂,我拷贝过来放在这里,作为参考。 如果无法立即完成重叠的操作…

【Canvas】js用Canvas绘制阴阳太极图动画效果

学习JavaScript是否兴趣缺缺,那就需要来一个兴趣学习,问一下有没有兴趣用Canvas画图呢,可以画很多有趣的事物,自由发挥想象,收获多多哦,这里有一个例子,如何用canvas画阴阳太极图动图效果&#…

【博客544】golang pprof性能调试:寻找memory瓶颈

golang pprof性能调试:寻找memory瓶颈 1、前置 pprof的使用与输出列解析看姐妹篇:golang pprof性能调试:寻找cpu瓶颈 2、引入pprof到程序中,以调试memory瓶颈 给程序加入: import _ "net/http/pprof"go…

【Android App】实现在线语音合成功能(使用云知声平台和WebSocket 超详细 附源码)

需要源码和Jar包请点赞关注收藏后评论区留下QQ~~~ 一、在线语音合成 虽然国产智能机大多集成了中文语音引擎,但是系统自带的语音工具无法满足商用要求,功能单一,所以势必引入第三方的语音引擎,依靠第三方提供的开发包统一支撑语音…

缓存穿透、缓存击穿、缓存雪崩及其解决方案

缓存(cache),大家都非常熟悉,几乎每个系统乃至整个计算机体系中都会用到。在分布式系统架构中,主要用于减轻数据库的压力,提高系统的响应速度和并发吞吐,即空间(内存)换时间。当大量的读、写请求…

2023年天津财经大学珠江学院专升本经济学专业课考试大纲

天津财经大学珠江学院2023年高职升本科专业课考试《经济学》考试大纲一、本大纲系天津财经大学珠江学院2023年高职升本科《经济学》课程考试大纲。所列考试范围出自郑健壮、王培才主编的教材《经济学基础(第二版)》,清华大学出版社&#xff0…

React - Ant Design4.x版本安装使用,并按需引入和自定义主题

React - Ant Design4.x版本安装使用,并按需引入和自定义主题一. 安装使用 antd二.antd 高级配置安装 craco,对 create-react-app 的默认配置进行自定义自定义主题安装 babel-plugin-import ,按需加载组件代码和样式Ant Design官网…

mycat-3-实战篇

1 总结: 1:用的表必须在mycat的配置文件中配置。 2:mycat默认分片策略中,都是针对表的主键,默认是id,如果主键不是id的,请去rule.xml自己复制一份修改 3: 2 注意细讲解 1:schem…

车辆大全和车牌识别系统毕业设计,车牌识别系统设计与实现,车牌AI识别系统论文毕设作品参考

功能清单 【后台管理员功能】 系统设置:设置网站简介、关于我们、联系我们、加入我们、法律声明 广告管理:设置小程序首页轮播图广告和链接 留言列表:所有用户留言信息列表,支持删除 会员列表:查看所有注册会员信息&a…

TypeScript开启

TypeScript是什么? typescript是以JavaScript为基础构建的语言,是一个Javascript的超集,可以在任何支持JavaScript的平台中执行,typescript扩展了JavaScript,并添加了类型。 注意:ts不能被js直接解析执行&…

27个超实用Chrome DevTools 调试技巧 source 全局搜索(持续更新)

谷歌开发者工具提供了一系列的功能来帮助开发者高效 Debug 网页应用,让他们可以更快地查找和修复 bug。在谷歌的开发者工具中,有非常多有用的小工具,但是很多开发者并不知道。通过这篇文章,我把我常用的那些高效 Debug 的 Chrome …