[FuseDream] AIを使ってテキストから絵を描く [日本語対応]

2021年12月13日月曜日

Artificial Intelligence

本記事ではFuseDreamと呼ばれる機械学習手法を用いて、AIにテキストを入力し、テキストに応じた絵を描いてもらう方法を紹介します。

アイキャッチ

FuseDreamとは

FuseDreamは、TextToImageタスクを実現する手法です。 TextToImageタスクとは、与えられたテキストから、テキストに沿った画像を生成するタスクを指します。 例えば"A photo of a dog."というテキストを与えた場合、FuseDreamはテキストの意味を理解し、テキストに沿った"犬の写真"を生成します。

この技術はCLIPGANと呼ばれる既存技術を適切に組み合わせたことによって実現されています。 CLIPとは、ImageToTextタスクを実現する手法で、画像を認識し適切なキャプション(画像の説明)を生成します。

CLIP概要図

またGAN(Genera tive Adversarial Networks)は、敵対的生成ネットワークと呼ばれ画像生成技術として用いられることの多い技術です。 FuseDreamは、GANを用いて画像を生成し、CLIPのスコアが最大化される画像を見つけることによって、TextToImageタスクを実現しています。 FuseDreamの特徴は、このGANとCLIPをFuseDreamパイプラインでつなぎ合わせ、適切に最適化している点にあります。

FuseDream概要図

なお、以下の記事では有料にはなりますが、詳細な技術解説、Google Colaboratoryに対応した学習済みモデルを用いた画像・動画生成方法をご紹介しています。

FuseDreamの導入手順

セットアップ1: conda環境構築

それでは早速、開発環境にFuseDreamをセットアップしていきます。
動作確認は下記の環境で行っています。

OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

それでは、FuseDreamをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。

conda環境構築手順を下記に記載します。FuseDreamの動作要件は下記の通りです。
なお筆者の環境ではPyTorch==1.10でも動作したためPytorchは1.7.1以上であれば問題無く動作すると思われます。

  1. PyTorch==1.7.1
  2. torchvision==0.8.2
  3. lpips==0.1.4

# python version 3.7のconda環境を作成
$ conda create -n fusedream python=3.7 -y

# 作成した環境をアクティベート
$ conda activate fusedream
$ cd fusedream

# Proxy配下の場合は事前に下記を設定
$ export http_proxy="http://"username":"password"@proxy:port"
$ export https_proxy="http://"username":"password"@proxy:port"

# gitからcodeをclone
$ git clone https://github.com/gnobitab/FuseDream.git
$ cd FuseDream

# 関連するライブラリをインストール
# https://pytorch.org/get-started/previous-versions/ からcudaバージョンが一致するものをインストール
$ conda install pytorch==1.10 torchvision torchaudio cudatoolkit=11.3 -c pytorch
$ conda install -c conda-forge tqdm lpips
$ conda install -c anaconda h5py

# CLIPをインストール
$ pip3 install ftfy regex tqdm
$ pip3 install git+https://github.com/openai/CLIP.git

# torchの動作確認
$ python
>>> import torch
>>> print(torch.cuda.is_available())
True
>>> print(torch.cuda.device_count())
2

以上で、FuseDreamの環境構築は完了です。

セットアップ2: 学習済みモデルのダウンロード

続いて、学習済みモデルのダウンロードを行います。

# 下記からbiggan-256.pthとbiggan-512.pthをダウンロード
# https://drive.google.com/drive/folders/1nJ3HmgYgeA9NZr-oU-enqbYeO7zBaANs?usp=sharing
# ./BigGAN_utils/weights/に配置

以上でモデルのダウンロードは完了です。 モデルサイズもbiggan-512.pthで314MBほどと軽量のため比較的直ぐにダウンロードは完了します。

TextToImage(テキストから画像生成)

最後に本題のテキストから画像を生成する方法です。 ここまで準備ができていればコマンド一つで実行が可能です。なお入力するテキストは日本語・英語ともに可能となっています。

$ python fusedream_generator.py --text 'A photo of a blue dog.' --seed 1234

各オプションは以下の通りです。
--textオプションで入力するテキストを設定
--seedオプションで乱数を生成する元となる数字を設定

このため、同一テキストでもseedが異なれば、別の画像が生成されます。 また筆者の環境では画像生成までに約5分を要しました。

FuseDream_beautiful woman_出力結果
出力結果左:text->"beautiful woman" seed->1234
出力結果右:text->"beautiful woman" seed->999

生成結果ですが、女性であることは分かりますが、beautifulであるかどうかは厳しいところですね。。。
若干恐怖すら感じます。 他の出力結果をいくつか見てみます。

$ python fusedream_generator.py --text '車に乗る男性の写真' --seed 1234
FuseDream_車に乗る男性_出力結果
text->"車に乗る男性の写真" seed->1234

男性を視認することは難しいですが、車らしき画像は生成されています。 CLIPScoreも0.35と英語で入力した場合と大差ないため日本語にも対応しているようです。

また固有名詞も認識可能なようです。

$ python fusedream_generator.py --text 'Keanu Reeves of The Matrix' --seed 1233
FuseDream_Keanu Reaves of The Matrix

文節の多いやや複雑な文章の出力結果は以下の通りです。

$ python fusedream_generator.py --text 'A dog holding a ball and a cat sleeping in bed' --seed 1234
FuseDream_A dog holding a ball and a cat sleeping in bed_出力結果

最後に抽象的な言葉を入力した結果です。

$ python fusedream_generator.py --text 'death' --seed 1234
FuseDream_death_出力結果

パラメータ設定

調整可能なパラメータを紹介します。 以下のパラメータはfusedream_generator.pyにて変更可能です。

  1. INIT_ITERS
    GANによる画像生成の試行回数
  2. OPT_ITERS
    最適化試行回数
  3. get_G
    256でbiggan-256.pthを使用、512でbiggan-512.pthを使用
  4. latent_noise
    Falseに設定することでエッジを鋭く出力

まとめ

本記事では、FuseDreamでテキストから画像を生成する方法を紹介しました。
近年様々なタスクを実現するモデルが開発されていますが、
今回の手法のように既存モデルの組み合わせによって新たなタスクを実現できると実現できるタスクの幅が広がりますね。 組み合わせの妙によって新規性を持つ技術を生み出せる点は非常に興味深いです。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1. 論文 - FuseDream: Training-Free Text-to-Image Generation with Improved CLIP+GAN Space Optimization

2. GitHub - gnobitab/FuseDream

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology