Dostosowywanie obrazów na podstawie określonego stylu za pomocą Imagen


Na tej stronie znajdziesz informacje o tym, jak korzystać z funkcji dostosowywaniaImagen, aby edytować lub generować obrazy na podstawie określonego stylu za pomocą pakietów SDK Firebase AI Logic.

Jak to działa: podajesz prompt tekstowy i co najmniej 1 obraz referencyjny, który przedstawia określony styl (np. wzór, teksturę lub styl projektu). Model wykorzystuje te dane wejściowe do wygenerowania nowego obrazu na podstawie określonego stylu na obrazach referencyjnych.

Możesz na przykład wygenerować nowy obraz kuchni na podstawie obrazu z popularnego katalogu detalicznego, który udostępnisz.

Przejdź do kodu



Zanim zaczniesz

Dostępne tylko wtedy, gdy jako dostawcę interfejsu API używasz Vertex AI Gemini API.

Jeśli jeszcze tego nie zrobisz, zapoznaj się z przewodnikiem dla początkujących, w którym znajdziesz informacje o tym, jak skonfigurować projekt Firebase, połączyć aplikację z Firebase, dodać pakiet SDK, zainicjować usługę backendu dla wybranego dostawcy interfejsu API i utworzyć instancję ImagenModel.

Modele obsługujące tę funkcję

Imagen oferuje edycję obrazów za pomocą modelu capability:

  • imagen-3.0-capability-001

Pamiętaj, że w przypadku modeli Imagen lokalizacja global nie jest obsługiwana.

Wysyłanie prośby o dostosowanie stylu

Poniższy przykład pokazuje żądanie dostosowania stylu, w którym model ma wygenerować nowy obraz w stylu podanego obrazu referencyjnego (w tym przykładzie jest to „Gwiaździsta noc” Van Gogha).

W dalszej części tej strony znajdziesz szablony promptów, z których dowiesz się, jak pisać prompty i jak używać w nich obrazów referencyjnych.

Swift

Edytowanie obrazów za pomocą modeli Imagen nie jest obsługiwane w przypadku języka Swift. Sprawdź ponownie w późniejszym terminie.

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

Edytowanie obrazów za pomocą modeli Imagen nie jest obsługiwane w przypadku aplikacji internetowych. Sprawdź ponownie w późniejszym terminie.

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

Edytowanie obrazów za pomocą modeli Imagen nie jest obsługiwane w przypadku Unity. Sprawdź ponownie w późniejszym terminie.

Szablony promptów

W żądaniu podajesz obrazy referencyjne (maksymalnie 4 obrazy), definiując element ImagenStyleReference, w którym określasz identyfikator obrazu referencyjnego (i opcjonalnie opis stylu). Pamiętaj, że wiele obrazów może mieć ten sam identyfikator referencyjny (np. wiele zdjęć tego samego wzoru).

Podczas pisania prompta odwołujesz się do tych identyfikatorów. Możesz na przykład użyć w prompcie symbolu [1], aby odwołać się do obrazów z identyfikatorem odwołania 1. Jeśli podasz opis tematu, możesz go też uwzględnić w prompcie, aby był łatwiejszy do odczytania.

W tabeli poniżej znajdziesz szablony promptów, które mogą stanowić punkt wyjścia do pisania promptów dostosowanych do stylu.

Przypadek użycia Obrazy referencyjne Szablon prompta Przykład
Styl obiektu Obraz tematu (1–4) Wygeneruj obraz w stylu STYLE_DESCRIPTION [1] na podstawie tego opisu: IMAGE_DESCRIPTION. Wygeneruj obraz w stylu neon sign style [1] na podstawie tego opisu: a sign saying have a great day.
Stylizacja obrazu osoby bez danych wejściowych siatki twarzy Obraz tematu (1–4) Utwórz obraz przedstawiający SUBJECT_DESCRIPTION [1], który będzie pasować do opisu: portret SUBJECT_DESCRIPTION [1] ${PROMPT} Utwórz obraz przedstawiający a woman with short hair[1], który będzie pasować do opisu: portret a woman with short hair[1] w stylu kreskówki 3D z rozmytym tłem. Urocza postać z uśmiechniętą twarzą, patrząca w obiektyw, w pastelowych kolorach…
Stylizacja obrazu osoby z siatką twarzy Obraz obiektu (1–3)

Obraz kontrolny siatki twarzy (1)
Utwórz obraz przedstawiający SUBJECT_DESCRIPTION [1] w pozycji CONTROL_IMAGE [2], który będzie pasować do opisu: portret SUBJECT_DESCRIPTION [1] ${PROMPT} Utwórz obraz przedstawiający a woman with short hair [1] w pozycji control image [2], który będzie pasować do opisu: portret a woman with short hair [1] w stylu kreskówki 3D z rozmytym tłem. Urocza postać z uśmiechniętą twarzą, patrząca w obiektyw, w pastelowych kolorach…



Sprawdzone metody i ograniczenia

Przypadki użycia

Możliwość dostosowywania obejmuje promptowanie w dowolnym stylu, co może sprawiać wrażenie, że model potrafi więcej, niż został wytrenowany. W sekcjach poniżej opisujemy przewidywane przypadki użycia dostosowywania oraz niewyczerpujące przykłady nieprzewidywanych przypadków użycia.

Zalecamy korzystanie z tej funkcji w przypadkach użycia, do których jest ona przeznaczona, ponieważ model został wytrenowany pod kątem tych przypadków i oczekujemy w nich dobrych wyników. Z kolei jeśli będziesz zmuszać model do wykonywania zadań wykraczających poza jego przeznaczenie, możesz spodziewać się słabych wyników.

Przewidywane przypadki użycia

Poniżej znajdziesz przykłady zastosowań dostosowywania na podstawie stylu:

  • Generowanie obrazu na podstawie tekstu wejściowego, który jest zgodny z określonym stylem podanym na obrazie referencyjnym.

  • zmieniać zdjęcia osób;

  • zmieniać zdjęcie osoby, zachowując jej wyraz twarzy;

Przykłady niezamierzonych przypadków użycia

Poniżej znajduje się niepełna lista niezamierzonych przypadków użycia dostosowywania na podstawie stylu. Model nie jest trenowany pod kątem tych przypadków użycia i prawdopodobnie będzie dawać słabe wyniki.

  • Generowanie obrazu na podstawie tekstu i obrazu referencyjnego z zamiarem uzyskania pewnego poziomu kontroli nad wygenerowaną kompozycją na podstawie obrazu referencyjnego.

  • Wygeneruj obraz osoby na podstawie obrazu referencyjnego, na którym znajduje się osoba z określonym wyrazem twarzy.

  • Umieść 2 osoby w innej scenie, zachowaj ich tożsamość i określ styl obrazu wyjściowego (np. obraz olejny) za pomocą obrazu referencyjnego.

  • Stylizuj zdjęcie zwierzęcia i przekształć je w rysunek, zachowując lub określając kompozycję obrazu.

  • Umieść produkt, np. ciasteczko lub kanapę, w różnych scenach, pod różnymi kątami i w określonym stylu obrazu (np. fotorealistycznym z określonymi kolorami, stylami oświetlenia lub animacją).