我正在参与「启航方案」
现在很多人都喜欢摄影(自拍)。有限的滤镜和装修玩多了也会腻,所以就有 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 官方代码地址:
github.com/opencv/open…
目录下通过履行命令运行代码:
python fast_neural_style.py --model starry_night.t7
model
参数是供给预先训练好的模型文件路径,OpenCV 没有供给下载,但给出的参阅项目 github.com/jcjohnson/f… 中能够找到
其他可设置参数有:
-
input
能够指定原始图片/视频,假如不供给就默许运用摄像头实时收集。 -
width
、height
,调整处理图画的巨细,设置小一点能够进步核算速度。在我自己的电脑上,300×200 的转换视频能够到达 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)
履行成果:
另外还改了个多效果实时比照的版别(核算量大了,很卡顿),也同时上传在代码中。
文中案例源码:gitee.com/crossin/sni…