使用Bedrock上的Nova/Stable Diffusion模型生成图像的测试

注:截止测试发起时Nova 2 Omni尚未GA没有拿到测试权限,因此只能拿1年多前的上一代模型的Nova Canvas测试,这对于6个月换一代的模型很不公平,但目前没有测试Nova 2 Omni的账号,后续拿到后会补上。

一、背景

本文测试文生图的场景,并提供sample代码用于快速测试。截止测试发起时Nova 2 Omni尚未GA没有拿到测试权限,因此只能拿上一代模型的Nova Canvas测试。

测试对象是:

  • Bedrock上的Nova Canvas
  • Bedrock上的Stable Diffusion Large
  • Bedrock上的Stable Image Ultra
  • Google Vertex AI上的Gemini 2.5 Flash Image
  • Google Vertex AI上的Google Gemini 3 Pro Image Preview

测试方法如下:

  • 分别测试中文和英文,对于不支持输入中文的Stable系列模型则使用英文Prompt
  • Nova Canvas, Stable Diffusion Large/Ultra 均在Amazon Bedrock上的API调用
  • 测试代码为Kiro IDE自动生成,参数全默认,未进行二次人工优化,以一次出图为准
  • Google Gemini 系列模型为浏览器在Vertex AI的控制台网页界面直接提交Prompt,未使用API,参数全默认,未进行二次人工优化,以一次出图为准

开始测试。

二、测试代码和方法

1、调用Bedrock上的Nova Canvas模型的代码

运行如下代码,通过切换传入的prompt即可在当前目录下获得输出图片(注意文件名都叫output.png)。

import boto3
import json
import base64
from pathlib import Path

# 创建 Bedrock Runtime 客户端,使用本机 AWS CLI 配置,指定 us-east-1 区域
bedrock_runtime = boto3.client(
    service_name='bedrock-runtime',
    region_name='us-east-1'
)

# 定义提示词
prompt1cn = "4000米海拔的青藏高原上的公路,公路是黑色沥青没有积雪,两边的地面是积雪覆盖。背后是七千米7000米以上的雪山被太阳照亮,但是途中画面角度不直接看到太阳"
prompt2cn = "日照金山,画面地点在雪域高原,背后是8000米的雪山尖峰,金色的太阳光照亮了顶部"
prompt1en = "A black asphalt highway on the Tibetan Plateau at 4000 meters altitude, the road is clear without snow, both sides covered with snow. Behind are majestic snow-capped mountains over 7000 meters high illuminated by sunlight, but the sun is not directly visible in the frame. Photorealistic, high quality, dramatic landscape."
prompt2en = "Golden hour sunlight on mountain peaks, majestic 8000-meter snow-capped summits on the snowy plateau, golden sunlight illuminating the mountain tops, dramatic landscape photography"

prompt_submit = prompt1cn

# 准备请求体
request_body = {
    "taskType": "TEXT_IMAGE",
    "textToImageParams": {
        "text": prompt_submit
    },
    "imageGenerationConfig": {
        "numberOfImages": 1,
        "quality": "standard",
        "height": 1024,
        "width": 1024,
        "cfgScale": 8.0,
        "seed": 0
    }
}

# 调用 Nova Canvas 模型
model_id = "amazon.nova-canvas-v1:0"

print("正在调用 Nova Canvas 模型生成图片...")
print(f"提示词: {prompt_submit}")

response = bedrock_runtime.invoke_model(
    modelId=model_id,
    body=json.dumps(request_body)
)

# 解析响应
response_body = json.loads(response['body'].read())

# 获取生成的图片(base64 编码)
image_base64 = response_body['images'][0]

# 解码并保存图片
image_data = base64.b64decode(image_base64)
output_path = Path("output.png")

with open(output_path, "wb") as f:
    f.write(image_data)

print(f"图片已成功生成并保存到: {output_path.absolute()}")

2、调用Bedrock上的Stable Diffusion模型的代码

运行如下代码,通过切换传入的prompt即可在当前目录下获得输出图片(注意文件名都叫output.png)。

替换代码中的模型ID,即可在Large和Ultra版本之间切换。Stable Diffusion 3.5 Large的model id是stability.sd3-5-large-v1:0,Stable Image Ultra的model id是stability.stable-image-ultra-v1:1

import boto3
import json
import base64
from pathlib import Path

# 创建 Bedrock Runtime 客户端,使用本机 AWS CLI 配置,指定 us-west-2 区域
bedrock_runtime = boto3.client(
    service_name='bedrock-runtime',
    region_name='us-west-2'
)

# 定义提示词(使用英文以避免内容过滤)
prompt1 = "A black asphalt highway on the Tibetan Plateau at 4000 meters altitude, the road is clear without snow, both sides covered with snow. Behind are majestic snow-capped mountains over 7000 meters high illuminated by sunlight, but the sun is not directly visible in the frame. Photorealistic, high quality, dramatic landscape."
prompt2 = "Golden hour sunlight on mountain peaks, majestic 8000-meter snow-capped summits on the snowy plateau, golden sunlight illuminating the mountain tops, dramatic landscape photography"
prompt_submit = prompt1

