现在很多人都喜欢拍照(自拍). 有限的滤镜和装饰玩多了也会腻, 所以就有 App 提供了模仿名画风格的功能, 比如 prisma,versa 等, 可以把你的照片变成 梵高, 毕加索, 蒙克 等大师的风格.
这种功能叫做 "图像风格迁移", 几乎都是基于 CVPR 2015 的论文《A Neural Algorithm of Artistic Style》和 ECCV 2016 的论文《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》中提出的算法, 以及后续相关研究的基础上开发出来的.
通俗来讲, 就是借助于神经网络, 预先将名画中的风格训练成出模型, 在将其应用在不同的照片上, 生成新的风格化图像.
而因为神经网络在计算机视觉方面的应用越来越广, 著名的视觉开发库 OpenCV 在 3.3 版本中正式引入 DNN(深度神经网络), 支持 Caffe,TensorFlow,Torch/PyTorch 等主流框架的模型, 可用以实现图像的识别, 检测, 分类, 分割, 着色等功能.
我最近才发现在 OpenCV 的 Sample 代码中就有图像风格迁移的 Python 示例(原谅我的后知后觉), 是基于 ECCV 2016 论文中的网络模型实现. 所以, 即使作为人工智能的菜鸟, 也可以拿别人训练好的模型来玩一玩, 体会下神经网络的奇妙.
(相关代码和模型的获取见文末)
OpenCV 官方代码地址:
目录下通过执行命令运行代码:
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 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 的编程教室) 对话中回复关键字 名画
来源: https://juejin.im/post/5bc4aab25188255c82553d63