图像风格快速迁移tensorflow实战

引言

需要解决的问题是:利用tensorflow的快速风格迁移功能,把一张qq的logo图片转换成《星空》油画的风格,并打印输出。

如图所示,最右边图像是输入结果,左边两图是输入:

 

一、操作步骤

通过两天的学习,修了许多bug,踩了不少坑,终于把实验做成了。现在试着阐述相关的原理和具体操作步骤。

这里我把整个实验过程分为4大部分,每个部分都会给出详细的操作步骤。

A.软件的安装和配置

B.风格迁移代码的理解和操作

C.导入相关的库

D.开始运行

A.软件的安装和配置

本次实验我们通过python语言来实现,所以首先需要安装python编程环境。为节省以后额外下载安装各种集成包和调用各种库的时间,建议直接安装Anaconda,而不是安装裸的python。

1.通过Anaconda安装python编译环境:

1.下载Anaconda

通过清华大学开源软件镜像站下载最新版本的Anaconda。官网Anaconda | Anaconda Distribution下载也可,不同可能速度比较慢。

我使用的是windows系统,下载的是2021年11月的版本,名称为Anaconda3-2021.11-Windows-x86_64.exe。

2.安装Anaconda

3.环境变量的配置

4. 测试安装情况

2.安装相应版本的python。

在安装了Adaconda软件之后,会自动帮你集成最新python环境,但是有的代码和最新版Python不能兼容,所以,还需要下载能运行本实验代码的python3.6或者3.7版本。

1.下载python

从Python Releases for Windows | Python.org下载python的不同版本,我这里下载的是python-3.6.6-amd64.exe

2.安装python

3.检查python安装情况

3安装pycharm

B.风格迁移代码的理解和操作

代码如下:

 

from keras.preprocessing.image import load_img,img_to_array
import numpy as np
import cv2 as cv
from keras.applications import vgg19
from keras import backend as k
from scipy.optimize import fmin_l_bfgs_b
import time
target_image_path = './qq.jpg'
style_reference_image_path = './style.jpg'
print(target_image_path)
print(style_reference_image_path)
width, height = load_img(target_image_path).size            #加载图片的大小
img_height = 600
img_width = int(width * img_height / height)"""预处理图片,包括变形到(1,width, height)形状,数据归一到0-1之间:param image: 输入一张图片:return: 预处理好的图片"""
def preprocess_image(image_path):img = load_img(image_path, target_size=(img_height, img_width))img = img_to_array(img)img = np.expand_dims(img, axis=0)img = vgg19.preprocess_input(img)return img"""将0-1之间的数据变成图片的形式返回:param x: 数据在0-1之间的矩阵:return: 图片,数据都在0-255之间"""
def deprocess_image(x):x[:, :, 0] += 103.939x[:, :, 1] += 116.799x[:, :, 2] += 123.68# 'BGR'->'RGB'x = x[:, :, ::-1]x = np.clip(x, 0, 255).astype('uint8')              # 以防溢出255范围return xtarget_image = k.constant(preprocess_image(target_image_path))
style_reference_image = k.constant(preprocess_image(style_reference_image_path))
combination_image = k.placeholder((1, img_height, img_width, 3))input_tensor = k.concatenate([target_image,style_reference_image,combination_image], axis=0)model = vgg19.VGG19(input_tensor=input_tensor,weights='imagenet',include_top=False)print('Model loaded')def content_loss(base, combination):return k.sum(k.square(combination - base))def gram_matrix(x):          # Gram矩阵assert k.ndim(x)==3if k.image_data_format()=='channels_first':features=k.batch_flatten(x)else:features = k.batch_flatten(k.permute_dimensions(x,(2, 0, 1)))gram = k.dot(features, k.transpose(features))return gram# 风格损失,是风格图片与结果图片的Gram矩阵之差,并对所有元素求和
def style_loss(style, combination):S = gram_matrix(style)C = gram_matrix(combination)channels = 3size = img_height * img_widthreturn k.sum(k.square(S - C)) / (4. * (channels ** 2) * (size ** 2))def total_variation_loss(x):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))outputs_dict = dict([(layer.name,layer.output) for layer in model.layers])
content_layer = 'block5_conv2'
style_layers = ['block1_conv1','block2_conv1','block3_conv1','block4_conv1','block5_conv1']total_variation_weight = 1e-4
style_weight = 1.
content_weight = 0.025loss = k.variable(0.)#最终损失值
layer_features = outputs_dict[content_layer]
target_image_features = layer_features[0, :, :, :]
combination_features = layer_features[2, :, :, :]
loss += content_weight*content_loss(target_image_features,combination_features)#加内容损失for layer_name in style_layers:#加风格损失layer_features = outputs_dict[layer_name]style_reference_features = layer_features[1, :, :, :]combination_features = layer_features[2, :, :, :]sl = style_loss(style_reference_features, combination_features)loss += (style_weight / len(style_layers)) * sl#加变异损失,得到最终损失函数值
loss += total_variation_weight * total_variation_loss(combination_image)grads = k.gradients(loss, combination_image)[0]
fetch_loss_and_grads = k.function([combination_image], [loss, grads])class Evaluator(object):def __init__(self):self.loss_value = Noneself.grads_values = Nonedef loss(self, x):assert self.loss_value is Nonex = x.reshape((1, img_height, img_width, 3))outs = fetch_loss_and_grads([x])loss_value = outs[0]grad_values = outs[1].flatten().astype('float64')self.loss_value = loss_valueself.grad_values = grad_valuesreturn self.loss_valuedef grads(self, x):assert self.loss_value is not Nonegrad_values = np.copy(self.grad_values)self.loss_value = Noneself.grad_values = Nonereturn grad_valuesevaluator = Evaluator()result_prefix = 'my_result'
iterations = 2x = preprocess_image(target_image_path)#目标图片路径
x = x.flatten()#展开,应用l-bfgsfor i in range(iterations):print('Start of iteration', i)start_time = time.time()#在生成图片上运行L-BFGS优化;注意传递计算损失和梯度值必须为两个不同函数作为参数x, min_val, info = fmin_l_bfgs_b(evaluator.loss, x,fprime=evaluator.grads,maxfun=20)print('Current loss value:', min_val)img = x.copy().reshape((img_height, img_width, 3))img = deprocess_image(img)if i==iterations-1:fname = result_prefix + '_at_iteration_%d.png' % icv.imwrite(fname, img)print('Image saved as', fname)end_time = time.time()print('Iteration %d completed in %ds' % (i, end_time - start_time))

