「Amazon SageMakerに展開された生成AIを使用して創造的な広告を生成する」
Using AI deployed on Amazon SageMaker to generate creative advertisements.
創造的な広告は、生成型AI(GenAI)によって革命を起こす可能性があります。GenAIモデルを再トレーニングし、モデルにテキストのプロンプト(シーンやオブジェクトを説明する文章)などのいくつかの入力を提供することで、製品のショットなど、新しい種類の画像を幅広く生成することができます。この技術は、2022年に新しい基礎モデル(FMs)の一種である潜在拡散モデル(Stable Diffusion、Midjourney、Dall-E-2など)の爆発的な普及とともに有望な結果を示しています。しかし、これらのモデルを本番で使用するためには、生成プロセスを継続的に改善して一貫した出力を生成する必要があります。これは、製品の多数のサンプル画像を作成し、巧妙なプロンプトエンジニアリングを行うことを意味し、大規模なタスクを難しくします。
この記事では、大量の画像カタログを扱う場合に、この変革的な技術を活用して魅力的で革新的な広告を生成する方法について探求します。GenAIの力、特にインペインティングの技術を使用することで、画像の背景をシームレスに作成することができます。これにより、視覚的に魅力的で魅惑的なコンテンツが生成され、望ましくない画像のアーティファクト(モデルの幻想)が削減されます。また、この技術の実践的な実装についても、この創造的プロセスを駆動するGenAIモデルを効率的に展開するためのAmazon SageMakerエンドポイントを活用します。
我々は、GenAIベースの画像生成においてインペインティングを主要な技術として使用しています。これは、画像内の欠落した要素を置き換えるための強力な解決策を提供します。しかし、これにはいくつかの課題があります。たとえば、画像内のオブジェクトの位置を正確に制御することが制限されるため、画像のアーティファクト、浮遊するオブジェクト、またはブレンドされていない境界などの潜在的な問題が発生することがあります。以下の例の画像で示します。
これを克服するために、我々はこの記事で、創造的な自由と効率的なプロダクションのバランスを取るために、最小限の監督でリアルな画像の多様性を生成することを提案します。提案されたソリューションをプロダクションにスケールし、AWS環境でAIモデルの展開を効率化するために、SageMakerエンドポイントを使用してデモンストレーションを行います。
具体的には、インペインティングプロセスを一連のレイヤーに分割し、各レイヤーに異なる一連のプロンプトを使用することを提案しています。このプロセスは以下のステップで要約することができます:
- まず、一般的なシーンのプロンプト(例:「背景に木のある公園」)を入力し、その背景にオブジェクトをランダムに配置します。
- 次に、オブジェクトが存在する位置(例:「芝生でのピクニック、または木製のテーブル」)をプロンプトすることで、オブジェクトの下部中央にレイヤーを追加します。
- 最後に、背景と同じプロンプトを使用して、オブジェクトの上部中央に背景と似たレイヤーを追加します。
このプロセスの利点は、オブジェクトのリアリズムの向上です。これにより、人間の期待に合致する背景環境に対して、より良いスケーリングと位置づけでオブジェクトが認識されます。以下の図は、提案されたソリューションのステップを示しています。
ソリューションの概要
タスクを達成するために、次のデータフローが考慮されます:
- セグメントアニシングモデル(SAM)とStable Diffusion InpaintingモデルがSageMakerエンドポイントにホストされています。
- 背景プロンプトを使用して、Stable Diffusionモデルを使用して生成された背景画像を作成します。
- ベースの製品画像をSAMに通過させてマスクを生成します。マスクの反対はアンチマスクと呼ばれます。
- 生成された背景画像、マスク、および前景のプロンプトとネガティブのプロンプトを使用して、Stable Diffusion Inpaintingモデルに入力し、生成された中間背景画像を生成します。
- 同様に、生成された背景画像、アンチマスク、および前景のプロンプトとネガティブのプロンプトを使用して、Stable Diffusion Inpaintingモデルに入力し、生成された中間前景画像を生成します。
- 生成された中間前景画像と生成された中間背景画像を組み合わせて、生成された製品画像の最終出力を取得します。
前提条件
私たちは、エンドポイントを展開し推論を実行するために使用される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などのツールを使用して行うことができます。または、オブジェクトが画像の中心にあると仮定し、AIツール(Segment Anything Models (SAM)など)を使用してオブジェクトを自動的にセグメント化することもできます。
SAMを使用してマスクを生成する
SAMは、高品質なマスクを容易に生成するための高度な生成AI技術です。SAMは、広範なデータセットでトレーニングされた深層学習モデルを使用して、興味のあるオブジェクトを正確に識別しセグメント化し、正確な境界とピクセルレベルのマスクを提供します。この画期的な技術は、マスクの手動作成にかかる時間と労力を自動化することにより、画像処理ワークフローを革新します。SAMを使用することで、ビジネスや個人は、オブジェクトの認識、画像編集、コンピュータビジョンタスクなどのためのマスクを迅速に生成できるようになり、視覚分析と操作の可能性を広げることができます。
SageMakerエンドポイントにSAMモデルをホストする
ノートブック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エンドポイント上で安定したディフュージョンインペインティングモデルをホストする
2.1と同様に、ノートブック1_HostGenAIModels.ipynb
を使用して、SageMakerエンドポイントを作成し、安定したディフュージョンインペインティングモデルをホストします。
inference_inpainting.py
の推論コードを使用し、code.tar.gz
ファイルにパッケージ化して、SageMakerエンドポイントを作成します。このコードは、安定したディフュージョンインペインティングモデルをダウンロードし、エンドポイント上でホストし、推論を実行して出力を生成します:
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)
安定したディフュージョンインペインティングモデルを呼び出し、新しい画像を生成する
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))
# PIL Imageを使用して生成された画像を保存する
post_image.save('images/speaker_generated.png')
以下の図は、洗練されたマスク、生成された背景、生成された製品画像、および後処理された画像を示しています。
生成された製品画像は、次のプロンプトを使用しています:
- 背景生成 – 「椅子、ソファ、窓、屋内」
- インペインティング – 「本のそばに」
クリーンアップ
この記事では、コストの大部分を占める2つのGPU対応のSageMakerエンドポイントを使用しています。エンドポイントが使用されていない場合に余分なコストを避けるために、これらのエンドポイントをオフにする必要があります。エンドポイントをクリーンアップするためには、3_CleanUp.ipynb
というノートブックを提供しています。また、SageMakerノートブックを使用してモデルをホストし、推論を実行しています。したがって、ノートブックインスタンスが使用されていない場合は、停止することが良い慣行です。
結論
生成型AIモデルは一般的に大規模な機械学習モデルであり、効率的に実行するために特定のリソースが必要です。この記事では、広告のユースケースを使用して、SageMakerエンドポイントがテキストから画像への変換の基盤となる生成型AIモデル(Stable Diffusion)をホストするためのスケーラブルで管理された環境を提供する方法を示しました。2つのモデルを必要なときにホストして実行する方法や、複数のモデルを単一のエンドポイントからホストする方法も示しました。これにより、インフラのプロビジョニング、スケーラビリティ、モニタリングに関連する複雑さが排除され、組織はモデルの展開と予測の提供にのみ集中することができます。SageMakerエンドポイントを使用することで、組織は統一されたインフラストラクチャ内で複数のモデルを効率的に展開および管理し、最適なリソース利用率を実現し、運用オーバーヘッドを削減することができます。
詳細なコードはGitHubで利用できます。このコードは、AWS CloudFormationとAWS Cloud Development Kit(AWS CDK)の使用方法を示し、SageMakerノートブックおよび他の必要なリソースの作成プロセスを自動化します。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles