使用 Imagen 生成圖片


Vertex AI in Firebase SDK 可讓您存取 Imagen 3 模型 (透過 Imagen API),以便根據文字提示產生圖像。這項功能可讓您執行以下操作:

  • 根據以自然語言撰寫的提示生成圖片
  • 以多種格式和風格產生圖片
  • 在圖片中顯示文字

請注意,Vertex AI in Firebase 目前尚不支援 Imagen 型號提供的所有功能。如要進一步瞭解,請參閱本頁稍後的「支援的功能和功能」一節。

跳至僅限文字輸入的程式碼

事前準備

如果您尚未完成,請參閱入門指南,瞭解如何設定 Firebase 專案、將應用程式連結至 Firebase、新增 SDK、初始化 Vertex AI 服務,以及建立 ImagenModel 例項。

請務必至少使用下列 Firebase 程式庫版本:
iOS+:v11.9.0 以上 | Android:v16.2.0 以上 (BoM:v33.10.0 以上) | Web:v11.4.1 以上 | Flutter:v1.4.0 以上 (BoM:v3.8.0 以上)

支援這項功能的型號

Imagen 3 模型支援圖片產生功能。我們即將支援使用 Gemini 2.0 模型產生圖片。

從純文字輸入內容生成圖片

您可以使用文字提示,要求 Imagen 模型產生圖片。您可以產生一張圖片多張圖片

根據純文字輸入內容生成一張圖片

請先完成本指南的「事前準備」一節,再嘗試使用這個範例。

您可以要求 Imagen 模型透過文字提示生成單一圖像。

請務必建立 ImagenModel 例項並呼叫 generateImages

Swift

import FirebaseVertexAI

// Initialize the Vertex AI service
let vertex = VertexAI.vertexAI()

// Create an `ImagenModel` instance with an Imagen 3 model that supports your use case
let model = vertex.imagenModel(modelName: "imagen-3.0-generate-002")

// Provide an image generation prompt
let prompt = "An astronaut riding a horse"

// To generate an image, call `generateImages` with the text prompt
let response = try await model.generateImages(prompt: prompt)

// Handle the generated image
guard let image = response.images.first else {
  fatalError("No image in the response.")
}
let uiImage = UIImage(data: image.data)

Kotlin

// Using Imagen with Vertex AI in Firebase is in public preview
// It requires opt-in to use the API
@OptIn(PublicPreviewAPI::class)
suspend fun generateImage() {
  // Initialize the Vertex AI service and create an `ImagenModel` instance
  // Specify an Imagen 3 model that supports your use case
  val imagenModel = Firebase.vertexAI.imagenModel("imagen-3.0-generate-002")

  // Provide an image generation prompt
  val prompt = "An astronaut riding a horse"

  // To generate an image, call `generateImages` with the text prompt
  val imageResponse = imagenModel.generateImages(prompt)

  // Handle the generated image
  val image = imageResponse.images.first()

  val bitmapImage = image.asBitmap()
}

Java

// Initialize the Vertex AI service and create an `ImagenModel` instance
// Specify an Imagen 3 model that supports your use case
ImagenModel imagenModel = FirebaseVertexAI.getInstance().imagenModel(
        /* modelName */ "imagen-3.0-generate-002");

ImagenModelFutures model = ImagenModelFutures.from(imagenModel);

// Provide an image generation prompt
String prompt = "An astronaut riding a horse";

// To generate an image, call `generateImages` with the text prompt
Futures.addCallback(model.generateImages(prompt), new FutureCallback<ImagenGenerationResponse<ImagenInlineImage>>() {
    @Override
    public void onSuccess(ImagenGenerationResponse<ImagenInlineImage> result) {
        if (result.getImages().isEmpty()) {
            Log.d("TAG", "No images generated");
        }
        Bitmap bitmap = result.getImages().get(0).asBitmap();
        // Use the bitmap to display the image in your UI
    }

    @Override
    public void onFailure(Throwable t) {
        // ...
    }
}, Executors.newSingleThreadExecutor());

Web

import { initializeApp } from "firebase/app";
import { getVertexAI, getImagenModel } from "firebase/vertexai";

// TODO(developer) Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
  // ...
};

// Initialize FirebaseApp
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Vertex AI service
const vertexAI = getVertexAI(firebaseApp);

// Create an `ImagenModel` instance with an Imagen 3 model that supports your use case
const imagenModel = getImagenModel(
  vertexAI,
  {
    model: "imagen-3.0-generate-002"
  }
);

// Provide an image generation prompt
const prompt = "An astronaut riding a horse.";

// To generate an image, call `generateImages` with the text prompt
const response = await imagenModel.generateImages(prompt)

// If fewer images were generated than were requested,
// then `filteredReason` will describe the reason they were filtered out
if (response.filteredReason) {
  console.log(response.filteredReason);
}

if (response.images.length == 0) {
  throw new Error("No images in the response.")
}

const image = response.images[0];

Dart

