返回顶部
首页 > 资讯 > 后端开发 > Python >利用Python实现图片风格迁移
  • 642
分享到

利用Python实现图片风格迁移

2023-06-02 03:06:52 642人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容主要讲解“利用python实现图片风格迁移”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“利用Python实现图片风格迁移”吧!1. 什么是图片的风格迁移?所谓图片风格迁移,是指利用程序算

本篇内容主要讲解“利用python实现图片风格迁移”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“利用Python实现图片风格迁移”吧!

1. 什么是图片的风格迁移?

利用Python实现图片风格迁移

所谓图片风格迁移,是指利用程序算法学习著名画作的风格,然后再把这种风格应用到另外一张图片上的技术。

举个例子,见上图。左边是我们的原始图片(也称内容图像):小编在苏州甪直古镇的一座小桥上拍下的一张照片。

中间是我们的风格图片:挪威表现派画家爱德华·蒙克的代表作《呐喊》(The Scream)。

右边是将爱德华·蒙克的《呐喊》的风格应用于原始图片后生成的风格化结果图。仔细观察,图片是如何保留了流水、房屋、房屋在水中的倒影,甚至远处树木的内容,但却运用了《呐喊》的风格,就好像爱德华·蒙克在我们的景色中运用了他高超的绘画技巧一样!

问题是,我们应该定义一个什么样的神经网络来执行图片的风格迁移?

这可能吗?

答案是:可以的。我将在下一节简单讨论如何基于神经网络来实现图片风格的迁移。

2. 基本原理

Gatys等人在2015年发表了第一篇基于深度学习的风格迁移算法文章,原文链接为https://arxiv.org/abs/1508.06576,随后文章收录于2016年的CVPR顶会。

有趣的是,他们提出了一种完全不需要新网络架构的风格迁移算法,其使用的网络构架是在前人的VGG19基础上稍加改造而成的,而且网络参数也使用预训练(通常在ImageNet上)网络的参数。我们来看下它的原理:

利用Python实现图片风格迁移

我们知道,卷积神经网络(CNN)具有很强的图像特征(feature/representation)提取能力,如上图所示。

对于内容图片,深层网络(d和e)提取的是高维特征,同时也丢弃了细节信息;浅层网络(a, b和c)提取的是低维特征,图片的细节大多都保留下来了。

对于风格图片,通过包含多层的特征相关性(Gram矩阵),可获得多尺度图像风格的重构,捕获其纹理信息。这样构建的网络可以忽略图像的具体细节,保留风格。

为了将内容图片和风格图片融合在一起(见下图),我们应该使风格化结果图(初始为一张白噪声图片)的特征同时与内容图片和风格图片的特征之间的距离最小化,最终获取我们所需的风格化结果图。

利用Python实现图片风格迁移

因此生成目标图片的损失函数可定义为:

利用Python实现图片风格迁移

其中α和β分别是内容图片和风格图片的特征所占的权重,通过最小化这个损失函数就可以获得我们想要的结果。来看个动态示意图:

利用Python实现图片风格迁移

值得注意的是,这里优化的参数不再是网络的权重ω和偏差b,而是初始输入的一张白噪声图片。

虽然上述方法可产生非常漂亮的风格迁移效果,但是速度很慢。

2016年,Johnson等人基于Gatys等人的工作,提出了一种速度可提高三个数量级的风格迁移算法。虽然算法的速度很快,但最大的缺点是不能像Gatys等人那样随意选择你的风格图片。针对每张风格图片,你都需要训练一个网络来重现这个风格。一旦网络模型训练好之后,你就可将它应用于你想要的任何内容图片了。

这篇博客我们将使用Johnson等人的方法,其算法实现和预训练模型可参考Https://GitHub.com/jcjohnson/fast-neural-style。

3. 基于OpenCV的快速实现

下面利用OpenCV来快速实现图片的风格迁移,我将其封装成一个叫 style_transfer()的函数,其使用说明可参考函数内部的注释。目前只有11个预训练模型可用。

1.  `## 载入所需库`2.  `import cv2`3.  `import time` 4.  `def style_transfer(pathIn='',`5.  `pathOut='',`6.  `model='',`7.  `width=None,`8.  `jpg_quality=80):`9.  `'''`10.  `pathIn: 原始图片的路径`11.  `pathOut: 风格化图片的保存路径`12.  `model: 预训练模型的路径`13.  `width: 设置风格化图片的宽度,默认为None, 即原始图片尺寸`14.  `jpg_quality: 0-100,设置输出图片的质量,默认80,越大图片质量越好`15.  `'''`16.  `## 读入原始图片,调整图片至所需尺寸,然后获取图片的宽度和高度`17.  `img = cv2.imread(pathIn)`18.  `(h, w) = img.shape[:2]`19.  `if width is  not  None:`20.  `img = cv2.resize(img, (width, round(width*h/w)), interpolation=cv2.INTER_CUBIC)`21.  `(h, w) = img.shape[:2]` 23.  `## 从本地加载预训练模型`24.  `print('加载预训练模型......')`25.  `net = cv2.dnn.readNetFromTorch(model)` 26.  `## 将图片构建成一个blob:设置图片尺寸,将各通道像素值减去平均值(比如ImageNet所有训练样本各通道统计平均值)`27.  `## 然后执行一次前馈网络计算,并输出计算所需的时间`28.  `blob = cv2.dnn.blobFromImage(img, 1.0, (w, h), (103.939, 116.779, 123.680), swapRB=False, crop=False)`29.  `net.setInput(blob)`30.  `start = time.time()`31.  `output = net.forward()`32.  `end = time.time()`33.  `print("风格迁移花费:{:.2f}秒".fORMat(end - start))` 35.  `## reshape输出结果, 将减去的平均值加回来,并交换各颜色通道`36.  `output = output.reshape((3, output.shape[2], output.shape[3]))`37.  `output[0] += 103.939`38.  `output[1] += 116.779`39.  `output[2] += 123.680`40.  `output = output.transpose(1, 2, 0)` 42.  `## 输出风格化后的图片`43.  `cv2.imwrite(pathOut, output, [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])`

