ホーム エンジニア AI iWGAN-LCを用いたロゴ画像生成
iWGAN-LCを用いたロゴ画像生成
 

iWGAN-LCを用いたロゴ画像生成

概要

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インスタンスを使ってロゴ生成ができた。
  • 今回出力されたロゴ画像群は、品質的にそのままロゴとして使えるわけではなさそう。
  • ただし、シェイプや色、その他の特徴をなめらかに変化させることが可能なモデルなので、調整を行うことで、使えるロゴが出力できる可能性はありそう。

参考

https://github.com/alex-sage/logo-gen

記事を共有

最近人気な記事