窝牛号

python深度学习神经网络的风格迁移,让你也可拥有梵高大师的画作

上期视频,我们分享了一个神经网络风格迁移的视频,本期我们将利用代码的方式来讲解其实现过程。

神经网络风格迁移

python+opencv实现神经网络的风格迁移

首先我们需要下载已经训练完成的神经网络模型,从视频中也可以看出来,其中应用到了好几个模型

模型下载: github.com/jcjohnson/fast-neural-style

然后把下载下来的模型放到models文件夹下,方便我们取用

import os import itertools import time import cv2 modelPaths = [] for root, dirs, files in os.walk(&34;): for file in files: modelPaths.append(os.path.join(root, file)) print(modelPaths) models = list(zip(range(0, len(modelPaths)), (modelPaths))) modelIter = itertools.cycle(models) (modelID, modelPath) = next(modelIter)

首先我们使用os.walk函数,遍历models文件夹下的所有模型的路径,并保存在modelPaths中,然后使用itertools函数建立一个循环体,用于操作迭代对象

itertools是python的一个内建模块,提供了用于操作迭代器的函数。

迭代器(Iterator)是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。在Python中是一种常用的数据结构,比起列表(list),迭代器可以提高开发体验和运行效率,按需使用。itertools模块提供的全部是处理迭代功能的函数,它们的返回值不是list,而是迭代对象。

cycle函数是将一个序列无限循环下去,通过此方式,我们便可以在循环体中使用不同的神经网络模型

net = cv2.dnn.readNetFromTorch(modelPath) vs = cv2.VideoCapture(&39;) time.sleep(2.0) i = 0

我们使用cv2.dnn.readNetFromTorch函数来加载神经网络模型,并读入一段视频,方便后期进行神经网络的迁移

while True: (grabbed, frame) = vs.read() (h, w) = frame.shape[:2] blob = cv2.dnn.blobFromImage(frame, 1.0, (w, h), (103.939, 116.779, 123.680), swapRB=False, crop=False) net.setInput(blob) output = net.forward() output = output.reshape((3, output.shape[2], output.shape[3])) output[0] += 103.939 output[1] += 116.779 output[2] += 123.680 output /= 255.0 output = output.transpose(1, 2, 0)

我们在while true里面来加载导入的视频,并一帧一帧地读取视频

(h, w) = frame.shape[:2]来获取视频帧的尺寸大小

获取到的视频帧我们使用cv2.dnn.blobFromImage函数来对图片进行预处理

预处理完成后的图片帧传入net.setInput(blob)神经网络,并使用神经网络的前向传递来预测神经网络迁移的图片

神经网络预测完成后,我们在reshape到原始图片尺寸上

i = i + 1 if i == 300: (modelID, modelPath) = next(modelIter) print(&34;.format(modelID + 1, modelPath)) net = cv2.dnn.readNetFromTorch(modelPath) i = 0

神经网络每处理一帧视频图片,我们使用i变量加1,待处理完成300帧(10s)后,我们使用前面定义的循环体进行神经网络的遍历,来选择另外一个模型来进行神经网络的风格迁移

cv2.imshow(&34;, output) key = cv2.waitKey(1) if key == ord(&39;): break fourcc = cv2.VideoWriter_fourcc(*&39;) writer = cv2.VideoWriter(&34;, fourcc, 30,(output.shape[1], output.shape[0]), True) writer.write((output*255).astype(&39;)) writer.release() vs.release()

神经网络处理完成后,便可以使用imshow函数对处理后的视频帧实时查看

通过VideoWriter函数,建立一个视频保存函数,这里的第一个参数是需要保存的视频路径

第二个参数是视频的编码格式,第三个参数为视频的帧率,每秒的视频帧数,第四个参数为输出视频的尺寸大小,这里一定要与原始视频一致,若对视频帧进行了处理,需要统一视频帧图片的尺寸

最后保存处理完成的视频,这里特别需要注意的是,由于神经网络处理的图片在[0~1]之间,而opencv处理的视频图片在[0~255]之间,这里我们需要把图片格式到0~255空间,否则保存的图片视频完全失真。

本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除

窝牛号 wwww.93ysy.com   沪ICP备2021036305号-1