跳至主要内容

Imagen 3:Gemini API 实例指南

学习如何使用 Google 的 Imagen 3 API 与 Python 生成图像,包括环境搭建以及纵横比和安全过滤等选项的调整。
· 12分钟 阅读

使用 AI 探索

Imagen 3 是一款文本生成图像模型,能够以多种风格精准呈现细节丰富的场景,甚至可在图像中融入文字,适合用于广告与媒体内容创作等应用场景。

我们可以通过 Vertex AI Studio 界面使用 Imagen 3,或通过 API 将其直接集成到应用程序中。

在本教程中,我将解释如何使用 Google Generative API 与 Python 结合 Imagen 3 生成图像。我将通过实际示例带您完成环境搭建、编写必要代码,并将这项技术集成到您的项目中。无论您是想为应用加入动态图像,还是单纯出于好奇,本指南都将提供一条清晰的途径,帮助您以编程方式理解并使用 Imagen 3。

设置 Google Generative AI API

要在 Python 中开始使用 Imagen 3,我们需要先完成几个关键步骤。首先,创建一个 Google Cloud 项目。项目就绪后,需要生成一个 API 密钥。该密钥将允许我们的 Python 代码与 Imagen 3 服务交互。

创建 Google Cloud 项目

创建 Google 的 AI API 所需的第一步是新建一个 Google Cloud 项目。让我们一起完成这个流程:

  1. 访问 Google Cloud 控制台: 我们先前往Google Cloud Console。您需要使用 Google 账号登录。
  2. 选择或创建新项目: 在控制台顶部导航栏找到项目下拉菜单。点击后可选择现有项目或创建新项目。我们选择 "New Project" 继续。
  3. 填写项目信息: 将出现一个简要表单,要求填写基本信息。项目名称可自定,但选择描述性名称更有帮助,后续也可更改。我们将使用 Imagen-tutorial。Organization 可留空。

为 Imagen 3 设置 Google Cloud 项目

创建 API 密钥

现在 Google Cloud 项目已创建,我们可以前往 Google AI Studio 的API 密钥页面创建一个 API 密钥。

要创建密钥,点击 "Create API key" 按钮:

在 Google Cloud 控制台中创建 API 密钥

在弹窗中,输入我们上面创建的项目名称,选择它,然后点击 "Create API key in existing project":

为 Google Cloud 中的特定项目创建 API 密钥

复制密钥,并在我们将编写 Python 脚本的同一文件夹中创建一个名为 .env 的文件。.env 文件的内容应为:

GEMINI_API_KEY=<paste_your_key_here>

结算账户

如果我们现在尝试使用该 API 密钥,会收到错误提示 "Imagen API is only accessible to billed users at this time."。这是因为该 API 并非免费使用,我们需要先将一个结算账户关联到项目,才能使用它。

在撰写本文时,使用 Imagen 3 生成一张图像的价格为 $0.03。更多信息请查看其定价页面。

要添加结算账户,请在 Google AI Studio 中 API 密钥旁边点击 "Set up Billing" 按钮。

在 Google Cloud 中设置结算账户

这会将我们重定向到 Google Cloud 官网,我们可以点击 "Link a billing account" 选择现有结算账户,或点击 "Manage billing accounts" 创建新账户。

在 Google Cloud 项目中创建结算账户

假设我们还没有结算账户,于是选择 "Manage billing accounts"。在页面左上角有一个 "Create account" 按钮。创建账户需要填写个人信息并添加信用卡以处理付款。

使用 Python 通过 Imagen 3 生成图像

使用 Anaconda 搭建环境

在本教程中,我们使用 Anaconda。这是一款流行的平台,可简化包管理和项目搭建,使运行 Python 脚本更加容易。

您可以从其官方网站安装 Anaconda。

要设置 Anaconda 环境,打开终端并:

  • 创建环境:conda create -n imagen python=3.9。该命令会创建一个名为 imagen 的环境,使用 Python 3.9 版本。
  • 激活环境:conda activate imagen。
  • 安装 Google 生成式 AI 包:pip install -q -U google-genai。
  • 安装图像处理包以处理生成的图像:pip install pillow。
  • 安装用于加载 API 密钥的包:pip install python-dotenv

我们也可以在不使用 Anaconda 的情况下直接安装这些包,但可能会与现有包产生冲突,或当前的 Python 安装使用了不同的版本。使用 Anaconda 可以避免这些潜在问题。

生成我们的第一张图像

现在我们已准备好开始使用 Imagen 3。请在与 .env. 文件相同的文件夹中创建一个新的 Python 脚本,例如 gen_image.py。

首先,我们导入必要的包:

# Google generative AI:
from google import genai
from google.genai import types

# Packages to process the generated image:
from PIL import Image
from io import BytesIO

# Packages to load the .env file:
import os
from dotenv import load_dotenv

接着,从 .env 文件加载 API 密钥:

load_dotenv()
api_key = os.getenv("GEMINI_API_KEY")

然后,初始化 Google 生成式 AI 客户端。该对象用于与 Google API 通信:

client = genai.Client(api_key=api_key)

要生成图像,我们使用 client.models.generate_images() 函数:

prompt="""
A dog surfing at the beach
"""
response = client.models.generate_images(
    model="imagen-3.0-generate-002",
    prompt=prompt,
    config=types.GenerateImagesConfig(
        number_of_images=1,
    )
)

最后,使用 Image 对象显示生成的图像:

for generated_image in response.generated_images:
  image = Image.open(BytesIO(generated_image.image.image_bytes))
  image.show()

效果如下:

使用 Imagen 3 生成第一张图像

文本生成

与其他文生图模型相比,Imagen 3 的一个有趣特性是具备生成文字的能力。让我们试试用新鲜茶叶拼出单词 “Tea”:

prompt="""
Word "tea" made from fresh tea leaves, white background
"""
response = client.models.generate_images(
    model="imagen-3.0-generate-002",
    prompt=prompt,
)

效果如下:

使用 Imagen 3 生成图像中文字

Imagen 3 的图像生成选项

图像生成选项通过 types.GenerateImagesConfig 提供。在上面的示例中,我们只指定了要生成的图像数量:

config=types.GenerateImagesConfig(
    number_of_images=1,
)

本节我们将探索 Imagen 3 API 提供的其他选项。更多信息请查看官方文档。

生成多张图像

我们可以使用 number_of_images 参数在一次提示中生成多张图像。默认会生成四张图像。

让我们为一本漫画生成两张图像试试。

prompt="""
Single comic book panel of two people overlooking a destroyed city. 
A speech bubble points from one of them and says: I guess this is the end.
"""
response = client.models.generate_images(
    model="imagen-3.0-generate-002",
    prompt=prompt,
    config=types.GenerateImagesConfig(
        number_of_images=2,
    )
)

效果如下:

使用 Imagen 3 为漫画生成多张图像

这也是在图像中生成文本的另一个示例。尽管左侧图像包含了一些多余且不需要的文字,但通过生成多张图像,我们可以提高获得期望输出的概率。右侧图像几乎完全符合我们的提示。

控制纵横比

默认情况下,生成的图像是 1:1 的正方形。该模型支持以下纵横比:1:1、3:4、4:3、9:16 和 16:9。

让我们生成一张 9:16 的图像,用作手机壁纸:

prompt="""
A drone shot of a river flowing between mountains with a stormy sky.
"""
response = client.models.generate_images(
    model="imagen-3.0-generate-002",
    prompt=prompt,
    config=types.GenerateImagesConfig(
        aspect_ratio="9:16",
    )
)

效果如下:

使用 Imagen 3 生成 9:16 纵横比的图像

安全级别过滤

文档提到我们可以使用 safety_filter_level 指定图像过滤级别。每张生成的图像都会获得一个概率分数,用于衡量图像不安全(如不当内容)的可能性。

