百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

怎样利用AWS、Docker和深度学习伪造成一个艺术家

toyiye 2024-06-24 19:13 10 浏览 0 评论

“能工摹形,巧匠窃意(Good artists copy, great artists steal)” —— 毕加索

在英国第四频道纪录片系列之“Faking it”中,Paul O’Hare(一名来自利物浦的画家和室内装潢师)需要在四个星期的时间内,将自己伪装成一个艺术家,并且尝试着去欺骗伦敦美术馆的评论家。我们将要展示如何利用Docker、AWS和深度学习来完成这个任务,并且完成任务所需的时间控制在半小时内,这甚至包含了你阅读这篇文章的时间。此外,所需的费用不高于$10。

神来之笔

为了加速伪装的速度,我们将会利用一个人工智能系统。这个系统基于深度神经网络,该网络能够创造出和某个艺术家风格一模一样的艺术作品(至少我们是无法辨别的)。这是如何实现的?这是通过将一个图片的内容(肖像画或者风景画)和另外一个图片的样式(这通常是某个知名艺术家的作品)整合在一起实现的。我们将会使用一个叫做neural-style的算法来完成这个任务,它基于强大的深度网络来对图片进行处理。

听起来似乎很复杂,通过直接观看我们新创作的图片,就很容易认识到我们究竟在做什么。看到这些图片,也不枉我们花费上千小时来科研和写代码啊:)。

这个算法神秘的效果是通过复用一个预建立好的深度神经网络(VGG19)来实现的,这个网络是由牛津大学的研究人员和ImageNet Challenge 2014 image processing competition的获胜者开发的。这个网络应用了多层卷积神经网络(CNNs),它能够将一个图片从原始像素提炼成更高层次的、更概念化的表示。事实上,抽象层次之高足以将图片的样式原样地表示出来。正是通过将原始像素转换成样式的方式,系统才能以某个图片的样式来重画另外一个图片的像素。

到目前为止,实现和部署这个算法不是一个简单的任务。我们将会在剩下的内容中解释如何做到它,并且所要求运行的的命令不超过三个。不过在这之前,让我们介绍些更细节的内容。除了VGG19,我们还需要:

  • 一个画板——torch 数据挖掘库,它能够让我们模拟一个画家(基于Justin Johnson的工作)

  • 以及一个加速我们制图过程的方式,毕竟我们不想要花费几天、几个星期,甚至几个月来等待结果。因此,我们将会使用图形处理单元(GPU)加上一个传统的CPU来加速我们的深度学习算法,成功将等待的时间减低到几分钟。

问题

我们已经很接近目标了。但是我们还需要解决最后一个挑战。工具、库、算法的创新、依赖和变化会使得运行环境被破坏。仅仅是大量的库和依赖就给运行算法带来了许多问题:

  • Nvidia GPU驱动,为了使用GPU

  • CUDA开发套件,为了控制GPU

  • Cudnn库,为了使用GPU深度网络计算

  • Torch7,一个深度网络开发的框架,以及它的依赖(protobuf)

  • Loadcaffe lua 模块,为了加载预建立好的网络,这也是我们应用VGG19的方式。

为了获得更加卓越的结果,我们需要用不同的图片,样式和参数来运行这个算法,而以上的所有软件是自动化这个过程的必需品。这带来了一个非常脆弱的环境,因为只要有任何不可逆转的更新被引入到GPU驱动或者torch库中,整个系统就会停止工作。这意味着不仅仅第一次的环境搭建是繁重的,并且为了保持系统运行,我们还需要一次次地重复这个过程。这离我们的理想状态非常遥远:艺术家灵感出现时,画布必须在手上。类似地,当我们创意迸发时,我们的工具必须能够立马运行,我们不能受制于一个永远在变化的环境。

很明显,Docker是解决这个问题的好办法。但是,还有一个棘手的问题:Docker将我们的进程从环境分离,同时分离了宿主机上的特定硬件资源。不幸的是,我们的深度神经网络算法需要对GPU的直接访问。Docker是基础方法,但是我们还需要其他的东西。

解决办法是nvidia-docker,它对docker进行了封装,允许容器利用NVIDIA GPU。通过这个命令,Docker会通过一个卷自动挂载宿主机上的GPU驱动到容器中,通过这个方式,任何Docker进程就能够在宿主机的GPU上运行代码了。

有了Docker,现在,我们对宿主机的要求直线下降:我们只需要安装Docker,nvidia-docker,以及正确的GPU驱动。剩下的依赖都包含在Docker镜像中,这个镜像通过Dockerfile创建,因此具有可重复创建的特性,同时这保证了所有不断变化的依赖都被固定在某个能够正确工作的版本上。

画图工具

现在我们所需要的仅仅是一个能够运行我们系统的机器。我们使用了公有云,这里选择了AWS和它的GPU优化虚拟机。AWS提供了两个类型的GPU实例,但我们选择了最新的P2 AWS EC2实例。这些实例是专门为了深度学习而设计的,和我们现在的项目很符合。让我们开始构建它吧:

