Insertar objetos en una imagen con la función de pintura

En esta página se describe cómo insertar objetos en una imagen, lo que también se denomina relleno. Imagen en Vertex AI te permite especificar un área de máscara para insertar objetos en una imagen. Puedes usar tu propia máscara o dejar que Imagen en Vertex AI genere una por ti.

Ejemplo de inserción de contenido

Con la función de pintura, puedes usar una imagen base, una máscara de imagen y un prompt de texto para añadir contenido a una imagen.

Entradas

Imagen base* que se va a editar Área de máscara especificada con las herramientas de la consola Google Cloud Petición de texto
Una imagen base de ejemplo. Un tarro de cristal contiene un líquido rojo con una rodaja de limón en el lateral y una pajita. Se ven rodajas de limón
           en primer plano a la izquierda Imagen base de un tarro de cristal, ahora con un área de máscara especificada en la consola de Cloud fresas

* Crédito de la imagen: Alex Lvrs en Unsplash.

Salida después de especificar un área de máscara en la Google Cloud consola

Captura de pantalla de una edición generada de un tarro de cristal que contiene un líquido rojo. En esta captura de pantalla, las rodajas de limón que estaban en primer plano en la imagen anterior se han sustituido por dos fresas que están justo delante del tarro. Captura de pantalla de una edición generada de un tarro de cristal que contiene un líquido rojo. En esta captura de pantalla, las rodajas de limón que estaban en primer plano en la imagen se han sustituido por tres fresas que se encuentran justo a la izquierda del tarro. Captura de pantalla de una edición generada de un tarro de cristal que contiene un líquido rojo. En esta captura de pantalla, las rodajas de limón que estaban en primer plano en la imagen anterior se han sustituido por dos fresas, que están ligeramente delante y a la izquierda del tarro.

Ver la tarjeta del modelo Imagen for Editing and Customization

