Personnaliser des images en fonction d'un sujet spécifié avec Imagen


Cette page explique comment utiliser la fonctionnalité de personnalisation de Imagen pour modifier ou générer des images en fonction d'un sujet spécifié à l'aide des SDK Firebase AI Logic.

Fonctionnement : vous fournissez un prompt textuel et au moins une image de référence montrant un sujet spécifique (comme un produit, une personne ou un animal de compagnie). Le modèle utilise ces entrées pour générer une nouvelle image basée sur le sujet spécifié dans les images de référence.

Par exemple, vous pouvez demander au modèle d'appliquer un style dessin animé à la photo d'un enfant ou de changer la couleur d'un vélo sur une image.

 Accéder au code



Avant de commencer

Disponible uniquement lorsque vous utilisez Vertex AI Gemini API comme fournisseur d'API.

Si ce n'est pas déjà fait, suivez le guide de démarrage, qui décrit comment configurer votre projet Firebase, associer votre application à Firebase, ajouter le SDK, initialiser le service de backend pour le fournisseur d'API de votre choix et créer une instance ImagenModel.

Modèles compatibles avec cette fonctionnalité

Imagen propose des fonctionnalités de retouche photo grâce à son modèle capability :

  • imagen-3.0-capability-001

Notez que pour les modèles Imagen, l'emplacement global n'est pas accepté.

Envoyer une demande de personnalisation de sujet

L'exemple suivant montre une requête de personnalisation de sujet qui demande au modèle de générer une nouvelle image basée sur l'image de référence fournie (dans cet exemple, un chat). Comme un chat est un animal, il utilise le type de sujet ImagenSubjectReferenceType.ANIMAL.

Si votre sujet est une personne ou un produit, vous pouvez également utiliser cet exemple, mais en apportant les modifications suivantes :

  • Si votre sujet est une personne, utilisez le type de sujet ImagenSubjectReferenceType.PERSON. Vous pouvez envoyer ce type de requête avec ou sans image de contrôle du maillage du visage pour guider davantage la génération d'images.

  • Si votre sujet est un produit, utilisez le type de sujet ImagenSubjectReferenceType.PRODUCT.

Consultez les modèles de requêtes plus loin sur cette page pour découvrir comment rédiger des requêtes et utiliser des images de référence dans celles-ci.

Swift

