Bilder mit Imagen anhand eines Steuerelements anpassen


Auf dieser Seite wird beschrieben, wie Sie die Anpassungsfunktion von Imagen verwenden, um Bilder basierend auf einem angegebenen Steuerelement mit den Firebase AI Logic-SDKs zu bearbeiten oder zu generieren.

Funktionsweise: Sie geben einen Text-Prompt und mindestens ein Kontrollreferenzbild an, z. B. eine Zeichnung oder ein Canny-Edge-Bild. Das Modell verwendet diese Eingaben, um ein neues Bild basierend auf den Kontrollbildern zu generieren.

Sie können dem Modell beispielsweise eine Zeichnung eines Raumschiffs und des Mondes zusammen mit einem Text-Prompt zur Verfügung stellen, um ein Aquarellgemälde auf Grundlage der Zeichnung zu erstellen.

Zum Code springen

Arten von Kontrollreferenzbildern

Das Referenzbild für die kontrollierte Anpassung kann ein Scribble, ein Canny Edge-Bild oder ein Gesichts-Mesh sein.



Hinweis

Nur verfügbar, wenn Sie Vertex AI Gemini API als API-Anbieter verwenden.

Falls noch nicht geschehen, folgen Sie dem Startleitfaden. Darin wird beschrieben, wie Sie Ihr Firebase-Projekt einrichten, Ihre App mit Firebase verbinden, das SDK hinzufügen, den Backend-Dienst für den von Ihnen ausgewählten API-Anbieter initialisieren und eine ImagenModel-Instanz erstellen.

Modelle, die diese Funktion unterstützen

Imagen bietet Bildbearbeitung über das capability-Modell:

  • imagen-3.0-capability-001

Bei Imagen-Modellen wird der Speicherort global nicht unterstützt.

Anfrage für kontrollierte Anpassung senden

Im folgenden Beispiel wird eine Anfrage zur kontrollierten Anpassung gezeigt, in der das Modell aufgefordert wird, ein neues Bild basierend auf dem bereitgestellten Referenzbild zu generieren (in diesem Beispiel eine Zeichnung des Weltraums, z. B. eine Rakete und der Mond). Da das Referenzbild eine grobe, handgezeichnete Skizze oder ein grober Umriss ist, wird der Steuerungstyp CONTROL_TYPE_SCRIBBLE verwendet.

Wenn Ihr Referenzbild ein Canny Edge-Bild oder ein Gesichts-Mesh ist, können Sie dieses Beispiel auch mit den folgenden Änderungen verwenden:

  • Wenn Ihr Referenzbild ein Canny Edge-Bild ist, verwenden Sie den Steuerungstyp CONTROL_TYPE_CANNY.

  • Wenn Ihr Referenzbild ein Gesichts-Mesh ist, verwenden Sie den Steuerungstyp CONTROL_TYPE_FACE_MESH. Dieses Steuerelement kann nur mit der Motivanpassung von Personen verwendet werden.

Weiter unten auf dieser Seite finden Sie Prompt-Vorlagen, mit denen Sie lernen können, wie Sie Prompts schreiben und Referenzbilder darin verwenden.

Swift