设置安全级别过滤很重要,因为它有助于确保生成的内容恰当且符合用户偏好,从而为各类应用维护一个安全且尊重的环境。

文档称其支持三个级别:

  • BLOCK_LOW_AND_ABOVE:即使概率分数较低也会拦截图像。
  • BLOCK_MEDIUM_AND_ABOVE :仅拦截概率分数为中或高的图像。
  • BLOCK_ONLY_HIGH :仅拦截概率分数高的图像。

不过,经过实际测试,目前 API 只支持 BLOCK_LOW_AND_ABOVE 选项。提供其他值将导致报错。

人物生成功能

我们可以通过 person_generation 选项控制模型是否允许生成包含人物的图像。它提供两个选项:

  • DONT_ALLOW:包含人物的图像会被拦截。
  • ALLOW_ADULT:允许生成包含人物(仅限成人)的图像。

默认选项为允许人物。例如,如果我们设置为不允许人物,并尝试生成一张有人做饭的图像,将不会得到任何结果。

prompt="""
A person cooking.
"""
response = client.models.generate_images(
    model="imagen-3.0-generate-002",
    prompt=prompt,
    config=types.GenerateImagesConfig(
        person_generation="DONT_ALLOW",
    )
)
print(response.generated_images)

输出如下:

None

为 Imagen 3 编写优质提示词

官方文档提供了全面的提示词指南,这里不再重复。以下是编写优质提示词的关键要点:

  • 提示词写作基础:
    • 主题: 聚焦于您想呈现的主体、人物或场景。
    • 情境与背景: 描述主体所处的设置或环境。
    • 风格: 指定您想要的艺术或摄影风格(如速写、绘画、照片)。
  • 使用描述性语言: 借助细致的形容词与上下文来明确期望的输出。
  • 参考特定风格: 使用知名艺术家或艺术流派来引导审美取向。
  • 图像中的文字: 将文本限制在 25 个字符以内,并使用简洁明确的短语补充信息。
  • 提示词参数化: 如果需要以相同风格生成多张图像,建议创建可复用的提示词模板,只把变化的部分作为输入。
  • 摄影: 指定相机设置、镜头类型和光线以影响结果。
  • 艺术: 使用诸如 "a painting of..." 或特定技法如 "watercolor painting of..." 等描述。
  • 图像质量修饰词: 使用 "high-quality" 或 "4K" 等关键词以提升输出质量。
  • 照片级真实感: 包含镜头类型与焦距等技术细节以增强真实感。

图像编辑与自定义

Imagen 3 还具备图像编辑和图像自定义的能力。遗憾的是,这些功能目前仍未全面开放,仅对特定用户可用。

例如,自定义功能允许我们根据提示对参考图像进行定制。在示例中,给出一张女性的照片,提示将其修改为同一人物手持橙子的图像。

Imagen 3 中的图像自定义示例

关于这些功能及访问申请表的更多信息可在其网站上查看。

结语

在本教程中,我们学习了如何使用 Python 与 Google 的 Generative API 配合 Imagen 3 生成图像。总体来说,我对在测试 API 时获得的输出很满意。我认为结果质量高、AI 痕迹更少,更不易与真实图像区分。

在图像中处理文字的能力对品牌与营销很有用。总体而言,我认为该模型表现出色。我唯一的遗憾是功能尚未全部开放,因为我认为图像编辑甚至比图像生成更实用。

François Aubry

作者

François Aubry

全栈工程师,CheapGPT 创始人。我一直热爱教学。从学生时代起,我就积极寻找机会为同学提供辅导与帮助。这份热情促使我攻读博士学位,并在此期间担任助教,以支持我的学术追求。那些年里,我在传统课堂环境中收获了极大的成就感,既建立联系也促进学习。随着在线学习平台的兴起,我也看到了数字教育的变革潜力。事实上,我曾参与我们大学一款此类平台的建设。我致力于将传统教学理念与创新的数字方法相融合。我的热情在于打造既有吸引力、信息量充足,又能让当代学习者轻松获取的课程。

主题