生成的データ インテリジェンス

画像の生成、編集、検索に Amazon Titan モデルを使用する |アマゾン ウェブ サービス

日付:

アマゾンの岩盤 Amazon やその他の大手 AI 企業が提供する幅広い高性能基盤モデルを提供します。 人間原理, AI21, Meta, 密着, スタビリティAI、テキストと画像の生成、検索、チャット、推論およびエージェントの代理など、幅広いユースケースをカバーしています。新しい Amazon Titan 画像ジェネレーター このモデルを使用すると、コンテンツ作成者は、簡単な英語のテキスト プロンプトを使用して、高品質でリアルな画像を迅速に生成できます。高度な AI モデルは、複数のオブジェクトに関する複雑な命令を理解し、次のような用途に適したスタジオ品質の画像を返します。 広告、e コマース、および エンターテインメント。主な機能には、プロンプトを反復処理することで画像を調整する機能、自動背景編集、同じシーンの複数のバリエーションを生成する機能などが含まれます。クリエイターは独自のデータを使用してモデルをカスタマイズし、特定のスタイルでブランド画像を出力することもできます。重要なのは、Titan Image Generator には、AI が生成したすべての画像に目に見えない透かしを入れるなどの安全策が組み込まれていることです。 責任ある使用 そして偽情報の拡散を軽減します。この革新的なテクノロジーにより、カスタム イメージを大量に作成できるようになります。 あらゆる業界 よりアクセスしやすく、効率的になります。

新しい Amazon Titan マルチモーダル埋め込み モデルは、テキスト、画像、またはその両方を理解することで、より正確な検索と推奨事項を構築するのに役立ちます。画像と英語のテキストを意味ベクトルに変換し、データ内の意味と関係をキャプチャします。商品説明や写真などのテキストと画像を組み合わせて、商品をより効果的に識別できます。ベクトルは、迅速かつ正確な検索エクスペリエンスを強化します。 Titan Multimodal Embeddings はベクトル次元に柔軟性があり、パフォーマンスのニーズに合わせた最適化が可能です。非同期 API と AmazonOpenSearchサービス コネクタを使用すると、モデルをニューラル検索アプリケーションに簡単に統合できます。

この投稿では、AWS Python SDK を介して Titan Image Generator と Titan Multimodal Embeddings モデルを使用する方法を説明します。

画像の生成と編集

このセクションでは、AWS SDK を使用して新しい画像を生成し、既存の画像に対して AI を活用した編集を実行するための基本的なコーディング パターンを示します。コード例は Python で提供されており、JavaScript (Node.js) もここで利用できます。 GitHubリポジトリ.

Amazon Bedrock API を使用するスクリプトを作成する前に、環境に適切なバージョンの AWS SDK をインストールする必要があります。 Python スクリプトの場合は、 AWS SDK for Python(Boto3)。 Python ユーザーは、 ピローモジュールを使用すると、画像の読み込みや保存などの画像操作が容易になります。セットアップ手順については、を参照してください。 GitHubリポジトリ.

さらに、Amazon Titan Image Generator および Titan Multimodal Embeddings モデルへのアクセスを有効にします。詳細については、以下を参照してください。 モデルアクセス.

ヘルパー関数

次の関数は、Amazon Bedrock Boto3 ランタイム クライアントをセットアップし、さまざまな構成のペイロードを取得してイメージを生成します (これについてはこの投稿で後ほど説明します)。

import boto3
import json, base64, io
from random import randint
from PIL import Image

bedrock_runtime_client = boto3.client("bedrock-runtime")


def titan_image(
    payload: dict,
    num_image: int = 2,
    cfg: float = 10.0,
    seed: int = None,
    modelId: str = "amazon.titan-image-generator-v1",
) -> list:
    #   ImageGenerationConfig Options:
    #   - numberOfImages: Number of images to be generated
    #   - quality: Quality of generated images, can be standard or premium
    #   - height: Height of output image(s)
    #   - width: Width of output image(s)
    #   - cfgScale: Scale for classifier-free guidance
    #   - seed: The seed to use for reproducibility
    seed = seed if seed is not None else randint(0, 214783647)
    body = json.dumps(
        {
            **payload,
            "imageGenerationConfig": {
                "numberOfImages": num_image,  # Range: 1 to 5
                "quality": "premium",  # Options: standard/premium
                "height": 1024,  # Supported height list above
                "width": 1024,  # Supported width list above
                "cfgScale": cfg,  # Range: 1.0 (exclusive) to 10.0
                "seed": seed,  # Range: 0 to 214783647
            },
        }
    )

    response = bedrock_runtime_client.invoke_model(
        body=body,
        modelId=modelId,
        accept="application/json",
        contentType="application/json",
    )

    response_body = json.loads(response.get("body").read())
    images = [
        Image.open(io.BytesIO(base64.b64decode(base64_image)))
        for base64_image in response_body.get("images")
    ]
    return images
        

