Questa pagina descrive come utilizzare la funzionalità di personalizzazione di Imagen per modificare o generare immagini in base a uno stile specifico utilizzando gli SDK Firebase AI Logic.
Come funziona: fornisci un prompt di testo e almeno un'immagine di riferimento che mostri uno stile specifico (come un motivo, una trama o uno stile di design). Il modello utilizza questi input per generare una nuova immagine in base allo stile specificato nelle immagini di riferimento.
Ad esempio, puoi generare una nuova immagine di una cucina basata su un'immagine di un catalogo di vendita al dettaglio popolare che fornisci.
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 dello stile
Il seguente esempio mostra una richiesta di personalizzazione dello stile che chiede al modello di generare una nuova immagine con lo stile dell'immagine di riferimento fornita (in questo esempio, "Notte stellata" di Van Gogh).
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 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
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 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
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
ImagenStyleReference
in cui specifichi un ID di riferimento per un'immagine
(e, facoltativamente, anche una descrizione dello stile). Tieni presente che più immagini possono
avere lo stesso ID riferimento (ad esempio, più foto dello stesso motivo).
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
. Se fornisci
una descrizione dell'argomento, puoi includerla anche nel prompt in modo che
sia più facile da leggere per una persona.
La tabella seguente fornisce modelli di prompt che possono essere un punto di partenza per scrivere prompt per la personalizzazione in base allo stile.
Caso d'uso | Immagini di riferimento | Modello di prompt | Esempio |
---|---|---|---|
Stile oggetto | Immagine del soggetto (1-4) | Genera un'immagine in STYLE_DESCRIPTION [1] in base alla seguente didascalia: IMAGE_DESCRIPTION. | Genera un'immagine in neon sign style [1] in base alla seguente didascalia: a sign saying have a great day. |
Stilizzazione dell'immagine di una persona senza input della mesh del volto | Immagine del soggetto (1-4) | Crea un'immagine di SUBJECT_DESCRIPTION [1] che corrisponda alla descrizione: un ritratto di SUBJECT_DESCRIPTION [1] ${PROMPT} | Crea un'immagine di a woman with short hair[1] che corrisponda alla descrizione: un ritratto di a woman with short hair[1] in stile cartone animato 3D con 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 della mesh del volto |
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 sfondo sfocato. Un personaggio carino e adorabile, con un volto sorridente, che guarda la fotocamera, tonalità di colore 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 uno stile:
Genera un'immagine da un input di testo che segue lo stile specifico fornito da un'immagine di riferimento.
Alterare una foto di una persona.
Modificare una foto di una persona e preservarne 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 uno stile. Il modello non è addestrato per questi casi d'uso e probabilmente produrrà risultati scadenti.
Genera un'immagine dal testo e utilizzando un'immagine di riferimento, con l'intento di avere un certo livello di controllo della composizione generata dall'immagine di riferimento.
Genera un'immagine di una persona a partire da un'immagine di riferimento che ritrae una persona con una determinata espressione facciale.
Posiziona due persone in una scena diversa, preserva le loro identità e specifica lo stile dell'immagine di output (ad esempio un dipinto a olio) utilizzando un'immagine di riferimento.
Stilizza la foto di un animale domestico e trasformala in un disegno, preservando o specificando la composizione dell'immagine.
Inserisci un prodotto, ad esempio un biscotto o un divano, in diverse scene con diverse angolazioni del prodotto e seguendo uno stile di immagine specifico (ad esempio fotorealistico con colori, stili di illuminazione o animazioni specifici).