Die Bildbearbeitung mit Imagen-Modellen wird für Swift nicht unterstützt. Schauen Sie später in diesem Jahr noch einmal vorbei.

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 subject reference using the reference image.
    val controlReference = ImagenControlReference(
        image = referenceImage,
        referenceID = 1,
        controlType = CONTROL_TYPE_SCRIBBLE
    )

    // Provide a prompt that describes the final image.
    // The "[1]" links the prompt to the subject reference with ID 1.
    val prompt = "A cat flying through outer space arranged like the space scribble[1]"

    // Use the editImage API to perform the controlled customization.
    // Pass the list of references, the prompt, and an editing configuration.
    val editedImage = model.editImage(
        references = listOf(controlReference),
        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 subject reference using the reference image.
ImagenControlReference controlReference = new ImagenControlReference.Builder()
        .setImage(referenceImage)
        .setReferenceID(1)
        .setControlType(CONTROL_TYPE_SCRIBBLE)
        .build();

// Provide a prompt that describes the final image.
// The "[1]" links the prompt to the subject reference with ID 1.
String prompt = "A cat flying through outer space arranged like the space scribble[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 controlled customization.
// Pass the list of references, the prompt, and an editing configuration.
Futures.addCallback(model.editImage(Collections.singletonList(controlReference), 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

Die Bildbearbeitung mit Imagen-Modellen wird für Web-Apps nicht unterstützt. Schauen Sie später in diesem Jahr noch einmal vorbei.

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 control reference using the reference image.
final controlReference = ImagenControlReference(
  image: referenceImage,
  referenceId: 1,
    controlType: ImagenControlType.scribble,
);

// Provide a prompt that describes the final image.
// The "[1]" links the prompt to the subject reference with ID 1.
final prompt = "A cat flying through outer space arranged like the space scribble[1]";

try {
  // Use the editImage API to perform the controlled customization.
  // Pass the list of references, the prompt, and an editing configuration.
  final response = await model.editImage(
    [controlReference],
    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');
}

Einheit

Die Bildbearbeitung mit Imagen-Modellen wird für Unity nicht unterstützt. Schauen Sie später in diesem Jahr noch einmal vorbei.

Prompt-Vorlagen

In der Anfrage stellen Sie Referenzbilder (bis zu vier Bilder) bereit, indem Sie ein ImagenControlReference definieren, in dem Sie eine Referenz-ID für ein Bild angeben. Mehrere Bilder können dieselbe Referenz-ID haben, z. B. mehrere Scribbles derselben Idee.

Beim Schreiben des Prompts verweisen Sie dann auf diese IDs. Sie verwenden beispielsweise [1] im Prompt, um auf Bilder mit der Referenz-ID 1 zu verweisen.

In der folgenden Tabelle finden Sie Prompt-Vorlagen, die als Ausgangspunkt für das Schreiben von Prompts zur Anpassung auf Grundlage einer Kontrollvariablen dienen können.

Anwendungsfall Referenzbilder Prompt-Vorlage Beispiel
Kontrollierte Anpassung Skizzenkarte (1) Generiere ein Bild, das der scribble map [1] entspricht, um der Beschreibung zu entsprechen: ${STYLE_PROMPT} ${PROMPT}. Generiere ein Bild, das dem scribble map [1] entspricht, um der Beschreibung zu entsprechen: Das Bild sollte im Stil eines impressionistischen Ölgemäldes mit entspannten Pinselstrichen sein. Es hat eine natürliche Beleuchtung und sichtbare Pinselstriche. Ein Auto in der Seitenansicht. Das Auto ist auf einer nassen, reflektierenden Fahrbahn geparkt, wobei sich die Lichter der Stadt in den Pfützen spiegeln.
Kontrollierte Anpassung Canny-Kontrollbild (1) Generiere ein Bild, das dem edge map [1] entspricht, um der Beschreibung zu entsprechen: ${STYLE_PROMPT} ${PROMPT} Erstelle ein Bild, das dem edge map [1] entspricht, und zwar gemäß der folgenden Beschreibung: Das Bild sollte im Stil eines impressionistischen Ölgemäldes mit entspannten Pinselstrichen gehalten sein. Es hat eine natürlich beleuchtete Atmosphäre und sichtbare Pinselstriche. Ein Auto in der Seitenansicht. Das Auto ist auf einer nassen, reflektierenden Straße geparkt, wobei sich die Lichter der Stadt in den Pfützen spiegeln.
Stilisierung von Personenbildern mit FaceMesh-Eingabe Motivbild (1–3)

FaceMesh-Kontrollbild (1)
Erstelle ein Bild von SUBJECT_DESCRIPTION [1] in der Pose von CONTROL_IMAGE [2], das der Beschreibung entspricht: ein Porträt von SUBJECT_DESCRIPTION [1] ${PROMPT} Erstelle ein Bild von a woman with short hair [1] in der Pose von control image [2], das der Beschreibung entspricht: ein Porträt von a woman with short hair [1] im 3D-Cartoonstil mit einem weichgezeichneten Hintergrund. Eine niedliche und liebenswerte Figur mit einem lächelnden Gesicht, die in die Kamera schaut, Pastellfarben …
Stilisierung von Personenbildern mit FaceMesh-Eingabe Motivbild (1–3)

FaceMesh-Kontrollbild (1)
Erstelle ein Bild im Stil ${STYLE_PROMPT} von SUBJECT_DESCRIPTION [1] in der Pose von CONTROL_IMAGE [2], das der Beschreibung entspricht: ein Porträt von SUBJECT_DESCRIPTION [1] ${PROMPT} Erstelle ein Bild im 3D‑Cartoonstil von a woman with short hair [1] in der Pose des control image [2], das der Beschreibung entspricht: ein Porträt von a woman with short hair [1] im 3D‑Cartoonstil mit einem verschwommenen Hintergrund. Eine niedliche und liebenswerte Figur mit einem lächelnden Gesicht, die in die Kamera schaut, Pastellfarben …



Best Practices und Einschränkungen

Anwendungsfälle

Die Anpassungsfunktion bietet die Möglichkeit, Prompts kostenlos zu formulieren. Dadurch kann der Eindruck entstehen, dass das Modell mehr kann, als es gelernt hat. In den folgenden Abschnitten werden vorgesehene Anwendungsfälle für die Anpassung sowie Beispiele für nicht vorgesehene Anwendungsfälle beschrieben.

Wir empfehlen, diese Funktion für die vorgesehenen Anwendungsfälle zu verwenden, da wir das Modell für diese Anwendungsfälle trainiert haben und gute Ergebnisse erwarten. Wenn Sie das Modell hingegen für Dinge verwenden, die nicht dem vorgesehenen Anwendungsfall entsprechen, sollten Sie mit schlechten Ergebnissen rechnen.

Vorgesehene Anwendungsfälle

Im Folgenden sind vorgesehene Anwendungsfälle für die Anpassung auf Grundlage eines Steuerelements aufgeführt:

  • Generiere ein Bild, das dem Prompt und den Canny Edge-Kontrollbildern entspricht.

  • Generiere ein Bild, das dem Prompt und den Kritzelbildern entspricht.

  • Ein Foto einer Person stilisieren, ohne den Gesichtsausdruck zu verändern.

Beispiele für unbeabsichtigte Anwendungsfälle

Im Folgenden finden Sie eine unvollständige Liste von nicht beabsichtigten Anwendungsfällen für die Anpassung basierend auf einer Kontrollvariablen. Das Modell ist nicht für diese Anwendungsfälle trainiert und wird wahrscheinlich schlechte Ergebnisse liefern.

  • Erstellt ein Bild mit einem im Prompt angegebenen Stil.

  • Ein Bild aus Text generieren, das einem bestimmten Stil folgt, der durch ein Referenzbild vorgegeben wird. Dabei kann die Bildkomposition mithilfe eines Kontrollbilds bis zu einem gewissen Grad gesteuert werden.

  • Ein Bild aus Text generieren, das einem bestimmten Stil folgt, der durch ein Referenzbild vorgegeben wird. Die Bildkomposition kann mithilfe einer Kontrollskizze gesteuert werden.

  • Ein Bild aus Text generieren, das einem bestimmten Stil folgt, der durch das Referenzbild vorgegeben wird. Die Bildkomposition kann mithilfe eines Kontrollbilds bis zu einem gewissen Grad gesteuert werden. Die Person auf dem Bild hat einen bestimmten Gesichtsausdruck.

  • Ein Foto von zwei oder mehr Personen stilisieren und dabei die Gesichtsausdrücke beibehalten

  • Ein Foto eines Haustiers stilisieren und in eine Zeichnung umwandeln Die Komposition des Bildes beibehalten oder angeben (z. B. Aquarell).