Amazon Web Services ブログ

Amazon SageMaker 上にデプロイした生成系 AI で広告クリエイティブを生成する

広告クリエイティブは、生成系 AI(Generative AI, GenAI)によって革命を起こす可能性を秘めています。 生成系 AI モデルを再トレーニングし、テキストプロンプト (モデルによって生成されるシーンやオブジェクトを説明する文) などのいくつかの入力をモデルに与えることで、製品画像などさまざまな種類の斬新な画像を作成できるようになりました。 この手法は、2022 年から Stable DiffusionMidjourneyDall-E-2 などの潜在拡散モデル (Latent Diffusion Model) と呼ばれる新しいクラスの基盤モデル(Foundation Model, FM)の爆発的増加によって有望な結果を示しています。 ただし、これらのモデルを本番環境で使用するには、生成プロセスを継続的に改良して一貫した出力を生成する必要があります。 多くの場合、製品のサンプル画像を大量に作成し、巧妙で迅速なエンジニアリングを行う必要があるため、大規模な作業は困難になります。

この記事では、特に大量の画像を扱う場合に、この革新的なテクノロジーを活用して、魅力的で革新的な広告を大規模に生成する方法について模索します。生成系 AI の力、特にインペインティング技術を利用することで、画像の背景をシームレスに作成でき、視覚的に美しく魅力的なコンテンツを作成でき、(モデルハルシネーションと呼ばれる)望ましくない画像アーティファクトを減らすことができます。 また、Amazon SageMaker エンドポイントを活用して、この手法の実用的な実装についても詳しく説明します。これにより、この創造的なプロセスを推進する生成系 AI モデルの効率的なデプロイが可能になります。

生成系 AI ベースの画像生成では、画像内の欠落している要素を置き換えるための強力なソリューションである、インペインティングを重要なテクニックとして採用しています。 ただし、これにはいくつかの課題があります。 たとえば、画像内のオブジェクトの位置を正確にコントロールすることは制限されるため、次の画像例に示すような生成した画像自体の問題や、オブジェクトの浮き上がり、境界がシームレスに融合していないなどの問題が発生する可能性があります。

この問題に対処するために、この記事では最低限の指示で多数のリアルな画像を生成し、創造の自由と制作における効率性のバランスをとることを提案します。 提案されたソリューションを本番環境向けに拡張し、AWS 環境への AI モデルのデプロイを効率化するために、SageMaker エンドポイントを使用してデモを行います。

特に、インペインティング処理をレイヤーのセットとして分割します。この各レイヤーは異なるプロンプトのセットを持つことがあります。 このプロセスは、以下のステップに要約できます。

  1. まず、一般的なシーンのプロンプト (たとえば「後ろに木がある公園」など) を入力して背景画像を生成し、その背景にオブジェクトをランダムに配置します。
  2. 次に、オブジェクトを置く場所をプロンプト(たとえば「芝生の上でのピクニック」、「木製のテーブル」など)で指示し、オブジェクトの中央下部より下の部分にレイヤーを追加します。
  3. 最後に、背景と同じプロンプトを使用して、オブジェクトの中央上部より上の部分に背景レイヤーに似たレイヤーを追加します。

このプロセスの利点は、背景に対して人間の期待に沿った拡大縮小や配置を解釈するため、オブジェクトのリアリティが向上することです。 次の図は、提案されたソリューションの手順を示しています。

ソリューション概要

これらのタスクを実行するには、次のデータフローが考えられます。

  1. Segment Anything Model (SAM)Stable Diffusion インペインティングモデルは SageMaker エンドポイントにホストされます。
  2. 背景プロンプト (Background Prompt) を使用して、Stable Diffusion モデルを使用して背景画像 (Generated Background Image) を生成します。
  3. 基本となる商品画像 (Base Product Image) が SAM を介して渡されマスク画像 (Mask) が生成されます。 マスク画像の逆はアンチマスク画像 (Anti-Mask) と呼ばれます。
  4. 生成された背景画像とマスク画像が、前景用のプロンプト (Foreground Prompt) とネガティブプロンプト (Negative Prompt) と一緒に Stable Diffusion インペインティングモデルへの入力として使用され、中間生成物としての背景画像 (Generated Intermediate Background Image) が生成されます。
  5. 同様に、生成された背景画像、アンチマスク画像、前景用のプロンプト、ネガティブプロンプトが Stable Diffusion Inpainting モデルへの入力として使用され、中間生成物としての前景画像 (Generated Intermediate Foreground Image) が生成されます。
  6. 最終的に生成される商品画像の出力結果 (Generated Product Image) は、生成された中間の前景画像と生成された中間の背景画像を組み合わせることによって得られます。


