对比python学julia(第四章:人工智能)--(第四节)绘画大师

  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种已经训练好的风格迁移网络模型,大家可以选择不同的模型进行图像风格迁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章