测试一下:

1.  `>>> models = glob.glob('.*.t7')`2.  `>>> models      ## 列出所有可用的预训练模型`3.  `['.\\models\\eccv16\\composition_vii.t7',`4.  `'.\\models\\eccv16\\la_muse.t7',`5.  `'.\\models\\eccv16\\starry_night.t7',`6.  `'.\\models\\eccv16\\the_wave.t7',`7.  `'.\\models\\instance_norm\\candy.t7',`8.  `'.\\models\\instance_norm\\feathers.t7',`9.  `'.\\models\\instance_norm\\la_muse.t7',`10.  `'.\\models\\instance_norm\\mosaic.t7',`11.  `'.\\models\\instance_norm\\starry_night.t7',`12.  `'.\\models\\instance_norm\\the_scream.t7',`13.  `'.\\models\\instance_norm\\udnie.t7']` 15.  `>>> pathIn = './img/img01.jpg'`16.  `>>> pathOut = './result/result_img01.jpg'`17.  `>>> model = './models/instance_norm/the_scream.t7'`18.  `>>> style_transfer(pathIn, pathOut, model, width=500)`19.  `加载预训练模型......`20.  `风格迁移花费:1.18秒` 22.  `>>> pathIn = './img/img02.jpg'`23.  `>>> pathOut = './result/result_img02.jpg'`24.  `>>> model = './models/instance_norm/starry_night.t7'`25.  `>>> style_transfer(pathIn, pathOut, model, width=500)`26.  `加载预训练模型......`27.  `风格迁移花费:3.17秒` 29.  `>>> pathIn = './img/img03.jpg'`30.  `>>> pathOut = './result/result_img03.jpg'`31.  `>>> model = './models/instance_norm/the_scream.t7'`32.  `>>> style_transfer(pathIn, pathOut, model, width=500)`33.  `加载预训练模型......`34.  `风格迁移花费:0.90秒` 36.  `>>> pathIn = './img/img04.jpg'`37.  `>>> pathOut = './result/result_img04.jpg'`38.  `>>> model = './models/eccv16/the_wave.t7'`39.  `>>> style_transfer(pathIn, pathOut, model, width=500)`40.  `加载预训练模型......`41.  `风格迁移花费:2.68秒` 43.  `>>> pathIn = './img/img05.jpg'`44.  `>>> model = './models/instance_norm/mosaic.t7'`45.  `>>> style_transfer(pathIn, pathOut, model, width=500)`46.  `加载预训练模型......`47.  `风格迁移花费:1.23秒`

从运行结果可知,在CPU上,一张图片的风格迁移所花的时间大概也就几秒。如果使用GPU,完全可以实时对视频/摄像头进行风格迁移处理。

4. 目前的相关进展

自Gatys等人第一次(2015年)实现基于深度学习的风格迁移以来,风格迁移技术仍一直在发展,如今在速度和质量上都有了很大提高。目前的一些进展可以通过下面的链接来了解:

  • https://github.com/jcjohnson/fast-neural-style

  • https://github.com/DmitryUlyanov/texture_nets

  • https://github.com/luanfujun/deep-painterly-harmonization

  • https://junyanz.github.io/CycleGAN/

他们的一些作品:

风格迁移

利用Python实现图片风格迁移

利用Python实现图片风格迁移

外来图片的融合

利用Python实现图片风格迁移

利用Python实现图片风格迁移

利用Python实现图片风格迁移

图片季节的变换

利用Python实现图片风格迁移

图片背景的虚化

利用Python实现图片风格迁移

角色互换

利用Python实现图片风格迁移

到此,相信大家对“利用Python实现图片风格迁移”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 利用Python实现图片风格迁移

本文链接: https://lsjlt.com/news/228734.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 利用Python实现图片风格迁移
    本篇内容主要讲解“利用Python实现图片风格迁移”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“利用Python实现图片风格迁移”吧!1. 什么是图片的风格迁移?所谓图片风格迁移,是指利用程序算...
    99+
    2023-06-02
  • 利用Python实现多种风格的照片处理
    目录前言照片修复的具体实操将照片风格素描化的具体实操前言 在上一篇教程当中呢,小编向大家展示了如何通过一键点击实现将头像变成动漫风的实践,无非是在制作的UI界面当中,在用户上传了照片...
    99+
    2024-04-02
  • 如何实现迁移图片目录的bat
    这篇文章给大家分享的是有关如何实现迁移图片目录的bat的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码如下:@echo off setlocal enabledelayedexpansion ::开启变量延迟,...
    99+
    2023-06-08
  • 利用python 迁移单个redis的
    环境的是python3 / pip3 import sys import redis # 迁移hash def moveHash(cursor): cursor, data = r.hscan(key, cursor) ...
    99+
    2023-01-31
    python redis
  • 如何利用Spring MVC实现RESTful风格
    目录SpringMVC实现RESTful风格RESTful使用Spring MVC实现RESTful风格静态资源访问问题Spring MVC的RESTful学习什么RESTful使用...
    99+
    2024-04-02
  • 怎么使用Python将图片转为漫画风格
    安装OpenCV首先,我们需要安装OpenCV。OpenCV是一个开源计算机视觉库,它提供了各种各样的图像处理工具,可以用于许多不同的应用程序。我们可以使用以下命令在Python中安装OpenCV: pip install opencv-p...
    99+
    2023-05-14
    Python
  • 如何使用Python将图片转为漫画风格
    本篇内容主要讲解“如何使用Python将图片转为漫画风格”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Python将图片转为漫画风格”吧!安装OpenCV首先,我们需要安装OpenCV。...
    99+
    2023-07-06
  • 利用Python 实现图片转字符画
    目录前言字符画的原理灰度值和RGB代码实战总结前言 相信大家在网上经常看到有人秀出各种各样的字符画,对于这个五彩斑斓的世界来说,我们日常看到的都是一些高清的彩色的图片,偶尔来个粗糙的...
    99+
    2024-04-02
  • Python实现图片格式转换
    本文实例为大家分享了Python实现图片格式转换的具体代码,供大家参考,具体内容如下 碰上这样一个情景: 我从网络上下载了一张表情包图片,存放在 MyImages 文件夹下,文件类型...
    99+
    2024-04-02
  • 如何使用CSS实现图片马赛克风格化效果
    这篇文章主要介绍如何使用CSS实现图片马赛克风格化效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、image-rendering 介绍CSS 中有一个有趣的特性叫 image-...
    99+
    2024-04-02
  • Python实现图片背景移除工具
    上传一张图片,实现其背景移除的功能。 代码示例: import streamlit as st from rembg import remove from PIL import Im...
    99+
    2023-02-27
    Python图片背景移除工具 Python图片背景移除 Python背景移除
  • 如何利用python实现图片批处理
    前言 在训练神经网络之前,我们往往需要对数据集进行批量处理。本文以图片为例,介绍如何使用python实现图片的批量处理,包括批量命名,批量更改图像像素,批量对图片进行Harris、C...
    99+
    2024-04-02
  • Python将图片转为漫画风格的示例
    目录安装OpenCV读取图片并进行边缘检测对边缘进行处理以生成漫画效果保存漫画效果图片Python是一种功能强大的编程语言,它可以用于图像处理、机器学习和人工智能等领域。在本文中,我...
    99+
    2023-05-16
    Python 图片转为漫画 Python图片变为漫画
  • 利用C#实现批量图片格式转换功能
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2022-12-09
    C#批量图片格式转换 C#图片格式转换 C# 格式转换
  • EMR-Kafka中怎么利用Connect实现数据迁移
    本篇文章给大家分享的是有关EMR-Kafka中怎么利用Connect实现数据迁移,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.背景流式处理中经常会遇到Kafka与其他系统进...
    99+
    2023-06-19
  • 利用Python多线程实现图片下载器
    目录导语开发工具环境搭建原理简介效果展示导语 之前有很多小伙伴说想学习一下多线程图片下载器,虽然好像已经过去很久了,不过还是上来安排一波吧。至于题目为什么说是构建一个小型数据集,因为...
    99+
    2024-04-02
  • 怎么利用Python实现图片转字符画
    本文小编为大家详细介绍“怎么利用Python实现图片转字符画”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么利用Python实现图片转字符画”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。字符画的原理这种字符画...
    99+
    2023-07-02
  • 利用Python的PIL工具包实现图片比
     PythonWare公司提供了免费的图像处理工具包PIL(Python Image Library),该软件包提供了基本的图像处理功能,本文介绍了使用PIL工具包中的Image模块进行比对的过程。                    ...
    99+
    2023-01-31
    工具包 图片 Python
  • Python虚拟环境迁移的实现
    使用python开发脚本使用的时候难免会遇到需要更换电脑来运行的问题,但是python不同版本的兼容性较差,在其他电脑使原python脚本运行时经常会发生一些问题,因此就需要pyth...
    99+
    2023-03-06
    Python虚拟环境迁移 Python虚拟环境
  • Python利用AI接口实现抠图并改图片底色
    目录前言一、注册百度AI账号二、代码实现1.引入库2.获取Access Token3.核心代码4.图片底色填充5.图片压缩6.获取图图片大小7.png格式转jpg8.主函数9.完整代...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作