テキストから画像を生成する

テキスト プロンプトから新しい画像を生成するスクリプトは、次の実装パターンに従います。

  1. テキスト プロンプトとオプションの否定テキスト プロンプトを構成します。
  2. BedrockRuntime クライアントで Titan Image Generator モデルを呼び出します。
  3. 応答を解析してデコードします。
  4. 結果のイメージをディスクに保存します。

テキストから画像へ

以下は、Titan Image Generator モデルの一般的なイメージ生成スクリプトです。

# Text Variation
# textToImageParams Options:
#   text: prompt to guide the model on how to generate variations
#   negativeText: prompts to guide the model on what you don't want in image
images = titan_image(
    {
        "taskType": "TEXT_IMAGE",
        "textToImageParams": {
            "text": "two dogs walking down an urban street, facing the camera",  # Required
            "negativeText": "cars",  # Optional
        },
    }
)

これにより、次のような画像が生成されます。

応答画像 1 応答画像 2
通りを歩く2匹の犬 通りを歩く2匹の犬

画像のバリエーション

画像バリエーションは、既存の画像の微妙なバリエーションを生成する方法を提供します。次のコード スニペットは、前の例で生成されたイメージの 1 つを使用してバリアント イメージを作成します。

# Import an input image like this (only PNG/JPEG supported):
with open("<YOUR_IMAGE_FILE_PATH>", "rb") as image_file:
    input_image = base64.b64encode(image_file.read()).decode("utf8")

# Image Variation
# ImageVariationParams Options:
#   text: prompt to guide the model on how to generate variations
#   negativeText: prompts to guide the model on what you don't want in image
#   images: base64 string representation of the input image, only 1 is supported
images = titan_image(
    {
        "taskType": "IMAGE_VARIATION",
        "imageVariationParams": {
            "text": "two dogs walking down an urban street, facing the camera",  # Required
            "images": [input_image],  # One image is required
            "negativeText": "cars",  # Optional
        },
    },
)

これにより、次のような画像が生成されます。

元の画像 応答画像 1 応答画像 2
通りを歩く2匹の犬

既存の画像を編集する

Titan Image Generator モデルを使用すると、既存のイメージ内の要素や領域を追加、削除、または置換できます。次のいずれかを指定して、どの領域に影響を与えるかを指定します。

  • マスク画像 – マスク イメージは、値 0 のピクセルが影響を与える領域を表し、値 255 のピクセルが変更しない領域を表すバイナリ イメージです。
  • マスクプロンプト – マスク プロンプトは、影響を与えたい要素を自然言語でテキストで説明したもので、社内のテキストからセグメンテーションへのモデルを使用します。

詳細については、 即時エンジニアリングガイドライン.

画像に編集を適用するスクリプトは、次の実装パターンに従います。

  1. 編集する画像をディスクから読み込みます。
  2. 画像をbase64でエンコードされた文字列に変換します。
  3. 次のいずれかの方法でマスクを構成します。
    1. ディスクからマスク イメージをロードし、base64 としてエンコードして、 maskImage パラメータに一致する最初のデバイスのリモートコントロール URL を返します。
    2. をセットする maskText パラメータを影響を受ける要素のテキスト説明に指定します。
  4. 次のオプションのいずれかを使用して、生成する新しいコンテンツを指定します。
    1. 要素を追加または置換するには、 text パラメータを新しいコンテンツの説明に追加します。
    2. 要素を削除するには、 text パラメータを完全に削除します。
  5. BedrockRuntime クライアントで Titan Image Generator モデルを呼び出します。
  6. 応答を解析してデコードします。
  7. 結果のイメージをディスクに保存します。

オブジェクト編集: マスク イメージを使用した修復

