设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 9243|回复: 5
打印 上一主题 下一主题

Python+OpenCV 图像风格迁移(模仿名画)

[复制链接]

169

主题

1

好友

733

积分

版主

Rank: 7Rank: 7Rank: 7

跳转到指定楼层
楼主
发表于 2018-10-15 22:38:29 |只看该作者 |倒序浏览

现在很多人都喜欢拍照(自拍)。有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了模仿名画风格的功能,比如 prisma、versa 等,可以把你的照片变成 梵高、毕加索、蒙克 等大师的风格。

这种功能叫做“图像风格迁移”,几乎都是基于 CVPR 2015 的论文《A Neural Algorithm of Artistic Style》和 ECCV 2016 的论文《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》中提出的算法,以及后续相关研究的基础上开发出来的。

通俗来讲,就是借助于神经网络,预先将名画中的风格训练成出模型,在将其应用在不同的照片上,生成新的风格化图像。
来自《A Neural Algorithm of Artistic Style》
而因为神经网络在计算机视觉方面的应用越来越广,著名的视觉开发库 OpenCV 在 3.3 版本中正式引入 DNN(深度神经网络),支持 Caffe、TensorFlow、Torch/PyTorch 等主流框架的模型,可用以实现图像的识别、检测、分类、分割、着色等功能。我最近才发现在 OpenCV 的 Sample 代码中就有图像风格迁移的 Python 示例(原谅我的后知后觉),是基于 ECCV 2016 论文中的网络模型实现。所以,即使作为人工智能的菜鸟,也可以拿别人训练好的模型来玩一玩,体会下神经网络的奇妙。

(相关代码和模型的获取见文末)

OpenCV 官方代码地址: https://github.com/opencv/opencv/blob/3.4.0/samples/dnn/fast_neural_style.py

目录下通过执行命令运行代码:
  1. python fast_neural_style.py --model starry_night.t7
复制代码
model 参数是提供预先训练好的模型文件路径,OpenCV 没有提供下载,但给出的参考项目 https://github.com/jcjohnson/fast-neural-style  中可以找到

其他可设置参数有:
input 可以指定原始图片/视频,如果不提供就默认使用摄像头实时采集。width、height,调整处理图像的大小,设置小一点可以提高计算速度。在我自己的电脑上,300x200 的转换视频可以达到 15 帧/秒。median_filter 中值滤波的窗口大小,用来对结果图像进行平滑处理,这个对结果影响不大。
执行后的效果(取自 jcjohnson/fast-neural-style):
原始图像ECCV16 modelsinstance_norm models
核心代码其实很短,就是 加载模型 -> 读取图片 -> 进行计算 -> 输出图片,我在官方示例基础上进一步简化了一下:
  1. import cv2
  2. # 加载模型
  3. net = cv2.dnn.readNetFromTorch('the_scream.t7')
  4. net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV);
  5. # 读取图片
  6. image = cv2.imread('test.jpg')
  7. (h, w) = image.shape[:2]
  8. blob = cv2.dnn.blobFromImage(image, 1.0, (w, h), (103.939, 116.779, 123.680), swapRB=False, crop=False)
  9. # 进行计算
  10. net.setInput(blob)
  11. out = net.forward()
  12. out = out.reshape(3, out.shape[2], out.shape[3])
  13. out[0] += 103.939
  14. out[1] += 116.779
  15. out[2] += 123.68
  16. out /= 255
  17. out = out.transpose(1, 2, 0)
  18. # 输出图片
  19. cv2.imshow('Styled image', out)
  20. cv2.waitKey(0)
复制代码
执行结果:

另外还改了个多效果实时对比的版本(计算量大了,很卡顿),也一并上传在代码中。

PS:前两天看赵雷演唱会的时候我还说:他演唱会的背景 MV 大量使用了 图像二值化、边缘检测 等操作,让我想到以前数字图像处理课的大作业……现在图像风格迁移的效率达到了实时,想必以后也会经常被使用吧



获取文中相关代码和模型下载地址,请在公众号(Crossin的编程教室)对话中回复关键字 名画



════其他文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | 如何debug? | Python单词表 | 知乎下载器 | 人工智能 | 嘻哈 | 爬虫 | 我用Python | 抓抖音 | requests | AI平台

欢迎微信搜索及关注:Crossin的编程教室

回复

使用道具 举报

0

主题

0

好友

4

积分

新手上路

Rank: 1

沙发
发表于 2018-10-17 23:14:02 |只看该作者
你好,我想请问一下要加哪个代码才能把修改后的图片保存下来呀~我用cv2.imwrite(' ', out )这个代码存出来的图片是黑色的~
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2018-10-18 21:28:46 |只看该作者
szlibaojia 发表于 2018-10-17 23:14
你好,我想请问一下要加哪个代码才能把修改后的图片保存下来呀~我用cv2.imwrite(' ', out )这个代码存出来 ...

out /= 255
保存的话把这句去掉
因为两种方式的数值范围不一样,一个是0~1,一个是0~255
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

6

主题

0

好友

166

积分

注册会员

Rank: 2

地板
发表于 2018-11-17 00:36:44 |只看该作者
老师,请问怎么加载模型呢
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2018-11-17 14:08:01 |只看该作者
东东哥 发表于 2018-11-17 00:36
老师,请问怎么加载模型呢
  1. python fast_neural_style.py --model starry_night.t7
复制代码
t7 文件就是模型,下载了放到代码同一目录,然后通过命令行参数传入文件名
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

6

主题

0

好友

166

积分

注册会员

Rank: 2

6#
发表于 2018-11-17 17:49:18 |只看该作者
crossin先生 发表于 2018-11-17 14:08
t7 文件就是模型,下载了放到代码同一目录,然后通过命令行参数传入文件名 ...

谢谢老师
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-4-26 23:18 , Processed in 0.026508 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部