图片风格迁移已经是一个比较成熟的领域,现在连实时风格迁移都不是问题。之前一直在想这样一篇文章,可惜大多数开源项目配置起来很麻烦,比如luanfujun/deep-photo-styletransfer这个项目,需要安装CUDA、Pytorch、cudnn等,并且配置可以花一天时间。不过最近发现了一个非常不错的开源应用项目,就是基于OpenCV的DNN图像风格迁移。您只需要安装OpenCV即可使用它。它也有局限性。我们只能使用别人训练好的模型进行风格迁移。如果我们要自定义样式,就必须配置cudn等工具,使用deep-photo-styletransfer等方法进行训练。但是作为初学者,我们只需要体验这样的风格迁移算法即可。有兴趣的同学可以自行进一步学习。在今天的教程中,我们使用fast-neural-style训练好的模型对下图进行风格迁移。1.在开始之前,您需要确保您的计算机上已经成功安装了Python和pip。(可选1)如果使用Python进行数据分析,可以直接安装Anaconda,Anaconda内置了Python和pip。.(可选2)另外,推荐大家使用VSCode编辑器,它有很多优点。请选择以下方式之一输入命令安装依赖项:Windows环境打开Cmd(开始-运行-CMD)。MacOS环境打开Terminal(command+空格进入Terminal)。如果您使用的是VSCode编辑器或Pycharm,则可以直接使用界面底部的Terminal。pip安装python-opencv2。选择模型fast-neural-style一共发布9种模型样式,我们会一一尝试,其中部分样式如下例如:candymosaicstarry_nightudnie模型文件可以扫描下方二维码关注Python实战宝典,回复风格迁移下载,里面有全部9种模型风格的资源和源码。3、克隆OpenCV源码我们直接克隆了OpenCV开源项目中DNN图像迁移的例子。importcv2ascvimportnumpyasnpimportargparseparser=argparse.ArgumentParser(description='此脚本用于从''https://github.com/jcjohnson/fast-neural-styleusingOpenCV')parser.add_argument('--input',help='图像或视频的路径。跳过从相机捕获帧')parser.add_argument('--model',help='Pathto.t7model')parser.add_argument('--width',default=-1,type=int,help='将输入调整为特定宽度。')parser.add_argument('--height',default=-1,type=int,help='将输入调整为特定宽度height.')parser.add_argument('--median_filter',default=0,type=int,help='Kernelsizeofpostprocessingblurring.')args=parser.parse_args()net=cv.dnn.readNetFromTorch(args.model)ifargs.input:cap=cv.VideoCapture(args.input)else:cap=cv.VideoCapture(0)cv.namedWindow('Styledimage',cv.WINDOW_NORMAL)whilecv.waitKey(1)<0:hasFrame,frame=cap.read()如果没有hasFrame:cv.waitKey()breakinWidth=args.widthifargs.width!=-1elseframe.shape[1]inHeight=args.heightifargs.height!=-1elseframe.shape[0]inp=cv.dnn.blobFromImage(帧,1.0,(inWidth,inHeight),net.setInput(inp).rewardout=(3,out.shape[2],out.shape[3])out[0]+=103.939out[1]+=116.779out[2]+=123.68out/=255out=out.transpose(1,2,0)t,_=net.getPerfProfile()freq=cv.getTickFrequency()/1000打印t/freq,'ms'ifargs.median_filter:out=cv.medianBlur(out,args.median_filter)imowcv.('Styledimage',out)注意源码是基于Python2的,所以少了括号第46行,如果你是Python3,请注意加括号,这段代码可以直接使用,parser中定义了5个参数,--输入要迁移的图片的宽高,median_filter是一个中值filter,基本思想是用像素邻域的灰度值的中值代替像素的灰度值,所以in理论上,值越大,图像越好,越平滑,输出中得到的细节越好(不确定)。个人试过median_filter对图像的效果,发现变化很小,直接设置为默认值即可。4.开始迁移。将第二步的代码保存成一个文件,命名为1.py,在CMD/Terminal中运行带参数的脚本,其中input为源图片路径,model为迁移的样式模型文件,如运行:python1.py--input1.jpg--modeludnie.t7效果:9种风格全部传递效果:如果喜欢今天的Python教程,可以关注公众号:Python编程学习圈了解更多编程技术干货!