以下は、Titan Image Generator モデルの一般的な画像編集スクリプトです。 maskImage。以前に生成されたイメージの 0 つを取得し、値 255 のピクセルが黒としてレンダリングされ、値 XNUMX のピクセルが白としてレンダリングされるマスク イメージを提供します。また、テキスト プロンプトを使用して、画像内の犬の XNUMX 匹を猫に置き換えます。

with open("<YOUR_MASK_IMAGE_FILE_PATH>", "rb") as image_file:
    mask_image = base64.b64encode(image_file.read()).decode("utf8")

# Import an input image like this (only PNG/JPEG supported):
with open("<YOUR_ORIGINAL_IMAGE_FILE_PATH>", "rb") as image_file:
    input_image = base64.b64encode(image_file.read()).decode("utf8")

# Inpainting
# inPaintingParams Options:
#   text: prompt to guide inpainting
#   negativeText: prompts to guide the model on what you don't want in image
#   image: base64 string representation of the input image
#   maskImage: base64 string representation of the input mask image
#   maskPrompt: prompt used for auto editing to generate mask

images = titan_image(
    {
        "taskType": "INPAINTING",
        "inPaintingParams": {
            "text": "a cat",  # Optional
            "negativeText": "bad quality, low res",  # Optional
            "image": input_image,  # Required
            "maskImage": mask_image,
        },
    },
    num_image=3,
)

これにより、次のような画像が生成されます。

元の画像 マスク画像 編集した画像
通りを歩く2匹の犬 通りを歩く猫と犬

オブジェクトの削除: マスク プロンプトを使用した修復

別の例では、次のように使用します。 maskPrompt 前の手順で取得した画像内の編集するオブジェクトを指定します。テキスト プロンプトを省略すると、オブジェクトが削除されます。

# Import an input image like this (only PNG/JPEG supported):
with open("<YOUR_IMAGE_FILE_PATH>", "rb") as image_file:
    input_image = base64.b64encode(image_file.read()).decode("utf8")

images = titan_image(
    {
        "taskType": "INPAINTING",
        "inPaintingParams": {
            "negativeText": "bad quality, low res",  # Optional
            "image": input_image,  # Required
            "maskPrompt": "white dog",  # One of "maskImage" or "maskPrompt" is required
        },
    },
)

これにより、次のような画像が生成されます。

元の画像 応答画像
通りを歩く2匹の犬 道を歩いている一匹の犬

背景編集:アウトペイント

アウトペイントは、画像の背景を置き換える場合に便利です。ズームアウト効果を得るために画像の境界を拡張することもできます。次のスクリプト例では、 maskPrompt 保持するオブジェクトを指定します。あなたも使うことができます maskImage。 パラメーター outPaintingMode マスク内のピクセルの変更を許可するかどうかを指定します。として設定した場合 DEFAULT、再構成された画像が全体的に一貫性を持つように、マスク内のピクセルを変更することができます。このオプションは、次の場合に推奨されます。 maskImage 提供されているオブジェクトはピクセルレベルの精度で表現されていません。として設定した場合 PRECISE、マスク内のピクセルの変更が防止されます。このオプションは、 maskPrompt または maskImage オブジェクトをピクセルレベルの精度で表現します。

# Import an input image like this (only PNG/JPEG supported):
with open("<YOUR_IMAGE_FILE_PATH>", "rb") as image_file:
    input_image = base64.b64encode(image_file.read()).decode("utf8")

# OutPaintingParams Options:
#   text: prompt to guide outpainting
#   negativeText: prompts to guide the model on what you don't want in image
#   image: base64 string representation of the input image
#   maskImage: base64 string representation of the input mask image
#   maskPrompt: prompt used for auto editing to generate mask
#   outPaintingMode: DEFAULT | PRECISE
images = titan_image(
    {
        "taskType": "OUTPAINTING",
        "outPaintingParams": {
            "text": "forest",  # Required
            "image": input_image,  # Required
            "maskPrompt": "dogs",  # One of "maskImage" or "maskPrompt" is required
            "outPaintingMode": "PRECISE",  # One of "PRECISE" or "DEFAULT"
        },
    },
    num_image=3,
)

これにより、次のような画像が生成されます。

元の画像 テキスト 応答画像
道を歩く2匹の犬 "ビーチ" ビーチを歩いている一匹の犬
通りを歩く2匹の犬 "森林"

さらに、さまざまな値の影響は、 outPaintingModemaskImage ピクセルレベルの精度でオブジェクトの輪郭を描かないものは次のとおりです。

このセクションでは、Titan Image Generator モデルで実行できる操作の概要を説明しました。具体的には、これらのスクリプトは、テキストからイメージへの変換、イメージのバリエーション、インペイント、およびアウトペイントのタスクを示します。で詳しく説明されているタスク タイプのパラメータの詳細を参照することで、独自のアプリケーションにパターンを適応させることができるはずです。 Amazon Titan Image Generator ドキュメント.

マルチモーダルな埋め込みと検索

Amazon Titan マルチモーダル埋め込みモデルは、画像検索や類似性に基づく推奨などのエンタープライズタスクに使用でき、検索結果の偏りを軽減するのに役立つ緩和策が組み込まれています。さまざまなニーズに合わせて最適なレイテンシー/精度のトレードオフを実現するために、複数の埋め込みディメンション サイズがあり、データのセキュリティとプライバシーを維持しながら独自のデータに適応するために、すべてをシンプルな API でカスタマイズできます。 Amazon Titan Multimodal Embeddings は、リアルタイムまたは非同期のバッチ変換検索および推奨アプリケーション用のシンプルな API として提供され、以下を含むさまざまなベクトルデータベースに接続できます。 AmazonOpenSearchサービス.

ヘルパー関数

次の関数は、画像とオプションでテキストをマルチモーダル埋め込みに変換します。

def titan_multimodal_embedding(
    image_path: str = None,  # maximum 2048 x 2048 pixels
    description: str = None,  # English only and max input tokens 128
    dimension: int = 1024,  # 1,024 (default), 384, 256
    model_id: str = "amazon.titan-embed-image-v1",
):
    payload_body = {}
    embedding_config: dict = {"embeddingConfig": {"outputEmbeddingLength": dimension}}

    # You can specify either text or image or both
    if image_path:
        # Maximum image size supported is 2048 x 2048 pixels
        with open(image_path, "rb") as image_file:
            payload_body["inputImage"] = base64.b64encode(image_file.read()).decode(
                "utf8"
            )
    if description:
        payload_body["inputText"] = description

    assert payload_body, "please provide either an image and/or a text description"
    print("n".join(payload_body.keys()))

    response = bedrock_runtime_client.invoke_model(
        body=json.dumps({**payload_body, **embedding_config}),
        modelId=model_id,
        accept="application/json",
        contentType="application/json",
    )

    return json.loads(response.get("body").read())

次の関数は、クエリ マルチモーダル エンベディングを指定すると、上位の類似したマルチモーダル エンベディングを返します。実際には、OpenSearch Service などの管理されたベクトル データベースを使用できることに注意してください。次の例は説明を目的としたものです。

from scipy.spatial.distance import cdist
import numpy as np

def search(query_emb: np.array, indexes: np.array, top_k: int = 1):
    dist = cdist(query_emb, indexes, metric="cosine")
    return dist.argsort(axis=-1)[0, :top_k], np.sort(dist, axis=-1)[:top_k]

合成データセット

説明のために、以下を使用します Amazon Bedrock の Anthropic の Claude 2.1 モデル 次のプロンプトを使用して、それぞれ 3 つのバリエーションを持つ 7 つの異なる製品をランダムに生成します。

Generate a list of 7 items description for an online e-commerce shop, each comes with 3 variants of color or type. All with separate full sentence description.

以下は、返された出力のリストです。

1. T-shirt
- A red cotton t-shirt with a crew neck and short sleeves.
- A blue cotton t-shirt with a v-neck and short sleeves.
- A black polyester t-shirt with a scoop neck and cap sleeves.

2. Jeans
- Classic blue relaxed fit denim jeans with a mid-rise waist.
- Black skinny fit denim jeans with a high-rise waist and ripped details at the knees.
- Stonewash straight leg denim jeans with a standard waist and front pockets.

3. Sneakers
- White leather low-top sneakers with an almond toe cap and thick rubber outsole.
- Gray mesh high-top sneakers with neon green laces and a padded ankle collar.
- Tan suede mid-top sneakers with a round toe and ivory rubber cupsole.

4. Backpack
- A purple nylon backpack with padded shoulder straps, front zipper pocket and laptop sleeve.
- A gray canvas backpack with brown leather trims, side water bottle pockets and drawstring top closure.
- A black leather backpack with multiple interior pockets, top carry handle and adjustable padded straps.