Antes de empezar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Vertex AI API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Vertex AI API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. Configura la autenticación de tu entorno.

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    Java

    Para usar las Java muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local en la documentación de autenticación Google Cloud .

    Node.js

    Para usar las Node.js muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local en la documentación de autenticación Google Cloud .

    Python

    Para usar las Python muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local en la documentación de autenticación Google Cloud .

    REST

    Para usar las muestras de la API REST de esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a la CLI de gcloud.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    Para obtener más información, consulta el artículo Autenticarse para usar REST de la documentación sobre autenticación de Google Cloud .

    Insertar con un área de máscara definida

    Usa los siguientes ejemplos para especificar la función de pintura para insertar contenido. En estos ejemplos, se especifica una imagen base, una petición de texto y un área de máscara para modificar la imagen base.

    Imagen 3

    Usa los siguientes ejemplos para enviar una solicitud de pintura con el modelo Imagen 3.

    Consola

    1. En la Google Cloud consola, ve a la página Vertex AI > Media Studio .

      Ir a Media Studio

    2. Haz clic en Subir. En el cuadro de diálogo de archivos que se muestra, seleccione el archivo que quiera subir.
    3. Haz clic en Inpaint.
    4. Elige una de estas opciones:

      • Subir tu propia máscara:
        1. Crea una máscara en tu ordenador.
        2. Haz clic en Subir máscara. En el cuadro de diálogo que se muestra, selecciona una máscara para subirla.
      • Define la máscara: en la barra de herramientas de edición, usa las herramientas de máscara (cuadro, pincel o masked_transitionsinvertir ) para especificar la zona o las zonas en las que quieres añadir contenido.
    5. Opcional: En el panel Parámetros, ajusta las siguientes opciones:
      • Modelo: el modelo de Imagen que se va a usar.
      • Número de resultados: el número de resultados que se van a generar.
      • Petición negativa: elementos que se deben evitar
    6. En el campo de petición, escribe una petición para modificar la imagen.
    7. Haz clic en Generar.

    Python

    Instalar

    pip install --upgrade google-genai

    Para obtener más información, consulta la documentación de referencia del SDK.

    Define variables de entorno para usar el SDK de IA generativa con Vertex AI:

    # Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
    # with appropriate values for your project.
    export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
    export GOOGLE_CLOUD_LOCATION=us-central1
    export GOOGLE_GENAI_USE_VERTEXAI=True

    from google import genai
    from google.genai.types import (
        RawReferenceImage,
        MaskReferenceImage,
        MaskReferenceConfig,
        EditImageConfig,
    )
    
    client = genai.Client()
    
    # TODO(developer): Update and un-comment below line
    # output_file = "output-image.png"
    
    raw_ref = RawReferenceImage(
        reference_image=Image.from_file(location="test_resources/fruit.png"),
        reference_id=0,
    )
    mask_ref = MaskReferenceImage(
        reference_id=1,
        reference_image=Image.from_file(location="test_resources/fruit_mask.png"),
        config=MaskReferenceConfig(
            mask_mode="MASK_MODE_USER_PROVIDED",
            mask_dilation=0.01,
        ),
    )
    
    image = client.models.edit_image(
        model="imagen-3.0-capability-001",
        prompt="A plate of cookies",
        reference_images=[raw_ref, mask_ref],
        config=EditImageConfig(
            edit_mode="EDIT_MODE_INPAINT_INSERTION",
        ),
    )
    
    image.generated_images[0].image.save(output_file)
    
    print(f"Created output image using {len(image.generated_images[0].image.image_bytes)} bytes")
    # Example response:
    # Created output image using 1234567 bytes
    

    REST

    Para obtener más información, consulta la referencia de la API Edit images.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu Google Cloud ID de proyecto.
    • LOCATION: la región de tu proyecto. Por ejemplo, us-central1, europe-west2 o asia-northeast3. Para ver una lista de las regiones disponibles, consulta Ubicaciones de la IA generativa en Vertex AI.
    • TEXT_PROMPT: La petición de texto indica qué imágenes genera el modelo. Cuando uses una petición para insertar contenido con la función de pintura, describe la zona enmascarada para obtener los mejores resultados. Evita las peticiones de una sola palabra. Por ejemplo, usa "un corgi bonito" en lugar de "corgi".
    • B64_BASE_IMAGE: la imagen base que quieres editar o aumentar de resolución. La imagen debe especificarse como una cadena de bytes codificada en Base64. Tamaño máximo: 10 MB.
    • B64_MASK_IMAGE: la imagen en blanco y negro que quieras usar como capa de máscara para editar la imagen original. La imagen debe especificarse como una cadena de bytes codificada en Base64. Tamaño máximo: 10 MB.
    • MASK_DILATION: número flotante. Porcentaje de la anchura de la imagen para dilatar esta máscara. Se recomienda usar el valor 0.01 para compensar las máscaras de entrada imperfectas.
    • EDIT_STEPS: número entero. Número de pasos de muestreo del modelo base. Para la inserción de relleno generativo, empieza en el paso 35. Aumenta los pasos hasta el límite superior de 75 si la calidad no cumple tus requisitos. Aumentar los pasos también aumenta la latencia de las solicitudes.
    • EDIT_IMAGE_COUNT: número de imágenes editadas. Valores enteros aceptados: del 1 al 4. Valor predeterminado: 4.

    Método HTTP y URL:

    POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagen-3.0-capability-001:predict

    Cuerpo JSON de la solicitud:

    {
      "instances": [
        {
          "prompt": "TEXT_PROMPT",
          "referenceImages": [
            {
              "referenceType": "REFERENCE_TYPE_RAW",
              "referenceId": 1,
              "referenceImage": {
                "bytesBase64Encoded": "B64_BASE_IMAGE"
              }
            },
            {
              "referenceType": "REFERENCE_TYPE_MASK",
              "referenceId": 2,
              "referenceImage": {
                "bytesBase64Encoded": "B64_MASK_IMAGE"
              },
              "maskImageConfig": {
                "maskMode": "MASK_MODE_USER_PROVIDED",
                "dilation": MASK_DILATION
              }
            }
          ]
        }
      ],
      "parameters": {
        "editConfig": {
          "baseSteps": EDIT_STEPS
        },
        "editMode": "EDIT_MODE_INPAINT_INSERTION",
        "sampleCount": EDIT_IMAGE_COUNT
      }
    }
    

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagen-3.0-capability-001:predict"

    PowerShell

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagen-3.0-capability-001:predict" | Select-Object -Expand Content
    La siguiente respuesta de ejemplo corresponde a una solicitud con "sampleCount": 2. La respuesta devuelve dos objetos de predicción con los bytes de la imagen generada codificados en Base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Imagen 2

    Usa los siguientes ejemplos para enviar una solicitud de pintura con el modelo Imagen 2.

    Consola

    1. En la Google Cloud consola, ve a la página Vertex AI > Media Studio .

      Ir a Media Studio

    2. Haz clic en Subir. En el cuadro de diálogo de archivos que se muestra, seleccione el archivo que quiera subir.
    3. Haz clic en Inpaint.
    4. Elige una de estas opciones:

      • Subir tu propia máscara:
        1. Crea una máscara en tu ordenador.
        2. Haz clic en Subir máscara. En el cuadro de diálogo que se muestra, selecciona una máscara para subirla.
      • Define la máscara: en la barra de herramientas de edición, usa las herramientas de máscara (cuadro, pincel o masked_transitionsinvertir ) para especificar la zona o las zonas en las que quieres añadir contenido.
    5. Opcional. En el panel Parámetros, ajuste las siguientes opciones:
      • Modelo: el modelo de Imagen que se va a usar.
      • Número de resultados: el número de resultados que se van a generar.
      • Petición negativa: elementos que se deben evitar
    6. En el campo de petición, introduce una nueva petición para modificar la imagen.
    7. Haz clic en Generar.

    Python

    Para saber cómo instalar o actualizar el SDK de Vertex AI para Python, consulta Instalar el SDK de Vertex AI para Python. Para obtener más información, consulta la documentación de referencia de la API Python.

    
    import vertexai
    from vertexai.preview.vision_models import Image, ImageGenerationModel
    
    # TODO(developer): Update and un-comment below lines
    # PROJECT_ID = "your-project-id"
    # input_file = "input-image.png"
    # mask_file = "mask-image.png"
    # output_file = "output-image.png"
    # prompt = "red hat" # The text prompt describing what you want to see inserted.
    
    vertexai.init(project=PROJECT_ID, location="us-central1")
    
    model = ImageGenerationModel.from_pretrained("imagegeneration@006")
    base_img = Image.load_from_file(location=input_file)
    mask_img = Image.load_from_file(location=mask_file)
    
    images = model.edit_image(
        base_image=base_img,
        mask=mask_img,
        prompt=prompt,
        edit_mode="inpainting-insert",
    )
    
    images[0].save(location=output_file, include_generation_parameters=False)
    
    # Optional. View the edited image in a notebook.
    # images[0].show()
    
    print(f"Created output image using {len(images[0]._image_bytes)} bytes")
    # Example response:
    # Created output image using 1400814 bytes
    

    REST

    Para obtener más información sobre las solicitudes de modelos imagegeneration, consulta la referencia de la API de modelos imagegeneration.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu Google Cloud ID de proyecto.
    • LOCATION: la región de tu proyecto. Por ejemplo, us-central1, europe-west2 o asia-northeast3. Para ver una lista de las regiones disponibles, consulta Ubicaciones de la IA generativa en Vertex AI.
    • TEXT_PROMPT: la petición de texto que indica qué imágenes debe generar el modelo. Este campo es obligatorio tanto para generar como para editar.
    • B64_BASE_IMAGE: la imagen base que quieres editar o aumentar de resolución. La imagen debe especificarse como una cadena de bytes codificada en Base64. Tamaño máximo: 10 MB.
    • B64_MASK_IMAGE: la imagen en blanco y negro que quieras usar como capa de máscara para editar la imagen original. La imagen debe especificarse como una cadena de bytes codificada en Base64. Tamaño máximo: 10 MB.
    • EDIT_IMAGE_COUNT: número de imágenes editadas. Valor predeterminado: 4.
    • GUIDANCE_SCALE_VALUE: parámetro (entero) que controla el grado de cumplimiento del modelo con la petición de texto. Los valores más altos aumentan la alineación entre la petición de texto y las imágenes generadas, pero pueden comprometer la calidad de la imagen. Valores: 0 - 500. Valor predeterminado: 60.

    Método HTTP y URL:

    POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagegeneration@006:predict

    Cuerpo JSON de la solicitud:

    {
      "instances": [
        {
          "prompt": "TEXT_PROMPT",
          "image": {
              "bytesBase64Encoded": "B64_BASE_IMAGE"
          },
          "mask": {
            "image": {
              "bytesBase64Encoded": "B64_MASK_IMAGE"
            }
          }
        }
      ],
      "parameters": {
        "sampleCount": EDIT_IMAGE_COUNT,
        "editConfig": {
          "editMode": "inpainting-insert",
          "guidanceScale": GUIDANCE_SCALE_VALUE
        }
      }
    }
    

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagegeneration@006:predict"

    PowerShell

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagegeneration@006:predict" | Select-Object -Expand Content
    La siguiente respuesta de ejemplo corresponde a una solicitud con "sampleCount": 2. La respuesta devuelve dos objetos de predicción con los bytes de la imagen generada codificados en Base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Java

    Antes de probar este ejemplo, sigue las Java instrucciones de configuración de la guía de inicio rápido de Vertex AI con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de Vertex AI.

    Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

    En este ejemplo, se especifica el modelo como parte de un EndpointName. El EndpointName se transfiere al método predict, al que se llama en un PredictionServiceClient. El servicio devuelve una versión editada de la imagen, que se guarda de forma local.

    Para obtener más información sobre las versiones y las funciones de los modelos, consulta Modelos de Imagen.

    
    import com.google.api.gax.rpc.ApiException;
    import com.google.cloud.aiplatform.v1.EndpointName;
    import com.google.cloud.aiplatform.v1.PredictResponse;
    import com.google.cloud.aiplatform.v1.PredictionServiceClient;
    import com.google.cloud.aiplatform.v1.PredictionServiceSettings;
    import com.google.gson.Gson;
    import com.google.protobuf.InvalidProtocolBufferException;
    import com.google.protobuf.Value;
    import com.google.protobuf.util.JsonFormat;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.Base64;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
    
    public class EditImageInpaintingInsertMaskSample {
    
      public static void main(String[] args) throws IOException {
        // TODO(developer): Replace these variables before running the sample.
        String projectId = "my-project-id";
        String location = "us-central1";
        String inputPath = "/path/to/my-input.png";
        String maskPath = "/path/to/my-mask.png";
        String prompt =
            ""; // The text prompt describing what you want to see inserted in the mask area.
    
        editImageInpaintingInsertMask(projectId, location, inputPath, maskPath, prompt);
      }
    
      // Edit an image using a mask file. Inpainting can insert the object designated by the prompt
      // into the masked area.
      public static PredictResponse editImageInpaintingInsertMask(
          String projectId, String location, String inputPath, String maskPath, String prompt)
          throws ApiException, IOException {
        final String endpoint = String.format("%s-aiplatform.googleapis.com:443", location);
        PredictionServiceSettings predictionServiceSettings =
            PredictionServiceSettings.newBuilder().setEndpoint(endpoint).build();
    
        // Initialize client that will be used to send requests. This client only needs to be created
        // once, and can be reused for multiple requests.
        try (PredictionServiceClient predictionServiceClient =
            PredictionServiceClient.create(predictionServiceSettings)) {
    
          final EndpointName endpointName =
              EndpointName.ofProjectLocationPublisherModelName(
                  projectId, location, "google", "imagegeneration@006");
    
          // Encode image and mask to Base64
          String imageBase64 =
              Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get(inputPath)));
          String maskBase64 =
              Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get(maskPath)));
    
          // Create the image and image mask maps
          Map<String, String> imageMap = new HashMap<>();
          imageMap.put("bytesBase64Encoded", imageBase64);
    
          Map<String, String> maskMap = new HashMap<>();
          maskMap.put("bytesBase64Encoded", maskBase64);
          Map<String, Map> imageMaskMap = new HashMap<>();
          imageMaskMap.put("image", maskMap);
    
          Map<String, Object> instancesMap = new HashMap<>();
          instancesMap.put("prompt", prompt); // [ "prompt", "<my-prompt>" ]
          instancesMap.put(
              "image", imageMap); // [ "image", [ "bytesBase64Encoded", "iVBORw0KGgo...==" ] ]
          instancesMap.put(
              "mask",
              imageMaskMap); // [ "mask", [ "image", [ "bytesBase64Encoded", "iJKDF0KGpl...==" ] ] ]
          instancesMap.put("editMode", "inpainting-insert"); // [ "editMode", "inpainting-insert" ]
          Value instances = mapToValue(instancesMap);
    
          // Optional parameters
          Map<String, Object> paramsMap = new HashMap<>();
          paramsMap.put("sampleCount", 1);
          Value parameters = mapToValue(paramsMap);
    
          PredictResponse predictResponse =
              predictionServiceClient.predict(
                  endpointName, Collections.singletonList(instances), parameters);
    
          for (Value prediction : predictResponse.getPredictionsList()) {
            Map<String, Value> fieldsMap = prediction.getStructValue().getFieldsMap();
            if (fieldsMap.containsKey("bytesBase64Encoded")) {
              String bytesBase64Encoded = fieldsMap.get("bytesBase64Encoded").getStringValue();
              Path tmpPath = Files.createTempFile("imagen-", ".png");
              Files.write(tmpPath, Base64.getDecoder().decode(bytesBase64Encoded));
              System.out.format("Image file written to: %s\n", tmpPath.toUri());
            }
          }
          return predictResponse;
        }
      }
    
      private static Value mapToValue(Map<String, Object> map) throws InvalidProtocolBufferException {
        Gson gson = new Gson();
        String json = gson.toJson(map);
        Value.Builder builder = Value.newBuilder();
        JsonFormat.parser().merge(json, builder);
        return builder.build();
      }
    }
    

    Node.js

    Antes de probar este ejemplo, sigue las Node.js instrucciones de configuración de la guía de inicio rápido de Vertex AI con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Node.js de Vertex AI.

    Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

    En este ejemplo, se llama al método predict en un objeto PredictionServiceClient. El servicio genera imágenes que se guardan de forma local. Para obtener más información sobre las versiones y las funciones de los modelos, consulta Modelos Imagen.

    /**
     * TODO(developer): Update these variables before running the sample.
     */
    const projectId = process.env.CAIP_PROJECT_ID;
    const location = 'us-central1';
    const inputFile = 'resources/woman.png';
    const maskFile = 'resources/woman_inpainting_insert_mask.png';
    const prompt = 'hat';
    
    const aiplatform = require('@google-cloud/aiplatform');
    
    // Imports the Google Cloud Prediction Service Client library
    const {PredictionServiceClient} = aiplatform.v1;
    
    // Import the helper module for converting arbitrary protobuf.Value objects
    const {helpers} = aiplatform;
    
    // Specifies the location of the api endpoint
    const clientOptions = {
      apiEndpoint: `${location}-aiplatform.googleapis.com`,
    };
    
    // Instantiates a client
    const predictionServiceClient = new PredictionServiceClient(clientOptions);
    
    async function editImageInpaintingInsertMask() {
      const fs = require('fs');
      const util = require('util');
      // Configure the parent resource
      const endpoint = `projects/${projectId}/locations/${location}/publishers/google/models/imagegeneration@006`;
    
      const imageFile = fs.readFileSync(inputFile);
      // Convert the image data to a Buffer and base64 encode it.
      const encodedImage = Buffer.from(imageFile).toString('base64');
    
      const maskImageFile = fs.readFileSync(maskFile);
      // Convert the image mask data to a Buffer and base64 encode it.
      const encodedMask = Buffer.from(maskImageFile).toString('base64');
    
      const promptObj = {
        prompt: prompt, // The text prompt describing what you want to see inserted
        editMode: 'inpainting-insert',
        image: {
          bytesBase64Encoded: encodedImage,
        },
        mask: {
          image: {
            bytesBase64Encoded: encodedMask,
          },
        },
      };
      const instanceValue = helpers.toValue(promptObj);
      const instances = [instanceValue];
    
      const parameter = {
        // Optional parameters
        seed: 100,
        // Controls the strength of the prompt
        // 0-9 (low strength), 10-20 (medium strength), 21+ (high strength)
        guidanceScale: 21,
        sampleCount: 1,
      };
      const parameters = helpers.toValue(parameter);
    
      const request = {
        endpoint,
        instances,
        parameters,
      };
    
      // Predict request
      const [response] = await predictionServiceClient.predict(request);
      const predictions = response.predictions;
      if (predictions.length === 0) {
        console.log(
          'No image was generated. Check the request parameters and prompt.'
        );
      } else {
        let i = 1;
        for (const prediction of predictions) {
          const buff = Buffer.from(
            prediction.structValue.fields.bytesBase64Encoded.stringValue,
            'base64'
          );
          // Write image content to the output file
          const writeFile = util.promisify(fs.writeFile);
          const filename = `output${i}.png`;
          await writeFile(filename, buff);
          console.log(`Saved image ${filename}`);
          i++;
        }
      }
    }
    await editImageInpaintingInsertMask();

    Insertar con detección automática de máscara

    Usa los siguientes ejemplos para especificar la función de pintura para insertar contenido. En estos ejemplos, se especifica una imagen base y una petición de texto. Imagen detecta y crea automáticamente un área de máscara para modificar la imagen base.

    Imagen 3

    Usa los siguientes ejemplos para enviar una solicitud de pintura con el modelo Imagen 3.

    Consola

    1. En la Google Cloud consola, ve a la página Vertex AI > Media Studio .

      Ir a Media Studio

    2. Haz clic en Subir. En el cuadro de diálogo de archivos que se muestra, seleccione el archivo que quiera subir.
    3. Haz clic en Inpaint.
    4. En la barra de herramientas de edición, haz clic en background_replaceExtraer máscara.
    5. Selecciona una de las opciones de extracción de máscara:

      • Elementos de fondo: detecta los elementos de fondo y crea una máscara alrededor de ellos.
      • Elementos en primer plano: detecta los objetos en primer plano y crea una máscara a su alrededor.
      • background_replacePersonas: detecta a las personas y crea una máscara a su alrededor.
    6. Opcional: En el panel Parámetros, ajusta las siguientes opciones:
      • Modelo: el modelo de Imagen que se va a usar.
      • Número de resultados: el número de resultados que se van a generar.
      • Petición negativa: elementos que se deben evitar
    7. En el campo de petición, introduce una nueva petición para modificar la imagen.
    8. Haz clic en EnviarGenerar.

    Python

    Instalar

    pip install --upgrade google-genai

    Para obtener más información, consulta la documentación de referencia del SDK.

    Define variables de entorno para usar el SDK de IA generativa con Vertex AI:

    # Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
    # with appropriate values for your project.
    export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
    export GOOGLE_CLOUD_LOCATION=us-central1
    export GOOGLE_GENAI_USE_VERTEXAI=True

    from google import genai
    from google.genai.types import (
        RawReferenceImage,
        MaskReferenceImage,
        MaskReferenceConfig,
        EditImageConfig,
    )
    
    client = genai.Client()
    
    # TODO(developer): Update and un-comment below line
    # output_file = "output-image.png"
    
    raw_ref = RawReferenceImage(
        reference_image=Image.from_file(location="test_resources/fruit.png"),
        reference_id=0,
    )
    mask_ref = MaskReferenceImage(
        reference_id=1,
        reference_image=None,
        config=MaskReferenceConfig(
            mask_mode="MASK_MODE_FOREGROUND",
            mask_dilation=0.1,
        ),
    )
    
    image = client.models.edit_image(
        model="imagen-3.0-capability-001",
        prompt="A small white ceramic bowl with lemons and limes",
        reference_images=[raw_ref, mask_ref],
        config=EditImageConfig(
            edit_mode="EDIT_MODE_INPAINT_INSERTION",
        ),
    )
    
    image.generated_images[0].image.save(output_file)
    
    print(f"Created output image using {len(image.generated_images[0].image.image_bytes)} bytes")
    # Example response:
    # Created output image using 1234567 bytes
    

    REST

    Para obtener más información, consulta la referencia de la API Edit images.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu Google Cloud ID de proyecto.
    • LOCATION: la región de tu proyecto. Por ejemplo, us-central1, europe-west2 o asia-northeast3. Para ver una lista de las regiones disponibles, consulta Ubicaciones de la IA generativa en Vertex AI.
    • TEXT_PROMPT: La petición de texto indica qué imágenes genera el modelo. Cuando uses una petición para insertar contenido con la función de pintura, describe la zona enmascarada para obtener los mejores resultados. Evita las peticiones de una sola palabra. Por ejemplo, usa "un corgi bonito" en lugar de "corgi".
    • B64_BASE_IMAGE: la imagen base que quieres editar o aumentar de resolución. La imagen debe especificarse como una cadena de bytes codificada en Base64. Tamaño máximo: 10 MB.
    • MASK_MODE: cadena que define el tipo de creación automática de máscaras que usa el modelo. Valores disponibles:
      • MASK_MODE_BACKGROUND: genera automáticamente una máscara mediante la segmentación del fondo.
      • MASK_MODE_FOREGROUND: genera automáticamente una máscara mediante la segmentación del primer plano.
      • MASK_MODE_SEMANTIC: genera automáticamente una máscara mediante la segmentación semántica basada en las clases de segmentación que especifiques en la matriz maskImageConfig.maskClasses. Por ejemplo:
                  "maskImageConfig": {
                    "maskMode": "MASK_MODE_SEMANTIC",
                    "maskClasses": [175, 176], // bicycle, car
                    "dilation": 0.01
                  }
                
    • MASK_DILATION: número flotante. Porcentaje de la anchura de la imagen para dilatar esta máscara. Se recomienda usar el valor 0.01 para compensar las máscaras de entrada imperfectas.
    • EDIT_STEPS: número entero. Número de pasos de muestreo del modelo base. Para la inserción de relleno generativo, empieza en el paso 35. Aumenta los pasos hasta el límite superior de 75 si la calidad no cumple tus requisitos. Aumentar los pasos también aumenta la latencia de las solicitudes.
    • EDIT_IMAGE_COUNT: número de imágenes editadas. Valores enteros aceptados: del 1 al 4. Valor predeterminado: 4.

    Método HTTP y URL:

    POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagen-3.0-capability-001:predict

    Cuerpo JSON de la solicitud:

    {
      "instances": [
        {
          "prompt": "TEXT_PROMPT",
          "referenceImages": [
            {
              "referenceType": "REFERENCE_TYPE_RAW",
              "referenceId": 1,
              "referenceImage": {
                "bytesBase64Encoded": "B64_BASE_IMAGE"
              }
            },
            {
              "referenceType": "REFERENCE_TYPE_MASK",
              "referenceId": 2,
              "maskImageConfig": {
                "maskMode": "MASK_MODE",
                "dilation": MASK_DILATION
              }
            }
          ]
        }
      ],
      "parameters": {
        "editConfig": {
          "baseSteps": EDIT_STEPS
        },
        "editMode": "EDIT_MODE_INPAINT_INSERTION",
        "sampleCount": EDIT_IMAGE_COUNT
      }
    }
    

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagen-3.0-capability-001:predict"

    PowerShell

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagen-3.0-capability-001:predict" | Select-Object -Expand Content
    La siguiente respuesta de ejemplo corresponde a una solicitud con "sampleCount": 2. La respuesta devuelve dos objetos de predicción con los bytes de la imagen generada codificados en Base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Imagen 2

    Usa los siguientes ejemplos para enviar una solicitud de pintura con el modelo Imagen 2.

    Consola

    1. En la Google Cloud consola, ve a la página Vertex AI > Media Studio .

      Ir a Media Studio

    2. En el panel de tareas inferior, haz clic en Editar imagen.

    3. Haz clic en Subir para seleccionar la imagen almacenada localmente que quieras editar.

    4. En la barra de herramientas de edición, haz clic en background_replaceExtraer.

    5. Selecciona una de las opciones de extracción de máscara:

      • Elementos de fondo: detecta los elementos de fondo y crea una máscara alrededor de ellos.
      • Elementos en primer plano: detecta los objetos en primer plano y crea una máscara a su alrededor.
      • background_replacePeople: detecta a las personas y crea una máscara a su alrededor.
    6. Opcional: En el panel Parámetros, ajusta el Número de resultados, la Petición negativa, la Guía de la petición de texto u otros parámetros.

    7. En el campo de petición, escribe una petición para modificar la imagen.

    8. Haz clic en Generar.

    Python

    Para saber cómo instalar o actualizar el SDK de Vertex AI para Python, consulta Instalar el SDK de Vertex AI para Python. Para obtener más información, consulta la documentación de referencia de la API Python.

    
    import vertexai
    from vertexai.preview.vision_models import Image, ImageGenerationModel
    
    # TODO(developer): Update and un-comment below lines
    # PROJECT_ID = "your-project-id"
    # input_file = "input-image.png"
    # mask_mode = "background" # 'background', 'foreground', or 'semantic'
    # output_file = "output-image.png"
    # prompt = "beach" # The text prompt describing what you want to see inserted.
    
    vertexai.init(project=PROJECT_ID, location="us-central1")
    
    model = ImageGenerationModel.from_pretrained("imagegeneration@006")
    base_img = Image.load_from_file(location=input_file)
    
    images = model.edit_image(
        base_image=base_img,
        mask_mode=mask_mode,
        prompt=prompt,
        edit_mode="inpainting-insert",
    )
    
    images[0].save(location=output_file, include_generation_parameters=False)
    
    # Optional. View the edited image in a notebook.
    # images[0].show()
    
    print(f"Created output image using {len(images[0]._image_bytes)} bytes")
    # Example response:
    # Created output image using 1234567 bytes
    

    REST

    Para obtener más información sobre las solicitudes de modelos imagegeneration, consulta la referencia de la API de modelos imagegeneration.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu Google Cloud ID de proyecto.
    • LOCATION: la región de tu proyecto. Por ejemplo, us-central1, europe-west2 o asia-northeast3. Para ver una lista de las regiones disponibles, consulta Ubicaciones de la IA generativa en Vertex AI.
    • TEXT_PROMPT: la petición de texto que indica qué imágenes debe generar el modelo. Este campo es obligatorio tanto para generar como para editar.
    • B64_BASE_IMAGE: la imagen base que quieres editar o aumentar de resolución. La imagen debe especificarse como una cadena de bytes codificada en Base64. Tamaño máximo: 10 MB.
    • EDIT_IMAGE_COUNT: número de imágenes editadas. Valor predeterminado: 4.
    • MASK_TYPE: pide al modelo que genere una máscara en lugar de tener que proporcionar una. Por lo tanto, cuando proporciones este parámetro, debes omitir el objeto mask. Valores disponibles:
      • background: genera automáticamente una máscara en todas las regiones, excepto en el objeto, la persona o el sujeto principales de la imagen.
      • foreground: genera automáticamente una máscara para el objeto, la persona o el sujeto principales de la imagen.
      • semantic: usa la segmentación automática para crear un área de máscara para una o varias clases de segmentación. Defina las clases de segmentación con el parámetro classes y los valores class_id correspondientes. Puedes especificar hasta 5 clases. Cuando usas el tipo de máscara semántica, el objeto maskMode debe tener el siguiente aspecto:
        "maskMode": {
          "maskType": "semantic",
          "classes": [class_id1, class_id2]
        }
    • GUIDANCE_SCALE_VALUE: parámetro (entero) que controla el grado de cumplimiento del modelo con la petición de texto. Los valores más altos aumentan la alineación entre la petición de texto y las imágenes generadas, pero pueden comprometer la calidad de la imagen. Valores: 0 - 500. Valor predeterminado: 60.

    Método HTTP y URL:

    POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagegeneration@006:predict

    Cuerpo JSON de la solicitud:

    {
      "instances": [
        {
          "prompt": "TEXT_PROMPT",
          "image": {
            "bytesBase64Encoded": "B64_BASE_IMAGE"
          }
        }
      ],
      "parameters": {
        "sampleCount": EDIT_IMAGE_COUNT,
        "editConfig": {
          "editMode": "inpainting-insert",
          "maskMode": {
            "maskType": "MASK_TYPE"
          },
          "guidanceScale": GUIDANCE_SCALE_VALUE
        }
      }
    }
    

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagegeneration@006:predict"

    PowerShell

    Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/imagegeneration@006:predict" | Select-Object -Expand Content
    La siguiente respuesta de ejemplo corresponde a una solicitud con "sampleCount": 2. La respuesta devuelve dos objetos de predicción con los bytes de la imagen generada codificados en Base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Limitaciones

    En las siguientes secciones se explican las limitaciones de la función de eliminar objetos de Imagen.

    Píxeles modificados

    No se garantiza que los píxeles generados por el modelo que no están en la máscara sean idénticos a los de la entrada y se generan con la resolución del modelo (por ejemplo, 1024x1024). Puede haber cambios muy pequeños en la imagen generada.

    Si quieres que la imagen se conserve perfectamente, te recomendamos que combines la imagen generada con la imagen de entrada mediante la máscara. Por lo general, si la resolución de la imagen de entrada es 2K o superior, es necesario combinar la imagen generada y la imagen de entrada.

    Insertar limitación

    La inserción suele coincidir con el estilo de la imagen base. Sin embargo, es posible que determinadas palabras clave activen resultados que se parezcan a estilos de dibujos animados, aunque tu intención sea crear un resultado fotorrealista.

    Un ejemplo que hemos visto en particular son los colores inexactos. Por ejemplo, si escribes "jirafa amarilla", se suele generar una jirafa de dibujos animados, ya que las jirafas fotorrealistas son marrones y beige. Del mismo modo, es difícil generar colores fotorrealistas, pero poco naturales.

    Siguientes pasos

    Consulta artículos sobre Imagen y otros productos de IA generativa en Vertex AI: