Personalizzare le immagini in base a un controllo utilizzando Imagen


Questa pagina descrive come utilizzare la funzionalità di personalizzazione di Imagen per modificare o generare immagini in base a un controllo specificato utilizzando gli SDK Firebase AI Logic.

Come funziona: fornisci un prompt di testo e almeno un'immagine di riferimento di controllo (ad esempio un disegno o un'immagine Canny Edge). Il modello utilizza questi input per generare una nuova immagine basata sulle immagini di controllo.

Ad esempio, puoi fornire al modello un disegno di un'astronave e della luna insieme a un prompt di testo per creare un dipinto ad acquerello basato sul disegno.

Vai al codice

Tipi di immagini di riferimento dei controlli

L'immagine di riferimento per la personalizzazione controllata può essere uno scarabocchio, un'immagine Canny Edge o una mesh del volto.



Prima di iniziare

Disponibile solo quando utilizzi Vertex AI Gemini API come provider API.

Se non l'hai ancora fatto, completa la guida introduttiva, che descrive come configurare il progetto Firebase, connettere l'app a Firebase, aggiungere l'SDK, inizializzare il servizio di backend per il provider API scelto e creare un'istanza ImagenModel.

Modelli che supportano questa funzionalità

Imagen offre la modifica delle immagini tramite il modello capability:

  • imagen-3.0-capability-001

Tieni presente che per i modelli Imagen, la posizione global non è supportata.

Inviare una richiesta di personalizzazione controllata

Il seguente esempio mostra una richiesta di personalizzazione controllata che chiede al modello di generare una nuova immagine basata sull'immagine di riferimento fornita (in questo esempio, un disegno dello spazio, come un razzo e la luna). Poiché l'immagine di riferimento è uno schizzo o un contorno approssimativo disegnato a mano, utilizza il tipo di controllo CONTROL_TYPE_SCRIBBLE.

Se l'immagine di riferimento è un'immagine Canny Edge o una mesh del volto, puoi anche utilizzare questo esempio, ma con le seguenti modifiche:

Consulta i modelli di prompt più avanti in questa pagina per scoprire come scrivere prompt e come utilizzare le immagini di riferimento al loro interno.

Swift

La modifica delle immagini con i modelli Imagen non è supportata per Swift. Ricontrolla più tardi quest'anno.

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

La modifica delle immagini con i modelli Imagen non è supportata per le app web. Ricontrolla più tardi quest'anno.

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');
}

Unity

La modifica delle immagini con i modelli Imagen non è supportata per Unity. Ricontrolla più tardi quest'anno.

Modelli di prompt

Nella richiesta, fornisci immagini di riferimento (fino a 4 immagini) definendo un ImagenControlReference in cui specifichi un ID di riferimento per un'immagine. Tieni presente che più immagini possono avere lo stesso ID riferimento (ad esempio, più scarabocchi della stessa idea).

Poi, quando scrivi il prompt, fai riferimento a questi ID. Ad esempio, utilizzi [1] nel prompt per fare riferimento alle immagini con l'ID riferimento 1.

La tabella seguente fornisce modelli di prompt che possono essere un punto di partenza per scrivere prompt per la personalizzazione in base a un controllo.

Caso d'uso Immagini di riferimento Modello di prompt Esempio
Personalizzazione controllata Mappa con scarabocchi (1) Genera un'immagine in linea con scribble map [1] in modo che corrisponda alla descrizione: ${STYLE_PROMPT} ${PROMPT}. Genera un'immagine in linea con scribble map [1] per corrispondere alla descrizione: l'immagine deve essere nello stile di un dipinto a olio impressionista con pennellate rilassate. Presenta un'atmosfera illuminata naturalmente e pennellate evidenti. Una vista laterale di un'auto. L'auto è parcheggiata su una strada bagnata e riflettente, con le luci della città che si riflettono nelle pozzanghere.
Personalizzazione controllata Immagine di controllo Canny (1) Genera un'immagine in linea con edge map [1] in modo che corrisponda alla descrizione: ${STYLE_PROMPT} ${PROMPT} Genera un'immagine in linea con il edge map [1] in modo che corrisponda alla descrizione: l'immagine deve essere in stile pittura a olio impressionista, con pennellate rilassate. Presenta un'atmosfera illuminata naturalmente e pennellate evidenti. Una vista laterale di un'auto. L'auto è parcheggiata su una strada bagnata e riflettente, con le luci della città che si riflettono nelle pozzanghere.
Stilizzazione dell'immagine di una persona con input FaceMesh Immagine del soggetto (1-3)

Immagine di controllo FaceMesh (1)
Crea un'immagine di SUBJECT_DESCRIPTION [1] nella posa di CONTROL_IMAGE [2] in modo che corrisponda alla descrizione: un ritratto di SUBJECT_DESCRIPTION [1] ${PROMPT} Crea un'immagine di a woman with short hair [1] nella posa di control image [2] in linea con la descrizione: un ritratto di a woman with short hair [1] in stile cartone animato 3D con uno sfondo sfocato. Un personaggio carino e adorabile, con un volto sorridente, che guarda la fotocamera, tonalità di colore pastello…
Stilizzazione dell'immagine di una persona con input FaceMesh Immagine del soggetto (1-3)

Immagine di controllo FaceMesh (1)
Crea un'immagine ${STYLE_PROMPT} di SUBJECT_DESCRIPTION [1] nella posa di CONTROL_IMAGE [2] in modo che corrisponda alla descrizione: un ritratto di SUBJECT_DESCRIPTION [1] ${PROMPT} Crea un'immagine in stile cartone animato 3D di a woman with short hair [1] nella posa di control image [2] in modo che corrisponda alla descrizione: un ritratto di a woman with short hair [1] in stile cartone animato 3D con uno sfondo sfocato. Un personaggio carino e adorabile, con un volto sorridente, che guarda la fotocamera, tonalità pastello…



Best practice e limitazioni

Casi d'uso

La funzionalità di personalizzazione offre prompt in stile libero, che possono dare l'impressione che il modello possa fare più di quanto sia stato addestrato a fare. Le sezioni seguenti descrivono i casi d'uso previsti per la personalizzazione e alcuni esempi di casi d'uso non previsti.

Ti consigliamo di utilizzare questa funzionalità per i casi d'uso previsti, poiché abbiamo addestrato il modello su questi casi d'uso e ci aspettiamo buoni risultati. Al contrario, se spingi il modello a fare cose al di fuori dei casi d'uso previsti, i risultati saranno scadenti.

Casi d'uso previsti

Di seguito sono riportati i casi d'uso previsti per la personalizzazione in base a un controllo:

  • Genera un'immagine che segue il prompt e le immagini di controllo dei bordi.

  • Genera un'immagine che segua il prompt e le immagini di scarabocchi.

  • Applica uno stile a una foto di una persona preservando l'espressione facciale.

Esempi di casi d'uso non previsti

Di seguito è riportato un elenco non esaustivo di casi d'uso non intenzionali per la personalizzazione in base a un controllo. Il modello non è addestrato per questi casi d'uso e probabilmente produrrà risultati scadenti.

  • Genera un'immagine utilizzando uno stile specificato nel prompt.

  • Genera un'immagine dal testo che segue uno stile specifico fornito da un'immagine di riferimento, con un certo livello di controllo sulla composizione dell'immagine utilizzando l'immagine di controllo.

  • Genera un'immagine da un testo che segue uno stile specifico fornito da un'immagine di riferimento, con un certo livello di controllo sulla composizione dell'immagine utilizzando uno schizzo di controllo.

  • Genera un'immagine da un testo che segue uno stile specifico fornito dall'immagine di riferimento, con un certo livello di controllo sulla composizione dell'immagine utilizzando un'immagine di controllo. La persona nell'immagine ha un'espressione facciale specifica.

  • Stilizza una foto di due o più persone e conserva le loro espressioni facciali.

  • Stilizza una foto di un animale domestico e trasformala in un disegno. Preserva o specifica la composizione dell'immagine (ad esempio, acquerello).