低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

工程师如何培养美学思维

2019 年 11 月 14 日

工程师如何培养美学思维

在中央美院 2019 届研究生毕业作品展中,迎来了一位特殊的毕业生,她的年龄只有 1 岁零 10 个月,但是她的画作却同其他同学的作品一道参加了展览。这是什么情况呢?下来跟随作者一起去认识下夏语冰同学,同时学习下快速成为一名有艺术水准画家的妙招吧。


中央美院 2019 届硕士毕业生中有一位叫夏语冰的同学。毕业前夕,她的画作同其他同学的作品一道参加了研究生毕业展。


不过,夏语冰并非现实中的人类,她是 MSRA 研发的一款 AI 机器人微软小冰,她被培养学习绘画已经 20 多个月了。小冰作为一个画家成长的过程,就像追求艺术的人类一样,经历了一个漫长而又艰辛的过程。在经过近两年的学习培养之后,小冰的绘画作品已经达到了一定的艺术水准,所以才被破格批准化名夏语冰参加中央美院研究生毕业展。


无独有偶,在 UK Channel 4 的纪录片《Faking it》中,来自利物浦的装饰家 Paul O’Hare 只用了四个星期就将自己变成了一位优秀的艺术家,并试图在伦敦艺术画廊愚弄评论家们。


本篇文章将带你快速上手使用 Docker 和云主机,体验深度学习算法带来的惊喜和艺术冲击,成功转型 9012 款 Coding Artist。


1 一个画家的诞生

在艺术领域,尤其是绘画中,人类通过在图像的内容和风格之间构成复杂的相互作用,掌握了创造独特视觉体验的技能。到目前为止,该过程的算法基础仍然是未知的,并且不存在具有类似能力的工程项目。然而在其他视觉感知的相关领域,例如物体检测和人脸识别,由深度神经网络为基础的计算机视觉模型带来了近乎甚至超越人类的表现。


为了更快的运行起服务,我们会使用一些预训练好的深度神经网络模型和一台已经安装配置好 NVIDIA driver, CUDA Toolkit 10 和 nvidia-docker2 的 GPU 工作站。


Style Transfer 可以帮助我们创造出和艺术家作品相比几乎肉眼无法区分的艺术图像,模型会将一幅肖像或风景画与一副或几幅艺术家作品图像的风格相结合,从而得到一张风格迁移的全新艺术作品。





具体效果如上所示,以 Figure 1 莫奈的《日出·印象》为例,Figure 3 的内容和原始图像 Figure 2 相近,除此之外天空中还呈现了 Figure 1 中的橙黄色和草绿色,而绘画笔法上也继承了莫奈的笔触,画面的整体色调和 Figure 1 一致。可以看出,算法对提供绘画素材的风景图片和提供绘画风格素材的《日出·印象》两者的处理方式是不同的,对前者着重保留画面内容,对后者则是要剔除掉其内容而保留绘画风格。


2 绘画面临的问题

在我们正式开始之前,我们还需要完成工作环境的准备和安装,包括运行软件所需要的类库,框架和软硬件依赖。


首先,因为我们不想花费数小时甚至数周来进行训练和测试。我们会将图形处理单元 GPU 与传统 CPU 一起使用,以加速我们的深度学习算法并将等待时间缩短到几分钟。


  • NVIDIA GPU 驱动。

  • NVIDIA CUDA 开发套件,用于调用 GPU 驱动程序并提供高层次 API。

  • cudnn 库,用于 GPU 深度神经网络计算。

  • torch & protobuf,深度神经网络开发框架及依赖。

  • loadcaffe lua 模块,用于加载预训练网络 VGG19。


我们需要以上所有的软件来协同稳定运行不同的运算过程已获得我们期望的计算结果,同时大量的依赖又导致了一个新的问题,如果 GPU 驱动程序或者 Torch 版本更新中引入了任何不能向下兼容的内容,那么整个工程将很有可能 crash 掉,这意味着不仅每次重新安装系统环境的工作是反复的,而且我们还需要在每次组件和依赖更新时仍不断重复这一过程。试想当灵感突然冲击艺术家的大脑时,画布和工具必须在手边,同理,我们开发者也需要一个稳定的系统运行环境来解决依赖等问题。


介入容器化使用 Docker 是这个问题的有效解决方案。Docker 将我们的进程与其环境隔离开来,其中包括主机中的特定硬件资源。但是我们的深度神经网络算法需要直接访问 GPU 资源。为了解决这一问题,我们还需要引入 nvidia-docker.



先简单介绍下 nvidia-docker , nvidia-docker2.0 是一个简单的包,它主要通过修改 docker 的配置文件来让 docker 使用 NVIDIA Container runtime; nvidia-container-runtime 才是真正的核心部分,它在原有的 docker 容器运行时 runc 的基础上增加一个 prestart hook, 用于调用 libnvidia-container 库。


它们之间的关系可以通过下面这张图关联起来:



工具介绍完毕,现在我们只需要安装 Docker,nvidia-docker2 和相应的 GPU 驱动程序。其余的依赖项将包含在 Docker 镜像中,通过编辑 Dockerfile 以完成镜像构建,并保证启动的不同容器的环境一致性。


