その他
    ホーム エンジニア 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