$ docker-machine create — driver amazonec2 \

-- amazonec2-instance-type p2.xlarge \

-- amazonec2-access-key *** \

-- amazonec2-secret-key *** nvidia-docker

在运行这个命令前,你需要:

  1. 安装Docker on Mac,Docker on Windows,或者docker-machine。

  2. 创建AWS的账户。不幸的是,P2或G2实例不包含在AWS免费计划中,但我们可以花费少于$10的金钱来创造大量的艺术品。如果你的电脑拥有一个NUIDA GPU,那么你也能够在本地运行我们的脚本。

  3. 创建一个access/secret密钥对

  4. 由于默认情况下你不允许使用P2和G2实例,因此你需要在AWS上打开一个ticket来增加P2和G2实例的使用限制。完成这些只需要少于一小时的时间。

安装NVIDIA驱动和nvidia-docker是第二个步骤。我们已经提供了一个简单的脚本来完成这些事情:

$ docker-machine ssh nvidia-docker

$ git clone https://github.com/albarji/neural-style-docker

$ cd neural-style-docker

$ ./scripts/install-nvidia.sh

如果一切顺利,你将会得到以下输出结果:

上面命令仅仅是安装了nvidia软件包,并且输出了GPU卡的信息,以此确保一切正常。

画画之前,你必须闭上眼,轻声吟唱……

毕加索如是说。但在闭上眼之前,我们还有最后一个步骤:部署我们的神奇算法:

$ ./scripts/fake-it.sh goldengate.jpg vangogh.jpg

现在,你只需要下载产生的图片,然后将它们发布在艺术论坛,比如说Devianart,或者将它们展示在本地的艺术馆中:) 从你的电脑运行以下命令:

$ docker-machine scp -r docker-nvidia:/home/ubuntu/neural-style-docker/output .

然后在当前的目录下你就能看到新产生的图片了(在这个例子中,图片的名字是goldengate_by_vangogh.jpg)。

下面是更多的例子:

给我一个美术馆……

我将能够填满它,毕加索如是说。现在,我们也能够做到!并且不需要花费一生的时间。我们已经提供了一些风格和内容,因此你只需要坐下来,放轻松,闭上眼,然后轻声吟唱。通过将不同的风格应用在同一幅画上,我们将能够清楚地看到不同的画家是如何用不同的风格来绘制同一个场景或肖像的。

为了表达对Docker的感谢,为了我们生命中的点点滴滴,我们决定开放我们自己的Docker美术馆:

Afremov imagining Docker

Docker was used in the Roman Empire, as this old mosaic proves

This alleyway depicts an urban graffiti of Docker

A modern dockerized city by Hundertwasser

A classic dockerized city by Renoir

Ancient greek pottery was distributed in containers

Picasso innovated a great deal using Docker

Van Gogh was impressed by Docker

Every math professor knows about the containerability theorem

Docker run potatoes

现在轮到你了。选择你最喜欢的艺术家或者艺术作品,将你自己的图片转换成艺术品。请将你的成果分享给我们!并且关注我们的Twitter(@albarjip and @lherrerabenitez)。

PS:结束创作后,不要忘记停止和删除你的P2实例。

$ docker-machine rm nvidia-docker

我们的艺术馆:

  • http://lherrerabenitez.deviantart.com/gallery/

  • http://albarji.deviantart.com/gallery/60433505/neuralstyle

机器学习、数据挖掘以及Docker的参考文献

不了解机器学习、数据挖掘和Docker的、并且想要了解它们的朋友,请点击下面的链接:

  • https://arxiv.org/abs/1508.06576?——?A neural algorithm of style

  • http://www.robots.ox.ac.uk/~vgg/publications/2015/Simonyan15/?——Very Deep Convolutional Networks for Large-Scale Image Recognition (VGG19 network)

  • https://github.com/jcjohnson/neural-style?——A torch implementation of the paper A Neural Algorithm of Artistic Style by Leon A. Gatys, Alexander S. Ecker, and Matthias Bethge.

  • http://image-net.org/challenges/LSVRC/2014/?——ImageNet 2014 Challenge

  • https://www.coursera.org/learn/machine-learning?——?Andrew Ng Machine Learning Course

  • https://github.com/soumith/cvpr2015/blob/master/Deep%20Learning%20with%20Torch.ipynb?——Deep Learning with Torch

  • https://github.com/docker/labs?——Docker Tutorials

  • https://github.com/NVIDIA/nvidia-docker——?NVIDIA Docker

构建和优化Docker镜像

我们想要优化和减少镜像的体积。你能够帮助我们吗?

  • 下载项目:

$ git clone https://github.com/albarji/neural-style-docker

  • 修改项目文件

  • 构建新的镜像:

$ sudo nvidia-docker build -t neural-style:2.0 .

  • 运行测试代码:

$ sudo nvidia-docker run — rm -v $(pwd):/images — entrypoint python

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码