Home Archives Categories Tags Docs

利用Neural Style的TensorFlow实现,像梵高一样作画

发布时间: 更新时间: 总字数:1732 阅读时间:4m 作者: 分享

本文将为您介绍如何利用阿里云的服务瞬间变身梵高,给自己生活中的图片带来不一样的艺术气息。

概述

1890年7月29日,梵高在一片麦田里结束了自己的年仅37岁的生命,他给全世界留下《星夜》、《向日葵》与《有乌鸦的麦田》这些伟大的作品。特别当看到《星夜》中像焰火一样闪亮的星星时,你是否感受到了他对绘画火焰般的热情。

梵高曾写道:“我常想,要是我能够多花些时间来画真正的风景画,那该多好!我经常看到各种奇景,使我不由自主地说:我在画上从来没有见过这么好的风景。” 这是大师和后世共同的遗憾。

而随着科技的发展,到了今天,我们也能够创造出和梵高风格近似的艺术作品。具体来说,就是利用深度学习,将梵高的风格从他的作品中提取出来,并赋予到我们现有的图片,就可以得到用梵高风格画出来的新的图片。这里会使用一个叫做neural-style的TensorFlow实现来完成这个任务,它基于强大的深度神经网络(VGG19)来对图片进行处理。以下就是输入图片, 我们要将其转化为有星夜风格的图片:

然而,部署和运行这个算法可不简单,它至少需要:

  • 深度学习本身需要大规模的矩阵计算,但我们不想要花费几天、几个星期,甚至几个月来等待结果;因此利用GPU加速计算过程是必须的选择
  • 安装CUDA,Cudnn,Bazel,TensorFlow及其依赖,neural-stlye这些工具和库的复杂度,装过的宝宝心里都苦;因此GPU应用的简化部署也是必须的
  • 作为深度学习实验环境相对于其它系统,更为脆弱,而参数、配置和依赖库的变化,都会导致系统停止工作,重复的环境搭建不可避免;因此不断的重复部署和配置也是必须的

而HPC容器服务很好的利用Docker技术简化了GPU上应用部署和配置,同时又增加了以Nvidia GPU卡为粒度的调度和隔离,很好的满足了以上的3个需求。我们用一个简单的例子向您展示使用HPC上容器服务,可以一键式画出星空风格的街景。

利用HPC容器服务一键式运行neural-style模仿梵高作画

  1. 购买北京HPC后,按照北京HPC使用容器服务的文档在HPC机器上部署容器服务。

  2. 当安装完成后,确认容器服务上支持了GPU,可以看到每台阿里云HPC上有两个GPU,其中还有每个GPU的配置

  1. 为了简化部署,我们提供了一个预先构建的neural style的镜像

    registry-internal.cn-beijing.aliyuncs.com/cheyang/neural-style
    

以下创建是该镜像的Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/denverdino/tensorflow:0.10.0-devel-gpu

RUN cd / \
    && git clone https://github.com/anishathalye/neural-style.git \
    && cd neural-style \
    && wget http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.mat

RUN pip install SciPy Pillow NumPy

WORKDIR /neural-style

CMD ["python","neural_style.py","--content", "/neural/input.jpg","--styles", "/neural-style/examples/1-style.jpg", "--output", "/neural/output.jpg"]
  1. 按照在HPC容器服务上创建OSS数据卷创建一个OSS数据卷,并且用OSS客户端的图片上传上去

  1. 用如下的docker-compose模板部署到阿里云HPC容器服务上,就可以按照《星夜》的风格(1-stlye.jpg)生成我们期望看到的图片。

    version: '2'
    labels:
    aliyun.project_type: "batch"
    services:
    neural:
    image: registry-internal.cn-beijing.aliyuncs.com/cheyang/neural-style:latest
    command:
       - "python" 
       - "neural_style.py" 
       - "--content" 
       - "/neural/input.jpg" 
       - "--styles" 
       - "/neural-style/examples/1-style.jpg" 
       - "--output" 
       - "/neural/output.jpg"
    labels:
      - aliyun.gpu=1
    volumes:
       - neural:/neural
    

注:

  • aliyun.project_type: «batch»指定该应用使用的是离线应用,如果希望了解离线计算的元语,可以参考在阿里云容器服务中运行离线任务文档
  • aliyun.gpu指定申请的GPU个数。阿里云容器服务负责分配GPU给容器,并且将主机上的GPU卡映射到容器内,这里同时会做到对用户透明。举例来说,如果用户申请一个GPU,而主机上只有/dev/nvidia1可用,将主机上的/dev/nvidia1映射为容器里的/dev/nvidia0,这样就会让用户程序与具体设备号解耦。
  • volumes使用了OSS来存储输入的图片和输出的图片,如果感兴趣可以参考文档容器服务和OSS数据卷

  1. 可以到容器服务的应用状态页面查看进度,当发现应用完成后,就可以下载星夜风格的图片了

这样就可以看到星夜版的街景了

jpg

  1. 如果你部署了监控服务,就可以一站式的在计算过程中监控GPU的使用率,内存使用率和温度。这是实际的应用中非常有价值的数据,比如Nvidia GPU在温度高到一定程度的时候,是会导致计算停滞等问题。通过基础架构监控,帮您对基础架构的使用一目了然。

总结

可以看到,在利用容器服务可以使HPC上运行模仿梵高的Neural Style是如此的轻松写意,只需要一个镜像和一个Docker Compose文件,容器服务帮您搞定其它。您还可以在此之上尝试其他的机器学习应用,体验加快创新速度的愉悦。

参考

相关文章
最近更新
最新评论
加载中...