WindowsでMXNet-Gluon-Style-Transferを使ってみる(GPUあり)

CPU版はこちら
touch-sp.hatenablog.com

環境

Windows10 Pro 64bit
GeForce GTX 1080 (CUDA 8.0, cuDNN 6.0)

Anacondaに仮想環境を作成

conda create -n gluon python=2.7 anaconda
activate gluon
pip install mxnet-cu80==0.12.0

MXNetのソースをダウンロード

こちら』からv0.12.0のソースコードをダウンロードして解凍

imageのダウンロード

Linuxsvnコマンドが含まれるため、bash on Windowsを使用しないといけない
まずはsubversionのインストール

sudo apt-get install subversion

続いて、『incubator-mxnet-0.12.0/gluon/style_transfer』フォルダ内に移動して以下を実行

python download_images.py

Linuxコマンドが使えなけえば下記サイトからダウンロードできる
github.com

学習済みモデルのダウンロード

こちらは、通常のWindowsから実行可能
『incubator-mxnet-0.12.0/gluon/style_transfer』フォルダ内に移動して以下を実行

python models/download_model.py

Pythonコードの書き換え

『incubator-mxnet-0.12.0/gluon/style_transfer』フォルダ内のmain.pyとnet.pyを書き換え
(修正前)

from mxnet import gluon
from mxnet.gluon import nn, autograd, Block, HybridBlock, Parameter, ParameterDict

(修正後)

from mxnet import gluon, autograd
from mxnet.gluon import nn, Block, HybridBlock, Parameter, ParameterDict

実行

python main.py eval --content-image images/content/venice-boat.jpg --style-image images/styles/wave.jpg --model models/21styles.params --content-size 1024

実行結果

f:id:touch-sp:20171105002254j:plain:w400

おまけ

main.pyを以下のように書き換えてmymain.pyとして保存

import time
import random
import os
import mxnet as mx
import numpy as np
np.set_printoptions(precision=2)
from PIL import Image

from mxnet import gluon, autograd
from mxnet.gluon import nn, Block, HybridBlock, Parameter, ParameterDict
import mxnet.ndarray as F

import net
import utils
from option import Options
import data

import glob
import os

def evaluate(args):
    if args.cuda:
        ctx = mx.gpu(0)
    else:
        ctx = mx.cpu(0)
    # content_images
    content_image = utils.tensor_load_rgbimage(args.content_image, ctx, size=1024, keep_asp=True)
    # model
    style_model = net.Net(ngf=args.ngf)
    style_model.collect_params().load(args.model, ctx=ctx)

    #style_image
    files = glob.glob('images/styles/*.jpg')
    for f in files:
        style_image = utils.tensor_load_rgbimage(f, ctx, size=args.style_size)
        style_image = utils.preprocess_batch(style_image)
    
    # forward
        style_model.setTarget(style_image)
        output = style_model(content_image)
        (dirname,filename)=os.path.split(f)
        utils.tensor_save_bgrimage(output[0], filename, args.cuda)

def main():
    # figure out the experiments type
    args = Options().parse()

    if args.subcommand is None:
        raise ValueError("ERROR: specify the experiment type")


    elif args.subcommand == 'eval':
        # Test the pre-trained model
        evaluate(args)

    else:
        raise ValueError('Unknow experiment type')

if __name__ == "__main__":
   main()

実行するとすべてのスタイル画像を適応してくれる

python mymain.py eval --content-image images/content/flowers.jpg --model models/21styles.params

おまけ

Microsoft PowerPoint 2010のアート効果「鉛筆:スケッチ」と比較してみる
元の写真
f:id:touch-sp:20171106190936j:plain:w400
PowerPoint 2010
f:id:touch-sp:20171106190748j:plain:w400
MXNet-Gluon-Style-Transfer
f:id:touch-sp:20171106190826j:plain:w400