En esta página, se describe cómo usar la reconstrucción con Imagen para quitar un objeto de una imagen con los SDKs de Firebase AI Logic.
El retoque es un tipo de edición basada en máscaras. Una máscara es una superposición digital que define el área específica que deseas editar.
Cómo funciona: Proporcionas una imagen original y una imagen enmascarada correspondiente (ya sea generada automáticamente o proporcionada por ti) que define una máscara sobre el objeto o sujeto que deseas quitar. También puedes proporcionar, de manera opcional, una instrucción de texto que describa lo que quieres quitar, o bien el modelo puede detectar de forma inteligente qué objeto quitar. Luego, el modelo quita el objeto y rellena el área con contenido nuevo y adecuado para el contexto.
Por ejemplo, puedes enmascarar una pelota y reemplazarla por una pared en blanco o un campo de césped.
Ir al código de la máscara generada automáticamente Ir al código para proporcionar la máscara
Antes de comenzar
Solo está disponible cuando usas Vertex AI Gemini API como tu proveedor de la API. |
Si aún no lo hiciste, completa la guía de introducción, en la que se describe cómo configurar tu proyecto de Firebase, conectar tu app a Firebase, agregar el SDK, inicializar el servicio de backend para el proveedor de la API que elijas y crear una instancia de ImagenModel
.
Modelos que admiten esta capacidad
Imagen ofrece edición de imágenes a través de su modelo capability
:
imagen-3.0-capability-001
Ten en cuenta que, para los modelos Imagen, no se admite la ubicación global
.
Cómo quitar objetos con una máscara generada automáticamente
Antes de probar esta muestra, completa la sección Antes de comenzar de esta guía para configurar tu proyecto y tu app. |
En el siguiente ejemplo, se muestra cómo usar el relleno para quitar contenido de una imagen con la generación automática de máscaras. Proporcionas la imagen original y una instrucción de texto, e Imagen detecta y crea automáticamente un área de máscara para modificar la imagen original.
Swift
La edición de imágenes con modelos de Imagen no se admite en Swift. Vuelve a consultar más adelante este año.
Kotlin
Para quitar objetos con una máscara generada automáticamente, especifica ImagenBackgroundMask
. Usa editImage()
y establece la configuración de edición para usar ImagenEditMode.INPAINT_REMOVAL
.
// 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 'originalImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
val originalImage: Bitmap = TODO("Load your original image Bitmap here")
// Provide the prompt describing the content to be removed.
val prompt = "ball"
// Use the editImage API to remove the unwanted content.
// Pass the original image, the prompt, and an editing configuration.
val editedImage = model.editImage(
sources = listOf(
ImagenRawImage(originalImage),
ImagenBackgroundMask(), // Use ImagenBackgroundMask() to auto-generate the mask.
),
prompt = prompt,
// Define the editing configuration for inpainting and insertion.
config = ImagenEditingConfig(ImagenEditMode.INPAINT_REMOVAL)
)
// Process the resulting 'editedImage' Bitmap, for example, by displaying it in an ImageView.
}
Java
Para quitar objetos con una máscara generada automáticamente, especifica ImagenBackgroundMask
. Usa editImage()
y establece la configuración de edición para usar ImagenEditMode.INPAINT_REMOVAL
.
// 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 'originalImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
Bitmap originalImage = null; // TODO("Load your image Bitmap here");
// Provide the prompt describing the content to be removed.
String prompt = "ball";
// Define the list of sources for the editImage call.
// This includes the original image and the auto-generated mask.
ImagenRawImage rawOriginalImage = new ImagenRawImage(originalImage);
ImagenBackgroundMask rawMaskedImage = new ImagenBackgroundMask(); // Use ImagenBackgroundMask() to auto-generate the mask.
// Define the editing configuration for inpainting and removal.
ImagenEditingConfig config = new ImagenEditingConfig.Builder()
.setEditMode(ImagenEditMode.INPAINT_REMOVAL)
.build();
// Use the editImage API to remove the unwanted content.
// Pass the original image, the auto-generated masked image, the prompt, and an editing configuration.
Futures.addCallback(model.editImage(Arrays.asList(rawOriginalImage, rawMaskedImage), prompt, config), new FutureCallback<ImagenGenerationResponse>() {
@Override
public void onSuccess(ImagenGenerationResponse result) {
if (result.getImages().isEmpty()) {
Log.d("ImageEditor", "No images generated");
}
Bitmap editedImage = result.getImages().get(0).asBitmap();
// Process and use the bitmap to display the image in your UI
}
@Override
public void onFailure(Throwable t) {
// ...
}
}, Executors.newSingleThreadExecutor());
Web
La edición de imágenes con modelos Imagen no es compatible con las apps web. Vuelve a consultar más adelante este año.
Dart
Para quitar objetos con una máscara generada automáticamente, especifica ImagenBackgroundMask
. Usa editImage()
y establece la configuración de edición para usar ImagenEditMode.inpaintRemoval
.
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');
TODO - FLUTTER// This example assumes 'originalImage' is a pre-loaded Uint8List.
// In a real app, this might come from the user's device or a URL.
final Uint8List originalImage = Uint8List(0); // TODO: Load your original image data here.
// Provide the prompt describing the content to be removed.
final prompt = 'ball';
try {
// Use the editImage API to remove the unwanted content.
// Pass the original image, the prompt, and an editing configuration.
final response = await model.editImage(
sources: [
ImagenRawImage(originalImage),
ImagenBackgroundMask(), // Use ImagenBackgroundMask() to auto-generate the mask.
],
prompt,
// Define the editing configuration for inpainting and removal.
config: const ImagenEditingConfig(
editMode: ImagenEditMode.inpaintRemoval,
),
);
// 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 edición de imágenes con modelos de Imagen no es compatible con Unity. Vuelve a consultar más adelante este año.
Quita objetos con una máscara proporcionada
Antes de probar esta muestra, completa la sección Antes de comenzar de esta guía para configurar tu proyecto y tu app. |
En el siguiente ejemplo, se muestra cómo usar el relleno completo para quitar contenido de una imagen con una máscara definida en una imagen que proporcionas. Proporcionas la imagen original, una instrucción de texto y la imagen enmascarada.
Proporcionar una instrucción de texto es opcional si proporcionas una imagen enmascarada. Imagen puede detectar de forma inteligente un objeto para quitarlo del área enmascarada. Sin embargo, si el objeto que quieres quitar no es obvio o solo quieres quitar objetos específicos en el área enmascarada, proporciona una instrucción de texto para ayudar al modelo a quitar el objeto correcto.
Swift
La edición de imágenes con modelos de Imagen no se admite en Swift. Vuelve a consultar más adelante este año.
Kotlin
Para quitar objetos y proporcionar tu propia imagen enmascarada, especifica ImagenRawMask
con la imagen enmascarada. Usa editImage()
y establece la configuración de edición para usar ImagenEditMode.INPAINT_REMOVAL
.
// 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 'originalImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
val originalImage: Bitmap = TODO("Load your original image Bitmap here")
// This example assumes 'maskImage' is a pre-loaded Bitmap that contains the masked area.
// In a real app, this might come from the user's device or a URL.
val maskImage: Bitmap = TODO("Load your masked image Bitmap here")
// Provide the prompt describing the content to be removed.
val prompt = "ball"
// Use the editImage API to remove the unwanted content.
// Pass the original image, the masked image, the prompt, and an editing configuration.
val editedImage = model.editImage(
referenceImages = listOf(
ImagenRawImage(originalImage.toImagenInlineImage()),
ImagenRawMask(maskImage.toImagenInlineImage()), // Use ImagenRawMask() to provide your own masked image.
),
prompt = prompt,
// Define the editing configuration for inpainting and removal.
config = ImagenEditingConfig(ImagenEditMode.INPAINT_REMOVAL)
)
// Process the resulting 'editedImage' Bitmap, for example, by displaying it in an ImageView.
}
Java
Para quitar objetos y proporcionar tu propia imagen enmascarada, especifica ImagenRawMask
con la imagen enmascarada. Usa editImage()
y establece la configuración de edición para usar ImagenEditMode.INPAINT_REMOVAL
.
// 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 'originalImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
Bitmap originalImage = null; // TODO("Load your original image Bitmap here");
// This example assumes 'maskImage' is a pre-loaded Bitmap that contains the masked area.
// In a real app, this might come from the user's device or a URL.
Bitmap maskImage = null; // TODO("Load your masked image Bitmap here");
// Provide the prompt describing the content to be removed.
String prompt = "ball";
// Define the list of source images for the editImage call.
ImagenRawImage rawOriginalImage = new ImagenRawImage(originalImage);
ImagenBackgroundMask rawMaskedImage = new ImagenRawMask(maskImage); // Use ImagenRawMask() to provide your own masked image.
// Define the editing configuration for inpainting and removal.
ImagenEditingConfig config = new ImagenEditingConfig.Builder()
.setEditMode(ImagenEditMode.INPAINT_REMOVAL)
.build();
// Use the editImage API to remove the unwanted content.
// Pass the original image, the masked image, the prompt, and an editing configuration.
Futures.addCallback(model.editImage(Arrays.asList(rawOriginalImage, rawMaskedImage), prompt, config), new FutureCallback<ImagenGenerationResponse>() {
@Override
public void onSuccess(ImagenGenerationResponse result) {
if (result.getImages().isEmpty()) {
Log.d("ImageEditor", "No images generated");
}
Bitmap editedImage = result.getImages().get(0).asBitmap();
// Process and use the bitmap to display the image in your UI
}
@Override
public void onFailure(Throwable t) {
// ...
}
}, Executors.newSingleThreadExecutor());
Web
La edición de imágenes con modelos Imagen no es compatible con las apps web. Vuelve a consultar más adelante este año.
Dart
Para quitar objetos y proporcionar tu propia imagen enmascarada, especifica ImagenRawMask
con la imagen enmascarada. Usa editImage()
y establece la configuración de edición para usar ImagenEditMode.inpaintRemoval
.
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 'originalImage' is a pre-loaded Uint8List.
// In a real app, this might come from the user's device or a URL.
final Uint8List originalImage = Uint8List(0); // TODO: Load your original image data here.
// This example assumes 'maskImage' is a pre-loaded Uint8List that contains the masked area.
// In a real app, this might come from the user's device or a URL.
final Uint8List maskImage = Uint8List(0); // TODO: Load your masked image data here.
// Provide the prompt describing the content to be removed.
final prompt = 'ball';
try {
// Use the editImage API to remove the unwanted content.
// Pass the original image, the prompt, and an editing configuration.
final response = await model.editImage(
sources: [
ImagenRawImage(originalImage),
ImagenRawMask(maskImage), // Use ImagenRawMask() to provide your own masked image.
],
prompt: prompt,
// Define the editing configuration for inpainting and removal.
config: const ImagenEditingConfig(
editMode: ImagenEditMode.inpaintRemoval,
),
);
// 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 edición de imágenes con modelos de Imagen no es compatible con Unity. Vuelve a consultar más adelante este año.
Prácticas recomendadas y limitaciones
Te recomendamos que dilates la máscara cuando edites una imagen. Esto puede ayudar a suavizar los bordes de una edición y hacer que parezca más convincente. En general, se recomienda un valor de dilatación del 1% o el 2% (0.01
o 0.02
).
Envía comentarios sobre tu experiencia con Firebase AI Logic