はじめに
以下のMXNet-Gluon-Style-Transferを使ってみたいと思います。
github.com
以前にも試したことがあります。
touch-sp.hatenablog.com
今回は複数の変換を一度に実行するためのスクリプトを書きました。
また、GPUを使う場合と使わない場合の両方で実行可能なスクリプトにしました。
環境構築
Windows 10 Python 3.7.9 (GTX 1080 CUDA Toolkit 10.1)
PythonにインストールするのはMXNetとPillowだけです。
- GPUがある人
pip install mxnet-cu101==1.7.0 -f https://dist.mxnet.io/python/cu101 pip install pillow
「cu101」の部分はCUDA Toolkitのバージョンに合わせて変更して下さい。
最終的にはこうなりました。(pip freeze)
certifi==2020.12.5 chardet==3.0.4 graphviz==0.8.4 idna==2.6 mxnet-cu101==1.7.0 numpy==1.16.6 Pillow==8.0.1 requests==2.18.4 urllib3==1.22
- GPUがない人(CPUのみ)
pip install mxnet pip install pillow
最終的にはこうなりました。(pip freeze)
certifi==2020.12.5 chardet==3.0.4 graphviz==0.8.4 idna==2.6 mxnet==1.7.0.post1 numpy==1.16.6 Pillow==8.0.1 requests==2.18.4 urllib3==1.22
方法
二つのPythonスクリプトファイルを用意します。
「download.py」:モデルやスタイル画像をダウンロード、解凍するスクリプト
「transfer.py」:変換を実行するスクリプト
- download.py
import os import zipfile from mxnet import gluon url = 'https://github.com/StacyYang/MXNet-Gluon-Style-Transfer/archive/master.zip' filename = gluon.utils.download(url) with zipfile.ZipFile(filename) as f: f.extractall('.') os.rename('MXNet-Gluon-Style-Transfer-master', 'master') url2 = 'https://apache-mxnet.s3-accelerate.amazonaws.com/gluon/models/msgnet_21styles-2cb88353.zip' filename2 = gluon.utils.download(url2) with zipfile.ZipFile(filename2) as f: f.extractall('./master/models') os.remove(filename) os.remove(filename2) os.chdir('./master/models') os.rename('msgnet_21styles-2cb88353.params', '21styles.params')
- transfer.py
import sys import os import glob import mxnet as mx from master import net from master import utils os.makedirs('result', exist_ok=True) if mx.context.num_gpus() >0: ctx = mx.gpu() content_size = 1024 set_cuda = 1 else: ctx = mx.cpu() content_size = 512 set_cuda = 0 input_file = sys.argv[1] style_files = glob.glob('./master/images/styles/*.jpg') content_image = utils.tensor_load_rgbimage(input_file, ctx, size=content_size, keep_asp=True) style_model = net.Net(ngf=128) style_model.load_parameters('./master/models/21styles.params', ctx=ctx) for style_file in style_files: output_filename = os.path.basename(style_file) style_image = utils.tensor_load_rgbimage(style_file, ctx, size=512) style_image = utils.preprocess_batch(style_image) style_model.set_target(style_image) output = style_model(content_image) utils.tensor_save_bgrimage(output[0], os.path.join('result', output_filename), set_cuda)
二つのPythonスクリプトファイルを同じフォルダ(現在の作業フォルダ)に保存します。
またその同じフォルダに画像ファイル(元画像)を保存します。(今回は「tokyo.jpg」という名前を付けました)
最初にdownload.pyを実行します。
python download.py
同じフォルダ(現在の作業フォルダ)に「master」というフォルダが作成されます。
次にtransfer.pyを後ろに画像ファイル名をつけて実行します。
python transfer.py tokyo.jpg