Insérer des objets dans une image à l'aide de l'inpainting

Cette page décrit l'insertion d'objets dans une image, également appelée inpainting. Imagen sur Vertex AI vous permet de spécifier une zone de masque pour insérer des objets dans une image. Vous pouvez fournir votre propre masque ou laisser Imagen sur Vertex AI en générer un.

Exemple d'insertion de contenu

Avec l'insertion de contenu par inpainting, vous pouvez utiliser une image de base, un masque d'image et un prompt textuel pour ajouter du contenu à une image existante.

Entrées

Image de base* à modifier Zone de masque spécifiée à l'aide d'outils de la console Google Cloud Requête textuelle
Exemple d'image de base. Un bocal en verre contient un liquide rouge avec une tranche de citron sur le côté et une paille qui dépasse. Des tranches de citron sont visibles au premier plan à gauche. Image de base d'un bocal en verre, avec une zone de masque spécifiée dans la console Cloud fraises

Crédit image : Alex Lvrs sur Unsplash.

Sortie après avoir spécifié une zone de masque dans la console Google Cloud

Capture d'écran d'une modification générée d'un bocal en verre contenant un liquide rouge. Dans cette capture d'écran, les tranches de citron qui se trouvaient auparavant au premier plan de l'image sont remplacées par deux fraises placées directement devant le bocal. Capture d'écran d'une modification générée d'un bocal en verre contenant un liquide rouge. Sur cette capture d'écran, les tranches de citron qui se trouvaient au premier plan de l'image ont été remplacées par trois fraises juste à gauche du bocal. Capture d'écran d'une modification générée d'un bocal en verre contenant un liquide rouge. Dans cette capture d'écran, les tranches de citron qui se trouvaient auparavant au premier plan de l'image sont remplacées par deux fraises, légèrement devant et à gauche du bocal.

Afficher la fiche de modèle Imagen pour la modification et la personnalisation

