文系男子がfast style transferを試してみたら思いのほか手こずった
Fast Style Transferってご存知ですか?
画像を有名な画家のタッチに変換できるプログラムで
tensorflowを使った機械学習をお手軽に体験できるよってものです。
とは言えQiitaやブログに書かれている通りにやってもエラーが出てお手軽ってほどではなかったんですけどね。
ってことでちょっとその辺のお話をしようかと思います。
Fast Style Transfer とは
冒頭で軽く説明しましたが見てもらったほうが早いですね。
こんな感じで北斎、ルソー、レオニード・アフレモフ、フランシス・ピカビア、ピカソ、ムンク、ジャン=バディスト・ピルマン?風に画像を変換できます。
必要なライブラリです。
Requirements
You will need the following to run the above:
TensorFlow 0.11.0
Python 2.7.9, Pillow 3.4.2, scipy 0.18.1, numpy 1.11.2
If you want to train (and don't want to wait for 4 months):
A decent GPU
All the required NVIDIA software to run TF on a GPU (cuda, etc)
ffmpeg 3.1.3 if you want to stylize video
pythonは3.5、tensorflowは1.8、他も2018年5月現在で最新のバージョンを使いました。
fast style transfer 使い方
僕は今回windows10でgit cloneのやり方がわからなかったのでZIPをダウンロードしました。
適当なところに展開してください。
次にcheckpointをダウンロードします。
checkpointとはどの画家のタッチに変換するかを決める.ckptという拡張子のファイルのことです。
Evaluating Style Transfer Networksの項目にあるlocated hereのリンクからGoogleドライブに飛びます。
好きなckptをダウンロードしたらfast style transferのフォルダにぶち込みます。
次に変換したい画像を準備してください。
そしてその画像もfast style transferのフォルダにぶち込みます。
僕の場合Dropboxに入れて複数の端末で共有しているのでこんな感じになっています。
実行はGithubに書いてありますが一応
¥fast-style-transfer-master>python3 evaluate.py --chekpoint ./rain_princess.ckpt --in-path ./img.jpg --out-path ./asuka.jpg
chekpointオプションで画風を指定します。
in-pathで変換したい画像データを指定。
out-pathで変換後の画像データの名前を指定します。
これでうまくいけばいいんですがエラーが出た場合はコードを書き換える必要があります。
ImportError : No module named 'moviepy'
moviepyがないらしいのでpip install moviepyを実行します。
で実行してもまたエラーがでました。
NeedDownloadError : Need ffmpeg exe.
ffmpegのエラーのようです。
- install using conda : install ffmpeg -c conda-forge
- download using the command : imageio_download_bin ffmpeg
- download by calling(in python) : imageio.plugis.ffmpeg.download()
このように表示されたのでconda install してみましたがダメでした。
ffmpegをコメントアウト
動画を変換するときに使うライブラリのようなので今回はコメントアウトしました。
evaluate.pyをテキストエディタで開いて14,15行目をコメントアウトです。
#from moviepy.video.io.VideoFileClip import VideoFileClip
#import moviepy.video.io.ffmpeg_writer as ffmpeg_writer
すると次のエラーが発生しました。
TypeError : imread() got an unexpected keyword argument 'pilmode'
TypeErrorと言われてもimreadやpilmodeがなんだかわからない。
fast style transferはpython2系の時につくられたものなので画像処理に使われるpilと言うライブラリが
python3では使えなくなっているためその後継であるpillowを使う、という記事がちらほらでてきます。
しかし、pillowはすでにインストール済み
pip install pillowと書かれた記事ばかりで諦めかけていたその時、やっとみつけました。
頼もしいStackOverflow
pilmodeについていろいろ調べた結果我らがstackoverflowに解決策が書かれていました。
imread is deprecated in SciPy 1.0.0, and will be removed in 1.2.0. Use imageio.imread instead.
scipy.miscではなくimageioを使えって書かれているのでutils.pyを書き換えます。
場所はfast-style-transfer-master > src > utils.pyです。
utils.pyをテキストエディタで開いてctrl+hで置換を開きます。
アドバイス通りすべてのscipy.miscをimageioに置換し上書き保存します。
import imageio, numpy as np, os, sys import imageio def save_img(out_path, img): img = np.clip(img, 0, 255).astype(np.uint8) imageio.imsave(out_path, img) def scale_img(style_path, style_scale): scale = float(style_scale) o0, o1, o2 = imageio.imread(style_path, mode='RGB').shape scale = float(style_scale) new_shape = (int(o0 * scale), int(o1 * scale), o2) style_target = _get_img(style_path, img_size=new_shape) return style_target
これは一部なのですべて置換してくださいね。
これで僕はうまくいきました。
まとめ
話題のtensorflowを使って画像変換をやってみましたが、微妙ですね。
これで機械学習を体験できたかと言われるとなんとも。
tensorflowを使うとこんなことができるよー的な意味であれば体験できたとも言えますね。
いずれね、自分でtensorflowを試してみたいなとは思っています。
まずは機械学習からちょっとずつやっていこうかな。
ということで今回はこのへんで。