Personalizar imagens com base em um estilo especificado usando o Imagen


Nesta página, descrevemos como usar a capacidade de personalização do Imagen para editar ou gerar imagens com base em um estilo especificado usando os SDKs Firebase AI Logic.

Como funciona: você fornece um comando de texto e pelo menos uma imagem de referência que mostre um estilo específico (como um padrão, uma textura ou um estilo de design). O modelo usa essas entradas para gerar uma nova imagem com base no estilo especificado nas imagens de referência.

Por exemplo, você pode gerar uma nova imagem de uma cozinha com base em uma imagem de um catálogo de varejo popular que você fornece.

Ir para o código



Antes de começar

Disponível apenas quando você usa o Vertex AI Gemini API como provedor de API.

Se ainda não tiver feito isso, conclua o guia de primeiros passos, que descreve como configurar seu projeto do Firebase, conectar seu app ao Firebase, adicionar o SDK, inicializar o serviço de back-end para o provedor de API escolhido e criar uma instância de ImagenModel.

Modelos compatíveis com esse recurso

O Imagen oferece edição de imagens com o modelo capability:

  • imagen-3.0-capability-001

Para modelos Imagen, o local global não é compatível.

Enviar uma solicitação de personalização de estilo

O exemplo a seguir mostra uma solicitação de personalização de estilo que pede ao modelo para gerar uma nova imagem com o estilo da imagem de referência fornecida (neste exemplo, "Noite Estrelada", de Van Gogh).

Confira os modelos de comando mais adiante nesta página para saber como escrever comandos e usar imagens de referência neles.

Swift

A edição de imagens com modelos Imagen não é compatível com Swift. Volte mais tarde este ano!

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

A edição de imagens com modelos Imagen não está disponível para apps da Web. Volte mais tarde este ano!

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

A edição de imagens com modelos Imagen não é compatível com o Unity. Volte mais tarde este ano!

Modelos de comandos

Na solicitação, você fornece imagens de referência (até quatro) definindo um ImagenStyleReference em que especifica um ID de referência para uma imagem (e, opcionalmente, uma descrição de estilo). Várias imagens podem ter o mesmo ID de referência (por exemplo, várias fotos do mesmo padrão).

Depois, ao escrever o comando, você se refere a esses IDs. Por exemplo, use [1] no comando para se referir a imagens com o ID de referência 1. Se você fornecer uma descrição do assunto, também poderá incluí-la no comando para facilitar a leitura.

A tabela a seguir oferece modelos de comandos que podem ser um ponto de partida para escrever comandos de personalização com base no estilo.

Caso de uso Imagens de referência Modelo de comando Exemplo
Estilo do objeto Imagem do personagem (1 a 4) Gere uma imagem em STYLE_DESCRIPTION [1] com base na seguinte legenda: IMAGE_DESCRIPTION. Gere uma imagem em neon sign style [1] com base na seguinte legenda: a sign saying have a great day.
Estilização de imagem de pessoa sem entrada de malha facial Imagem do personagem (1 a 4) Crie uma imagem sobre SUBJECT_DESCRIPTION [1] para corresponder à descrição: um retrato de SUBJECT_DESCRIPTION [1] ${PROMPT} Crie uma imagem sobre a woman with short hair[1] para corresponder à descrição: um retrato de a woman with short hair[1] em estilo de desenho animado 3D com fundo desfocado. Um personagem fofo e adorável, com um rosto sorridente, olhando para a câmera, tom de cor pastel ...
Estilização de imagem de pessoa com entrada de malha facial Imagem do assunto (1 a 3)

Imagem de controle de facemesh (1)
Crie uma imagem sobre SUBJECT_DESCRIPTION [1] na pose de CONTROL_IMAGE [2] para corresponder à descrição: um retrato de SUBJECT_DESCRIPTION [1] ${PROMPT} Crie uma imagem de a woman with short hair [1] na pose de control image [2] para corresponder à descrição: um retrato de a woman with short hair [1] em estilo de desenho animado 3D com plano de fundo desfocado. Um personagem fofo e adorável, com um rosto sorridente, olhando para a câmera, tom de cor pastel ...



Práticas recomendadas e limitações

Casos de uso

O recurso de personalização oferece comandos de estilo livre, o que pode dar a impressão de que o modelo pode fazer mais do que foi treinado para fazer. As seções a seguir descrevem casos de uso pretendidos para personalização e exemplos não exaustivos de casos de uso não pretendidos.

Recomendamos usar essa capacidade para os casos de uso pretendidos, já que treinamos o modelo com eles e esperamos bons resultados. Por outro lado, se você exigir que o modelo faça coisas fora dos casos de uso pretendidos, os resultados serão ruins.

Casos de uso pretendidos

Confira a seguir os casos de uso pretendidos para personalização com base em um estilo:

  • Gere uma imagem com base em uma entrada de texto que siga o estilo específico fornecido por uma imagem de referência.

  • Alterar a foto de uma pessoa.

  • Altere uma foto de uma pessoa e preserve a expressão facial dela.

Exemplos de casos de uso não intencionais

Confira a seguir uma lista não exaustiva de casos de uso não intencionais para personalização com base em um estilo. O modelo não é treinado para esses casos de uso e provavelmente vai gerar resultados ruins.

  • Gere uma imagem de texto e usando uma imagem de referência, com a intenção de ter algum nível de controle da composição gerada da imagem de referência.

  • Gere uma imagem de uma pessoa com base em uma imagem de referência que tenha uma pessoa com uma expressão facial específica.

  • Coloque duas pessoas em uma cena diferente, preserve as identidades delas e especifique o estilo da imagem de saída (como uma pintura a óleo) usando uma imagem de referência.

  • Estilize uma foto de um animal de estimação e transforme em um desenho, preservando ou especificando a composição da imagem.

  • Coloque um produto, como um cookie ou um sofá, em diferentes cenas com ângulos e estilos de imagem específicos (como fotorrealista com cores, estilos de iluminação ou animação específicos).