1.1.  项目简介

  所谓图像风格迁移,是利用深度学习技术,将一幅风格图像输人卷积神经网络提取风格特征,再将其应用到另一幅内容图像上,从而生成一幅与风格囝像相仿的新图像。如果选取绘画大师的作品作为风格囝像,那么生成的新图像就像是模仿大师风格创作的,让人叹为观止。

(图片来自网络)

  上图中,图A是原始图像,其他5张图像都是利用“图像风格迁移”的AI技术生成的绘画作品,每张图像的左下角是用来改变原始图像的风格图像。

在本节将介绍利用已经训练好的网络模型对静态图像进行风格迁移。

  1.2.  准备工作

  在磁盘上创建一个名为“painter“的文件夹作为项目目录,用于存放本项目的图像、模型和源文件等,然后从原书的“资源包/第 35 课/”文件夹中把 models 和 images 两个文件夹复制到“painter”文件夹中。models 文件夹中提供了一些己经训练好的风格迁移网络模型 ,images 文件夹中提供了一些用于测试的图像文件 。

  你也可以准备一些自己喜欢的照片放到 images 文件夹中,用于图像风格迁移。

  1.3.  图像风格迁移

  新建一个空白源文件,以Style_transfer.jl 作为文件名保存到“painter”文件夹中 ,然后编写程序实现图像风格迁移,由于程序比较简单,具体过程不做赘述,贴出python代码和julia代码,大家可以做个比较。

  Python代码:

 1 '''
2 程序:图像风格迁移
3 作者:苏秦@小海豚科学馆公众号
4 来源:图书《Python趣味编程:从入门到人工智能》
5 '''
6 import cv2
7
8 #指定图像和模型路径
9 image_file = 'image01.jpg'
10 model = 'starry_night.t7'
11
12 #加载风格迁移模型
13 net = cv2.dnn.readNetFromTorch('models/' + model)
14
15 #从文件中读取图像
16 image = cv2.imread('images/' + image_file)
17 (h, w) = image.shape[:2]
18 blob = cv2.dnn.blobFromImage(image, 1.0, (w, h),
19 (103.939, 116.779, 123.680), swapRB=False, crop=False)
20
21 #将图像传入风格迁移网络,并对返回结果进行计算
22 net.setInput(blob)
23 out = net.forward()
24 #print(out.shape)
25 #print(out[0])
26 #修正输出张量,加上平均减法,然后交换通道排序。
27 out = out.reshape(3, out.shape[2], out.shape[3])
28 out[0] += 103.939
29 out[1] += 116.779
30 out[2] += 123.68
31 out /= 255
32 out = out.transpose(1, 2, 0)
33
34 #显示图像到窗口,并保存图像
35 #cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
36 cv2.imshow('Image', out)
37 out *= 255.0
38 cv2.imwrite('output-' + model + '_' + image_file, out)
39 cv2.waitKey(0)
40 cv2.destroyAllWindows()

  Julia代码:

 1 using PyCall
2 cv2=pyimport("cv2")
3
4 #指定图像和模型路径
5 image_file = "image01.jpg"
6 model = "starry_night.t7"
7
8 #加载风格迁移模型
9 net = cv2.dnn.readNetFromTorch("models/" * model)
10
11 #从文件中读取图像
12 image = cv2.imread("images/" * image_file)
13 (h, w) =size(image)[1:2]
14 blob = cv2.dnn.blobFromImage(image, 1.0, (w, h),
15 (103.939, 116.779, 123.680), swapRB=false, crop=false)
16
17 #将图像传入风格迁移网络,并对返回结果进行计算
18 net.setInput(blob)
19 out = net.forward()
20 #修正输出张量,加上平均减法,然后交换通道排序。
21 out =reshape(out,(3,size(out,3),size(out,4)))
22 out[:,:,1].+=103.939
23 out[:,:,2].+=116.779
24 out[:,:,3].+=123.68
25 out /= 255
26 out = permutedims(out,(2, 3, 1))
27
28 #显示图像到窗口,并保存图像
29 #cv2.namedWindow("Image", cv2.WINDOW_NORMAL)
30 cv2.imshow("Image", out)
31 out *= 255.0
32 println("output-" * model * "_" * image_file)
33 cv2.imwrite("output-" * model * "_" * image_file, out)
34 cv2.waitKey(0)
35 cv2.destroyAllWindows()

  不过julia生成的图像和python生成的图像有差异,不知什么原因。

  这是julia生成的图像:

  这是pythn生成的图像:

  希望有高手能看看问题出在哪里。

  使用不同的风格迁移网络模型,可以生成不同风格的图像。在原书“资源包/第 35 课/models”文件夹中提供了9种已经训练好的风格迁移网络模型,大家可以选择不同的模型进行图像风格迁。

