Welcome to Mashykom WebSite



Image Generative AI 入門

 従来のニューラルネットワークによる画像の生成モデルは GAN (Generative Adversarial Nets) です。また、GAN の改良版の DCGAN、CycleGAN 、 Style Transfer などのモデルです。

 近年には、言語による記述から画像を生成する技術が発達しています。 DALL・E 3は、OpenAI社が開発した画像生成のAIアーキテクチャーで、驚異的な能力により画像生成AIの流行を牽引しています。このDALL・E 3 のライバルは MidJourney 5.2 Stable Diffusion XLでしょう。OpenAIのDALL・E 3 を利用するためには有料のサブスクリプションが必要ですが、 Microsoft のアカウントがあれば、Bing から無料で利用できます。

 このページでは、DALL・E シリーズの基本アーキテクチャーを解説し、それを構成するモジュールのCLIP modelとDiffusion modelについての説明を試みます。CLIPのPython 実装をGoogle Colab を利用して実行します。任意の画像を用いたZero Shot Classification を試みます。また、OpenAI のGLIDE アーキテクチャを説明して、画像の生成を実行してみます。

 DALL·E3の利用を Microsoft の Bing から行います。幾つかの例を実行してみます。

 2023年12月6日に、Googleは、テキスト、画像、オーディオを越えて機能する新しい大規模なマルチモーダルモデル(LMM)であるGeminiを発表しました。Geminiのテキスト機能は、同じ日にBARDに導入され、BARDからGeminiを利用することができるようになりました。Geminiを利用する方法について簡単に触れます。

Last updated: 2023.12.20


CLIPの仕組み


 CLIP(Contrastive Language-Image Pre-Training)は2021年2月にOpenAIが公開した物体識別モデルです。通常の物体識別モデルでは、ImageNetなどにある1000カテゴリから物体を識別しますが、CLIPはWEB上の画像と対応するテキストからなる4億個以上のデータで学習されています。ImageNetで学習されたモデルと同等の検出率で物体識別を行うことが可能です。

 CLIPは、Image EncoderとText Encoderを組み合わせて学習を行います。学習データは、(image, text)のペアから構成されています。画像をEncodeしたベクトルと、テキストをEncodeしたベクトルの内積が、正しCKIPわせでは1、間違った組み合わせでは0となるように学習を行います。推論では、学習されたText Encoderを使用して、ターゲットとなるデータセットのクラス名をEncodeし、Embeddingされたベクトルを取得、画像をEncodeしたベクトルと内積を計算、最も高い値を持つラベルを正解とします。このような手順で、Zero-shot linear classifierを生成します。

CLIP.png
CLIPの構造

 CLIPのコードはgithub.com/OpenAI/CLIPにあります。

 CLIPを用いて、画像の識別を実行するためには、github.com/openai/CLIP.git をダウンロードして、インストールします。PyTorch 1.7.1 以降のバージョンが必要です。


! pip install -c pytorch torchvision cudatoolkit=11.0
! pip install ftfy regex tqdm
! pip install git+https://github.com/openai/CLIP.git

以下のコードは、上に表示したCLIPの構造を示す画像を読み込んで、その画像を識別する例になります。"a diagram", "a dog", "a cat"のどれに最も近いかを判定します。


import torch
import clip
from PIL import Image

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)

image = preprocess(Image.open("CLIP.png")).unsqueeze(0).to(device)
text = clip.tokenize(["a diagram", "a dog", "a cat"]).to(device)

with torch.no_grad():
  image_features = model.encode_image(image)
  text_features = model.encode_text(text)

  logits_per_image, logits_per_text = model(image, text)
  probs = logits_per_image.softmax(dim=-1).cpu().numpy()

print("Label probs:", probs) # prints: [[0.9927937 0.00421068 0.00299572]]

  CLIP.pngの代わりに犬または猫の画像を使用してみてください。

 Cifar100のクラス分類を用いて、Zero-Shot Prediction を行うときは、以下のようなコード使用します。cifar100[4536]は路面電車の画像です。


import os
import clip
import torch
from torchvision.datasets import CIFAR100

# Load the model
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load('ViT-B/32', device)

# Download the dataset
cifar100 = CIFAR100(root=os.path.expanduser("~/.cache"), download=True, train=False)

# Prepare the inputs
image, class_id = cifar100[4536]
image_input = preprocess(image).unsqueeze(0).to(device)
text_inputs = torch.cat([clip.tokenize(f"a photo of a {c}") for c in cifar100.classes]).to(device)

