目次
概要
GANを応用したiWGAN-LC(LayerConditional)というモデルを使ったロゴ画像生成を行いました。 ロゴ画像生成にはiWGAN-LCの実装である https://github.com/alex-sage/logo-gen を使いました。 はじめに、iWGAN-LCとその元となったモデルの簡単な説明をしていきます。
GAN
敵対的生成ネットワークと呼ばれるモデルで、教師なし学習で画像生成などが行なえます。 GANの特徴は、贋作を作るモデル(生成器)と、贋作か本物か見分けるモデル(識別機) の2つのモデルが使われる点です。贋作を作るモデルは、本物そっくりの贋作を作るように訓練され、見分けるモデルはより偽物を見破れるように、切磋琢磨する形で訓練されていきます。
ただ、GANには以下の問題点がありました。
- 勾配消失が発生する
- モデルの良否を判断する明確な指標がない
- モード崩壊が起こる
これらを改善しようとしたモデルがWGANになります。
WGAN
WGANはWasserstein GANの略で、GANとの違いは以下になります。
- GANでは損失関数にJSD(Jensen-Shannon divergence)が使われていたが、WGANではWasserstein距離を使用している。(勾配消失問題への対処)
- Wasserstein距離を使うための制約として、重みのクリッピングをしている。
WGANには以下の問題点がありました。
- 重みのクリッピングを行ったことで、学習が不安定になる。
学習の不安定性の解消を図ったのがiWGAN-LCになります。
iWGAN-LC
iWGAN-LCはWGANを拡張したモデルで、WGANとの主な違いは以下になります。
- ラベルを事前にクラスタリングし、ワンホットベクトルとして、潜在ベクトルに追加
- 追加の特徴マップを各畳込み層と線形層(生成器、識別機の両方)の入力に追加
実行環境構築
ロゴ画像生成処理にはGPUを使用するため、EC2のGPU利用可能なインスタンスを使う前提で環境構築を行います。また、今回はゼロからモデルの訓練は行わず、公開されているpretrainedモデルを利用します。
まずはDockerfileの作成と、必要なソースを用意していきます。それらが準備できたら、EC2上でDockerビルドしていきますが、ソースをEC2に配置しやすいように、適当なgitリポジトリにpushしておくと楽かもしれません。また、データセット、pretrainedモデルはファイルサイズが大きいので、EC2上で直接ダウンロードして配置するほうがよいかもしれません。(お好みで)
EC2インスタンスの設定
利用するインスタンスは以下になります。
- AMI
- Deep Learning AMI (Ubuntu 18.04) Version 36.0 – ami-0bc87a16c757a7f07
- インスタンスタイプ
- g4dn.xlarge (GPUが使えるものであればOK)
logo-genの環境要件
python 2系
tensorflow 1.3
tensorflow-gpu 1.3
cuda 8.0
cudnn 6
上記のpython、cuda、cudnnが入っているnvidiaのdockerイメージを利用して環境構築していきます。cuda, cudnnのバージョンは、tesorflowのバージョンにあったものを選択する必要があるため、別のバージョンだと動かない可能性が高くなります。tensorflowなどについてはDockerfile内でpipでインストールしていきます。Dockerfileは以下の内容で作成します。
Dockerfile
FROM nvidia/cuda:8.0-cudnn6-runtime-ubuntu16.04
SHELL ["/bin/bash", "-c"]
ENV APP_ROOT /app
ENV LANG=C.UTF-8
RUN apt-get update -qq && \
apt-get install -y --no-install-recommends \
build-essential \
libboost-all-dev \
wget \
vim \
openssh-client \
graphviz-dev \
pkg-config \
git-core \
openssl \
libssl-dev \
libffi6 \
libffi-dev \
cmake \
unzip \
python-dev \
python-pip \
python-setuptools \
curl && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
mkdir /install
RUN pip install --upgrade pip
RUN pip install backports.functools-lru-cache==1.5 \
backports.shutil-get-terminal-size==1.0.0 \
backports.weakref==1.0rc1 \
bleach==1.5.0 \
cycler==0.10.0 \
decorator==4.3.2 \
enum34==1.1.6 \
funcsigs==1.0.2 \
h5py==2.9.0 \
html5lib==0.9999999 \
ipython==5.8.0 \
ipython-genutils==0.2.0 \
kiwisolver==1.0.1 \
Markdown==3.0.1 \
matplotlib==2.2.3 \
mock==2.0.0 \
numpy==1.16.1 \
pathlib2==2.3.3 \
pbr==5.1.2 \
pexpect==4.6.0 \
pickleshare==0.7.5 \
Pillow==5.4.1 \
prompt-toolkit==1.0.15 \
protobuf==3.6.1 \
ptyprocess==0.6.0 \
Pygments==2.3.1 \
pyparsing==2.3.1 \
python-dateutil==2.8.0 \
pytz==2018.9 \
scandir==1.9.0 \
scipy==1.2.1 \
simplegeneric==0.8.1 \
six==1.12.0 \
subprocess32==3.5.3 \
tensorflow==1.3.0 \
tensorflow-gpu==1.3.0 \
tensorflow-tensorboard==0.1.8 \
tqdm==4.31.1 \
traitlets==4.3.2 \
wcwidth==0.1.7 \
Werkzeug==0.14.1 \
--no-cache-dir
COPY src $APP_ROOT/src
WORKDIR $APP_ROOT/src
Dockerfileと同じディレクトリに、log-genリポジトリのソースを含めて、src
という名前で配置します。以下のような配置になります。
my-src/
Dockerfile
src/
次にデータセット配置用のディレクトリを作成します。
mkdir src/wgan/data
データセット、pretrainedモデルの配置
データセット をダウンロードして、上記で作成したsrc/wgan/data
に配置します。次に pretrained model をダウンロードして、 src/wgan/runs
に配置します。pretrained modelはzip圧縮されているので解凍し、中の設定ファイルの修正をします。
unzip model_WGAN_LLD-icon-sharp_rc_128.zip
vim model_WGAN_LLD-icon-sharp_rc_128/config.json
"DATA": "LLD-icon-sharp.hdf5" を以下のように修正
↓
"DATA": "data/LLD-icon-sharp.hdf5"
Docker ビルド
Dockerfileのあるディレクトリで、以下のコマンドを実行します。
docker build -t logo-gen .
GPUの確認
コンテナに入ってGPUが認識されているか確認します。
docker run --gpus all -e NVIDIA_DRIVER_CAPABILITIES=all -v $PWD/src:/src -it logo-gen /bin/bash
nvidia-smi
GPUが1つ認識されていることが確認できれば大丈夫です。
画像生成
実行するディレクトリに移動して、ipythonを起動します。
cd src/wgan
ipython
以下のコマンドで画像生成を実行します。
import tensorflow as tf
import numpy as np
import vector
from logo_wgan import WGAN
session = tf.Session()
wgan = WGAN(session, load_config='LLD-icon-sharp_rc_128')
vec = vector.Vector(wgan)
vec.show_random(save="./result.png")
result.png に以下のようなロゴ画像群が出力されていれば成功です。(以下の画像と同じ画像は出力されません。)
まとめ
- EC2のGPUインスタンスを使ってロゴ生成ができた。
- 今回出力されたロゴ画像群は、品質的にそのままロゴとして使えるわけではなさそう。
- ただし、シェイプや色、その他の特徴をなめらかに変化させることが可能なモデルなので、調整を行うことで、使えるロゴが出力できる可能性はありそう。