0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教你如何用OpenCV、Python和深度学习技术对图像和实时视频进行神经风格迁移

zhKF_jqr_AI 来源:未知 作者:李倩 2018-08-31 09:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

编者按:在这篇教程中,作者Adrian Rosebrock将教你如何用OpenCV、Python深度学习技术对图像和实时视频进行神经风格迁移。

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.pyimagesearch.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行)

利用itertools和cycle创建迭代器(27行)。

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

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

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

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

对按键的处理:

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

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

“q”:按下q会退出while循环。

实时风格迁移的结果

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

可以看到,只需要按一个按键就能轻松地进行循环。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11221

    浏览量

    222997
  • 图像
    +关注

    关注

    2

    文章

    1096

    浏览量

    42163
  • 深度学习
    +关注

    关注

    73

    文章

    5591

    浏览量

    123921

原文标题:无需GPU,只用OpenCV和Python实现图像和视频的风格迁移

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    那些年我用OpenCV+Qt趟过哪些坑?写给视觉应用开发者的避坑指南

    预处理、二值化分析、测量) 16. 案例:图像修复与水印智能移除工具 (传统图像算法与深度学习的结合、交互式编辑) 回过头看,从早期写一个按钮功能都要百度半天,到现在能规划整个系统的
    发表于 12-02 09:43

    从0到1,10+年资深LabVIEW专家,手把手教你攻克机器视觉+深度学习(5000分钟实战课)

    “告别检测系统能力缺陷!10+年LabVIEW视觉资深专家手把手教你:5000+分钟高清教程(含工具、算法原理、实战操作、项目优化全流程讲解)”——从传统视觉算法→深度学习建模→工业级部署"
    的头像 发表于 12-02 08:07 120次阅读
    从0到1,10+年资深LabVIEW专家,手把手<b class='flag-5'>教你</b>攻克机器视觉+<b class='flag-5'>深度</b><b class='flag-5'>学习</b>(5000分钟实战课)

    基于FPGA利用sm4进行实时图像加密

    求一份在fpga上利用sm4进行实时图像加密的文件
    发表于 09-15 19:05

    如何在机器视觉中部署深度学习神经网络

    图 1:基于深度学习的目标检测可定位已训练的目标类别,并通过矩形框(边界框)对其进行标识。 在讨论人工智能(AI)或深度学习时,经常会出现“
    的头像 发表于 09-10 17:38 705次阅读
    如何在机器视觉中部署<b class='flag-5'>深度</b><b class='flag-5'>学习</b><b class='flag-5'>神经</b>网络

    【Sipeed MaixCAM Pro开发板试用体验】基于MaixCAM-Pro的AI生成图像鉴别系统

    技术落地到了一个小小的边缘设备MaixCAM-Pro上。它不仅展示了深度学习图像取证领域的强大能力,更体现了边缘AI在现实世界中的应用价值——无需依赖云端,即可在本地快速、安全、低成
    发表于 08-21 13:59

    深度学习对工业物联网有哪些帮助

    深度学习作为人工智能的核心分支,通过模拟人脑神经网络的层级结构,能够自动从海量工业数据中提取复杂特征,为工业物联网(IIoT)提供了从数据感知到智能决策的全链路升级能力。以下从技术赋能
    的头像 发表于 08-20 14:56 769次阅读

    【GM-3568JHF开发板免费体验】OpenCV开发环境安装和计数程序开发

    、 Android 等系统上运行,并通过Python接口简化操作。 sudo apt install libopencv-dev python3-opencv 四、OpenCV图像
    发表于 08-09 13:30

    itop-3568开发板机器视觉opencv开发手册-图像绘制-画线

    用 imshow()函数对画线之后的图像进行展示; 第 8 行使用了 waitKey()函数,持续显示展示照片直到按键的按下。 保存退出之后,在终端界面中输入以下命令进行 python
    发表于 06-04 10:38

    【「# ROS 2智能机器人开发实践」阅读体验】视觉实现的基础算法的应用

    : 一、机器人视觉:从理论到实践 第7章详细介绍了ROS2在机器视觉领域的应用,涵盖了相机标定、OpenCV集成、视觉巡线、二维码识别以及深度学习目标检测等内容。通过学习,我认识到:
    发表于 05-03 19:41

    基于LockAI视觉识别模块:C++图像采集例程

    本文主要演示如何使用LockAI视觉识别模块进行视频流的读取,同时使用Edit模块进行图像传输。基础知识讲解1.1OpenCV简介
    的头像 发表于 04-30 18:23 566次阅读
    基于LockAI视觉识别模块:C++<b class='flag-5'>图像</b>采集例程

    何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板

    本文将介绍基于米尔电子MYD-LMX93开发板(米尔基于NXPi.MX93开发板)的基于OpenCV的人脸检测方案测试。OpenCV提供了一个非常简单的接口,用于相机捕捉一个视频(我用的电脑内置
    的头像 发表于 04-15 11:51 653次阅读
    如<b class='flag-5'>何用</b><b class='flag-5'>OpenCV</b>的相机捕捉<b class='flag-5'>视频</b><b class='flag-5'>进行</b>人脸检测--基于米尔NXP i.MX93开发板

    BP神经网络与深度学习的关系

    ),是一种多层前馈神经网络,它通过反向传播算法进行训练。BP神经网络由输入层、一个或多个隐藏层和输出层组成,通过逐层递减的方式调整网络权重,目的是最小化网络的输出误差。 二、深度
    的头像 发表于 02-12 15:15 1360次阅读

    BP神经网络在图像识别中的应用

    BP神经网络在图像识别中发挥着重要作用,其多层结构使得网络能够学习到复杂的特征表达,适用于处理非线性问题。以下是对BP神经网络在图像识别中应
    的头像 发表于 02-12 15:12 1195次阅读

    深度学习入门:简单神经网络的构建与实现

    深度学习中,神经网络是核心模型。今天我们用 Python 和 NumPy 构建一个简单的神经网络。 神经
    的头像 发表于 01-23 13:52 855次阅读

    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV

    识别、分类、跟踪、场景重建等。这可能涉及到机器学习深度学习模型的应用。 简而言之,图像处理是计算机视觉的基础,提供了必要的工具和技术来预处
    发表于 12-14 09:31