前提条件

エンドポイントのデプロイと推論の実行に使用する SageMaker ノートブックを作成する AWS CloudFormation テンプレートを開発しています。

以下にアクセスできる AWS Identity and Access Management (IAM) ロールを持つ AWS アカウントが必要です。

  • AWS CloudFormation
  • SageMaker
    • SageMaker エンドポイントには ML モデルを実行するインスタンスが提供されていますが、生成系 AI モデルのような負荷の高いワークロードを実行するには、GPU 対応の SageMaker エンドポイントを使用します。 価格の詳細については、Amazon SageMaker の料金を参照してください。
      モデルのホストには NVIDIA A10G 対応の ml.g5.2xlarge インスタンスを使用しています。
  • Amazon Simple Storage Service (Amazon S3)

詳細については、GitHub レポジトリCloudFormation テンプレートをご確認ください。

製品の対象領域をマスクする

一般的には、配置したいオブジェクトの画像と、オブジェクトの輪郭を描いたマスクを用意する必要があります。 これは Amazon SageMaker Ground Truth などのツールを使用して行うことができます。あるいは、オブジェクトが画像の真ん中にあると仮定すれば、Segment Anything Models(SAM)などの AI ツールを使用してオブジェクトを自動的にセグメント化することもできます。

SAM を使用してマスク画像を生成する

高度な生成系 AI 技術である SAM を使用すると、画像内のさまざまなオブジェクトに高品質のマスク画像を簡単に生成できます。 SAM は、広範なデータセットでトレーニングされた深層学習のモデルを使用して、対象オブジェクトを正確に識別してセグメント化し、正確な境界とピクセルレベルのマスク画像を提供します。 この画期的なテクノロジーは、手作業でマスク画像を作成するという時間と労力のかかる作業を自動化することで、画像処理のワークフローを革新します。 SAM により、企業や個人はオブジェクト認識、画像編集、コンピュータービジョンタスクなどのためのマスク画像を迅速に生成できるようになり、視覚的な分析と操作の可能性が広がります。

SAM モデルを SageMaker エンドポイントでホストする

ノートブック 1_HostGenaiModels.ipynb を使用して SageMaker エンドポイントを作成し、SAM モデルをホストします。
inference_sam.py 内の推論コードを使用し、それを code.tar.gz ファイルにパッケージ化し、それを使用して SageMaker エンドポイントを作成します。 このコードは SAM モデルをダウンロードし、エンドポイントにホストし、推論を実行して出力を生成するためのエントリポイントを提供します。

SAM_ENDPOINT_NAME = 'sam-pytorch-' + str(datetime.utcnow().strftime('%Y-%m-%d-%H-%M-%S-%f'))
prefix_sam = "SAM/demo-custom-endpoint"
model_data_sam = s3.S3Uploader.upload("code.tar.gz", f's3://{bucket}/{prefix_sam}')
model_sam = PyTorchModel(entry_point='inference_sam.py',
                         model_data=model_data_sam,
                         framework_version='1.12',
                         py_version='py38',  
                         role=role,
                         env={'TS_MAX_RESPONSE_SIZE':'2000000000', 'SAGEMAKER_MODEL_SERVER_TIMEOUT' : '300'},
                         sagemaker_session=sess,      
                         name='model-'+SAM_ENDPOINT_NAME)
predictor_sam = model_sam.deploy(initial_instance_count=1,
                                 instance_type=INSTANCE_TYPE,
                                 deserializers=JSONDeserializer(),
                                 endpoint_name=SAM_ENDPOINT_NAME)