# 准备请求体 - Stable Diffusion 3.5 Large 格式
request_body = {
    "prompt": prompt_submit,
    "mode": "text-to-image",
    "aspect_ratio": "1:1",
    "output_format": "png"
}

# 调用 Stable Diffusion 3.5 Large 模型
model_id = "stability.sd3-5-large-v1:0"

print("正在调用 Stable Diffusion 3.5 Large 模型生成图片...")
print(f"提示词: {prompt_submit}")

response = bedrock_runtime.invoke_model(
    modelId=model_id,
    body=json.dumps(request_body)
)

# 解析响应
response_body = json.loads(response['body'].read())

# 检查是否被内容过滤器拦截
if 'finish_reasons' in response_body and response_body['finish_reasons']:
    finish_reason = response_body['finish_reasons'][0]
    if finish_reason and ('Filter' in str(finish_reason) or 'CONTENT_FILTERED' in str(finish_reason)):
        print(f"错误: 请求被内容过滤器拦截 - {finish_reason}")
        print("建议: 尝试修改提示词或使用英文提示词")
        exit(1)

# 获取生成的图片(base64 编码)
# Stable Diffusion 3.5 的响应格式可能是 'image' 而不是 'images'
if 'images' in response_body:
    image_base64 = response_body['images'][0]
elif 'image' in response_body:
    image_base64 = response_body['image']
elif 'artifacts' in response_body:
    image_base64 = response_body['artifacts'][0]['base64']
else:
    print("响应内容:", json.dumps(response_body, indent=2, ensure_ascii=False))
    raise KeyError(f"无法在响应中找到图片数据。响应键: {list(response_body.keys())}")

# 解码并保存图片
image_data = base64.b64decode(image_base64)
output_path = Path("output_sd.png")

with open(output_path, "wb") as f:
    f.write(image_data)

print(f"图片已成功生成并保存到: {output_path.absolute()}")

3、手工在Google Vertex AI控制台上发起测试

登陆到Google Vertex AI控制台,在右侧的弹出窗口中,可以选择要测试的Gemini的特定版本,然后提交Prompt即可发起测试。如下截图。

三、效果对比

再次备注:截止测试发起时Nova 2 Omni尚未GA没有拿到测试权限,因此只能拿1年多前的上一代模型的Nova Canvas测试,这对于6个月换一代的模型很不公平,但目前没有测试Nova 2 Omni的账号,后续拿到后会补上。

测试用例1-中文Prompt对比如下截图。

测试用例1-英文Prompt对比如下截图。

测试用例2-中文Prompt对比如下截图。

测试用例2-英文Prompt对比如下截图。

从以上结果中可看出:

  • 对Nova模型使用英文Prompt效果好于优于中文Prompt,这可能与模型的训练数据和优化方向有关,其他模型差别不大
  • Stable Diffusion系列模型对于中文Prompt有触发内容过滤风险,在Amazon Bedrock的API上调用出错,因此需要改用英文Prompt
  • 测试用例1中Gemini系列模型效果最好,尤其是Gemini 3 Pro Image Preview取得了碾压性效果
  • 测试用例2中Stable Image Ultra模型效果最好,碾压性优势
  • 由于Nova Canvas模型太老了,效果确实不如另外的模型,期待已经官宣了的Nova 2 Omni尽快在Bedrock服务上开放API给广大用户。

四、成本测算

1、价格列表

模型 价格/张
Google Gemini 2.5 Flash Image $0.039
Amazon Nova Canvas 标准质量 $0.04
Amazon Nova Canvas 高级质量 $0.06
Stable Diffusion 3.5 Large $0.08
Stable Image Ultra $0.14

2、结论

在AWS云上生态的性价比选择:Nova Canvas标准质量。虽然列表价格和Google Gemini 2.5 Flash Image相近,但Nova可应用AWS折扣,因此调用模型的时间价格可能比Google Gemini 2.5 Flash Image更好。高质量需求则直接使用Stable Image Ultra。

再次备注:截止测试发起时Nova 2 Omni尚未GA没有拿到测试权限,因此只能拿1年多前的上一代模型的Nova Canvas测试,这对于6个月换一代的模型很不公平,但目前没有测试Nova 2 Omni的账号,后续拿到后会补上。

五、参考文档

Amazon Nova 模型价格:

https://aws.amazon.com/nova/pricing/

Amazon Bedrock 上的Stable Diffusion/Stable Image模型价格:

https://aws.amazon.com/bedrock/pricing/

Google Gemini Model Pricing:

https://cloud.google.com/vertex-ai/generative-ai/pricing


最后修改于 2025-12-10