こんにちは、久保です。
2025年7月4日、Amazon Nova CanvasでVirtual try-onとスタイルオプションが利用可能になりました。
Amazon Nova Canvasとは、AWSが開発・提供している生成AIモデルの一つで、画像の生成モデルです。
本ブログでは、Amazon Nova CanvasのVirtual try-on機能を使ってみた結果と、試すために作成したスクリプトをご紹介いたします。
Virtual try-on とは
Virtual try-onは、人物の画像と衣服などのアイテムの画像を合成して、その人物がその衣服を着ている画像を生成する機能です。
Amazon Bedrock(生成AIのサービス)を通じて、Amazon Nova Canvasモデルを利用して実行できます。
結果
結果を見ていただいた方が早いので、早速結果を掲載いたします。
こちらが人物画像として利用する画像です。

服の画像については前述したAWSのブログからお借りします。
なお、画像のサイズは 2048 x 2048 以内である必要がございます。

これらをソースとして指定して、後ほど紹介するスクリプトを利用してAmazon Nova CanvasでVirtual try-onを実行した結果です。
% python virtual_tryon.py kubo-portlate.jpg nova-canvas-source-images.jpg ================================================== Amazon Nova Canvas Virtual Try-On ================================================== 人物画像: kubo-portlate.jpg 衣服画像: nova-canvas-source-images.jpg 衣服クラス: UPPER_BODY 出力ファイル名: tryon_result.jpg リージョン: ap-northeast-1 ================================================== 画像サイズをチェック中... 推論パラメータを設定中... AWS Bedrock Runtime クライアントを作成中... (リージョン: ap-northeast-1) Amazon Nova Canvas を呼び出し中... 生成された画像を保存中... (1枚) 保存完了: tryon_result.jpg Virtual try-on が正常に完了しました! 処理が正常に完了しました!

とても自然に、試着できているのではないでしょうか? 人物の描写、左下に映り込んでいる愛猫も崩れることなく再現されています。
その他の結果
他にもフリー素材の写真を利用させていただき、いくつか試してみました。
ダウンジャケット
冬のダウンジャケットです。こちらも自然な見た目になっています。(なぜか手をパンツのポケットに入れています。)

シャツ
シャツです。こちらはなんとなく違和感はありますが、試着イメージとしては十分ではないでしょうか。

全身画像
上半身だけでなく全身の画像の結果が以下です。 こちらもかなり自然に生成されており、合成されたものであると言われなければ気づかないかもしれません。

下半身への適用
上半身だけでなく"LOWER_BODY" や、 "FULL_BODY"、 "FOOTWEAR"といったタイプを指定することで下半身や全身にも適用が可能です。
以下は、パンツをジーンズにしてみた結果です。
後ほどご紹介するスクリプトにおいては、--garment-class LOWER_BODY
のように指定することができます。
% python virtual_tryon.py stand.jpg jeans.jpg --region ap-northeast-1 --garment-class LOWER_BODY ================================================== Amazon Nova Canvas Virtual Try-On ================================================== 人物画像: stand.jpg 衣服画像: jeans.jpg 衣服クラス: LOWER_BODY 出力ファイル名: tryon_result.png リージョン: ap-northeast-1 ================================================== 画像サイズをチェック中... 推論パラメータを設定中... AWS Bedrock Runtime クライアントを作成中... (リージョン: ap-northeast-1) Amazon Nova Canvas を呼び出し中... 生成された画像を保存中... (1枚) 保存完了: tryon_result.png Virtual try-on が正常に完了しました! 処理が正常に完了しました!
少し元のジーンズの感触は失われていますが、パンツがジーンズに置き換えられています。

スクリプト
以下のスクリプトで試しています。 なお、このスクリプトは同じくAWSが提供しているAmazon Q Developer Proを利用して生成したものです。
#!/usr/bin/env python3 """ Amazon Nova Canvas Virtual Try-On Script このスクリプトは、Amazon Nova CanvasのVirtual try-on機能を使用して、 人物の写真と衣服の写真を合成し、その人が衣服を着ている新しい画像を生成します。 使用方法: python virtual_tryon.py <person_image> <garment_image> [options] 例: python virtual_tryon.py person.jpg aws-hoodie.jpg python virtual_tryon.py person.png shirt.png --garment-class UPPER_BODY --output result.png """ import argparse import base64 import io import json import sys from pathlib import Path import boto3 from PIL import Image def load_image_as_base64(image_path): """Helper function for preparing image data.""" try: with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode("utf-8") except FileNotFoundError: print(f"エラー: 画像ファイル '{image_path}' が見つかりません。") sys.exit(1) except Exception as e: print(f"エラー: 画像ファイル '{image_path}' の読み込みに失敗しました: {e}") sys.exit(1) def validate_image_size(image_path): """画像サイズが4.1MP(2048x2048相当)以下であることを確認""" try: with Image.open(image_path) as img: width, height = img.size pixels = width * height max_pixels = 4100000 # 4.1MP if pixels > max_pixels: print(f"警告: 画像 '{image_path}' のサイズが大きすぎます ({width}x{height} = {pixels:,}ピクセル)") print(f"最大サイズ: {max_pixels:,}ピクセル (2048x2048相当)") print("画像のリサイズを検討してください。") return False except Exception as e: print(f"警告: 画像 '{image_path}' のサイズチェックに失敗しました: {e}") return True def virtual_tryon(person_image_path, garment_image_path, garment_class="UPPER_BODY", output_filename="tryon_result", region="ap-northeast-1", profile=None): """ Amazon Nova CanvasのVirtual try-on機能を実行 Args: person_image_path (str): 人物の画像パス garment_image_path (str): 衣服の画像パス garment_class (str): 衣服のクラス(UPPER_BODY, LOWER_BODY, FULL_BODY, FOOTWEAR) output_filename (str): 出力ファイル名(拡張子なし) region (str): AWSリージョン profile (str): AWSプロファイル名 """ # 画像サイズのバリデーション print("画像サイズをチェック中...") validate_image_size(person_image_path) validate_image_size(garment_image_path) # 推論パラメータの設定 print("推論パラメータを設定中...") inference_params = { "taskType": "VIRTUAL_TRY_ON", "virtualTryOnParams": { "sourceImage": load_image_as_base64(person_image_path), "referenceImage": load_image_as_base64(garment_image_path), "maskType": "GARMENT", "garmentBasedMask": {"garmentClass": garment_class} } } try: # Bedrock Runtimeクライアントの作成 print(f"AWS Bedrock Runtime クライアントを作成中... (リージョン: {region})") session = boto3.Session(profile_name=profile) if profile else boto3.Session() bedrock = session.client(service_name="bedrock-runtime", region_name=region) # リクエストの準備 body_json = json.dumps(inference_params, indent=2) # Nova Canvasの呼び出し print("Amazon Nova Canvas を呼び出し中...") response = bedrock.invoke_model( body=body_json, modelId="amazon.nova-canvas-v1:0", accept="application/json", contentType="application/json" ) # レスポンスから画像を抽出 response_body_json = json.loads(response.get("body").read()) # エラーチェック if response_body_json.get("error"): print(f"エラー: {response_body_json.get('error')}") return False images = response_body_json.get("images", []) if not images: print("エラー: 生成された画像がありません。") return False # 各画像をBase64からデコードしてJPEGファイルとして保存 print(f"生成された画像を保存中... ({len(images)}枚)") for index, image_base64 in enumerate(images): image_bytes = base64.b64decode(image_base64) image_buffer = io.BytesIO(image_bytes) image = Image.open(image_buffer) if len(images) == 1: filename = f"{output_filename}.jpg" else: filename = f"{output_filename}_{index}.jpg" image.save(filename, "JPEG", quality=95) print(f"保存完了: {filename}") print("Virtual try-on が正常に完了しました!") return True except Exception as e: print(f"エラー: Amazon Nova Canvas の呼び出しに失敗しました: {e}") return False def main(): parser = argparse.ArgumentParser( description="Amazon Nova Canvas Virtual Try-On", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" 使用例: %(prog)s person.jpg hoodie.png %(prog)s person.png shirt.jpg --garment-class UPPER_BODY %(prog)s model.jpg shoes.png --garment-class FOOTWEAR --output my_tryon %(prog)s person.jpg pants.jpg --garment-class LOWER_BODY --region ap-northeast-1 衣服クラスのオプション: UPPER_BODY - 上半身の衣服(シャツ、ジャケット、パーカーなど) LOWER_BODY - 下半身の衣服(パンツ、スカートなど) FULL_BODY - 全身の衣服(ドレス、コートなど) FOOTWEAR - 履物(靴、ブーツなど) 対応リージョン: us-east-1 - US East (N. Virginia) ap-northeast-1 - Asia Pacific (Tokyo) eu-west-1 - Europe (Ireland) """ ) parser.add_argument("person_image", help="人物の画像ファイルパス") parser.add_argument("garment_image", help="衣服の画像ファイルパス") parser.add_argument("--garment-class", choices=["UPPER_BODY", "LOWER_BODY", "FULL_BODY", "FOOTWEAR"], default="UPPER_BODY", help="衣服のクラス (デフォルト: UPPER_BODY)") parser.add_argument("--output", "-o", default="tryon_result", help="出力ファイル名(拡張子なし、デフォルト: tryon_result)") parser.add_argument("--region", "-r", default="ap-northeast-1", help="AWSリージョン (デフォルト: ap-northeast-1)") parser.add_argument("--profile", "-p", help="AWSプロファイル名") args = parser.parse_args() # ファイルの存在確認 if not Path(args.person_image).exists(): print(f"エラー: 人物画像ファイル '{args.person_image}' が見つかりません。") sys.exit(1) if not Path(args.garment_image).exists(): print(f"エラー: 衣服画像ファイル '{args.garment_image}' が見つかりません。") sys.exit(1) print("=" * 50) print("Amazon Nova Canvas Virtual Try-On") print("=" * 50) print(f"人物画像: {args.person_image}") print(f"衣服画像: {args.garment_image}") print(f"衣服クラス: {args.garment_class}") print(f"出力ファイル名: {args.output}.jpg") print(f"リージョン: {args.region}") print("=" * 50) # Virtual try-onの実行 success = virtual_tryon( person_image_path=args.person_image, garment_image_path=args.garment_image, garment_class=args.garment_class, output_filename=args.output, region=args.region, profile=args.profile ) if success: print("処理が正常に完了しました!") sys.exit(0) else: print("処理に失敗しました。") sys.exit(1) if __name__ == "__main__": main()
事前準備
python環境
Pythonおよび、boto3、pillowが必要となります。
$ pip install boto3 pillow
Amazon Nova Canvasモデルへのアクセス設定
利用するAWSアカウントの東京リージョンで、Amazon Nova Canvasへのモデルアクセスを設定しておく必要があります。

認証設定
AWS CLIや環境変数を利用してboto3でAWS Bedrockにアクセスできるよう設定が必要です。 IAMでは以下の権限が必要となります。
- Amazon Bedrock Runtime:
bedrock:InvokeModel
実行方法
第一引数に人物画像、第二引数に衣服の画像を指定することで利用可能です。
# 基本的な例(上半身の衣服) python virtual_tryon.py person.jpg hoodie.png # 衣服クラスを指定 python virtual_tryon.py person.jpg pants.jpg --garment-class LOWER_BODY # 出力ファイル名を指定 python virtual_tryon.py person.png shirt.jpg --output my_result # US East リージョンを使用 python virtual_tryon.py person.jpg jacket.png --region us-east-1 # 特定のAWSプロファイルを使用 python virtual_tryon.py person.jpg jacket.png --profile my-profile # 履物の試着 python virtual_tryon.py person.jpg shoes.png --garment-class FOOTWEAR
オプション
オプション | 説明 | デフォルト |
---|---|---|
--garment-class |
衣服のクラス(UPPER_BODY , LOWER_BODY , FULL_BODY , FOOTWEAR ) |
UPPER_BODY |
--output , -o |
出力ファイル名(拡張子なし) | tryon_result |
--region , -r |
AWSリージョン | ap-northeast-1 |
--profile , -p |
AWSプロファイル名 | なし |
利用可能なリージョン
Virtual try-onは、2025年7月7日現在、US East (N. Virginia)、Asia Pacific (Tokyo)、 Europe (Ireland) で利用可能です。
おわりに
Amazon Nova CanvasのVirtual try-onを利用することで、とても簡単に衣服の試着イメージを生成することができました。
AWSの中で閉じた安全な環境でBedrockを通して利用可能なので、既存のAWSアプリケーションに組み込むことも容易かと思われます。
様々な活用が想像できますね!
それでは、本記事がどなたかのお役に立ちましたら幸いです。
久保 賢二(執筆記事の一覧)
猫とAWSが好きです。