图像风格迁移已经属于比较成熟的领域了,现在连实时的风格迁移都不成问题。之前一直想出一篇这样的文章,但无奈于大部分开源项目配置起来非常麻烦,比如 luanfujun/deep-photo-styletransfer 项目,需要安装 cuda、pytorch、cudnn等等,配置能花一天的时间。
不过最近我发现一个非常好的开源应用项目,那就是基于opencv的dnn图像风格迁移。你只需要安装opencv就可以使用。
它也有局限性,我们只能用别人训练好的模型进行风格迁移,如果我们要自定义风格,那就必须配置cudn等工具,使用 deep-photo-styletransfer 等项目的方法进行训练。
不过作为初学者,我们只需要体验一下这样的风格迁移算法即可。感兴趣的同学可以再自己深入研究。今天的教程我们拿 fast-neural-style 训练好的模型对下面的图片做一次风格迁移。
1.准备
开始之前,你要确保python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细python安装指南 进行安装。
**(可选1) **如果你用python的目的是数据分析,可以直接安装anaconda:python数据分析与挖掘好帮手—anaconda,它内置了python和pip.
**(可选2) **此外,推荐大家用vscode编辑器,它有许多的优点:python 编程的最好搭档—vscode 详细指南。
请选择以下任一种方式输入命令安装依赖 :
windows 环境 打开 cmd (开始-运行-cmd)。macos 环境 打开 terminal (command+空格输入terminal)。如果你用的是 vscode编辑器 或 pycharm,可以直接使用界面下方的terminal.pip install python-opencv2.选择模型
fast-neural-style放出的模型风格一共有9种,我们将一一尝试,其中部分风格如下比如:
3.克隆opencv源码
我们直接克隆opencv开源项目中关于dnn图像迁移的例子,地址是:
https://github.com/opencv/opencv/blob/3.4.0/samples/dnn/fast_neural_style.py
代码:
import cv2 as cvimport numpy as npimport argparseparser = argparse.argumentparser( description='this script is used to run style transfer models from ' 'https://github.com/jcjohnson/fast-neural-style using opencv')parser.add_argument('--input', help='path to image or video. skip to capture frames from camera')parser.add_argument('--model', help='path to .t7 model')parser.add_argument('--width', default=-1, type=int, help='resize input to specific width.')parser.add_argument('--height', default=-1, type=int, help='resize input to specific height.')parser.add_argument('--median_filter', default=0, type=int, help='kernel size of postprocessing blurring.')args = parser.parse_args()net = cv.dnn.readnetfromtorch(args.model)if args.input: cap = cv.videocapture(args.input)else: cap = cv.videocapture(0)cv.namedwindow('styled image', cv.window_normal)while cv.waitkey(1) < 0: hasframe, frame = cap.read() if not hasframe: cv.waitkey() break inwidth = args.width if args.width != -1 else frame.shape[1] inheight = args.height if args.height != -1 else frame.shape[0] inp = cv.dnn.blobfromimage(frame, 1.0, (inwidth, inheight), (103.939, 116.779, 123.68), swaprb=false, crop=false) net.setinput(inp) 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) t, _ = net.getperfprofile() freq = cv.gettickfrequency() / 1000 print t / freq, 'ms' if args.median_filter: out = cv.medianblur(out, args.median_filter) cv.imshow('styled image', out)注意,源代码是基于python2的,所以第46行少了括号,如果你是python3请注意补上括号。
这份代码可以直接使用, parser 里定义了5个参数,--input输入要迁移的图像宽度和高度, median_filter 是中值滤波器, 基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值 ,因此理论上数值越大,图像越平滑,输出的结果细节越好(不确定)。
亲自试了一下median_filter对图像的影响,发现改变微乎其微,因此直接为默认值即可。
4.开始迁移
将第二步的代码保存到一个文件中,命名为1.py,在cmd/terminal中带参数运行脚本,其中input是源图像路径,model是迁移的风格模型文件,如运行:
python 1.py --input 1.jpg --model udnie.t7
优化的Micrium OS和新Platform Builder加速嵌入式的设计
NASA的开源软件是什么?NASA的开源软件的详细分析
近红外光谱技术发展及原理
webgis的开发技术分析
红米Note7系列全球销量突破2000万台
基于OpenCV的DNN图像风格迁移
华为商城官宣,P30 Pro限量套装在华为商城开启预约
气压式织物胀破强度仪的参数及特点说明
FPGA在电机控制中的使用越来越多
人工智能发展史
中科大与中芯国际在产学研合作中取得新进展
交换机堆叠
NV040D语音芯片在智能毛球修剪器的应用
中国的5G为什么在世界上占有一席之地
比尔·盖茨提议:机器人应该和人类一样交税
亚太区首家电动汽车充电桩CB实验室成立
锂电池保护板工作原理
基于阻抗变化趋势识别的锂离子电池充电析锂起始点在线检测
自动驾驶汽车定位技术有哪些
解决启动物联网项目六大挑战的解决方案