SAM モデルを呼び出してマスク画像を生成する

次のコードは 2_GenerateInPaintingImages.ipynb ノートブックの一部で、エンドポイントを実行して結果を生成するために使用されます。

raw_image = Image.open("images/speaker.png").convert("RGB")
predictor_sam = PyTorchPredictor(endpoint_name=SAM_ENDPOINT_NAME,
                                 deserializer=JSONDeserializer())
output_array = predictor_sam.predict(raw_image, initial_args={'Accept': 'application/json'})
mask_image = Image.fromarray(np.array(output_array).astype(np.uint8))
# save the mask image using PIL Image
mask_image.save('images/speaker_mask.png')

次の図は、製品画像から取得したマスク画像を示しています。

インペインティングを使用して画像を生成する

SAM によって生成されたマスク画像を使ったインペインティングの力と、ユーザーのプロンプトを組み合わせることで、素晴らしい生成画像を作成できます。 インペインティングは高度な生成系 AI 技術を利用して、画像の欠けている部分やマスク画像されている部分をインテリジェントに埋め、周囲のコンテンツとシームレスに融合します。 SAM が生成したマスク画像をガイダンスとし、ユーザーのプロンプトをクリエイティブな入力として使用することで、インペインティングアルゴリズムは視覚的に一貫した文脈に適したコンテンツを生成し、とても美しくパーソナライズされた画像を作成できます。 このテクノロジーの融合により、クリエイティブな可能性が無限に広がり、ユーザーは自分のビジョンを鮮やかで魅力的なビジュアルストーリーに変えることができます。

SageMaker エンドポイントで Stable Diffusion のインペインティングモデルをホストする

2.1 と同様に、ノートブック 1_HostGenaiModels.ipynb を使用して SageMaker エンドポイントを作成し、Stable Diffusion のインペインティングモデルをホストしています。

inference_inpainting.py 内の推論コードを使用し、それを code.tar.gz ファイルにパッケージ化し、それを使用して SageMaker エンドポイントを作成します。 このコードは Stable Diffusion インペインティングモデルをダウンロードし、エンドポイントでホストし、推論を実行して出力を生成するためのエントリポイントを提供します。

INPAINTING_ENDPOINT_NAME = 'inpainting-pytorch-' + str(datetime.utcnow().strftime('%Y-%m-%d-%H-%M-%S-%f'))
prefix_inpainting = "InPainting/demo-custom-endpoint"
model_data_inpainting = s3.S3Uploader.upload("code.tar.gz", f"s3://{bucket}/{prefix_inpainting}")

model_inpainting = PyTorchModel(entry_point='inference_inpainting.py',
                                model_data=model_data_inpainting,       
                                framework_version='1.12',
                                py_version='py38',
                                role=role,
                                env={'TS_MAX_RESPONSE_SIZE':'2000000000', 'SAGEMAKER_MODEL_SERVER_TIMEOUT' : '300'},
                                sagemaker_session=sess,
                                name='model-'+INPAINTING_ENDPOINT_NAME)

predictor_inpainting = model_inpainting.deploy(initial_instance_count=1,
                                               instance_type=INSTANCE_TYPE,
                                               serializer=JSONSerializer(),
                                               deserializers=JSONDeserializer(),
                                               endpoint_name=INPAINTING_ENDPOINT_NAME,
                                               volume_size=128)

Stable Diffusion のインペインティングモデルを呼び出し、新しい画像を生成する

SAM モデルを呼び出す手順と同様に、ノートブックの 2_generateInPaintingImages.ipynbを使用してエンドポイントで推論を実行し、結果を生成します。

raw_image = Image.open("images/speaker.png").convert("RGB")
mask_image = Image.open('images/speaker_mask.png').convert('RGB')
prompt_fr = "table and chair with books"
prompt_bg = "window and couch, table"
negative_prompt = "longbody, lowres, bad anatomy, bad hands, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, letters"

inputs = {}
inputs["image"] = np.array(raw_image)
inputs["mask"] = np.array(mask_image)
inputs["prompt_fr"] = prompt_fr
inputs["prompt_bg"] = prompt_bg
inputs["negative_prompt"] = negative_prompt