# Calculate features
with torch.no_grad():
  image_features = model.encode_image(image_input)
  text_features = model.encode_text(text_inputs)

# Pick the top 5 most similar labels for the image
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)
values, indices = similarity[0].topk(5)

# Print the result
print("\nTop predictions:\n")
for value, index in zip(values, indices):
  print(f"{cifar100.classes[index]:>16s}: {100 * value.item():.2f}%")

 以下の結果が表示されます。

Top predictions:

streetcar: 96.11%
bus: 2.36%
train: 1.13%
bicycle: 0.04%
orange: 0.04%

 CLIPのモデルをダウンロードして実行するためのサンプルコードはこのColab(Interacting with CLIP.ipynb)に紹介されています。



DALL·E 2の仕組み


 2022年4月に公開されたDALL・E2では、CLIPの画像識別と拡散モデルの画像生成モデル(GLIDE)を組み合わせて画像生成を行ないます。テキストから画像を生成する上で用いられているのが拡散モデル(diffusion model)です。つまり、DALL・E2では、CLIPで得られたテキストのembeddingを画像生成の入力データとして用いて、拡散モデルからの出力がdecodeされます。

dalle2.png
Dalle 2の構造

 Diffusion Modelとは、元の画像に少しずつノイズを加えて、元の画像を壊して、その壊れた状態からノイズを取り除いて復元するという方法を採用します。具体的に、元のオリジナルデータに対して、各ステップに対して、少しずつGaussian Noiseを入れて、Tステップまで行います(Forward process)。Tが大きいければ、元の画像は最終的には完全にgausian 分布になります。そこから、少しずつノイズを取り除いて、もとの画像に復元するという学習を行います。

 従って、Forward process(拡散過程)は基本的にgaussian分布からnoiseを加えて、そして、Reverse processs(生成過程)で、少しずつ加えたnoiseを取り除いて、各ステップで、元のデータに戻すためのパラメータを学習します。学習が完了すれば、完全なrandom noiseから、元の画像を生成することができます。

 拡散モデルはGANやVAEモデルなどのように、潜在変数モデルに基づく生成モデルとみなすことができます。潜在変数モデルに基づく生成モデルは、はじめに潜在変数を生成し、次に潜在変数から観測データを生成します。拡散モデルでは、最初のノイズや途中のノイズを加えたデータが潜在変数であるとみなします。ただ、拡散モデルは従来の生成モデルと比べて優れた点が多くあります。1つは、学習が安定していること。テキストから画像を生成する能力は、拡散モデルもGANも同等に備えています。ただ、GANでは敵対的学習の構造そのものに、学習の不安定さと多様性の欠如があります。拡散モデルでは1つのモデルで安定した最尤(さいゆう)推定を使って学習すればよく、敵対的生成モデル(例えばGAN)のように学習が不安定ではなく、また変分自己符号化器(VAE)のように生成モデルと同時に認識モデルを学習する必要がない。2つ目は、難しい生成問題を簡単な部分生成問題に自動的に分解し、難しいデータ対象も生成できるように学習できることにあります。拡散モデルの生成過程は、多くの確率層を使った非常に深いネットワークとみなすことができる。

 diffusion modelをPythonで実装するコードの説明は、//keras.io/examples/generative/ddim/にあります。

 OpenAIが開発したGLIDEのコードはにあります。下の画像は、"an oil painting of a goldenredviever"と入力したとき、clip_guided.ipynbを利用して描いたゴールデンレッドリバーの生成画です。

golden.png
"an oil painting of a goldenredriever"

 Diffusion modelが採用されている代表的なAIサービスとして、DALL・E 2 のほかに Stable Diffusion があります。Stable Diffusionを試しに使ってみたい方は、Webアプリケーション上に公開されているHugging Face や Dream StudioなどのWebサービスを利用すると効率的です。 Hugging Face を利用するときは、このwebサイトにアクセスしてください。