对比python学julia(第四章:人工智能)--(第四节)绘画大师的更多相关文章

  1. Python for Infomatics 第13章 网页服务四(译)

    这几天因为其他事务,打断了自己的学习计划,今天继续我的翻译,避免又中途而废. 注:文章原文为Dr. Charles Severance 的 <Python for Informatics> ...

  2. Python for Infomatics 第12章 网络编程四(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.7 用BeautifulS ...

  3. The Definitive Guide To Django 2 学习笔记(八) 第四章 模板 (四)基本的模板标签和过滤器

    标签 下面的部分概述了常见的Django标签. if/else {%if%} 标签 对一个变量值进行测试,如果结果为true,系统将会显示在{%if%} 和 {%endif%}之间的一切,看个例子: ...

  4. PRML读书会第四章 Linear Models for Classification(贝叶斯marginalization、Fisher线性判别、感知机、概率生成和判别模型、逻辑回归)

    主讲人 planktonli planktonli(1027753147) 19:52:28 现在我们就开始讲第四章,第四章的内容是关于 线性分类模型,主要内容有四点:1) Fisher准则的分类,以 ...

  5. C# Language Specification 5.0 (翻译)第四章 类型

    C# 语言的类型分为两大类:值类型(value type)和引用类型(reference type),而它们又都同时具有至少一个类型形参的泛型类型(generic type).类型形参(type pa ...

  6. Netty源码分析第4章(pipeline)---->第4节: 传播inbound事件

    Netty源码分析第四章: pipeline 第四节: 传播inbound事件 有关于inbound事件, 在概述中做过简单的介绍, 就是以自己为基准, 流向自己的事件, 比如最常见的channelR ...

  7. Netty源码分析第4章(pipeline)---->第6节: 传播异常事件

    Netty源码分析第四章: pipeline 第6节: 传播异常事件 讲完了inbound事件和outbound事件的传输流程, 这一小节剖析异常事件的传输流程 首先我们看一个最最简单的异常处理的场景 ...

  8. Netty源码分析第4章(pipeline)---->第7节: 前章节内容回顾

    Netty源码分析第四章: pipeline 第七节: 前章节内容回顾 我们在第一章和第三章中, 遗留了很多有关事件传输的相关逻辑, 这里带大家一一回顾 首先看两个问题: 1.在客户端接入的时候, N ...

  9. 简学Python第四章__装饰器、迭代器、列表生成式

    Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群  群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...

  10. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

随机推荐

  1. 8个实用的Java Streams API

    分享8个开箱即用的API,方便日常处理集合. 1. 快速过滤空值:Stream.ofNullable 该方法是在 Java 9 中引入的,有助于过滤集合中的所有空值,从而可能使我们避免空指针异常. 在 ...

  2. 引用(包含) import wxss样式

    引用(包含) 把模板定义到外部,然后多个页面间可以共用使用定义的模板WXML结构显示. https://developers.weixin.qq.com/miniprogram/dev/referen ...

  3. C# .NET Dictionary 将集合key以ascii码从小到大排序

    .NET 不加参数,默认不是按ASC II 排序 .JAVA 默认是按ASC II 排序 . Array.Sort(arrKeys, string.CompareOrdinal); 按ASC II 排 ...

  4. RAS非对称加解密-RAS加解密和签名和验签,密钥生成器(java代码)

    RAS非对称加解密-RAS加解密和签名和验签,密钥生成器(java代码)RSA 算法是一种非对称加解密算法.服务方生成一对 RSA 密钥,即公钥 + 私钥,将公钥提供给调用方,调用方使用公钥对数据进行 ...

  5. Java邮件发送解决ssl javax.mail实现方式

    package test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.activation.DataH ...

  6. 06-Linux用户和组管理

    关于用户和组的知识 家目录 用户都有家目录:root用户家目录为/root.其他用户的家目录在/home/,如user1的家目录为/home/user1 当我们创建用户时,系统就会自动创建该用户的家目 ...

  7. 深入探索 Nuxt3 Composables:掌握目录架构与内置API的高效应用

    title: 深入探索 Nuxt3 Composables:掌握目录架构与内置API的高效应用 date: 2024/6/23 updated: 2024/6/23 author: cmdragon ...

  8. 逆向通达信 x 逆向微信 x 逆向Qt

    本篇在博客园地址https://www.cnblogs.com/bbqzsl/p/18252961 本篇内容包括: win32窗口嵌入Qt UI.反斗玩转signal-slot.最后 通达信 x 微信 ...

  9. InfluxDB 常用基本配置,启用账号密码登录,配置指定端口登录

    打开安装目录下的 influxdb.conf 找到 http 节点 配置完成后再安装目录下使用命令启动 influxdb influxd --config influxdb.conf 启动完成后,基本 ...

  10. 基于python3 flet库的证书查看工具

    前言 基于python3 flet库实现了证书信息的提取,留作自用,如有错误欢迎指正. 正文 程序架构: 主程序 main.py 证书解析程序 certHandle.py 运行 python main ...