predictor_inpainting = PyTorchPredictor(endpoint_name=INPAINTING_ENDPOINT_NAME,
                                        serializer=JSONSerializer(),
                                        deserializer=JSONDeserializer())

output_array = predictor_inpainting.predict(inputs, initial_args={'Accept': 'application/json'})
gai_image = Image.fromarray(np.array(output_array[0]).astype(np.uint8))
gai_background = Image.fromarray(np.array(output_array[1]).astype(np.uint8))
gai_mask = Image.fromarray(np.array(output_array[2]).astype(np.uint8))
post_image = Image.fromarray(np.array(output_array[3]).astype(np.uint8))

# save the generated image using PIL Image
post_image.save('images/speaker_generated.png')

次の図は、調整されたマスク画像、生成された背景画像、生成された製品画像、および後処理後の画像を示しています。

生成された商品画像は、次のプロンプトを使用します。

  • 背景生成 — “chair, couch, window, indoor”(日本語訳:「椅子、ソファ、窓、屋内」)
  • インペインティング — “besides books”(日本語訳:「本以外」)

クリーンアップ

この記事では、コストの大部分を占める 2 つの GPU 対応の SageMaker エンドポイントを使用します。 これらのエンドポイントは、使用していないときに余分なコストがかからないように、オフにする必要があります。エンドポイントのクリーンアップに役立つノートブック 3_CleanUp.ipynb を用意しています。 また、SageMaker ノートブックを使用してモデルをホストし、推論を実行します。 そのため、ノートブックインスタンスが使用されていない場合は停止することをお勧めします。

まとめ

生成系 AI モデルは通常、効率的に実行するには特定のリソースを必要とする大規模な ML モデルです。 この投稿では、広告のユースケースを使用して、SageMakerエンドポイントが、テキストから画像への基盤モデルである Stable Diffusion などの生成系 AI モデルをホストするためのスケーラブルで管理された環境を提供する方法を説明しました。 2 つのモデルをホストして必要に応じて実行する方法と、1 つのエンドポイントから複数のモデルをホストする方法を説明しました。 これにより、インフラストラクチャのプロビジョニング、スケーラビリティ、監視に関連する複雑さが解消され、組織はモデルの導入と予測の提供だけに集中してビジネス上の課題を解決できます。 SageMaker エンドポイントを使用すると、組織は統一されたインフラストラクチャ内で複数のモデルを効率的に展開および管理できるため、最適なリソース利用を実現し、運用のオーバーヘッドを削減できます。

詳細なコードは GitHub で公開されています。 このコードでは、AWS CloudFormation と AWS Cloud Development Kit (AWS CDK) を使用して SageMaker ノートブックやその他の必要なリソースを作成するプロセスを自動化する方法を示しています。


著者について


Fabian Benitez-Quiroz は AWS プロフェッショナルサービスの IoT エッジデータサイエンティストです。 オハイオ州立大学でコンピュータービジョンとパターン認識の博士号を取得しています。 Fabian は、さまざまな業界のお客様が IoT デバイスやクラウド上で低レイテンシーで機械学習モデルを実行できるよう支援しています。

 

Romil Shah は AWS プロフェッショナルサービスのシニアデータサイエンティストです。 Romilは、コンピュータービジョン、機械学習、IoT エッジデバイスにおいて6年以上の業界経験があります。 彼は、顧客がエッジデバイスやクラウド向けに機械学習モデルを最適化して展開できるよう支援しています。 顧客と協力して、基盤モデルを最適化および展開するための戦略を策定しています。

 

Han Man は、カリフォルニア州サンディエゴを拠点とする AWS プロフェッショナルサービスのシニアデータサイエンスおよび機械学習マネージャーです。 ノースウェスタン大学で工学の博士号を取得し、経営コンサルタントとして製造、ファイナンスサービス、エネルギーの分野でクライアントにアドバイスを提供した経験が数年あります。 現在、彼はさまざまな業種の主要顧客と熱心に協力して、AWS で ML と生成系ソリューションを開発および実装しています。

 


翻訳はソリューションアーキテクトの柏村が担当しました。原文はこちらです。