5. Smartwatch
- A silver stainless steel smartwatch with heart rate monitor, GPS tracker and sleep analysis.
- A space gray aluminum smartwatch with step counter, phone notifications and calendar syncing.
- A rose gold smartwatch with activity tracking, music controls and customizable watch faces.

6. Coffee maker
- A 12-cup programmable coffee maker in brushed steel with removable water tank and keep warm plate.
- A compact 5-cup single serve coffee maker in matt black with travel mug auto-dispensing feature.
- A retro style stovetop percolator coffee pot in speckled enamel with stay-cool handle and glass knob lid.

7. Yoga mat
- A teal 4mm thick yoga mat made of natural tree rubber with moisture-wicking microfiber top.
- A purple 6mm thick yoga mat made of eco-friendly TPE material with integrated carrying strap.
- A patterned 5mm thick yoga mat made of PVC-free material with towel cover included.

上記の応答を変数に代入します response_cat。次に、Titan Image Generator モデルを使用して各商品の製品画像を作成します。

import re

def extract_text(input_string):
    pattern = r"- (.*?)($|n)"
    matches = re.findall(pattern, input_string)
    extracted_texts = [match[0] for match in matches]
    return extracted_texts

product_description = extract_text(response_cat)

titles = []
for prompt in product_description:
    images = titan_image(
        {
            "taskType": "TEXT_IMAGE",
            "textToImageParams": {
                "text": prompt,  # Required
            },
        },
        num_image=1,
    )
    title = "_".join(prompt.split()[:4]).lower()
    titles.append(title)
    images[0].save(f"{title}.png", format="png")

生成されたすべての画像は、この投稿の最後にある付録にあります。

マルチモーダルなデータセットのインデックス作成

マルチモーダル データセットのインデックス作成には次のコードを使用します。

multimodal_embeddings = []
for image_filename, description in zip(titles, product_description):
    embedding = titan_multimodal_embedding(f"{image_filename}.png", dimension=1024)["embedding"]
    multimodal_embeddings.append(embedding)

マルチモーダル検索

マルチモーダル検索には次のコードを使用します。

query_prompt = "<YOUR_QUERY_TEXT>"
query_embedding = titan_multimodal_embedding(description=query_prompt, dimension=1024)["embedding"]
# If searching via Image
# query_image_filename = "<YOUR_QUERY_IMAGE>"
# query_emb = titan_multimodal_embedding(image_path=query_image_filename, dimension=1024)["embedding"]
idx_returned, dist = search(np.array(query_embedding)[None], np.array(multimodal_embeddings))

以下は検索結果の一部です。

まとめ

この投稿では、Amazon Titan Image Generator と Amazon Titan Multimodal Embeddings モデルを紹介します。 Titan Image Generator を使用すると、テキスト プロンプトからカスタムの高品質イメージを作成できます。主な機能には、プロンプトの反復処理、自動バックグラウンド編集、データのカスタマイズなどがあります。責任ある使用を奨励するために、目に見えない透かしなどの保護機能が備わっています。 Titan Multimodal Embeddings は、テキスト、画像、またはその両方をセマンティック ベクトルに変換して、正確な検索と推奨を強化します。次に、これらのサービスを使用するための Python コード サンプルを提供し、テキスト プロンプトから画像を生成し、それらの画像を反復処理する方法を示しました。マスク画像またはマスクテキストで指定された要素を追加、削除、または置換することにより、既存の画像を編集します。テキスト、画像、またはその両方からマルチモーダルな埋め込みを作成します。クエリに対する同様のマルチモーダル埋め込みを検索します。また、Titan Multimodal Embeddings を使用してインデックス付けおよび検索された合成 e コマース データセットを使用するデモも行いました。この投稿の目的は、開発者がアプリケーションでこれらの新しい AI サービスの使用を開始できるようにすることです。コード パターンは、カスタム実装のテンプレートとして機能します。

すべてのコードは次の場所で入手できます。 GitHubリポジトリ. 詳細については、 Amazon Bedrock ユーザーガイド.


著者について

ロヒト・ミタル マルチモーダル基盤モデルを構築する Amazon AI のプリンシパルプロダクトマネージャーです。彼は最近、Amazon Bedrock サービスの一部として Amazon Titan Image Generator モデルの立ち上げを主導しました。 AI/ML、NLP、検索の経験があり、革新的なテクノロジーで顧客の問題点を解決する製品を構築することに興味を持っています。

