Fast Style Transfer を使って画像を好みの画家風に変換する

機械学習

はじめに

機械学習について学んでいた際、「Fast Style Transfer」を見つけました。
「Fast Style Transfer」は、GAN(敵対性ネットワーク)を用いて、画像をゴッホやラッセンなどの好みの画家風に変換することができます。
面白そうだったので試してみました。

画風学習と画像変換の実行手順と、ハマったところがあったので回避方法をまとめました。

実行環境

パッケージのバージョン

Python 3.6.2
tensorflow 2.2.0
tensorflow-gpu 2.1.0
Keras 2.4.3
opencv-python 4.5.3.56
Pillow 7.2.0

実行端末のスペック

OS Windows 10 pro
CPU Intel Corei7-8750H 2.20GHz
GPU NVIDIA GeForce GTX 1050 Ti
メモリ 16GB

GPUを搭載していない実行環境で好きな画風を学習すると、学習時間に15時間以上かかりました。実行環境はGPU搭載の端末を用意することをお薦めします。

準備

「Fast Style Transfer」のダウンロード

「Fast Style Transfer」には、学習済みの画像識別モデルであるVGG16とVGG19を使用したバージョンがあります。ここでは、VGG19を使用した「Fast Style Transfer」をgithubからダウンロードします。

mkdir C:\tmp
cd C:\tmp
git clone https://github.com/cryu854/FastStyle

学習用画像データCOCO2014のダウンロード

学習の際に使用する画像を取得する必要があります。画像は、さまざまデータセットを提供しているCOCOから取得できます。取得する際のURLは、githubからダウンロードしたファイルの「setup.sh」内に記載があります。
<ダウンロードURL>
coco2014_train2014.zip

train2014.zipのサイズは約12.5GBあり、コマンドあるいはブラウザからダウンロードすると、途中でダウンロードに失敗することがあります。

train2014.zipの取得は、torrentで取得することをお薦めします。
torrentファイルは、academictorrents.comから取得できます。
<torrentファイルの取得>
MS Common Objects in Context (COCO2014) – Academic Torrents
赤丸で囲った箇所をクリックすると、torrentファイルを取得できます。

取得したtorrentファイルをtorrentアプリに読み込ませると、下記3つのzipファイルをダウンロードできます。

  1. test2014.zip
  2. train2014.zip
  3. val2014.zip

必要なのは「train2014.zip」のみです。その他のファイルのダウンロードは不要です。
ダウンロードが完了したら、train2014.zipを任意の場所に展開してください。

以上で準備は完了です。

画風学習時の注意点

train2014には82,782枚の画像が保存されています。一部の画像は破損しているため、学習に使用できませんでした。破損した画像を含めた状態で学習を実行すると、学習途中でエラーとなるので、破損した画像を削除します。削除する方法は下記を参考にしてみてください。

好みの画風を学習する

好みの画風の画像を任意の場所に保存しておきます。
※説明では、C:¥tmp\styleに保存、としています。

ここでは、葛飾北斎 富嶽三十六景の神奈川沖浪裏の画像をC:\tmp\style/wave.jpgとして保存しました。

<プログラムの実行例>

python C:\tmp\FastStyle\main.py train --style C:\tmp\style\wave.jpg --dataset C:\tmp\train2014 --weights C:\tmp\weights\ --batch 1

画風を学習する場合は、main.pyの引数を下記の通りにする必要があります。

  • 第1引数に「train」を指定します。
  • 「–style」に好みの画風のファイルをパスを指定します。
  • 「–dataset」に学習で使用する画像を指定します。
  • 「–weights」に学習した結果の保存先を指定します。※パスの最後に「\」を記載する
  • 「–batch」にバッチサイズを指定します。

<プログラムの実行結果>

私の実行環境では、実行完了までに8.8時間ほどかかりました。実行が正常に完了すると下記のメッセージが表示されます。

Total time: 32010.5
=====================================
             All saved!              
=====================================

C:\tmp\weights\配下に下記のファイルが出来ていれば学習できています。

  • C:\tmp\weights\.data-00000-of-00002
  • C:\tmp\weights\.data-00001-of-00002
  • C:\tmp\weights\.index
  • C:\tmp\weights\checkpoint

画風変換時の注意点

画像が大きいと変換を行う環境によっては、メモリが不足して変換作業に失敗する場合があります。
<失敗時に表示されるメッセージ>

tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[1,64,1890,2522] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc [Op:Conv2D]

画像のサイズを、1024×768や800×600などに小さくすることで、変換することができるようになります。

画像を好みの画風に変換する

変換したい画像を任意の場所に保存しておきます。
※説明では、C:¥tmp\contentに保存、としています。

<プログラムの実行例>

python C:\tmp\FastStyle\main.py evaluate --weights C:\tmp\weights\ --content C:\tmp\content\sample.jpg --result C:\tmp\result\sample_wave.jpg

画像に画風を適用する場合は、main.pyの引数を下記の通りにする必要があります。

  • 第1引数を「evaluate」を指定します。
  • 「–weights」に画風の学習結果を保存したフォルダを指定します。
  • 「–content」に画風を適用したい画像を指定します。
  • 「–result」に画風を適用した画像の保存先を指定します。

<プログラムの実行結果>

私の実行環境では、実行完了までに5秒ほどかかりました。実行が正常に完了すると下記のメッセージが表示されます。

Transfering image...

C:\tmp\result\配下に変換後の画像が保存されていれば、変換できています。

色々な画風を試す

色々な画風を試してみました。
油絵の画風は、上手くいったように感じています。
アンパンマンの画風は、、、気持ち悪い画風変換になってしまいました。
画風をアンパンマンのキャラクターで作成したので、キャラクターが強調された感じになってしまいました。

元画像 画風 画風変換後の画像

北斎 神奈川沖浪裏 (富嶽三十六景)

Lassen swim in the moon

出典:ウィットビー

コメント

タイトルとURLをコピーしました