La retouche d'images avec les modèles Imagen n'est pas compatible avec Swift. Revenez plus tard cette année !

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 subjectReference = ImagenSubjectReference(
        image = referenceImage,
        referenceID = 1,
        description = "cat",
        subjectType = ImagenSubjectReferenceType.ANIMAL
    )

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

    // Use the editImage API to perform the subject customization.
    // Pass the list of references, the prompt, and an editing configuration.
    val editedImage = model.editImage(
        references = listOf(subjectReference),
        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.
ImagenSubjectReference subjectReference = new ImagenSubjectReference.Builder()
        .setImage(referenceImage)
        .setReferenceID(1)
        .setDescription("cat")
        .setSubjectType(ImagenSubjectReferenceType.ANIMAL)
        .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[1] flying through outer space";

// 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 subject customization.
// Pass the list of references, the prompt, and an editing configuration.
Futures.addCallback(model.editImage(Collections.singletonList(subjectReference), 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 retouche d'images avec les modèles Imagen n'est pas disponible pour les applications Web. Revenez plus tard cette année !

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 subject reference using the reference image.
final subjectReference = ImagenSubjectReference(
  image: referenceImage,
  referenceId: 1,
  description: 'cat',
  subjectType: ImagenSubjectReferenceType.animal,
);

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

try {
  // Use the editImage API to perform the subject customization.
  // Pass the list of references, the prompt, and an editing configuration.
  final response = await model.editImage(
    [subjectReference],
    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 retouche d'images avec les modèles Imagen n'est pas compatible avec Unity. Revenez plus tard cette année !

Modèles de requêtes

Dans la requête, vous fournissez des images de référence (jusqu'à quatre) en définissant un ImagenSubjectReference dans lequel vous spécifiez un ID de référence pour une image (et éventuellement une description du sujet). Notez que plusieurs images peuvent avoir le même ID de référence (par exemple, plusieurs photos du même chat).

Ensuite, lorsque vous rédigez le prompt, vous faites référence à ces ID. Par exemple, vous utilisez [1] dans la requête pour faire référence aux images avec l'ID de référence 1. Si vous fournissez une description du sujet, vous pouvez également l'inclure dans la requête pour la rendre plus facile à lire.

Le tableau suivant décrit les modèles de requête qui peuvent servir de point de départ pour écrire des requêtes de personnalisation basées sur un sujet (comme un produit, une personne ou un animal de compagnie).

Cas d'utilisation Images de référence Modèle de requête Exemple
Stylisation d'images de produits – Annonce Image du sujet (jusqu'à quatre) Crée une image de SUBJECT_DESCRIPTION [1] correspondant à la description : ${PROMPT}

Crée une image de Luxe Elixir hair oil, golden liquid in glass bottle [1] correspondant à la description : Image en gros plan d'une main de femme tenant un Luxe Elixir hair oil, golden liquid in glass bottle [1] sur un fond blanc immaculé. La main de la femme est bien éclairée et le flacon est net, avec une faible profondeur de champ qui floute l'arrière-plan et met en valeur le produit. L'éclairage est doux et diffus, ce qui crée une lueur subtile autour du flacon et de la main. La composition globale est simple et élégante, ce qui met en avant le caractère luxueux du produit.

Stylisation d'image de produit : modification d'attribut Image du sujet (jusqu'à quatre) Génère une image d'un SUBJECT_DESCRIPTION, mais ${PROMPT}

Génère une image d'un Seiko watch [1], mais en bleu.

Stylisation de l'image d'une personne sans ajout du maillage du visage en entrée Image du sujet (jusqu'à quatre) Crée une image de SUBJECT_DESCRIPTION [1] correspondant à la description : un portrait de SUBJECT_DESCRIPTION [1] ${PROMPT} Crée une image de a woman with short hair[1] correspondant à la description : un portrait de a woman with short hair[1] dans un style de dessin animé 3D sur un fond flou. Un personnage mignon et adorable, avec un visage souriant, regardant la caméra, des tons pastel…
Stylisation de l'image d'une personne sans ajout du maillage du visage en entrée Image du sujet (jusqu'à quatre) Crée une image STYLE_DESCRIPTION [2] de SUBJECT_DESCRIPTION [1] correspondant à la description : un portrait de SUBJECT_DESCRIPTION [1] STYLE_PROMPT Crée une image 3d-cartoon style [2] de a woman with short hair [1] correspondant à la description : un portrait de a woman with short hair [1] dans un style de dessin animé 3D sur un fond flou. Un personnage mignon et adorable, avec un visage souriant, regardant la caméra, des tons pastel…
Stylisation de l'image d'une personne avec ajout du maillage du visage en entrée Image du sujet (jusqu'à 3)

Image de contrôle du maillage du visage (1)
Génère une image de la SUBJECT_DESCRIPTION [1] avec le Face mesh from the control image [2]. ${PROMPT} Génère une image de la the person [1] avec le face mesh from the control image [2]. La personne doit regarder droit devant elle avec une expression neutre. L'arrière-plan doit être…
Stylisation de l'image d'une personne avec ajout du maillage du visage en entrée Image du sujet (jusqu'à 3)

Image de contrôle du maillage du visage (1)
Crée une image de SUBJECT_DESCRIPTION [1] dans la pose de CONTROL_IMAGE [2] correspondant à la description : un portrait de SUBJECT_DESCRIPTION [1] ${PROMPT} Crée une image de a woman with short hair [1] dans la pose de control image [2] correspondant à la description : un portrait de a woman with short hair [1] dans un style de dessin animé 3D sur un fond flou. Un personnage mignon et adorable, avec un visage souriant, regardant la caméra, des tons pastel…
Stylisation de l'image d'une personne avec ajout du maillage du visage en entrée Image du sujet (jusqu'à 3)

Image de contrôle du maillage du visage (1)
Crée une image STYLE_DESCRIPTION [3] de SUBJECT_DESCRIPTION [1] dans la pose de CONTROL_IMAGE [2] correspondant à la description : un portrait de SUBJECT_DESCRIPTION [1] ${PROMPT} Crée une image 3d-cartoon style [3] de a woman with short hair [1] dans la pose de control image [2] correspondant à la description : un portrait de a woman with short hair [1] dans un style de dessin animé 3D sur un fond flou. Un personnage mignon et adorable, avec un visage souriant, regardant la caméra, des tons pastel…



Bonnes pratiques et limites

Si vous utilisez une personne comme sujet, nous vous recommandons de respecter les propriétés suivantes pour le visage de votre image de référence :

  • Le visage est centré et occupe au moins la moitié de l'image.
  • L'image est pivotée en vue de face dans toutes les directions (tangage, lacet et roulis).
  • Le visage n'est pas occulté par des objets tels que des lunettes de soleil ou un masque.

Cas d'utilisation

La fonctionnalité de personnalisation propose un système de rédaction de requêtes libre, ce qui peut donner l'impression que le modèle peut faire plus que ce pour quoi il a été entraîné. Les sections suivantes décrivent les cas d'utilisation prévus pour la personnalisation et des exemples non exhaustifs de cas d'utilisation non prévus.

Nous vous recommandons d'utiliser cette fonctionnalité pour les cas d'utilisation prévus, car nous avons entraîné le modèle pour ces cas précis et nous nous attendons à de bons résultats. À l'inverse, si vous poussez le modèle à effectuer des tâches en dehors des cas d'utilisation prévus, vous devez vous attendre à de mauvais résultats.

Cas d'utilisation prévus

Voici les cas d'utilisation prévus pour la personnalisation basée sur un sujet :

  • Styliser une photo d'une personne

  • Styliser une photo d'une personne tout en préservant ses expressions faciales

  • (Faible taux de réussite) Placez un produit, comme un canapé ou un cookie, dans plusieurs scènes avec différents angles de vue.

  • Générez des variantes d'un produit sans conserver les détails exacts.

  • Styliser une photo d'une personne tout en conservant son expression faciale

Exemples de cas d'utilisation non prévus

Vous trouverez ci-dessous une liste non exhaustive de cas d'utilisation non prévus pour la personnalisation basée sur un sujet. Le modèle n'est pas entraîné pour ces cas d'utilisation et produira probablement des résultats médiocres.

  • Placer plusieurs personnes dans différentes scènes tout en préservant leur identité

  • Placer plusieurs personnes dans différentes scènes tout en préservant leur identité, en spécifiant le style de l'image de sortie à l'aide d'une image exemple fournie en entrée pour définir le style

  • Styliser une photo de plusieurs personnes tout en préservant leur identité

  • Placer un animal de compagnie dans différentes scènes tout en préservant son identité

  • Styliser une photo d'un animal de compagnie et la transformer en dessin

  • Styliser une photo d'un animal de compagnie et la transformer en dessin, tout en conservant ou en spécifiant le style de l'image (par exemple, une aquarelle)

  • Placer un animal de compagnie et une personne dans une scène différente, tout en conservant leur identité

  • Styliser une photo d'un animal de compagnie et d'une ou plusieurs personnes et la transformer en dessin

  • Placer deux produits dans plusieurs scènes avec des angles différents.

  • Placer un produit, comme un cookie ou un canapé, dans différentes scènes avec différentes perspectives, tout en adoptant un style d'image spécifique (photoréaliste avec des couleurs, des styles d'éclairage ou des animations spécifiques, par exemple)

  • Placer un produit dans une autre scène, tout en conservant la composition de la scène telle que spécifiée par une image de contrôle

  • Placer deux produits dans plusieurs scènes avec des angles différents, en utilisant une image spécifique en entrée (par exemple, photoréaliste avec des couleurs, des styles d'éclairage ou des animations spécifiques)

  • Placer deux produits dans plusieurs scènes, tout en conservant la composition de la scène telle que spécifiée par une image de contrôle