NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

Amazon Nova Canvas で画像生成アプリを構築した話

はじめに

こんにちは。インフラエンジニア2年目の井手亮太です。 日々、AWSを中心としたクラウドインフラの設計・構築・運用に携わりながら、技術の幅を広げるべく新しい分野にも挑戦しています。

そんな筆者の最近のマイブームは……ずばり、AI!
ChatGPT、Gemini、Copilotなど、さまざまなAIサービスがある中で、今回はAWSが提供する最新の基盤モデルの一つ、Amazon Nova Canvas に注目しました!
本ブログではこの Amazon Nova Canvas を用いた簡単な画像生成アプリケーションを作成したので、そちらについて紹介していきたいと思います!

Amazon Nova Canvas とは

Amazon Nova Canvas(以下、Nova Canvas)とは、AWS が提供する生成AIモデル群「Amazon Nova」シリーズの一部で、テキストや画像の入力から高品質な画像を生成・編集できる画像生成モデルです。

aws.amazon.com

Nova Canvasは、AWSの生成AIプラットフォーム「Amazon Bedrock」上で提供されており、開発者向けの柔軟な統合が可能です。API経由での利用もできますし、 最近ではファインチューニング機能にも対応したことから、独自のデータを学習させることでブランド固有のビジュアルスタイルや、特定のテーマに沿った画像を高精度で生成することが可能になりました。

aws.amazon.com

全体構成

では、さっそく今回作成したアプリケーションについて説明していきます。処理の流れとしては以下の通りです。

  1. Web サイト上でプロンプト・ネガティブプロンプトの入力、及び画像をアップロードする
  2. バックエンドで Nova Canvas が画像を生成する
  3. Web サイト上で画像を表示&ダウンロードを実施する

画面遷移図とアーキテクチャ図を以下に掲載しています。各画面とその裏で実行される処理を番号で対応させています。

画面遷移

画面遷移図

アーキテクチャ

アーキテクチャ

翻訳したプロンプト&画像が SQS に格納された後は非同期で二つの処理を実行しています(画面②内での処理)。

  • 画像生成・保存&署名付きURL 保存処理(青破線矢印)

    Amazon Nova Canvas で画像生成したのちに、S3バケットへ保存します。その際、署名付きURLを発行し、Dynamo DB に保存します。

  • フロントから一定間隔での GetItem API リクエスト(赤破線矢印)

    SQSへのメッセージ送信が成功すると、Lambda関数がフロントエンドに成功レスポンスを返します。そのレスポンスを受けて、フロント側のロジック(言語はReact)で一定間隔ごとにGetItem API リクエストの処理を開始するように実装しています。

設計のポイント

1. Claude Sonnet 4 の使用

Nova Canvas の対応言語は英語のみのため、ユーザーが日本語など他の言語でプロンプトを入力した場合、英語への翻訳が必要になります。

このような翻訳タスクには通常「Amazon Translate」が使われますが、今回はあえて Claude Sonnet 4 を採用しました。
その理由は単なる翻訳にとどまらず、画像生成に最適化されたプロンプトへと自然に整えたかったからです。
今回は、以下のようなシステムプロンプトを設定しました。内容としては、強調表現の定義や、文章が入力された場合にそれを単語単位に変換するような処理を行うタスクを含んでいます。

prompt_request = f"""
    Amazon Nova Canvas で画像生成をするためのプロンプトを生成します。
    プロンプト生成の際、以下のルールは必ず守ってください。

    <ルール>
    1. プロンプトは英語で生成してください
    2. 出力はプロンプトのみにして、説明などは入れないでください。
    3. 入力に「」が含まれている場合、それは強調表現です。生成される画像に必ず含まれるようにプロンプトを生成してください。
    </ルール>

    プロンプト生成の手順を以下に示します。

    <手順>
    1. まず、入力されたテキスト{text}に「」が無いかを調べてください。これは強調表現なので、生成される画像に必ず含まれるようにプロンプトを修正してください
    2. 修正されたプロンプトを英語に翻訳してください。
    3.できるだけ文章ではなく、単語を並べる形にしてください。
    </手順>

    それでは以下のテキストから画像生成のプロンプトを生成してください。

    <input_text>
    {text}
    </input_text>
    """

たとえば、ユーザーが以下のようなプロンプトを入力したとします。ここではあえて画像内に必ず含めてほしい要素を最後に持ってきます。(AIは順番が先のものほど優先度を高くする傾向があります)

20 代前半のサッカー選手、スタジアムにいる、黒いズボン、ドリブルをしている、背景は満員の観客席、「青色のユニフォーム」

Claude Sonnet は以下のようなプロンプトを生成します。

Young soccer player in his early twenties, blue uniform, black shorts, dribbling, stadium setting, packed crowd in background, athletic pose, dynamic movement, professional football match atmosphere

「青色のユニホーム」が順番が先になっただけではなく、athletic pose, dynamic movementなど追加の要素を付け加えてくれました!

このように、Claude Sonnet を活用することで、ユーザーの意図を的確に読み取りながら、画像生成AIにとって最適なプロンプトへと自然に再構成できます。単なる翻訳にとどまらず、創造的な補足や焦点の明確化を行える点が、Claude の大きな魅力です。

2. Webサイト上から様々なパラメータを指定可能

プロンプト入力画面だけではなく、ネガティブプロンプトやタスクタイプ(後述)、元画像との類似度を選択可能にすることで、バリエーションにとんだ画像生成を可能としました。

Web UI

例えば、上記ではタスクタイプとして、Image Variation を選択しています。この場合、ユーザーインターフェースには「元画像との類似度」を指定するための選択ボックスが表示されます。これにより、生成される画像がどの程度元画像に似ているかを細かく調整することを可能としました。

意図した画像を作成するポイント

今回のアプリ開発では、実際に自分で100枚以上の画像を生成してみました。 最初は手探り状態でしたが、試行錯誤を重ねるうちに「こうするといい感じになるな」というポイントが少しずつ見えてきました。

このセクションでは、そんな実体験から得られたちょっとしたコツや工夫をいくつか紹介していきます。

1. タスクタイプ

画像生成においてタスクタイプとは、いわば「画像の生成・編集手法」のようなものです。目的に応じてタスクタイプを選ぶことで、より意図に沿った画像を得ることができます。Nova Canvas におけるタスクタイプの詳細は以下をご覧ください。

docs.aws.amazon.com

本アプリケーションでは、TEXT_IMAGE with text only, TEXT_IMAGE with image conditioning, IMAGE_VARIATIONの三つのタスクタイプを選択可能にしています。TEXT_IMAGE with text only は名前の通り、テキストを入力して画像を生成するモードです。その他二つは画像+テキストを入力して新たな画像を生成するモードとなっています。

プロンプト : サッカーボールを持っている男性、赤色のユニホーム、黒のパンツ、スタジアムにいる、観客に囲まれている 

上記の画像は、同じプロンプト・画像を使って異なるタスクタイプで生成した結果を比較しています。

  • IMAGE_VARIATION : 元のテーマや雰囲気を保ちながらも、構図やスタイルに変化を加えた複数のバリエーションを生成するのに適しています。より自由な発想で多様な案を得たいときにおすすめです。

  • TEXT_IMAGE with image conditioning : 元画像のデザイン構造や特徴を活かしながら、テキストの指示に基づいて画像を調整します。既存の画像に微調整を加えたい場合に最適です。

2. リクエストパラメータ

画像生成を行う際には、リクエスト時に指定する各種パラメータの役割を正しく理解することが、思い通りのビジュアルを得るための重要なポイントとなります。 各タスクタイプのリクエストパラメータの詳細については以下をご覧ください。 docs.aws.amazon.com

今回は、IMAGE_VARIATIONを例に挙げて解説していきます。

リクエストパラメータ(画像は 画像生成のリクエストとレスポンス構造 - Amazon Novaから引用)

  • simirarityStrength : 元画像との類似度。0.2~1.0 の間で指定。値が大きいほど元画像に忠実
  • text : プロンプト
  • negativeText : ネガティブプロンプト。生成される画像に含みたくない要素を指定
  • cfgScale : プロンプトへの忠実度を指定する。
  • seed : 画像生成した際にランダムに割り振られる値。seed 値が異なると、同じプロンプト、パラメータでも異なる画像が出力される

