京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

Rで、OpenAI APIの "DALL·E 2" モデルを使って『テキストから画像生成(txt2img)』を試してみた件

はじめに

先週、2023年7月6日未明に、GPT-4 APIの一般利用が発表されました。 しかし、私のアカウントのRate limitsでは残念ながら、まだGPT-4 APIが利用可能と表示されていません。

 

現在利用できるのは、gpt-3.5-turbo-16kまでです。

モデルリストを見ていると、最後の方にIMAGEというカテゴリーがありました。これは、OpenAI社が提供する、テキスト入力から画像を生成する、txt2imgモデルであるDALL·E 2 (ダリ ツー)がどうも使えるようです。

 

このモデルは1分間に50イメージの制限付きで使用できるみたいです。

 

サイズ256x256 pxの画像生成の場合で、1枚あたり0.016USドル(1ドル140円計算で、2.24円/画像となる)です。つまりは、画像生成のサブスクに別途登録するよりも、十分に安い料金で使えそうです。

あと、画像生成のモデルが乱立し過ぎてて、モデルごとにツールを変え環境を変えというのが、どうにも手間と学習コストがかかり過ぎて、すでに手が出せない。。。使い慣れた、R環境ですべてを完結したいというのがモチベーションです。

それでは、Rで実装して、画像生成を試みます。

実行環境

以下が実行環境です。

#実行環境
macOS Big Sur (バージョン11.5.2)
MacBook Air (M1, 2020)
チップ Apple M1
メモリ 16GB

#R環境
R version 4.2.3 (2023-03-15) -- "Shortstop Beagle"
Copyright (C) 2023 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin17.0 (64-bit)

txt2img実行関数の読み込み・API keyの設定

RStudioの環境を起動し、gistからRスクリプトを読み込みます。

source("https://gist.githubusercontent.com/kumeS/ba0a6219b180a42c4cdc82baf2d4b47e/raw/0b303d8927dfc294b475240f81d63cfca5fe7794/generateImage_for_gist.R")

今回、テキストから画像生成を行うgenerateImage4R関数、画像表示を行うDisplay関数を用意しています。

OpenAI APIにプロンプトを投げると、画像が生成されて、その画像URLがjson形式で返ってきます。 これをパースして、該当URLからPNG画像をダウンロードし、その画像を表示させる仕組みです。 このAPIでは、一度の実行で、画像を最大10枚まで生成できます。

OpenAI Web APIのURLは、https://api.openai.com/v1/images/generationsを使っています。

API REFERENCEの例では以下のようなレスポンスとなるりようです。

bodyで定義できる引数は、5つのみで、実行もシンプルです。このモデルの場合、入力テキストはpromptに全て盛り込む必要があります。

次に、GPT-4のSKRIVEプラグインで、generateImage4R関数の実行プロセスをフローチャートで表しています。

 

また、Display関数の実行プロセスだと以下のようなフローチャートにです。

 

次に、API keyを設定します。API keyはOpenAI のアカウントに登録し、キーを作成します。

#APIキーを定義
api_key <- "Your API Key"

#設定に反映
Sys.setenv(OPENAI_API_KEY = api_key)

#念の為、設定内容を表示
Sys.getenv("OPENAI_API_KEY")

上記の設定が一通り終われば、画像生成関数の実行を試してみます。

generateImage4R関数で、画像生成を実行した

はじめに、画像生成用のプロンプトを作成します。 プロンプトは自作しても良いですし、GPT-4を使って英語のプロンプトを作ってもらうのも良いです。

日本語と英語で同じ意味になるテキストでも出力は変わってきます。

また、どちらかというと、LLMモデルの傾向としては、英語で入力する方が何かと精度が良い結果が得られます。

自作したプロンプトで画像生成

それでは、自作したプロンプトで画像生成を試みます。

#自作したプロンプト
pr <- "white cat island sea ocean july hokkaido bear happy"

#実行: DALL·E 2を実行
img <- generateImage4R(pr)

#結果表示
Display(img)

上記の自作プロンプトwhite cat island sea ocean july hokkaido bear happyです。 日本語訳は、「白猫の島 海 海 7月 北海道 熊 幸せ」です。

GPT-4で作成したプロンプトで画像生成

このプロンプトをもとに、GPT-4で新たなプロンプトを考えてもらいました。

GPT-4が考えたプロンプトで画像生成した結果が次です。やたら、プロンプトが長いです。

#GPT-4が生成したプロンプト
gpt <- "Create an image of a joyful white cat, playfully prancing on a sandy island surrounded by the blue ocean, under the radiant July sun in Hokkaido, Japan. To one side, a friendly local bear observes the scene with amusement."

#実行: DALL·E 2を実行
gpt_img <- generateImage4R(gpt)

#結果表示
Display(gpt_img)

プロンプトを日本語訳すると、「北海道、7月の輝く太陽の下、青い海に囲まれた砂浜の島で、楽しそうに跳ね回る白猫をイメージしてください。一方では、人懐っこい地元のクマがその様子を楽しそうに観察している。」というプロンプトらしいです。

photorealisticプラグイン + GPT-4による最適化で作成したプロンプトで画像生成

ある方に教えてもらい、GPT-4のphotorealisticプラグインで、Midjourney用の画像生成プロンプトを作成できることを知りました。

つまりは、photorealisticプラグインは、Midjourney用(Photorealistic画像)のプロンプト作成支援ツールです。

そこで、このプラグインで作成し、GPT-4でDALL-E 2が理解しやすく最適化してもらうことで、プロンプトを作成しました。

GPT-4上での実行は以下の通りです。

 

2つの案が作成されましたので、それぞれ実行してみることにします。

#案1
photo1 <- "Imagine a serene scene in Hokkaido in July. A white cat is happily lounging on an island surrounded by the vast ocean. In the distance, a bear is also enjoying the summer day. The scene is captured with a high-resolution 16k camera, using a raw style to highlight the natural beauty of the scene. The lighting is soft, illuminating the scene with the warm glow of a summer day. The color palette is dominated by the cool blues of the ocean and the warm whites of the cat and the sandy island. The composition is balanced, with the cat in the foreground and the bear in the distance, creating a sense of depth."

#実行: DALL·E 2を実行
photo1_img <- generateImage4R(photo1)

#結果表示
Display(photo1_img)

#案2
photo2 <- "Picture a summer day in Hokkaido. A white cat is basking in the sun on an island in the middle of the sea. Not too far away, a bear is also enjoying the day. The scene is captured in a raw style with a high-resolution 16k camera. The lighting is natural, casting soft shadows and highlighting the textures of the scene. The colors are vibrant, with the blue of the ocean contrasting with the white of the cat and the brown of the bear. The composition is carefully arranged, with the cat and the bear positioned to draw the viewer's eye across the scene."

#実行: DALL·E 2を実行
photo2_img <- generateImage4R(photo2)

#結果表示
Display(photo2_img)

なんだか、フォトグラファーっぽい写真が家にいながら、生成できました。画質が悪いは愛嬌です。

まとめ

R環境で、OpenAI APIを使い、テキスト2イメージを試してみました。

プロンプトが良くなることで、生成された画像に動きやストーリーが付与されている気がしますが、 どうも、256x256で解像度をケチっているのか、画質やクオリティはあまり変わっていないようです。

画像生成のプロンプト・マスターへは道半ばです。。。