Tuỳ chỉnh hình ảnh dựa trên một kiểu cụ thể bằng Imagen


Trang này mô tả cách sử dụng khả năng tuỳ chỉnh từ Imagen để chỉnh sửa hoặc tạo hình ảnh dựa trên một phong cách cụ thể bằng cách sử dụng SDK Firebase AI Logic.

Cách hoạt động: Bạn cung cấp một câu lệnh bằng văn bản và ít nhất một hình ảnh tham khảo cho thấy một kiểu cụ thể (chẳng hạn như một mẫu, kết cấu hoặc kiểu thiết kế). Mô hình sử dụng các dữ liệu đầu vào này để tạo một hình ảnh mới dựa trên phong cách được chỉ định trong hình ảnh tham khảo.

Ví dụ: bạn có thể tạo một hình ảnh mới về nhà bếp dựa trên hình ảnh trong một danh mục bán lẻ phổ biến mà bạn cung cấp.

Chuyển đến mã



Trước khi bắt đầu

Chỉ có khi bạn dùng Vertex AI Gemini API làm trình cung cấp API.

Nếu bạn chưa thực hiện, hãy hoàn tất hướng dẫn bắt đầu sử dụng. Hướng dẫn này mô tả cách thiết lập dự án Firebase, kết nối ứng dụng của bạn với Firebase, thêm SDK, khởi chạy dịch vụ phụ trợ cho nhà cung cấp API mà bạn chọn và tạo một thực thể ImagenModel.

Các mô hình hỗ trợ tính năng này

Imagen cung cấp tính năng chỉnh sửa hình ảnh thông qua mô hình capability:

  • imagen-3.0-capability-001

Xin lưu ý rằng đối với các mô hình Imagen, hệ thống không hỗ trợ vị trí global.

Gửi yêu cầu tuỳ chỉnh kiểu

Mẫu sau đây cho thấy một yêu cầu tuỳ chỉnh kiểu yêu cầu mô hình tạo một hình ảnh mới theo kiểu của hình ảnh tham khảo được cung cấp (trong ví dụ này là bức "Đêm đầy sao" của Van Gogh).

Hãy xem các mẫu câu lệnh ở phần sau trên trang này để tìm hiểu về cách viết câu lệnh và cách sử dụng hình ảnh tham khảo trong câu lệnh.

Swift

Swift không hỗ trợ tính năng chỉnh sửa hình ảnh bằng các mô hình Imagen. Hãy kiểm tra lại vào cuối năm nay!

Kotlin

// Using this SDK to access Imagen models is a Preview release and requires opt-in
@OptIn(PublicPreviewAPI::class)
suspend fun customizeImage() {
    // Initialize the Vertex AI Gemini API backend service
    // Optionally specify the location to access the model (for example, `us-central1`)
    val ai = Firebase.ai(backend = GenerativeBackend.vertexAI(location = "us-central1"))

    // Create an `ImagenModel` instance with an Imagen "capability" model
    val model = ai.imagenModel("imagen-3.0-capability-001")

    // This example assumes 'referenceImage' is a pre-loaded Bitmap.
    // In a real app, this might come from the user's device or a URL.
    val referenceImage: Bitmap = TODO("Load your reference image Bitmap here")

    // Define the style reference using the reference image.
    val styleReference = ImagenStyleReference(
        image = referenceImage,
        referenceID = 1,
        description = "Van Gogh style"
    )

    // Provide a prompt that describes the final image.
    // The "[1]" links the prompt to the style reference with ID 1.
    val prompt = "A cat flying through outer space, in the Van Gogh style[1]"

    // Use the editImage API to perform the style customization.
    // Pass the list of references, the prompt, and an editing configuration.
    val editedImage = model.editImage(
        references = listOf(styleReference),
        prompt = prompt,
        config = ImagenEditingConfig(
            editSteps = 50 // Number of editing steps, a higher value can improve quality
        )
    )

    // Process the result
}

Java

// Initialize the Vertex AI Gemini API backend service
// Optionally specify the location to access the model (for example, `us-central1`)
// Create an `ImagenModel` instance with an Imagen "capability" model
ImagenModel imagenModel = FirebaseAI.getInstance(GenerativeBackend.vertexAI("us-central1"))
        .imagenModel(
                /* modelName */ "imagen-3.0-capability-001");

ImagenModelFutures model = ImagenModelFutures.from(imagenModel);

// This example assumes 'referenceImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
Bitmap referenceImage = null; // TODO("Load your image Bitmap here");

// Define the style reference using the reference image.
ImagenStyleReference subjectReference = new ImagenStyleReference.Builder()
        .setImage(referenceImage)
        .setReferenceID(1)
        .setDescription("Van Gogh style")
        .build();

// Provide a prompt that describes the final image.
// The "[1]" links the prompt to the style reference with ID 1.
String prompt = "A cat flying through outer space, in the Van Gogh style[1]";

// Define the editing configuration.
ImagenEditingConfig imagenEditingConfig = new ImagenEditingConfig.Builder()
        .setEditSteps(50) // Number of editing steps, a higher value can improve quality
        .build();

// Use the editImage API to perform the style customization.
// Pass the list of references, the prompt, and the editing configuration.
Futures.addCallback(model.editImage(Collections.singletonList(styleReference), prompt, imagenEditingConfig), new FutureCallback<ImagenGenerationResponse>() {
    @Override
    public void onSuccess(ImagenGenerationResponse 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

Các ứng dụng Web không hỗ trợ tính năng chỉnh sửa hình ảnh bằng các mô hình Imagen. Hãy kiểm tra lại vào cuối năm nay!

Dart

import 'dart:typed_data';
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';

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

// Initialize the Vertex AI Gemini API backend service
// Optionally specify a location to access the model (for example, `us-central1`)
final ai = FirebaseAI.vertexAI(location: 'us-central1');

// Create an `ImagenModel` instance with an Imagen "capability" model
final model = ai.imagenModel(model: 'imagen-3.0-capability-001');

// This example assumes 'referenceImage' is a pre-loaded Uint8List.
// In a real app, this might come from the user's device or a URL.
final Uint8List referenceImage = Uint8List(0); // TODO: Load your reference image data here

// Define the style reference using the reference image.
final styleReference = ImagenStyleReference(
  image: referenceImage,
  referenceId: 1,
  description: 'Van Gogh style',
);

// Provide a prompt that describes the final image.
// The "[1]" links the prompt to the style reference with ID 1.
final prompt = "A cat flying through outer space, in the Van Gogh style[1]";

try {
  // Use the editImage API to perform the style customization.
  // Pass the list of references, the prompt, and an editing configuration.
  final response = await model.editImage(
    [styleReference],
    prompt,
    config: ImagenEditingConfig(
      editSteps: 50, // Number of editing steps, a higher value can improve quality
    ),
  );

  // Process the result.
  if (response.images.isNotEmpty) {
    final editedImage = response.images.first.bytes;
    // Use the editedImage (a Uint8List) to display the image, save it, etc.
    print('Image successfully generated!');
  } else {
    // Handle the case where no images were generated.
    print('Error: No images were generated.');
  }
} catch (e) {
  // Handle any potential errors during the API call.
  print('An error occurred: $e');
}

Unity

Unity không hỗ trợ tính năng chỉnh sửa hình ảnh bằng các mô hình Imagen. Hãy kiểm tra lại vào cuối năm nay!

Mẫu câu lệnh

Trong yêu cầu, bạn cung cấp hình ảnh tham khảo (tối đa 4 hình ảnh) bằng cách xác định một ImagenStyleReference, trong đó bạn chỉ định mã tham chiếu cho một hình ảnh (và cũng có thể là nội dung mô tả kiểu). Xin lưu ý rằng nhiều hình ảnh có thể có cùng mã nhận dạng tham chiếu (ví dụ: nhiều bức ảnh có cùng một mẫu).

Sau đó, khi viết câu lệnh, bạn có thể tham khảo các mã nhận dạng này. Ví dụ: bạn sử dụng [1] trong câu lệnh để tham chiếu đến hình ảnh có mã nhận dạng tham chiếu là 1. Nếu cung cấp nội dung mô tả về chủ đề, bạn cũng có thể thêm nội dung đó vào câu lệnh để con người dễ đọc câu lệnh hơn.

Bảng sau đây cung cấp các mẫu câu lệnh có thể là điểm khởi đầu để viết câu lệnh tuỳ chỉnh dựa trên phong cách.

Trường hợp sử dụng Hình ảnh tham khảo Mẫu câu lệnh Ví dụ
Kiểu đối tượng Hình ảnh chủ thể (1-4) Tạo hình ảnh trong STYLE_DESCRIPTION [1] dựa trên chú thích sau: IMAGE_DESCRIPTION. Tạo hình ảnh trong neon sign style [1] dựa trên chú thích sau: a sign saying have a great day.
Tạo phong cách cho hình ảnh người mà không cần nhập lưới khuôn mặt Hình ảnh chủ thể (1-4) Tạo một hình ảnh về SUBJECT_DESCRIPTION [1] sao cho phù hợp với nội dung mô tả: ảnh chân dung của SUBJECT_DESCRIPTION [1] ${PROMPT} Tạo một hình ảnh về a woman with short hair[1] sao cho phù hợp với nội dung mô tả: ảnh chân dung của a woman with short hair[1] theo phong cách hoạt hình 3D với nền bị mờ. Một nhân vật dễ thương và đáng yêu, với khuôn mặt tươi cười, nhìn vào camera, tông màu nhạt ...
Tạo kiểu cho hình ảnh người bằng dữ liệu đầu vào là lưới khuôn mặt Hình ảnh đối tượng (1-3)

Hình ảnh mô tả về sự kiểm soát Facemesh (1)
Tạo hình ảnh về SUBJECT_DESCRIPTION [1] trong tư thế của CONTROL_IMAGE [2] sao cho phù hợp với nội dung mô tả: ảnh chân dung của SUBJECT_DESCRIPTION [1] ${PROMPT} Tạo một hình ảnh về a woman with short hair [1] trong tư thế của control image [2] sao cho phù hợp với nội dung mô tả: ảnh chân dung của a woman with short hair [1] theo phong cách hoạt hình 3D với nền bị mờ. Một nhân vật dễ thương và đáng yêu, với khuôn mặt tươi cười, nhìn vào camera, tông màu nhạt ...



Các phương pháp hay nhất và hạn chế

Trường hợp sử dụng

Khả năng tuỳ chỉnh cung cấp tính năng tạo câu lệnh theo phong cách tự do, có thể tạo ấn tượng rằng mô hình có thể làm được nhiều việc hơn những gì được huấn luyện. Các phần sau đây mô tả các trường hợp sử dụng dự kiến cho hoạt động tuỳ chỉnh và các ví dụ không đầy đủ về các trường hợp sử dụng ngoài ý muốn.

Bạn nên sử dụng tính năng này cho các trường hợp sử dụng dự kiến, vì chúng tôi đã huấn luyện mô hình dựa trên những trường hợp sử dụng đó và dự kiến sẽ có kết quả tốt. Ngược lại, nếu yêu cầu mô hình làm những việc ngoài các trường hợp sử dụng dự kiến, thì bạn nên dự đoán kết quả kém.

Các trường hợp sử dụng dự kiến

Sau đây là các trường hợp sử dụng dự kiến để tuỳ chỉnh dựa trên một kiểu:

  • Tạo hình ảnh từ văn bản đầu vào theo phong cách cụ thể do một hình ảnh tham khảo cung cấp.

  • Chỉnh sửa ảnh của một người.

  • Chỉnh sửa ảnh của một người và giữ nguyên biểu cảm khuôn mặt của người đó.

Ví dụ về các trường hợp sử dụng ngoài ý muốn

Sau đây là danh sách (chưa đầy đủ) các trường hợp sử dụng ngoài ý muốn để tuỳ chỉnh dựa trên một kiểu. Mô hình này không được huấn luyện cho những trường hợp sử dụng này và có thể sẽ tạo ra kết quả kém.

  • Tạo hình ảnh từ văn bản và sử dụng hình ảnh tham khảo, với mục đích kiểm soát một phần bố cục được tạo từ hình ảnh tham khảo.

  • Tạo hình ảnh một người dựa trên hình ảnh tham khảo có một người với biểu cảm khuôn mặt cụ thể.

  • Đặt hai người vào một cảnh khác, giữ nguyên danh tính của họ và chỉ định kiểu của hình ảnh đầu ra (chẳng hạn như tranh sơn dầu) bằng cách sử dụng một hình ảnh tham khảo.

  • Tạo phong cách cho ảnh chụp thú cưng và biến ảnh đó thành bản vẽ, đồng thời giữ nguyên hoặc chỉ định bố cục của hình ảnh.

  • Đặt một sản phẩm, chẳng hạn như bánh quy hoặc ghế sofa, vào nhiều cảnh với các góc độ sản phẩm khác nhau và tuân theo một phong cách hình ảnh cụ thể (chẳng hạn như chân thực với màu sắc, kiểu chiếu sáng hoặc ảnh động cụ thể).