import 'package:firebase_vertexai/firebase_vertexai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';

await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);

// Initialize the Vertex AI service and create an `ImagenModel` instance
// Specify an Imagen 3 model that supports your use case
final model =
    FirebaseVertexAI.instance.imagenModel(model: 'imagen-3.0-generate-002');

// Provide an image generation prompt
const prompt = 'An astronaut riding a horse.';

// To generate an image, call `generateImages` with the text prompt
final response = await model.generateImages(prompt);

if (response.images.isNotEmpty) {
  final image = response.images[0];
  // Process the image
} else {
  // Handle the case where no images were generated
  print('Error: No images were generated.');
}

瞭解如何選擇適合用途和應用程式的模型,以及選用的位置

根據純文字輸入內容生成多張圖片

請先完成本指南的「事前準備」一節,再嘗試使用這個範例。

根據預設,Imagen 3 模型每個要求只會產生一張圖片。不過,您可以要求 Imagen 模型在建立 ImagenModel 執行個體時提供 ImagenGenerationConfig,讓每個要求產生多張圖片。

請務必建立 ImagenModel 例項並呼叫 generateImages

Swift

import FirebaseVertexAI

// Initialize the Vertex AI service
let vertex = VertexAI.vertexAI()

// Create an `ImagenModel` instance with an Imagen 3 model that supports your use case
let model = vertex.imagenModel(
  modelName: "imagen-3.0-generate-002",
  // Configure the model to generate multiple images for each request
  // See: https://firebase.google.com/docs/vertex-ai/model-parameters
  generationConfig: ImagenGenerationConfig(numberOfImages: 4)
)

// Provide an image generation prompt
let prompt = "An astronaut riding a horse"

// To generate images, call `generateImages` with the text prompt
let response = try await model.generateImages(prompt: prompt)

// If fewer images were generated than were requested,
// then `filteredReason` will describe the reason they were filtered out
if let filteredReason = response.filteredReason {
  print(filteredReason)
}

// Handle the generated images
let uiImages =  response.images.compactMap { UIImage(data: $0.data) }

Kotlin

// Using Imagen with Vertex AI in Firebase is in public preview
// It requires opt-in to use the API
@OptIn(PublicPreviewAPI::class)
suspend fun generateImage() {
  // Initialize the Vertex AI service and create an `ImagenModel` instance
  // Specify an Imagen 3 model that supports your use case
  val imagenModel = Firebase.vertexAI.imagenModel(
      modelName = "imagen-3.0-generate-002",
      // Configure the model to generate multiple images for each request
      // See: https://firebase.google.com/docs/vertex-ai/model-parameters
      generationConfig = ImagenGenerationConfig(numberOfImages = 4)
  )

  // Provide an image generation prompt
  val prompt = "An astronaut riding a horse"

  // To generate images, call `generateImages` with the text prompt
  val imageResponse = imagenModel.generateImages(prompt)

  // If fewer images were generated than were requested,
  // then `filteredReason` will describe the reason they were filtered out
  if (imageResponse.filteredReason != null) {
    Log.d(TAG, "FilteredReason: ${imageResponse.filteredReason}")
  }

  for (image in imageResponse.images) {
    val bitmap = image.asBitmap()
    // Use the bitmap to display the image in your UI
  }
}

Java

// Configure the model to generate multiple images for each request
// See: https://firebase.google.com/docs/vertex-ai/model-parameters
ImagenGenerationConfig imagenGenerationConfig = new ImagenGenerationConfig.Builder()
        .setNumberOfImages(4)
        .build();

// Initialize the Vertex AI service and create an `ImagenModel` instance
// Specify an Imagen 3 model that supports your use case
ImagenModel imagenModel = FirebaseVertexAI.getInstance().imagenModel(
        /* modelName */ "imagen-3.0-generate-002",
        /* imageGenerationConfig */ imagenGenerationConfig);

ImagenModelFutures model = ImagenModelFutures.from(imagenModel);

// Provide an image generation prompt
String prompt = "An astronaut riding a horse";

// To generate images, call `generateImages` with the text prompt
Futures.addCallback(model.generateImages(prompt), new FutureCallback<ImagenGenerationResponse<ImagenInlineImage>>() {
    @Override
    public void onSuccess(ImagenGenerationResponse<ImagenInlineImage> result) {
        // If fewer images were generated than were requested,
        // then `filteredReason` will describe the reason they were filtered out
        if (result.getFilteredReason() != null){
            Log.d("TAG", "FilteredReason: " + result.getFilteredReason());
        }

        // Handle the generated images
        List<ImagenInlineImage> images = result.getImages();
        for (ImagenInlineImage image : images) {
            Bitmap bitmap = image.asBitmap();
            // Use the bitmap to display the image in your UI
        }
    }

    @Override
    public void onFailure(Throwable t) {
        // ...
    }
}, Executors.newSingleThreadExecutor());

Web

import { initializeApp } from "firebase/app";
import { getVertexAI, getImagenModel } from "firebase/vertexai";