アシュウィン・スワミナサン博士 は、12 年以上の業界経験と 5 年以上の学術研究経験を持つ、コンピュータ ビジョンおよび機械学習の研究者、エンジニア、マネージャーです。強力な基礎と、迅速に知識を獲得し、新たな新興分野に貢献できる実証済みの能力。

謝裕生博士 Amazon AGI の主任応用科学者です。彼の仕事は、マルチモーダル基礎モデルの構築に焦点を当てています。 AGI に入社する前は、AWS で Amazon Titan Image Generator や Amazon Textract Queries などのさまざまなマルチモーダル AI 開発を主導していました。

ハオ・ヤン博士 Amazon の主任応用科学者です。彼の主な研究対象は、限られた注釈を使用したオブジェクト検出と学習です。仕事以外では、ハオは映画鑑賞、写真、野外活動を楽しんでいます。

ダビデ・モドロ博士 Amazon AGI の応用科学マネージャーであり、大規模なマルチモーダル基礎モデルの構築に取り組んでいます。 Amazon AGI に入社する前は、AWS AI Labs (Amazon Bedrock および Amazon Rekognition) で 7 年間マネージャー/リーダーを務めていました。仕事以外では、旅行とあらゆる種類のスポーツ、特にサッカーを楽しんでいます。

バイチュアン・サン博士、 現在、AWS でシニア AI/ML ソリューション アーキテクトを務めており、生成 AI に重点を置き、データ サイエンスと機械学習の知識を応用して、実用的なクラウドベースのビジネス ソリューションを提供しています。経営コンサルティングと AI ソリューション アーキテクチャの経験を活かし、ロボティクス コンピュータ ビジョン、時系列予測、予知保全など、さまざまな複雑な課題に取り組んでいます。彼の仕事は、プロジェクト管理、ソフトウェア研究開発、学術的研究の確かな背景に基づいています。サン博士は仕事以外では、旅行と家族や友人との時間を過ごすことのバランスを楽しんでいます。

カイ・ジュウ博士 現在、AWS でクラウド サポート エンジニアとして働いており、SageMaker、Bedrock などの AI/ML 関連サービスの問題を抱えた顧客を支援しています。彼は SageMaker の主題専門家です。データ サイエンスとデータ エンジニアリングの経験があり、生成 AI を活用したプロジェクトの構築に興味を持っています。

クリス・シュルツ は 25 年以上にわたり、新しいテクノロジーと世界クラスのデザインを組み合わせることで、魅力的なユーザー エクスペリエンスを実現してきました。 Kris は、シニアプロダクトマネージャーとしての役割で、メディアとエンターテイメント、ゲーム、空間コンピューティングを強化する AWS サービスの設計と構築を支援しています。


付録

次のセクションでは、テキストの挿入、手、反射などの難しいサンプル ユース ケースを示し、Titan Image Generator モデルの機能を強調します。前の例で生成されたサンプル出力イメージも含まれています。

テキスト

Titan Image Generator モデルは、読み取り可能なテキストを画像に挿入するなどの複雑なワークフローに優れています。この例は、画像内で大文字と小文字を一貫したスタイルで明確にレンダリングする Titan の機能を示しています。

「genai」と書かれた野球帽をかぶったコーギー 「生成 AI」という文字が入った T シャツを着て親指を立てる幸せな少年

ハンド

Titan Image Generator モデルには、詳細な AI 画像を生成する機能もあります。この画像には、詳細が目に見えるリアルな手と指が示されており、そのような具体性が欠けている可能性があるより基本的な AI 画像生成を超えています。次の例では、ポーズと解剖学的構造が正確に描写されていることに注目してください。

上から見た人の手 コーヒーマグを持っている人の手をよく見る

Titan Image Generator モデルによって生成されたイメージは、次の例で示すように、オブジェクトを空間的に配置し、ミラー効果を正確に反映します。

ふわふわしたかわいい白猫が後ろ足で立ち、装飾された金色の鏡を好奇心旺盛に見つめています。反射の中で猫は自分自身を見る 水面に反射する美しい空の湖

合成商品画像

以下は、この記事の前半で Titan Multimodal Embeddings モデル用に生成された製品イメージです。

スポット画像

最新のインテリジェンス

スポット画像