​我正在参与「启航方案」

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

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

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

通俗来讲,便是借助于神经网络,预先将名画中的风格训练成出模型,在将其运用在不同的相片上,生成新的风格化图画。

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

来自《A Neural Algorithm of Artistic Style》

而因为神经网络在核算机视觉方面的运用越来越广,著名的视觉开发库 OpenCV 在 3.3 版别中正式引进 DNN(深度神经网络),支撑 Caffe、TensorFlow、Torch/PyTorch 等干流结构的模型,可用以完成图画的辨认、检测、分类、切割、上色等功用。

OpenCV 的 Sample 代码中有图画风格迁移的 Python 示例,是根据 ECCV 2016 论文中的网络模型完成。所以,即便作为人工智能的菜鸟,也能够拿别人训练好的模型来玩一玩,体会下神经网络的奇妙。

OpenCV 官方代码地址

github.com/opencv/open…

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

python fast_neural_style.py --model starry_night.t7

model 参数是供给预先训练好的模型文件路径,OpenCV 没有供给下载,但给出的参阅项目 github.com/jcjohnson/f… 中能够找到

其他可设置参数有:

  • input 能够指定原始图片/视频,假如不供给就默许运用摄像头实时收集。

  • widthheight,调整处理图画的巨细,设置小一点能够进步核算速度。在我自己的电脑上,300×200 的转换视频能够到达 15 帧/秒。

  • median_filter 中值滤波的窗口巨细,用来对成果图画进行滑润处理,这个对成果影响不大。

原始图画:

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

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

ECCV16 models:

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

instance_norm models:

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

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

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)

履行成果:

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

另外还改了个多效果实时比照的版别(核算量大了,很卡顿),也同时上传在代码中。

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

文中案例源码:gitee.com/crossin/sni…