Python+OpenCV 十几行代码模仿世界名画

现在很多人都喜欢拍照(自拍)。有限的滤镜和装饰玩多了也会腻,所以就有 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

目录下通过执行命令运行代码:

python fast_neural_style.py --model starry_night.t7

model 参数是提供预先训练好的模型文件路径,OpenCV 没有提供下载,但给出的参考项目 https://github.com/jcjohnson/fast-neural-style 中可以找到

其他可设置参数有:

  • input 可以指定原始图片/视频,如果不提供就默认使用摄像头实时采集。
  • widthheight,调整处理图像的大小,设置小一点可以提高计算速度。在我自己的电脑上,300x200 的转换视频可以达到 15 帧/秒。
  • median_filter 中值滤波的窗口大小,用来对结果图像进行平滑处理,这个对结果影响不大。

执行后的效果(取自 jcjohnson/fast-neural-style):

原始图像

ECCV16 models

instance_norm models

核心代码其实很短,就是 加载模型 -> 读取图片 -> 进行计算 -> 输出图片,我在官方示例基础上进一步简化了一下:

import cv2
# 加载模型
net = cv2.dnn.readNetFromTorch('the_scream.t7')
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV);
# 读取图片
image = cv2.imread('test.jpg')
(h, w) = image.shape[:2]
blob = cv2.dnn.blobFromImage(image, 1.0, (w, h), (103.939, 116.779, 123.680), swapRB=False, crop=False)
# 进行计算
net.setInput(blob)
out = net.forward()
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.68
out /= 255
out = out.transpose(1, 2, 0)
# 输出图片
cv2.imshow('Styled image', out)
cv2.waitKey(0)

执行结果:

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

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

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

参考文献: fast-neural-style jcjohnson https://github.com/jcjohnson/fast-neural-style

Perceptual Losses for Real-Time Style Transfer and Super-Resolution(ECCV 2016) Justin Johnson, Alexandre Alahi, Li Fei-Fei

A Neural Algorithm of Artistic Style(CVPR 2015) Leon A. Gatys, Alexander S. Ecker, Matthias Bethge

Neural Style Transfer with OpenCV - Adrian Rosebrock https://www.pyimagesearch.com/2018/08/27/neural-style-transfer-with-opencv/

无需GPU,只用OpenCV和Python实现图像和视频的风格迁移(译) - 论智 Bing https://mp.weixin.qq.com/s/KXA6b-ckttBSQR5DvS3SBg

可以用 Python 编程语言做哪些神奇好玩的事情?- 知乎回答 @杨航锋 https://www.zhihu.com/question/21395276/answer/115805610

用processing代码模仿梵高画杨超越 - 算法艺术实验室AALab Alice https://mp.weixin.qq.com/s/UOVww7IgCteuQ6Bsbf0yEA

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2018-10-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏量子位

手把手教你用Python实现自动特征工程

任何参与过机器学习比赛的人,都能深深体会特征工程在构建机器学习模型中的重要性,它决定了你在比赛排行榜中的位置。

3025
来自专栏章鱼的慢慢技术路

解救小哈——DFS算法举例

2718
来自专栏CVer

TensorFlow从入门到精通 | 预告篇

[TensorFlow从入门到精通]系列课程既包含TensorFlow的基础知识点(如Graph),还有卷积神经网络、模型的保存和恢复、迁移学习、Fine-Tu...

1384
来自专栏AI研习社

手把手教你用Python 和 Scikit-learn 实现垃圾邮件过滤

文本挖掘(Text Mining,从文字中获取信息)是一个比较宽泛的概念,这一技术在如今每天都有海量文本数据生成的时代越来越受到关注。目前,在机器学习模型的帮助...

3918
来自专栏专知

【干货】利用NLTK和Gensim进行主题建模(附完整代码)

4014
来自专栏机器学习人工学weekly

机器学习人工学weekly-2018/3/17

1. PyTorch构架分析 PyTorch – Internal Architecture Tour 链接:http://blog.christianper...

3147
来自专栏新智元

【AI可能真的要代替插画师了】复旦同济用cGAN生成动画人物

【新智元导读】复旦大学、同济、CMU等的研究者使用cGAN生成各种属性的二次元人物头像,效果非常令人印象深刻。生成的图片质量非常之高,本文作者认为这项工作如果加...

4605
来自专栏PPV课数据科学社区

【学习】SPSS探索分析实践操作

SPSS为我们提供了探索分析,所谓探索分析之所以是探索,是因为有时候我们对于变量的分布特点不是很清楚,探索的目的在于帮助我们完成以下的工作:识别...

3818
来自专栏大数据文摘

数据挖掘比赛通用框架

2898
来自专栏机器之心

资源 | 用自注意力GAN为百年旧照上色:效果惊艳,多图预警!

项目地址:https://github.com/jantic/DeOldify/blob/master/README.md

966

扫码关注云+社区

领取腾讯云代金券