DALL·E 3 の利用


  DALL・E 3 は2023年9月21日にOpenAI社が公開した最新の画像生成AIで、テキストプロンプトから画像を生成するDALL·E シリーズの最新版です。ChatGPT Plus から利用可能になっています。なので、OpenAIのDALL·E 3を利用するためには、有料の課金を伴うChatGPT Plus へのサブスクリプションが必要です。他方で、 Microsoft の Bing/Image Creator を利用すれば、無料で DALL·E 3 を使用して AI 画像を生成することができます。Microsoft Bing はMicrosoft のアカウントを作成すれば、利用可能です。テキスト プロンプトを入力すると、そのプロンプトに一致する一連の画像が AI によって生成されます。

 利用規約によれば、DALLEで作成した画像の所有権はユーザにあります。これには、無料または有料のクレジットを通じて生成された画像に関係なく、再印刷、販売、商品化の権利も含まれます。 ただし、Microsoft Bing Image Creatorは個人の非商業目的のみ利用可能で、商用利用不可となっていますのでご注意ください。

 下に表示されている絵は Microsoftの Bing Image-creator を用いて生成した画像の例です。"a big dog seeing Enoshima on automobile"というメッセージを入力しました。

OIG.jpeg
DALL·E 3による画像生成

 「樅木の下でフルートを吹く女性」というテキストを入力すると、以下の画像が作成されました。

lady_under_tree.jpeg
DALL·E 3による画像生成:樅木の下でフルートを吹く女性

Google Gemini の利用


 Gemini は Google が開発した マルチモーダルの生成 AI モデルです。Gemini モデルでは、選択したモデル バリエーションに応じてプロンプトでテキストと画像を受け取り、テキストのレスポンスを出力できます。Gemini の利用を開始する最も簡単な方法は、Google AI Studio を使用することです。

 Google AI Studio は、生成モデルを使用したプロトタイピング用のブラウザベースの IDE で、ブラウザ上でプロンプトのプロトタイプを作成して実行できるようにするウェブベースのツールです。Google AI Studio では,モデルを試してさまざまなプロンプトを簡単に試せます。結果に問題がなければ、Gemini API を利用した、お好みのプログラミング言語のコードにエクスポートできます。 詳しくは、Google AI Studio クイックスタートをご覧ください。

 ここで、簡単に利用法を説明します。このGoogle AI のページにアクセスします。マルチモーダル プロンプトを作成するには、Google AI Studio で以下のようにします。

  1. 左側のパネルで、[Create new] > [Freeform prompt] を選択します。
  2. 右にあるmodelの部分をGemini Pro Vision にします。
  3. プロンプトの入力領域に自動的に画像が表示されるので、それを消去して、自身の画像を貼り付けます。自身のPCにある画像、例えば、minato_mirai.jpg(みなとみらいのコスモ・クロックの写真)を貼り付けます。
  4. プロンプトのテキスト領域に、次のテキストを入力します。
    Tell me the story about the image uploaded
  5. アプリ ウィンドウの下部にある [Run] をクリックして、このリクエストに対する返信を生成します。

minato_mirai.jpg
みなとみらいのコスモ・クロック

 結果は下記のような返答になりました。「 The image uploaded is of the Cosmo Clock 21 Ferris wheel in Yokohama, Japan. The Ferris wheel is located in the Minato Mirai 21 district of Yokohama and is one of the most popular tourist attractions in the city. The Ferris wheel is 107 meters (351 feet) tall and has a diameter of 100 meters (328 feet). It was built in 1989 and is the tallest Ferris wheel in Japan. The Ferris wheel offers stunning views of the city of Yokohama and the surrounding area. On a clear day, you can see Mount Fuji in the distance.」

 Gemini Playgroundを用いた例について説明します。この例は、web上の解説記事、 First Impressions with Google’s Gemini に紹介されています。

 江ノ島の画像(image/enoshima_3.jpg)を用いた検証を行います。「Tell me the story about the image uploaded」とプロンプトに書き込むと、以下のように、Gimini による返答がありました。
「the Enoshima Island is located in the Sagami Bay in Kanagawa Prefecture, Japan. It is a popular tourist destination,known for its beautiful scenery and mild climate. The island is home to a variety of attractions, including the Enoshima Shrine, the Enoshima Aquarium, and the Enoshima Observation Tower. The island is also a popular spot for swimming,fishing, and boating.」

image/enoshima_3.jpg
江ノ島の画像

 次に、「please show me the content of the image」という問いを入力すると。 「The image shows a beautiful sunset over the ocean. The sky is a gradient of orange, yellow, pink, and blue. The sun is setting behind a small island, and there are waves crashing on the shore. There are two surfers in the water, and a few people walking on the beach.」という返答がありました。

**** To be continued ***

ページの先頭に戻る

DCGanのページに行く

トップページに戻る

ご質問、コメントなどは こちらからメール送信して下さい。