// TODO(developer) Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
  // ...
};

// Initialize FirebaseApp
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Vertex AI service
const vertexAI = getVertexAI(firebaseApp);

// Create an `ImagenModel` instance with an Imagen 3 model that supports your use case
const imagenModel = getImagenModel(
  vertexAI,
  {
    model: "imagen-3.0-generate-002",
    // Configure the model to generate multiple images for each request
    // See: https://firebase.google.com/docs/vertex-ai/model-parameters
    generationConfig: {
      numberOfImages: 4
    }
  }
);

// Provide an image generation prompt
const prompt = "An astronaut riding a horse.";

// To generate images, call `generateImages` with the text prompt
const response = await imagenModel.generateImages(prompt)

// If fewer images were generated than were requested,
// then `filteredReason` will describe the reason they were filtered out
if (response.filteredReason) {
  console.log(response.filteredReason);
}

if (response.images.length == 0) {
  throw new Error("No images in the response.")
}

const images = response.images[0];

Dart

import 'package:firebase_vertexai/firebase_vertexai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';

await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);

// Initialize the Vertex AI service and create an `ImagenModel` instance
// Specify an Imagen 3 model that supports your use case
final model = FirebaseVertexAI.instance.imagenModel(
  model: 'imagen-3.0-generate-002',
  // Configure the model to generate multiple images for each request
  // See: https://firebase.google.com/docs/vertex-ai/model-parameters
  generationConfig: ImagenGenerationConfig(numberOfImages: 4),
);

// Provide an image generation prompt
const prompt = 'An astronaut riding a horse.';

// To generate images, call `generateImages` with the text prompt
final response = await model.generateImages(prompt);

// If fewer images were generated than were requested,
// then `filteredReason` will describe the reason they were filtered out
if (response.filteredReason != null) {
  print(response.filteredReason);
}

if (response.images.isNotEmpty) {
  final images = response.images;
  for(var image in images) {
  // Process the image
  }
} else {
  // Handle the case where no images were generated
  print('Error: No images were generated.');
}

瞭解如何選擇適合用途和應用程式的模型,以及選用的位置

支援的功能和相關規定

Imagen 3 模型提供許多與圖像產生相關的功能。本節說明搭配 Vertex AI in Firebase 使用模型時支援的功能。

支援的功能

Vertex AI in Firebase 支援 Imagen 3 型號的這些功能。

  • 產生人物和臉孔 (前提是您的 Firebase 專案已獲得 Google Cloud核准)

  • 在生成的圖片中產生文字

  • 為產生的圖片加上浮水印

  • 設定圖片產生參數,例如產生的圖片數量、顯示比例和浮水印

  • 調整安全性設定

Vertex AI in Firebase不支援 Imagen 3 型號的這些進階功能。

請注意,即使在伺服器端使用 Imagen 模型,這些功能大多都需要在已核准的使用者名單中才能使用。

  • 圖片編輯或處理功能,包括放大圖片

  • 在傳送至模型的要求中加入圖片 (例如少量樣本學習)

  • 使用 SDK 驗證數位浮水印
    如要驗證圖片是否含有浮水印,您可以使用 Media 分頁將圖片上傳至 Vertex AI Studio。

  • 使用文字產生「動態圖片」 (MP4 產生)

  • 使用預先定義的風格生成圖片

  • 設定輸入文字的語言

  • 啟用 includeSafetyAttributes,表示無法傳回 safetyAttributes.categoriessafetyAttributes.scores

  • 停用提示強化功能 (enhancePrompt 參數),這表示以 LLM 為基礎的提示重寫工具一律會自動為提供的提示新增更多詳細資料,以便提供更能反映提供提示的高畫質圖片

  • 將生成的圖片直接寫入 Google Cloud Storage,做為模型回應的一部分 (storageUri 參數)。相反地,圖片一律會以 base64 編碼的圖片位元組格式傳回。
    如要將產生的圖片上傳至 Cloud Storage,您可以使用 Cloud Storage for Firebase

規格和限制

限制 (每項要求) Imagen 3 Imagen 3 Fast
輸入符記數量上限 480 個符記 480 個符記
輸出圖片數量上限 4 張圖片 4 張圖片
支援的輸出圖片解析度 (像素)
  • 1024x1024 像素 (1:1 顯示比例)
  • 896x1280 (顯示比例 3:4)
  • 1280x896 (顯示比例 4:3)
  • 768x1408 (顯示比例 9:16)
  • 1408x768 (顯示比例 16:9)
  • 1024x1024 像素 (1:1 顯示比例)
  • 896x1280 (顯示比例 3:4)
  • 1280x896 (顯示比例 4:3)
  • 768x1408 (顯示比例 9:16)
  • 1408x768 (顯示比例 16:9)



其他功能

瞭解如何控管內容產生作業

進一步瞭解支援的型號

瞭解可用於各種用途的模型,以及相關配額價格


針對使用 Vertex AI in Firebase 的體驗提供意見回饋