マルチモーダルな生成 AI 活用の入門編!
- 画像認識と画像生成
Author : Mantaro Yamada
ゲームなみなさんこんにちは!ゲームやメディアの皆様をご支援させていただいている、Solutions Architect の山田です。
この記事は、2024 年 1 月から 3 月の builders.flash 記事「品質管理に生成 AI は使えるのか !?」「生成 AI を用いたヘルプソリューションを作成する」「世界に 1 つだけの AI アシスタント作成」のシリーズの番外編の内容となっております。まだの方は是非そちらの記事も併せてご覧ください。
上記のシリーズ記事では、「言語」を扱う生成 AI を活用する方法を紹介してきました。Amazon Bedrock を利用することで、様々な応用ができるようになりました。
今回の記事では、言語だけでなく画像も扱う生成 AI の活用方法を紹介していきます。言語に限らず画像や音声など複数の入力や出力形態を扱うことを「マルチモーダル」と呼びます。マルチモーダルの中でもここでは特に画像にフォーカスして、画像の認識と画像の生成について紹介し、ゲーム開発への活用に繋がる可能性を考えてみたいと思います。
このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »
毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。
1. マルチモーダルな生成 AI と Amazon Bedrock
Amazon Bedrock は様々な基盤モデル (生成 AI の元となるモデル) を API ひとつで利用できる AWS サービスです。マネージドなサービスなので、モデルを自前で用意してホストしたり、管理したりする必要はありません。2024 年 4 月現在 (オレゴンリージョン)、画像が扱えるマルチモーダルなモデルをリストしてみます。
- 画像の認識 (image → text)
- Claude 3 Opus, Anthropic
- Claude 3 Sonnet, Anthropic
- Claude 3 Haiku, Anthropic
- 画像の生成 (text → image, image → image)
- Stable Diffusion XL (SDXL) 1.0, Stability AI
- Titan Image Generator G1, Amazon
それぞれのモデルを簡単に解説します。Anthropic 社から提供されている Cluade 3 は、日本語含む多言語の扱いにも長けている最新のモデルです。もちろんテキストチャット形式でも利用可能ですが、特徴として画像の入力にも対応しています。また、Opus は Claude 3 で最もインテリジェントなモデル、Sonnet は性能と速度のバランスが取れたスタンダードモデル、Haiku は高速・安価な軽量モデルです。今回の記事では、画像認識のパートで Claude 3 Sonnet を用いていきます。
次に、Stability AI 社から提供されている Stable Diffusion XL 1.0 は、高精度な画像生成が行えるモデルです。今回はこちらのモデルを使って画像生成を紹介していきます。同様の画像生成モデルとして、Amazon からも Titan Image Generator G1 というモデルも提供されています。
2. 画像の認識
早速、Amazon Bedrock を用いて、生成 AI に画像を認識、理解させるということからやってみましょう。Bedrock は、AWS マネジメントコンソールから「プレイグラウンド」として簡単に生成 AI を使えるインタフェースを提供しています。もちろん、API 経由で使うこともできますので、アプリケーションへの組み込みも簡単にできます。
今回は、Claude 3 が提供されている「バージニア北部」または「オレゴン」リージョンを用います。初めて Bedrock を用いる方は、過去の builders.flash 記事にて設定の方法が記述されているので、こちらの手順 を参照して進めてみてください。
さて、Bedrock のコンソール画面に移動し、左側メニューの「プレイグラウンド」の下にある「チャット」をクリックします。
クリックすると拡大します
モデル選択画面になるので、「Anthropic」→ 「Claude 3 Sonnet」を選択します。
クリックすると拡大します
Claude 3 Sonnet が選択されたら、こちらの画面の「Image」から画像をアップロードすることができます。そして、テキストでのプロンプトと同時にその画像を Claude に入力することができます。
これで準備は完了です。それでは、いろいろと試していきましょう。
クリックすると拡大します
早速、まずは試しにゲームバックエンドを支える AWS のアーキテクチャ図を入力して認識してみましょう。
AWS Well-Architected Framework - Game Industry Lens に記載されている、“Container-based game backend architecture” を入力し、解説をお願いしてみます。本記事では、特に注記しない限り各種パラメータはデフォルトとしています。
プロンプト:
この画像は AWS のアーキテクチャ図です。どのようなアーキテクチャか解説してください。
出力:
この画像は、ゲームサービスのためのAWSクラウドアーキテクチャを示しています。このアーキテクチャは、可用性と拡張性に優れた設計となっています。
主な構成要素は以下の通りです:
フロントエンド
- Amazon Route 53 およびGlobal Acceleratorが、ゲームコンテンツとダウンロードの配信を支援
- Amazon CloudFrontがコンテンツ配信を最適化
コンピューティングリソース
- Auto Scalingが有効化された Amazon EKS (Elastic Kubernetes Service) クラスターが複数の Availability Zone にデプロイされ、ゲームサービス、アカウントサービス、ソーシャルサービスなどのワークロードを実行
- Application Load Balancer と NAT Gateway が各 Availability Zone にデプロイされ、トラフィックをルーティング
データストア
- Amazon Aurora と Amazon ElastiCache (Redis) がデータベースとキャッシングを処理
ストレージ
- Amazon S3 がゲームコンテンツなどのオブジェクトストレージとして使用される
その他のサービス
- AWS Lambda がバックエンドワークフロー処理を実行
- Amazon SQS がアプリケーションのデカップリングを行う非同期キューを提供
- Amazon SNS がプッシュ通知を送信
- Amazon EventBridge がイベントドリブンなアーキテクチャを実現
このアーキテクチャは、可用性の高いマルチAZデプロイ、自動スケーリング、グローバルコンテンツ配信、イベントドリブン設計などにより、大規模なゲーミングワークロードに対応できる拡張性と耐障害性を備えています。
なんと簡潔に、わかりやすく解説してくれました。今回の結果では、誤りがなく説明できていました。
このままチャットを続けて、「ボトルネックになり得る箇所を指摘してください」「各コンポーネントを選定するポイントを解説してください」といった質問をしてみるのも面白そうです。もちろん、指摘が完璧である保証はないため、生成 AI の出力結果だけに基づいた判断は禁物ですが、是非試してみて頂けると興味深い結果が得られるのではないか思います。
次に、少し志向を変えて、登場人物の系譜図や相関図を認識させてみます。これは、例えばゲームの設定資料集や背景情報などを前提知識として生成 AI に与えたい場合 (そしてそれを元にして何かを生成させたい場合) を想定しています。まずは、以下の系譜図を解説してもらいました。
プロンプト:
この画像は、とある登場人物の系譜図を表しています。この系譜図を読み解いて、最下部に至るまでの流れを説明してください。
出力:
この系譜図は、日本の神話に登場する神々の血縁関係を示しているようです。頂点にある"別天津神"と"あめのみなかぬし"から枝分かれし、様々な神々の名前が階層構造で繋がっています。
主な流れを辿ると、"たかみむすひ"と"かみむすひ"から"おおいかね"が生まれ、そこから"いざなぎ"と"いざなみ"の"三貴神"が誕生しています。"いざなぎ"と"いざなみ"の間に"あまてらす"、"つくよみ"、"すさのお"などの子供たちがおり、その子孫が枝分かれして更に多くの神々が生まれています。
"あめのおしほみみ"からは"おおやまつみ"が生まれ、さらに"さくやひめ"、"ほてり"、"ほてり"、"ほおり"が現れます。そして"うがやふきあえず"の下に"たまよりひめ"が存在し、最終的に"じんむ(神武天皇)"に至る系統が示されています。
こうした階層構造と枝分かれを追うことで、日本神話に登場する多様な神々の親族関係や系譜を辿ることができる興味深い図となっています。
日本語の読み取りにも対応し、ある程度流れをまとめてくれていますが、今回は完璧にはいきませんでした。婚姻関係と親子関係が区別できていなかったり、間にエッジがないが近くに位置するノード間に親子関係があると認識してしまったり、"別天津神" と "三貴神" という「グループ」の扱いができていなかったりしていました。
次にキャラクター相関図を試してみます。こちらは抽象化した以下の図を用いました。また、認識して解説するだけでなく、その情報を元にストーリー展開のパターン出しをやってみています。
プロンプト:
この画像はとある登場人物の相関図です。この相関図を読解して、解説してください。
出力:
この図は、中央のAという人物を中心に、様々な人物や集団との関係性を示しています。
左側の人物関係を見ると、CはAに忠誠を尽くす存在で、Dは対立関係にあり、政敵とも考えられます。DからIへの矢印は、Dが信頼を置いている人物であると解釈できます。またDとHの「翼賛」関係から、Hはある程度Dを支持する立場と推測されます。
一方、右側のBは「仲間」と記されており、AとBは仲間関係にあります。B、E、Fは同じグループに属する仲間であると考えられます。そしてGは「師匠」との記述から、B、E、Fらに影響力のある指導的存在と思われます。
したがって、この図は権力闘争の構図を描いている可能性があります。AとDは対立関係にあり、お互いに支持者を動員し合っている様子がうかがえます。Aは忠実なCと、仲間のB、E、Fらを味方に引き付けている一方、DはHとIを支持者に従えています。GはBらの師匠的存在として影響力を持っているかもしれません。
このように、この相関図は権力の主導権を巡る複雑な人間関係と勢力争いを表しているように見受けられます。
プロンプト:
この相関図の情報に基づいて、次に起こり得る物語のパターンを考えてください。
出力:
この相関図から、次のような物語の展開が考えられます。
1. 権力闘争の激化
AとDの対立がさらに深刻化し、支持者同士の衝突や内戦状態に発展する可能性があります。CとIが率いる両陣営の忠実な支持者同士が戦う様子が描かれるかもしれません。
2. 裏切りと離反
仲間同士の裏切りや離反が起こり、勢力図が入れ替わるパターンも考えられます。例えば、BがGの影響でAから離反し、DとHの陣営に鞍替えするなどの事態が起きる可能性があります。
3. 新たな権力の台頭
H、IといったDの翼賛勢力が権力の実力者となり、AとDの対立を乗り越えて新たな体制を樹立するストーリーも描けるでしょう。
4. 和解と統一への道
対立する両陣営の間に止揚の可能性が見え隠れ、GのようなAとDの両者に影響力のある存在が調停に入り、最終的には和解と統一への道が開かれるかもしれません。
5. 内紛と分裂
むしろ同じ陣営内部での権力闘争や路線対立に焦点が当てられ、AあるいはDの陣営が内部分裂を起こすような物語になる可能性もあります。
このように、この相関図から権力者の野心、陰謀、背信、内戦、和解などさまざまな要素を取り入れた、ドラマティックな物語が描けそうです。
こちらの結果はどうでしょうか ? 相関図と生成 AI の出力結果を見比べて、またストーリー展開の案を読んでみてください。
結果としては、D と H の関係を読み違えている部分がありやはり完璧ではありませんが、それ以外は概ね関係性をまとめて解説してくれています。そして、相関図を前提情報としてアイデア出しに活用する流れは悪くないように思えます。
今回ご紹介したのはほんの一例にすぎませんが、マルチモーダルなモデルが登場してきたことで一層可能性が広がっていくことを知っていただけたら幸いです。画像を論理的に理解するという領域は、下記引用の Anthropic 社 User guides に limitations が記されている通り、まだまだこれからも発展が期待されるところです。既に使える Claude 3 Opus はもちろん、新たなモデルを様々なユースケースで試していきたいですね。
Limitations
...
Spatial reasoning: Claude's spatial reasoning abilities are limited. It may struggle with tasks requiring precise localization or layouts, like reading an analog clock face or describing exact positions of chess pieces.
https://docs.anthropic.com/claude/docs/vision#limitations
(訳) 空間的な推論: Claude の空間的推論能力は限られています。アナログ時計の文字盤を読んだり、チェスの駒の正確な位置を説明したりといった、正確な位置の特定やレイアウトを必要とするようなタスクには苦戦することがあります。
3. 画像の生成
次は、生成 AI で画像の生成をやってみましょう。Amazon Bedrock を用いて、今度は Stable Diffusion XL 1.0 というモデルを使っていきます。ここでは、ゲームのユースケースとして、テキストから画像を生成し、アイデア出しに活用することを考えたいと思います。具体的には、背景イラストの生成を試してみます。その他には、キャラクターイラストへの応用も考えられます。入門編としては、特定のキャラクターを生成させることにはこだわらず、キャラクターの「構図」やキャラクターの「ポーズ」のアイデア出しに使うこともできるでしょう。ちなみに Stable Diffusion XL 1.0 では、画像から画像 (image-to-image) の生成も可能で、画像編集など様々な応用に利用できますが、本記事では詳しく扱いません。
Note: ゲームのユースケースと生成 AI 利用の注意点
ゲーム開発のようなクリエイティブな分野では、生成 AI を利用する際に特に知的財産権への配慮が欠かせません。2024 年 4 月現在、明確な法律が定められているわけでもなく、知的財産権の侵害、誤情報の発生、機密情報の漏洩、などのリスクを考慮しなければなりません。
しかし、生成 AI には、開発効率を上げる可能性 (アイディア出し、QA 作業など) を秘めています。リスクを回避するだけで、生成 AI への投資、学習、利用を全く避けてしまうのは、将来の可能性を狭めてしまうかもしれません。このリスクをしっかり理解し、利用できる業務で生成 AI を活用すれば、開発者は今よりも多くの時間をクリエイティブに利用することができます。
このリスクを理解し生成 AI を利用する取り組みとして責任ある AI (responsible AI) というものがあります。AWS もこの取り組み を行っております。
責任ある AI を学び、リスクを正しく理解すれば、あらゆる分野で生成 AI を利用することができるようになります。責任ある AI には様々な分野で考え方がありますが、生成 AI 利用者が一番注意しなければいけない点としては「生成 AI によって出力されたものに責任を持つこと」とされています。出力をコントロールし責任を持つことができれば生成 AI の業務利用は可能です。
ここで扱う画像生成については、生成結果をそのまま用いるのではなく、アイデア出しの際の参考として用いるという使い方です。最終的には人間の手やチェックが入り、内容に責任を持つことができる業務であれば問題がないと考えられています。
さて、同様に「バージニア北部」または「オレゴン」リージョンが選択されていることを確認したうえで、Bedrock のコンソール画面に移動し、左側メニューの「プレイグラウンド」の下にある「イメージ」をクリックします。
初めて Bedrock で Stable Diffusion XL 1.0 を用いる方は、同様に こちらの手順 を参照して Stable Diffusion XL 1.0 のモデルアクセスを許可することを忘れないでください。
クリックすると拡大します
モデル選択画面になるので、「Stability AI」→ 「SDXL 1.0」を選択します。
クリックすると拡大します
クリックすると拡大します
あとはプロンプトを入力して実行することで、画像生成が行えます。各種パラメータは以下を表していて、詳細は こちらのドキュメント をご確認ください。
パラメータ | 最小値 | 最大値 | 説明 |
負のプロンプト | N/A | N/A | 生成されて欲しくない内容を記述します |
プロンプト強度 | 0 | 35 | 最終的な画像でプロンプトをどの程度表現するかを決定します。小さな数値を指定すると、生成結果におけるランダム性が増します。 |
ステップ数 | 10 | 50 | 生成ステップでは、画像をサンプリングする回数を設定します。このステップの回数が大きいほど、より正確な結果が得られます。 |
シード値 | 0 | 4294967295 | シードでは初期ノイズ設定を指定します。前回の実行と同じシードと設定を使用して推論を行えば、類似の画像を作成できます。この値を設定しないか、値が 0 の場合、乱数が設定されます。 |
まずは背景のアイデア出しとして、「森」のいくつかの背景パターンを生成してみます。パラメータは、検証時のコンソールのデフォルト値である、プロンプト強度: 10、また正確性は求めないのでステップ数: 10 で行いました。実写というよりはイラスト風な背景絵を生成したかったため、“anime” というワード含めたプロンプトにしています。プロンプトを変更する、あるいはシード値を変更することで、アイデア元となる複数の画像を生成することができます。
プロンプト:
An anime scenery of a forest, stylized anime art, vibrant colors, detailed environment
出力:
Seed=1
Seed=2
Seed=3
Seed=4
Seed=5
上記は、同じプロンプトで、シード値を変えた場合の結果です。シード値を変えることで、複数のパターンの高品質な画像を生成することができます。もちろん、プロンプトを自由に変えていただき、森以外の背景の生成もぜひ試していただけます。
API 経由で画像生成を行う
さて、アイデア出しに活用するためには沢山のパターンが欲しいところですので、コンソールではなく Bedrock の API を直接利用して、画像生成を automation してみましょう。Bedrock の API を呼び出すための SDK は、Python, JavaScript, Go など多くの言語に対応しています (詳細は ドキュメント を参照)。ここでは、Python を使う前提で解説させていただきます。
まず、Bedrock の実行権限を持った Python の実行環境を用意します。様々な方法がありますが、セキュアで簡単な方法として、Amazon SageMaker Studio を使う方法を解説します。SageMaker Studio は、AWS 上での AI/ML 開発に使えるツールセットが揃っているマネージドサービスです。SageMaker Studio を使うと、Bedrock の実行権限に加え、Python 環境および必要なライブラリが自動的にセットアップされます。
Amazon SageMaker のコンソール画面に移動し、左側メニューから「ドメイン」を選択してください。このとき、リージョンは同じ「バージニア北部」または「オレゴン」が選択されていることを確認してください。確認できたら、「ドメインを作成」をクリックしてください。
クリックすると拡大します
デフォルトで「シングルユーザー向けの設定 (クイックセットアップ)」が選択されています。このまま「設定」をクリックします。
クリックすると拡大します
数分待つと、セットアップが完了します。デフォルトユーザーが作成されていることを確認し、右側の「起動」から「Studio」をクリックします。
クリックすると拡大します
すると次のような画面に遷移しますが、これが SageMaker Studio のランディングページとなる web インタフェースになります。ここから様々な機能を利用することができます。
Python の実行環境を起動するには、JupyterLab か Code Editor をお好みで選べます。ここでは JupyterLab を使用するので、そちらをクリックしてください。
クリックすると拡大します
次に画面右上の「Create JupyterLab space」をクリックし、適当な名前を付けて、「Create space」をクリックします。
クリックすると拡大します
これで space が作成されました。「Run space」を押すと実際に実行基盤が起動します。
クリックすると拡大します
Space が起動すると、「Open JupyterLab」というボタンがクリック可能になるので、クリックすると別タブで JupyterLab が開きます。
Space が起動している間、インスタンスサイズに応じた従量課金の料金が発生します。デフォルトで設定されている ml.t3.medium の記事執筆時点の料金は、1 時間あたり $0.05 です。最新情報はこちらの 料金ページ を参照ください。そのため、使い終わったら適宜「Stop space」することでコストを最適化することができます。
クリックすると拡大します
JupyterLab が開いたら、「Notebook」の「Python 3 (ipykernel)」をクリックして、新規 Notebook を作成します。
クリックすると拡大します
Bedrock の実行権限、また Python SDK 等の必要なライブラリが始めからセットアップされているので、これで Python SDK から Bedrock API が利用できる準備が整いました。
クリックすると拡大します
それでは満を持して、Bedrock を API 経由で使って画像生成を行なってみます。こちらの ドキュメント にサンプルコードを載せおりますので、参考にしてください。
一度全てコピーして実行してみます。このような画像が生成されたら成功です。サンプルコードを読んでみると、この画像は prompt="""Sri lanka tea plantation.""" というプロンプトから生成されたものみたいですね (スリランカの茶畑) 。
クリックすると拡大します
ここからは、プロンプトやパラメータを変えたり、繰り返し処理をさせたりしながら、いろいろなパターンの生成を自動化していくことができます。サンプルコードで言うと、プロンプトとパラメータは下記の部分で指定します。各パラメータの仕様はこちらの ドキュメント を参照してください。
“cfg_scale“ はプレイグラウンドで「プロンプト強度」と表示されていたものを指します。
...
prompt="""Sri lanka tea plantation."""
# Create request body.
body=json.dumps({
"text_prompts": [
{
"text": prompt
}
],
"cfg_scale": 10,
"seed": 0,
"steps": 50,
"samples" : 1,
"style_preset" : "photographic"
})
...
本記事ではもう少し掘り下げて、アドバンスドな例を示してみます。Bedrock プレイグラウンドでは無かった、“style_preset” というパラメータを変えてみたいと思います。style_preset は下記の説明の通り、画像のスタイルをコントロールすることができるパラメータです。プレイグラウンドで生成を行なった際とプロンプト及びパラメータは同じで、style_preset だけをそれぞれに変えて生成した画像を下記に示します。
パラメータ | 最小値 | 最大値 | 説明 |
style_preset | N/A | N/A | 画像モデルを特定のスタイルに導くスタイルプリセット。このスタイルプリセットのリストは変更される可能性があります。 列挙型: 3d-model, analog-film, anime, cinematic, comic-book, digital-art, enhance, fantasy-art, isometric, line-art, low-poly, modeling-compound, neon-punk, origami, photographic, pixel-art, tile-texture。 |
プロンプト含めその他の条件は同じですが、style_preset によって生成できる画像が大きく変わっていることがわかります。style_preset もパターン出しの際に調整するパラメータとして活用できそうです。紹介はここまでとしますが、プロンプトと各種パラメータを変更しながら生成を繰り返すことで、アイデア出しのための画像を複数用意することができます。また、プロンプトを別の生成 AI (Claude 3 Sonnet など) に考えてもらうことで、プロンプト変更をある程度自動化することもできそうですね。
まとめ
今回はマルチモーダルな生成 AI を利用して、特に画像にフォーカスした画像認識と画像生成を試して確認しました。Amazon Bedrock を用いることで、自前で大規模なモデルを準備・ホストする必要なく、AWS サービスとしてセキュアに生成 AI を使うことができます。画像をインプット・アウトプットできるようになり、生成 AI はさらに活用の可能性が広がっていくと考えられます。生成 AI のリスクを考慮しつつですが、ゲーム開発・運用をよりよいものにしていける一助になれば幸いです。
筆者プロフィール
Mantaro Yamada
アマゾン ウェブサービスジャパン合同会社 ソリューションアーキテクト
ゲームやメディアなどエンターテイメント業界のお客様を支援させていただいています。
私自身もゲームや動画・ライブストリーミングなどはとても好きです。
AWS を無料でお試しいただけます