3 准备绘画工具

现在我们只需要一个地方来运行我们的项目。公司线上的所有 GPU 资源都是由几个不同区域的 k8s 集群统一管理,通过编辑 yml 配置文件来完成 Pod 正常的调度到 GPU 机器上的需求。


但是开发环境我更倾向于选择云主机,比如私有云的 GPU 服务器,公有云 P2 AWS EC2 实例,开发环境里的 GPU 工作站,无论哪种实例,都能帮助我们在几个小时之内快速落地应用。


接下来我们需要安装 NVIDIA 驱动程序和 nvidia-docker2, 我整理了一个安装脚本:


#!/bin/bash
# Install NVIDIA drivers 418.87sudo apt-get install --no-install-recommends -y gcc make libc-devwget -P /tmp http://cn.download.nvidia.com/tesla/418.87/NVIDIA-Linux-x86_64-418.87.00.runsudo sh /tmp/NVIDIA-Linux-x86_64-418.87.00.run --silent
# Install nvidia-docker2curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -distribution=$(. /etc/os-release;echo $ID$VERSION_ID)curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.listapt update && apt install nvidia-docker2sudo pkill -SIGHUP dockerd
# Testdocker run --runtime=nvidia --rm nvidia/cuda:9.0-devel-ubuntu16.04 nvidia-smi
复制代码


如果一切正常,您将获得以下输出:



4 To Draw You Must Close Your Eyes And Sing

没错,这又是一句毕加索说过的话, 想要画画你必须学会闭眼歌唱。


终于到最后一步部署机器学习算法了,演示项目地址在这里:


https://github.com/albarji/neural-style-docker.git
复制代码


构建镜像


docker build . -t neural-style:dev-0.0.1
复制代码


开始画图


./scripts/fake-it.sh goldengate.jpg monat.jpg
复制代码


现在,您只需将生成的图像下载下来欣赏,或者将不同 stage 生成的作品组装成 GIF。


Eurek!



5 References and Notes

1.A Neural Algorithm of Artistic Style


2.Visualizing and Understanding Convolutional Networks


3.How to Fake It As an Artist


4.neural-style-docker


5.神经美学:发生在大脑和艺术之间的化学反应


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/F8W362PH7uNRVaUBv73wwA


2019 年 11 月 14 日 16:11324

评论

发布
暂无评论
发现更多内容

初入响应式编程(下)

CD826

spring 微服务 响应式编程 reactor

Docker运行常用软件:MySQL,Redis,Nginx,RabbitMQ,Neuxs,Gitlab

读钓

MySQL nginx Docker gitlab

如何在非 sudo 用户下运行 docker 命令?

愚一

Docker DevOps

用jdk8的stream实现斐波那契数列

编号94530

jdk stream 斐波那契 fibonacci

西江月·记游(一)

轩辕御龙

MacOS配置网络命令

编程随想曲

macos network

在Kubernetes上运行SpringBoot应用

铁花盆

Docker Kubernetes Spring Boot

C++数组可以为变量吗

helloworld

c++ 互联网 编程语言

要不要重新认识一下递归与迭代?

西了意

编程

记游(四)

轩辕御龙

项目实施要避免哪些坑?

顾强

项目管理

身为程序员,怎么接私活赚外快?

爱看书的小代码

IPFS 星际传输协议的入门(二)

AIbot

区块链 分布式数据库

Django 中如何优雅的记录日志

AlwaysBeta

Python django Web 后端

格局不行,有机会也抓不住

池建强

创业 格局 MacTalk

Make Tmux Great Again

ccx

tmux

如何学习区块链技术

Kaichao

比特币 区块链 以太坊

nacos的一致性协议distro介绍

捉虫大师

nacos

redis数据结构介绍二-第二部分 跳表

Nick

redis 源码 数据结构 源码分析 算法

回"疫"录(6):致敬最美逆行者

小天同学

疫情 回忆录 现实纪录 纪实 创新突破

菩萨蛮·记游(二)

轩辕御龙

忆秦娥·记游(三)

轩辕御龙

Linux系统优化

桥哥技术之路

Linux

redis数据结构介绍三-第三部分 整数集合

Nick

redis 源码 数据结构 源码分析 算法

从翻译到本地化:我在Airbnb做本地化经理的经历

葛仲君

产品 翻译 Airbnb 本地化 全球化

广告与数据算法系列1.1.1: 什么是广告

黄崇远@数据虫巢

互联网 算法 广告

LeetCode 前1000题二叉树题目系统总结

Yano

面试 算法 LeetCode 二叉树 刷题

skywalking内存泄露排查

捉虫大师

dubbo 内存泄露

Ledge:这可能是距今最好的『DevOps + 研发效能』知识平台

Phodal

DevOps 敏捷开发 软件开发 研发效能

MySQL死锁与Spring事务

Dean

MySQL

一次漫长的dubbo网关内存泄露排查经历

捉虫大师

dubbo 内存泄露

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

工程师如何培养美学思维-InfoQ