社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

无需GPU,用OpenCV和Python实现图/视频风格迁移

落寞的搬运工 • 6 年前 • 844 次点击  

作者:Adrian Rosebrock

编译:Bing

2015年,Gatsys等人在论文A Neural Algorithm of Artistic Style中提出了最初的神经风格迁移算法。2016年,Johnson等人发表了 Perceptual Losses for Real-Time Style Transfer and Super-Resolutioin一文,将神经网络迁移作为用感知损失处理超分辨率问题的框架。结果表明该算法比Gatys等人的方法快了三倍。接下来,我将介绍如何在自己的图像和视频流中应用神经风格迁移。

用OpenCV进行神经风格迁移

首先说明的一点是,今天讨论的方法在一个CPU上可以达到近乎实时的效果,如果在GPU上则完全可以实现实时效果。

首先我们会简单塔伦下什么是神经风格迁移,以及它是如何运作的。之后我们会用OpenCV和Python动手操作。

什么是神经风格迁移?

从左至右:我们的内容图像;风格图像;输出的风格迁移图像

神经风格迁移主要有两个过程:

  • 提取某张图片的风格
  • 将该种风格应用到另一张图片上

上图就是将梵高著名的画作《星夜》的风格应用到普通的生活照上,我们保留了原照片中的山、人物和啤酒等所有内容,但全部替换成了梵高的油画风格。

问题就是,我们应该如何定义一个神经网络,让它执行神经风格迁移呢?

神经风格迁移如何工作?

在Gatys等人提出的首篇论文中,神经风格迁移算法不需要新的架构。相反,我们可以用一个预训练网络(通常在ImageNet上进行的预训练),并且定义一个损失函数,能让我们达到风格迁移的目标,然后对损失函数不断优化。

那么,这里的问题就不是“该用什么神经网络”了,而是“该用什么损失函数”。

答案包括:内容损失风格损失总变差损失。每个部分都是单独计算,然后在一个元损失函数中结合。通过将元损失函数最小化,我们将依次对内容、风格和总变差损失进行优化。

虽然Gatys等人的方法能生成不错的神经风格迁移结果,但是它的速度非常慢。2016年,Johnson等人在Gatys的基础上提出的全新算法速度快了三倍,但同时也存在着缺点,即用户不能随机选择想要应用的风格图像。用户首先要训练一个网络,生成你想要的风格。网络训练好后,你可以将它应用到任意内容图像上。

然而到了2017年,Ulyanov等人发表了Instance Normalization: The Missing Ingredient for Fast Stylization一文,他们表示将batch normalization替换成instance normalization(然后在训练和测试时都应用instance normalization),可以达到更快的效果,并且艺术效果也更好。

项目结构

在开始今天的教程前,请先下载我提供的资料(点击文末原文地址获取资料)。准备好了脚本、模型和图像后,你可以用tree指令检查项目的结构:

如果你从下载了.zip文件,就无需上网找其他素材了。我在其中提供了很多测试用的图像和模型。同时还有三种Python脚本。

开始神经风格迁移

接下来让我们用OpenCV和Python进行神经风格迁移的实践。

首先打开neural_style_transfer.py文件,插入如下代码:

我们导入所需的包并解析命令行参数。

导入的有:

  • imutils:这个包可以通过pip install --upgrade imutils安装。最近我发布了imutils==0.5.1,所以不要忘记更新!
  • OpenCV:你需要一个OpenCV 3.4或者更高版本。

该脚本下需要两个命令行:

  • --model:神经风格迁移的模型路径。在“下载”区中,我加入了11中经过与训练的模型。
  • --image:需要进行风格迁移的图像(输入图像)。在其中我放入了四张图片。

你不需要改变命令行代码,参数会在运行过程中进行处理。如果你不熟悉这一过程,可以阅读我另一篇文章:www.pyimagese arch.com/2018/03/12/python-argparse-command-line-arguments/

接下来的部分比较有趣,我们要下载图像和模型,然后计算神经风格迁移:

在这部分代码中,我们进行了:

  • 将下载的预训练神经风格迁移模型称为net(第17行);
  • 下载输入图像并调整尺寸(21和22行);
  • 用均值减法创建blob(27和28行);
  • 执行forward,获取output图像(31行)。

接下来,重要的是对输出图像进行后处理:

最后一步是将输出图像显示在屏幕上:

神经风格迁移结果

当你下载好文件后,打开终端执行以下命令:

现在,对命令行参数做简单改变,然后用《侏罗纪公园》中的截图作为内容图像,进行风格迁移:

另一个例子:

这是我最喜欢的案例,感觉都能当做酒吧的装饰画了。

实时神经风格迁移

上面我们讲了如何在单一图像上应用风格迁移,现在我们要把这一过程放在视频上。

大致流程和图像处理差不多,在这一脚本中,我们将:

  • 利用一个特殊的Python迭代器,它可以让我们在模型路径中循环使用所有可用的神经风格迁移模型。
  • 启动网络摄像头视频流,我们会(近乎)实时处理摄像头的帧。对于某些较大的模型,系统可能会慢一些。
  • 在每一帧上应用风格迁移,对输出进行后处理,并将结果显示在屏幕上。
  • 如果用户按下“n”键,我们将把迭代器循环运用到下一个神经风格迁移模型上,不用重启脚本。

首先,打开neural_style_transfer_video.py文件,插入以下代码:

之后,创建模型路径迭代器:

一旦我们开始在while循环中处理帧,“n”按键就会在迭代器中下载“下一个”模型。

为了创建模型迭代器,我们:

  • 搜集所有神经风格迁移模型并分类(18和19行)
  • 为每种模型分配ID(23行)
  • 利用itertoolscycle创建迭代器(27行)。

让我们开始下载第一个模型并对视频进行处理:

在32行,我们读取了第一个模型利用的路径。在36和37行,启动了视频,从摄像头中采集帧。

之后在帧与帧之间进行循环:

接着进行后处理并将输出图像展示出来:

对按键的处理:

两种不同的按键会对脚本运行产生不同的影响:

  • “n”:抓取下一个模型的路径和ID,并进行下载。如果我们已经获取上一个模型,迭代器就会从头开始循环。
  • “q”:按下q会退出while循环。

实时风格迁移的结果

执行以下命令就可以在视频上运用风格迁移啦:

可以看到,只需要按一个按键就能轻松地进行循环。下面是我自己做的demo视频:

无需GPU,只用OpenCV和Python实现图像和视频的风格迁移
今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/zgFC7O3Sez
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/23295
 
844 次点击