Avant de commencer

  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.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Vertex AI API.

    Enable the API

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

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Vertex AI API.

    Enable the API

  8. Configurez l'authentification pour votre environnement.

    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

    Pour utiliser les exemples Java de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Install the Google Cloud CLI.

    2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. To initialize the gcloud CLI, run the following command:

      gcloud init
    4. 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.

    Pour en savoir plus, consultez Configurer les ADC pour un environnement de développement local dans la documentation sur l'authentification Google Cloud .

    Node.js

    Pour utiliser les exemples Node.js de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Install the Google Cloud CLI.

    2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. To initialize the gcloud CLI, run the following command:

      gcloud init
    4. 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.

    Pour en savoir plus, consultez Configurer les ADC pour un environnement de développement local dans la documentation sur l'authentification Google Cloud .

    Python

    Pour utiliser les exemples Python de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Install the Google Cloud CLI.

    2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. To initialize the gcloud CLI, run the following command:

      gcloud init
    4. 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.

    Pour en savoir plus, consultez Configurer les ADC pour un environnement de développement local dans la documentation sur l'authentification Google Cloud .

    REST

    Pour utiliser les exemples d'API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à gcloud CLI.

      After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    Pour en savoir plus, consultez la section S'authentifier pour utiliser REST dans la documentation sur l'authentification Google Cloud .

    Insérer avec une zone de masque définie

    Utilisez les exemples suivants pour insérer du contenu par inpainting. Dans ces exemples, vous spécifiez une image de base, un prompt textuel et une zone de masque afin de modifier l'image de base.

    Imagen 3

    Utilisez les exemples suivants pour envoyer une requête d'inpainting à l'aide du modèle Imagen 3.

    Console

    1. Dans la console Google Cloud , accédez à la page Vertex AI>Media Studio .

      Accéder à Media Studio

    2. Cliquez sur Importer. Dans la boîte de dialogue de sélection de fichier qui s'affiche, sélectionnez un fichier à importer.
    3. Cliquez sur Inpaint.
    4. Effectuez l'une des opérations suivantes :

      • Importer votre propre masque :
        1. Créez un masque sur votre ordinateur.
        2. Cliquez sur Importer un masque. Dans la boîte de dialogue qui s'affiche, sélectionnez un masque à importer.
      • Définissez votre masque : dans la barre d'outils de modification, utilisez les outils de masque ( Zone,  Pinceau ou masked_transitions Inversion) pour spécifier la ou les zones dans lesquelles vous souhaitez ajouter du contenu.
    5. Facultatif : Dans le panneau Paramètres, ajustez les options suivantes :
      • Modèle : modèle Imagen à utiliser
      • Nombre de résultats : nombre de résultats à générer
      • Requête négative : éléments à ne pas générer
    6. Dans le champ de requête, saisissez une requête pour modifier l'image.
    7. Cliquez sur Générer.

    Python

    Installer

    pip install --upgrade google-genai

    Pour en savoir plus, lisez la documentation de référence du SDK.

    Définissez les variables d'environnement pour utiliser le SDK Gen AI avec 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

    Pour en savoir plus, consultez la documentation de référence de l'API Modifier des images.

    Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

    • PROJECT_ID : ID de votre projet Google Cloud .
    • LOCATION : région de votre projet (us-central1, europe-west2 ou asia-northeast3, par exemple). Pour obtenir la liste des régions disponibles, consultez IA générative sur les emplacements Vertex AI.
    • TEXT_PROMPT : prompt textuel qui guide le modèle pour la génération d'images. Lorsque vous utilisez un prompt pour une insertion par inpainting, décrivez la zone de masque pour obtenir de meilleurs résultats. Évitez les prompts à un seul mot. Par exemple, saisissez un corgi mignon au lieu de corgi.
    • B64_BASE_IMAGE : image de base à modifier ou à améliorer. L'image doit être spécifiée en tant que chaîne d'octets encodés en base64. Limite de taille : 10 Mo.
    • B64_MASK_IMAGE : image en noir et blanc que vous souhaitez utiliser comme calque de masque pour modifier l'image d'origine. L'image doit être spécifiée en tant que chaîne d'octets encodés en base64. Limite de taille : 10 Mo.
    • MASK_DILATION : float. Pourcentage de la largeur de l'image à utiliser pour dilater ce masque. Nous vous recommandons de définir 0.01 comme valeur pour compenser les masques d'entrée imparfaits.
    • EDIT_STEPS : entier. Nombre d'étapes d'échantillonnage pour le modèle de base. Pour effectuer une insertion par inpainting, commencez avec 35 étapes. Augmentez le nombre d'étapes jusqu'à la limite maximale de 75 si la qualité ne répond pas à vos exigences. L'augmentation du nombre d'étapes augmente également la latence des requêtes.
    • EDIT_IMAGE_COUNT : nombre d'images modifiées. Valeurs entières acceptées : 1 à 4. Valeur par défaut : 4.

    Méthode HTTP et URL :

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

    Corps JSON de la requête :

    {
      "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
      }
    }
    

    Pour envoyer votre requête, choisissez l'une des options suivantes :

    curl

    Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

    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

    Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

    $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
    L'exemple suivant représente la réponse à une requête avec "sampleCount": 2. La réponse renvoie deux objets de prédiction, avec les octets de l'image générée encodés en base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Imagen 2

    Utilisez les exemples suivants pour envoyer une requête d'inpainting à l'aide du modèle Imagen 2.

    Console

    1. Dans la console Google Cloud , accédez à la page Vertex AI>Media Studio .

      Accéder à Media Studio

    2. Cliquez sur Importer. Dans la boîte de dialogue de sélection de fichier qui s'affiche, sélectionnez un fichier à importer.
    3. Cliquez sur Inpaint.
    4. Effectuez l'une des opérations suivantes :

      • Importer votre propre masque :
        1. Créez un masque sur votre ordinateur.
        2. Cliquez sur Importer un masque. Dans la boîte de dialogue qui s'affiche, sélectionnez un masque à importer.
      • Définissez votre masque : dans la barre d'outils de modification, utilisez les outils de masque ( Zone,  Pinceau ou masked_transitions Inversion) pour spécifier la ou les zones dans lesquelles vous souhaitez ajouter du contenu.
    5. Facultatif. Dans le panneau Paramètres, ajustez les options suivantes :
      • Modèle : modèle Imagen à utiliser
      • Nombre de résultats : nombre de résultats à générer
      • Requête négative : éléments à ne pas générer
    6. Dans le champ du prompt, saisissez un prompt pour modifier l'image.
    7. Cliquez sur Générer.

    Python

    Pour savoir comment installer ou mettre à jour le SDK Vertex AI pour Python, consultez la section Installer le SDK Vertex AI pour Python. Pour en savoir plus, consultez la documentation de référence de l'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

    Pour en savoir plus sur les requêtes envoyées au modèle imagegeneration, consultez la documentation de référence de l'API du modèle imagegeneration.

    Avant d'utiliser les données de requête, effectuez les remplacements suivants :

    • PROJECT_ID : ID de votre projet Google Cloud .
    • LOCATION : région de votre projet (us-central1, europe-west2 ou asia-northeast3, par exemple). Pour obtenir la liste des régions disponibles, consultez IA générative sur les emplacements Vertex AI.
    • TEXT_PROMPT : prompt textuel qui guide le modèle pour la génération d'images. Ce champ est obligatoire pour la génération et la modification.
    • B64_BASE_IMAGE : image de base à modifier ou à améliorer. L'image doit être spécifiée en tant que chaîne d'octets encodés en base64. Limite de taille : 10 Mo.
    • B64_MASK_IMAGE : image en noir et blanc que vous souhaitez utiliser comme calque de masque pour modifier l'image d'origine. L'image doit être spécifiée en tant que chaîne d'octets encodés en base64. Limite de taille : 10 Mo.
    • EDIT_IMAGE_COUNT : nombre d'images modifiées. Valeur par défaut : 4.
    • GUIDANCE_SCALE_VALUE : paramètre (entier) qui contrôle dans quelle mesure le modèle respecte le prompt textuel. Les valeurs plus grandes améliorent la correspondance entre le prompt textuel et les images générées, mais peuvent affecter la qualité des images. Valeurs : 0 à 500. Par défaut : 60.

    Méthode HTTP et URL :

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

    Corps JSON de la requête :

    {
      "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
        }
      }
    }
    

    Pour envoyer votre requête, choisissez l'une des options suivantes :

    curl

    Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

    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

    Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

    $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
    L'exemple suivant représente la réponse à une requête avec "sampleCount": 2. La réponse renvoie deux objets de prédiction, avec les octets d'image générés encodés en base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Java

    Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le guide de démarrage rapide de Vertex AI sur l'utilisation des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vertex AI Java.

    Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

    Dans cet exemple, vous spécifiez le modèle dans EndpointName. EndpointName est transmis à la méthode predict, qui est appelée sur un PredictionServiceClient. Le service renvoie une version modifiée de l'image, qui est ensuite enregistrée localement.

    Pour en savoir plus sur les versions et les fonctionnalités des modèles, consultez Modèles 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

    Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js décrites dans le guide de démarrage rapide de Vertex AI sur l'utilisation des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vertex AI Node.js.

    Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

    Dans cet exemple, vous appelez la méthode predict sur un PredictionServiceClient. Le service génère des images qui sont ensuite enregistrées localement. Pour en savoir plus sur les versions et les fonctionnalités des modèles, consultez Modèles 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();

    Insérer avec la détection automatique de masque

    Utilisez les exemples suivants pour insérer du contenu par inpainting. Dans ces exemples, vous spécifiez une image de base et un prompt textuel. Imagen détecte et crée automatiquement une zone de masque pour modifier l'image de base.

    Imagen 3

    Utilisez les exemples suivants pour envoyer une requête d'inpainting à l'aide du modèle Imagen 3.

    Console

    1. Dans la console Google Cloud , accédez à la page Vertex AI>Media Studio .

      Accéder à Media Studio

    2. Cliquez sur Importer. Dans la boîte de dialogue de sélection de fichier qui s'affiche, sélectionnez un fichier à importer.
    3. Cliquez sur Inpaint.
    4. Dans la barre d'outils de modification, cliquez sur background_replaceExtraire le masque.
    5. Sélectionnez l'une des options d'extraction de masque :

      • Éléments d'arrière-plan : détecte les éléments d'arrière-plan et crée un masque autour de ces éléments.
      • Éléments de premier plan : détecte les objets au premier plan et crée un masque autour d'eux.
      • background_replacePersonnes : détecte les personnes et crée un masque autour d'elles.
    6. Facultatif : Dans le panneau Paramètres, ajustez les options suivantes :
      • Modèle : modèle Imagen à utiliser
      • Nombre de résultats : nombre de résultats à générer
      • Requête négative : éléments à ne pas générer
    7. Dans le champ du prompt, saisissez un prompt pour modifier l'image.
    8. Cliquez sur sendGénérer.

    Python

    Installer

    pip install --upgrade google-genai

    Pour en savoir plus, lisez la documentation de référence du SDK.

    Définissez les variables d'environnement pour utiliser le SDK Gen AI avec 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

    Pour en savoir plus, consultez la documentation de référence de l'API Modifier des images.

    Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

    • PROJECT_ID : ID de votre projet Google Cloud .
    • LOCATION : région de votre projet (us-central1, europe-west2 ou asia-northeast3, par exemple). Pour obtenir la liste des régions disponibles, consultez IA générative sur les emplacements Vertex AI.
    • TEXT_PROMPT : prompt textuel qui guide le modèle pour la génération d'images. Lorsque vous utilisez un prompt pour une insertion par inpainting, décrivez la zone de masque pour obtenir de meilleurs résultats. Évitez les prompts à un seul mot. Par exemple, saisissez un corgi mignon au lieu de corgi.
    • B64_BASE_IMAGE : image de base à modifier ou à améliorer. L'image doit être spécifiée en tant que chaîne d'octets encodés en base64. Limite de taille : 10 Mo.
    • MASK_MODE : chaîne qui définit le type de création automatique de masque utilisé par le modèle. Valeurs disponibles :
      • MASK_MODE_BACKGROUND : génère automatiquement un masque à l'aide de la segmentation de l'arrière-plan.
      • MASK_MODE_FOREGROUND : génère automatiquement un masque à l'aide de la segmentation du premier plan.
      • MASK_MODE_SEMANTIC : génère automatiquement un masque à l'aide d'une segmentation sémantique basée sur les classes de segmentation que vous spécifiez dans le tableau maskImageConfig.maskClasses. Par exemple :
                  "maskImageConfig": {
                    "maskMode": "MASK_MODE_SEMANTIC",
                    "maskClasses": [175, 176], // bicycle, car
                    "dilation": 0.01
                  }
                
    • MASK_DILATION : float. Pourcentage de la largeur de l'image à utiliser pour dilater ce masque. Nous vous recommandons de définir 0.01 comme valeur pour compenser les masques d'entrée imparfaits.
    • EDIT_STEPS : entier. Nombre d'étapes d'échantillonnage pour le modèle de base. Pour effectuer une insertion par inpainting, commencez avec 35 étapes. Augmentez le nombre d'étapes jusqu'à la limite maximale de 75 si la qualité ne répond pas à vos exigences. L'augmentation du nombre d'étapes augmente également la latence des requêtes.
    • EDIT_IMAGE_COUNT : nombre d'images modifiées. Valeurs entières acceptées : 1 à 4. Valeur par défaut : 4.

    Méthode HTTP et URL :

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

    Corps JSON de la requête :

    {
      "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
      }
    }
    

    Pour envoyer votre requête, choisissez l'une des options suivantes :

    curl

    Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

    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

    Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

    $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
    L'exemple suivant représente la réponse à une requête avec "sampleCount": 2. La réponse renvoie deux objets de prédiction, avec les octets de l'image générée encodés en base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Imagen 2

    Utilisez les exemples suivants pour envoyer une requête d'inpainting à l'aide du modèle Imagen 2.

    Console

    1. Dans la console Google Cloud , accédez à la page Vertex AI>Media Studio .

      Accéder à Media Studio

    2. Dans le panneau de tâches en bas, cliquez sur  Modifier l'image.

    3. Cliquez sur Importer pour sélectionner l'image stockée localement à modifier.

    4. Dans la barre d'outils de modification, cliquez sur background_replaceExtraire.

    5. Sélectionnez l'une des options d'extraction de masque :

      • Éléments d'arrière-plan : détecte les éléments d'arrière-plan et crée un masque autour d'eux.
      •  Éléments de premier plan : détecte les objets au premier plan et crée un masque autour d'eux.
      • background_replacePersonnes : détecte les personnes et crée un masque autour d'elles.
    6. Facultatif : Dans le panneau Paramètres, ajustez les options Nombre de résultats, Requête négative, Guide de requête textuelle ou d'autres paramètres.

    7. Dans le champ de requête, saisissez une requête pour modifier l'image.

    8. Cliquez sur Générer.

    Python

    Pour savoir comment installer ou mettre à jour le SDK Vertex AI pour Python, consultez la section Installer le SDK Vertex AI pour Python. Pour en savoir plus, consultez la documentation de référence de l'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

    Pour en savoir plus sur les requêtes envoyées au modèle imagegeneration, consultez la documentation de référence de l'API du modèle imagegeneration.

    Avant d'utiliser les données de requête, effectuez les remplacements suivants :

    • PROJECT_ID : ID de votre projet Google Cloud .
    • LOCATION : région de votre projet (us-central1, europe-west2 ou asia-northeast3, par exemple). Pour obtenir la liste des régions disponibles, consultez IA générative sur les emplacements Vertex AI.
    • TEXT_PROMPT : prompt textuel qui guide le modèle pour la génération d'images. Ce champ est obligatoire pour la génération et la modification.
    • B64_BASE_IMAGE : image de base à modifier ou à améliorer. L'image doit être spécifiée en tant que chaîne d'octets encodés en base64. Limite de taille : 10 Mo.
    • EDIT_IMAGE_COUNT : nombre d'images modifiées. Valeur par défaut : 4.
    • MASK_TYPE : demande au modèle de générer un masque (plutôt que vous en fournissiez un). Par conséquent, lorsque vous spécifiez ce paramètre, vous devez omettre l'objet mask. Valeurs disponibles :
      • background : génère automatiquement un masque pour toutes les zones à l'exception de l'objet, de la personne ou du sujet principal de l'image.
      • foreground : génère automatiquement un masque pour l'objet, la personne ou le sujet principaux de l'image.
      • semantic : utilisez la segmentation automatique afin de créer une zone de masque pour une ou plusieurs classes de segmentation. Définissez les classes de segmentation à l'aide du paramètre classes et des valeurs class_id correspondantes. Vous pouvez spécifier jusqu'à cinq classes. Lorsque vous utilisez le type de masque sémantique, l'objet maskMode doit ressembler à ceci :
        "maskMode": {
          "maskType": "semantic",
          "classes": [class_id1, class_id2]
        }
    • GUIDANCE_SCALE_VALUE : paramètre (entier) qui contrôle dans quelle mesure le modèle respecte le prompt textuel. Les valeurs plus grandes améliorent la correspondance entre le prompt textuel et les images générées, mais peuvent affecter la qualité des images. Valeurs : 0 à 500. Par défaut : 60.

    Méthode HTTP et URL :

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

    Corps JSON de la requête :

    {
      "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
        }
      }
    }
    

    Pour envoyer votre requête, choisissez l'une des options suivantes :

    curl

    Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

    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

    Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

    $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
    L'exemple suivant représente la réponse à une requête avec "sampleCount": 2. La réponse renvoie deux objets de prédiction, avec les octets d'image générés encodés en base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Limites

    Les sections suivantes expliquent les limites de la fonctionnalité Supprimer des objets d'Imagen.

    Pixels modifiés

    Les pixels générés par le modèle qui ne se trouvent pas dans le masque ne sont pas garantis d'être identiques à l'entrée et sont générés à la résolution du modèle (par exemple, 1024 x 1024). De très petites modifications peuvent exister dans l'image générée.

    Si vous souhaitez préserver parfaitement l'image, nous vous recommandons de fusionner l'image générée avec l'image d'entrée à l'aide du masque. En règle générale, si la résolution de l'image d'entrée est de 2K ou plus, il est nécessaire de fusionner l'image générée et l'image d'entrée.

    Insérer une limitation

    L'insertion correspond généralement au style de l'image de base. Toutefois, certains mots clés peuvent déclencher des sorties qui ressemblent à des styles de dessins animés, même si vous souhaitez créer une sortie photoréaliste.

    Par exemple, nous avons constaté que les couleurs étaient parfois inexactes. Par exemple, la requête "girafe jaune" a tendance à générer une girafe de dessin animé, car les girafes photoréalistes sont brunes et beiges. De même, il est difficile de générer des couleurs photoréalistes, mais non naturelles.

    Étapes suivantes

    Consultez des articles concernant Imagen et d'autres produits d'IA générative sur Vertex AI :