Personnaliser des images en fonction d'un contrôle à l'aide d'Imagen


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

Fonctionnement : vous fournissez une requête textuelle et au moins une image de référence de contrôle (comme un dessin ou une image de contours Canny). Le modèle utilise ces entrées pour générer une nouvelle image basée sur les images de contrôle.

Par exemple, vous pouvez fournir au modèle un dessin d'une fusée et de la lune, ainsi qu'une requête textuelle pour créer une aquarelle basée sur le dessin.

 Accéder au code

Types d'images de référence pour les contrôles

L'image de référence pour la personnalisation contrôlée peut être un croquis, une image de contours Canny ou un maillage facial.



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 contrôlée

L'exemple suivant montre une requête de personnalisation contrôlée qui demande au modèle de générer une image à partir de l'image de référence fournie (dans cet exemple, un dessin de l'espace, comme une fusée et la lune). Étant donné que l'image de référence est une esquisse ou un contour approximatif dessiné à la main, elle utilise le type de contrôle CONTROL_TYPE_SCRIBBLE.

Si votre image de référence est une image de contours ou un maillage facial, vous pouvez également utiliser cet exemple, mais en apportant les modifications suivantes :

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 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 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 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 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 ImagenControlReference dans lequel vous spécifiez un ID de référence pour une image. Notez que plusieurs images peuvent avoir le même ID de référence (par exemple, plusieurs gribouillis de la même idée).

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.

Le tableau suivant fournit des modèles de requêtes qui peuvent servir de point de départ pour écrire des requêtes de personnalisation basées sur un contrôle.

Cas d'utilisation Images de référence Modèle de requête Exemple
Personnalisation contrôlée Croquis de carte (1) Génère une image alignée sur scribble map [1] pour qu'elle corresponde à la description : ${STYLE_PROMPT} ${PROMPT}. Génère une image alignée sur scribble map [1] pour qu'elle corresponde à la description : L'image doit être dans le style d'une peinture à l'huile impressionniste avec des coups de pinceau détendus. Il possède une ambiance naturellement lumineuse et des coups de pinceau visibles. Vue de profil d'une voiture. La voiture est garée sur une route mouillée et réfléchissante, avec les lumières de la ville qui se reflètent dans les flaques d'eau.
Personnalisation contrôlée Image de contrôle Canny (1) Génère une image alignée sur edge map [1] pour qu'elle corresponde à la description : ${STYLE_PROMPT} ${PROMPT} Génère une image alignée sur edge map [1] pour qu'elle corresponde à la description : L'image doit être dans le style d'une peinture à l'huile impressionniste, avec des coups de pinceau détendus. Il présente une ambiance naturellement éclairée et des coups de pinceau visibles. Vue latérale d'une voiture. La voiture est garée sur une route mouillée et réfléchissante, avec les lumières de la ville qui se reflètent dans les flaques d'eau.
Stylisation de l'image d'une personne avec ajout du maillage du visage en entrée Image du sujet (1 à 3)

Image de contrôle avec 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 (1 à 3)

Image de contrôle avec maillage du visage (1)
Crée une image ${STYLE_PROMPT} 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 dans un style de dessin animé 3D 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

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 contrôle :

  • Générez une image qui suit le prompt et les images de contrôle au format Contours de Canny.

  • Générez une image qui respecte la requête et les images de gribouillis.

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

Exemples de cas d'utilisation non prévus

Voici une liste non exhaustive des cas d'utilisation non prévus pour la personnalisation basée sur un contrôle. Le modèle n'est pas entraîné pour ces cas d'utilisation et produira probablement des résultats médiocres.

  • Générez une image en utilisant un style spécifié dans la requête.

  • Générer une image à partir de texte qui respecte un style spécifique fourni par une image de référence, avec un certain niveau de contrôle sur la composition de l'image à l'aide d'une image de contrôle

  • Générer une image à partir de texte qui respecte un style spécifique fourni par une image de référence, avec un certain niveau de contrôle sur la composition de l'image à l'aide d'un gribouillis de contrôle

  • Générer une image à partir de texte qui respecte un style spécifique fourni par l'image de référence, avec un certain niveau de contrôle sur la composition de l'image à l'aide d'une image de contrôle La personne sur l'image a une expression faciale spécifique.

  • Styliser une photo de plusieurs personnes tout en préservant leurs expressions faciales

  • Styliser une photo d'un animal de compagnie et la transformer en dessin Conservez ou spécifiez la composition de l'image (par exemple, aquarelle).