Amazon Nova Canvas Virtual Try-Onで服の試着を試してみた

記事タイトルとURLをコピーする

こんにちは、久保です。

2025年7月4日、Amazon Nova CanvasでVirtual try-onとスタイルオプションが利用可能になりました。

https://aws.amazon.com/jp/blogs/news/amazon-nova-canvas-update-virtual-try-on-and-style-options-now-available/

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 が正常に完了しました!
処理が正常に完了しました!

virtual-tryonした結果

とても自然に、試着できているのではないでしょうか? 人物の描写、左下に映り込んでいる愛猫も崩れることなく再現されています。

その他の結果

他にもフリー素材の写真を利用させていただき、いくつか試してみました。

ダウンジャケット

冬のダウンジャケットです。こちらも自然な見た目になっています。(なぜか手をパンツのポケットに入れています。)

ダウンジャケット

シャツ

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

シャツ

全身画像

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

全身画像xダウンジャケット

下半身への適用

上半身だけでなく"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へのモデルアクセスを設定しておく必要があります。

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が好きです。