C.导入相关的库

以上步骤完成之后,我们就可以开始导入各种库来实现图像风格快速迁移。所需要的导入的功能package包括:

  1. Keras==2.2.4
  2. Tensorflow==1.13.0(或者tensorflow==1.13.1)
  3. Opencv-python
  4. Pillow
  5. Numpy

导入的方法有很多中,这里推荐使用命令行安装。而且,导入之前,把pycharm.exe以管理员身份运行。由于国内直接安装可能速度较慢,建议使用阿里云镜像站点安装。

执行代码示例:

pip install -i https://mirrors.aliyun.com/pypi/simple/ numpy

 

pip install -i https://mirrors.aliyun.com/pypi/simple/ keras==2.2.4

 

pip install -i https://mirrors.aliyun.com/pypi/simple/ tensorflow==1.13.1

 

Tensorflow安装结束显示

 同理

pip install -i https://mirrors.aliyun.com/pypi/simple/ opencv-python

在安装各种库的时候,可能需要安装pillow

执行代码:

pip3 install pillow

对于常见的错误,百度也能找到答案。

D.开始运行

检查无问题后,可以开始执行程序。

 

这里有个进度条,等大约5-10分钟就可以跑完。跑完结果显示如下:

 

可以看到,png文件已经保存至项目文件夹中。

三、实验结果

在项目文件夹中,得到了my_result_at_iteration_1.png文件。

参考

1.《智能计算系统》陈云霁

2. 代码参考 http://t.csdn.cn/sxksM

3. pycharm安装:pycharm安装教程,超详细_皮小孩ls的博客-CSDN博客_pycharm

4. 安装Anaconda: Anaconda安装(Python) - 知乎

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

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

相关文章

使用PyTorch搭建VGG模型进行图像风格迁移实战(附源码和数据集)

需要源码和图片集请点赞关注收藏后评论区留言或者私信~~~ 一、VGG模型 VGG模型是科学家们提出的图像分类模型,这一模型采用了简单粗暴的堆砌33卷积层的方式构建模型,并花费大量的时间逐层训练,最终在ImageNet图像分类比赛中获得了亚军&#…

Pytorch 使用GAN实现二次元人物头像生成 保姆级教程(数据集+实现代码+数学原理)

Pytorch 使用DCGAN实现二次元人物头像生成(实现代码公式推导) GAN介绍 算法主体 推导证明(之后将补全完整过程) 随机梯度下降训练D,G DCGAN介绍及相关原理 Pytorch实现二次元人物头像生成 如何使用GAN生成二次元头像 数据准备 代码实现 判别、生成模型…

GAN动漫人像生成实现(附带源码)

基于生成对抗网络的人像转卡通像实现 写在前面先来看看效果吧大家最想要的项目原理简介(2021/11/16更)本项目C和Pytorch的OnnxRuntime使用方法(2022/1/3更)APP的代码(2022/4/4更)双城之战风格迁移数据集写在后面 写在前面 天气晴朗万物可爱,希望通过这篇文章对大家…

NVIDIA的StyleGAN、StyleGAN2、StyleGAN3系列论文解读,梳理基于风格的生成器架构

通俗来讲就是,张三造假币(Generator生成器),然后用验钞机去验证真假(Discriminator辨别器),如果是假的就继续提高造假技术,直到验钞机检验不出来为止,也就是说一个造假一个验假(验钞机也需升级),两者互相学…

AI绘画突然爆火?快速体验二次元画师NovelAI(diffusion)

目录 0 写在前面1 diffusion vs GAN2 NovelAI3 AI绘画环境搭建4 体验AI创作 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支…

女神青涩时纤毫毕现,腾讯 AI 模型 GFPGAN 火上 GitHub 热榜第一,Demo 在线可玩

来源:量子位 作者:明敏 包浆老图立刻清晰到头发丝是一种怎样的体验?看这明亮的眼眸、清晰的发丝,原本模糊的人像立刻添了几分灵动(这就是用 AI 修复的高圆圆童年照)。 甚至时间更久远的历史名人照片也能搞…

游戏原画师

常用软件: 1. Photoshop著名的图形处理软件,也能绘画,适合绘画功底一般的初学者。 2. Painter很多专业人士都很爱用的一款软件。笔刷很多,适合有一定美术功底的人。 3. Sai画漫画的话,sai就比较好用了,对…

chatgpt赋能python:Python与前端连接:使用Python的Web框架构建后端API

Python与前端连接:使用Python的Web框架构建后端API Python是一种强大的编程语言,越来越受到开发者的欢迎。但是,对于Web开发,Python并不是一种前端语言。那么,如何将Python的后端与前端连接起来?本文将介绍…

Vue前端Flask后端

项目构建 本科期间因为学过相关课程,已经配好了相关的环境,所以直接进行了版本确认。 一、Vue2 1. 前端环境确认 Vue:3.2.47 | 踩过的坑使用1的时候一直为empty,加 -g仍是empty 在项目下1,非项目下要用2 1$ npm in…

chatgpt赋能python:Python前端与后端的数据交互

#Python前端与后端的数据交互 在现代Web应用程序中,前端与后端的数据交互至关重要。前端可能需要向后端发出请求来获取数据或触发某些操作,而后端则需要向前端返回数据或处理请求并采取适当的措施。Python是一种流行的编程语言,用于开发Web应…

上货避坑指南 私域上货选品工具 无货源选品上货 采集商品详情数据API分享 详情图 sku信息

电商开店之后,第一件事就是上货了,上货其实也是有技巧的。 上传商品时我们一定要注意细节,不可忽略一些重要细节,所以商家们在上传商品前,不可忽略是否预售、标题、主图、详情页、保证金、上架时间这几个细节。 详情…

批发供应系统批发订货发货管理系统开发功能

​ 古人说的一点都没错,不同行业的贸易企业看起来都是在卖货,但业务流程的确有很大的不同,而在疫情和现动态的双重打击下,传统商贸企业迫切需要面临转型。 1)在哪里转弯。怎么转。 专业点说是转型&#xff0c…

微商助理 防伪防窜货溯源代理授权查询系统源码

源码介绍 微商助理防伪防窜货溯源代理授权查询系统源码支持二维码扫码查询 程序架构:PHPMysql PHP版本要求PHP5.4以上(推荐PHP5.4) 把源码文件上传到网站根目录,此套系统功能较多,不推荐二级目录安装 安装方法一…

2021-07-10

基础研究方面有中科院、中科大、清华、南大、山西大学、北邮、上海交大等支持,设备研发由国盾量子、问天量子、科易理想量子、济南量子技术研究院、九州量子、中兴、华为等支持,量子网络、中创为量子、神州量子、亨通问天量子、神州信息等提供建设运维&a…

OpenCV:鼠标画直线并显示坐标

【天问】存于咸阳宫内,为秦始皇的配剑。当一个人成为天下至尊,权利已是他手中最锋利的宝剑,所谓“天问”不正是一种举剑问天、舍我其谁的王者气势的体现吗? 【鼠标操作】 1、回调函数 CV_EXPORTS void setMouseCallback(const string&…

神七问天 书中国航天史诗

2008年9月25日晚上9时10分,“神七”腾空而起,不到半个小时,北京航天飞控中心宣布“神七”发射成功。执行神舟七号载人航天飞行任务的航天员翟志刚、刘伯明、景海鹏出征前,向祖国和人民致以庄严的军礼。 “神舟七号”终于揭开了神秘…

C++ 组合模式

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 组合模式(Composite Pattern)组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。组合模式对单个对象(即:叶子构件)和组合对象(即:容器构件)的使用具有一致性,组合模式又被称为“整体…

分享打造爆款书的方法,同时聊聊出版图书中的哪些事和哪些坑

想想若干年前,我通过一位非常热情的图书公司的编辑,出版了我的第一本计算机图书,从此后一发不可收拾,最近2年出版了2本,有1本已经完稿,还有两本尚在写作途中。确实,出版出一件名利双收的事&…

腾讯面经来了

前言 今天给大家分享自己投递腾讯上海IEG后台开发职位的面试经历分享。 腾讯感觉整个流程比较慢,这周才刚刚走完HR面,一二两轮技术面在同一周,三面隔一周,HR面又隔一周,但是每轮面试官的态度还是非常棒的,面…