例えば、

  • 元画像の雰囲気を残しつつ、まったく新しいスタイルを生み出したい ⇒ simirarityStrength値を低くする

  • 出力の一貫性を担保したい ⇒ seed固定値にする

といったように、パラメータの値を調整することで、意図した画像に近づけることができます。

3. プロンプトエンジニアリング

AI 画像生成において、最も重要な要素のひとつがプロンプト(指示文)です。 どんなに優れた AI でも、プロンプトの質が低ければ理想の画像を描くことはできません。 だからこそ、プロンプトの書き方にはちょっとした工夫が必要です。

今回は、筆者が実際にプロンプトを書く際に特に意識している二つのポイントをご紹介します。 この二点を押さえるだけで、生成される画像のクオリティがぐっと上がります。

その1 含めたくない要素は ネガティブプロンプト内に記述する

まず、一つ目ですが、プロンプト内で含めたくない要素を否定表現(~を書かないで)で記述することは避けましょう
否定表現は、AIが「何を描くべきか」を判断するうえで混乱を招くことがあり、意図しない要素が含まれてしまう原因にもなります。

共通のプロンプト: サッカーの試合に出ている男性、スタジアム内、多くのディフェンダーに囲まれている、ドリブルをしている

その2 曖昧な表現は避け、具体的な指示を出す

「かわいい」「いい雰囲気」「おしゃれな背景」などの曖昧な表現はAIにとって解釈が広すぎるため意図した画像の生成が難しくなってしまいます。

AI画像生成において、筆者がプロンプトを書く際に必ず盛り込んでいる三つの要素があります。 それは、

被写体(何を書くか)・シチュエーション(いつ・どこで・何をしているか)・画風(どんなタッチで描くか)です。

まず、この三要素をざっくりと考えて、それぞれを少しずつ深掘りしていく、というのが筆者の基本的なスタイルです。
例えば、「スタジアムでサッカーをしている男性のアニメ風のイラスト」を描きたいとしましょう。 この時点で、以下のように三要素をざっくりと設定します。

  • 被写体 : サッカーをしている男性

  • シチュエーション : スタジアムで

  • 画風 : アニメ風

次にそれぞれの要素を詳細化・具体化していきます。例えば被写体では以下のような具現化が考えられます。

  • 年齢 : 20代前半
  • 国籍 : ヨーロッパ系
  • 髪型・服装 : 短髪、青と白のユニフォーム、背番号10
  • 表情・動き : ゴールを決めて笑顔。ドリブルをしている

以下、シチュエーション、画風の具体化の例です。

AIに「思い通りの絵」を描いてもらうためには、細部まで描写することが最大の近道です。 少し手間はかかりますが、その分、完成した画像の精度と満足度は格段にアップするでしょう。

おわりに

今回は、Amazon Nova Canvas を活用して画像生成アプリを作成し、その過程や工夫したポイント、そして画像生成をより魅力的にするためのコツについてご紹介しました。 実際に手を動かしてみることで、AI画像生成の奥深さや、ちょっとしたプロンプトの工夫が結果に大きく影響する面白さを実感することができました。

これから画像生成に挑戦してみたい方や、より高品質なアウトプットを目指したい方の参考になれば嬉しいです。

※今回使用したLLMと利用規約
本スライド作成にあたって使用したAmazon Bedrockの各Modelは2025-05-20~05-31(JST)に実行し、 その時点における次のEnd user license agreement (EULA)に基づいています。
Anthropic Claude Sonnet 4(apac.anthropic.claude-sonnet-4-20250514-v1:0):
Anthropic on Bedrock- Commercial Terms of Service (Version: September 17, 2024)
Amazon Nova Canvas (amazon.nova-canvas-v1:0):
AWS Customer Agreement (Last Updated May 17, 2024)
AWS サービス条件 (Last Updated May 2, 2025)

執筆者:井手 亮太
職種:インフラエンジニア
推しのサッカー選手:ケビン・デブライネ
執筆記事一覧:https://tech.nri-net.com/archive/author/r-ide-ryota