Menyisipkan objek ke dalam gambar menggunakan inpaint

Halaman ini menjelaskan cara menyisipkan objek ke dalam gambar, yang juga disebut inpainting. Imagen di Vertex AI memungkinkan Anda menentukan area mask untuk menyisipkan objek ke dalam gambar. Anda dapat menggunakan mask Anda sendiri, atau Anda dapat membiarkan Imagen di Vertex AI membuat mask untuk Anda.

Contoh penyisipan konten

Dengan inpainting untuk menyisipkan konten, Anda dapat menggunakan gambar dasar, mask gambar, dan perintah teks untuk menambahkan konten ke gambar yang ada.

Input

Gambar dasar* yang akan diedit Area mask yang ditentukan menggunakan alat di konsol Google Cloud Perintah teks
Contoh gambar dasar. Terdapat cairan merah dalam botol kaca dengan irisan lemon di sampingnya dan sedotan yang mencuat. Irisan lemon terlihat di latar depan kiri Gambar dasar botol kaca, sekarang dengan area mask yang ditentukan di
           konsol Cloud stroberi

* Kredit gambar: Alex Lvrs di Unsplash.

Output setelah menentukan area mask di konsol Google Cloud

Screenshot dari hasil edit yang dihasilkan dari gambar botol kaca berisi cairan merah. Dalam screenshot ini, irisan lemon yang sebelumnya berada di
           latar depan gambar diganti dengan dua stroberi tepat di depan
           stoples. Screenshot dari hasil edit yang dihasilkan dari gambar botol kaca berisi cairan merah. Dalam screenshot ini, irisan lemon yang sebelumnya berada di
           latar depan gambar diganti dengan tiga stroberi di sebelah kiri
           stoples. Screenshot dari hasil edit yang dihasilkan dari gambar botol kaca berisi cairan merah. Dalam screenshot ini, irisan lemon yang sebelumnya berada di latar depan gambar diganti dengan dua stroberi, sedikit di depan dan di sebelah kiri toples.

Melihat kartu model Imagen untuk Pengeditan dan Penyesuaian

Sebelum memulai

  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. Siapkan autentikasi untuk lingkungan Anda.

    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

    Untuk menggunakan contoh Java di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

    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.

    Untuk mengetahui informasi selengkapnya, lihat Menyiapkan ADC untuk lingkungan pengembangan lokal dalam dokumentasi autentikasi Google Cloud .

    Node.js

    Untuk menggunakan contoh Node.js di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

    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.

    Untuk mengetahui informasi selengkapnya, lihat Menyiapkan ADC untuk lingkungan pengembangan lokal dalam dokumentasi autentikasi Google Cloud .

    Python

    Untuk menggunakan contoh Python di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

    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.

    Untuk mengetahui informasi selengkapnya, lihat Menyiapkan ADC untuk lingkungan pengembangan lokal dalam dokumentasi autentikasi Google Cloud .

    REST

    Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke 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.

    Untuk mengetahui informasi selengkapnya, lihat Melakukan autentikasi untuk menggunakan REST dalam dokumentasi autentikasi Google Cloud .

    Menyisipkan dengan area mask yang ditentukan

    Gunakan contoh berikut untuk menentukan inpainting guna menyisipkan konten. Dalam contoh ini, Anda menentukan gambar dasar, perintah teks, dan area mask untuk mengubah gambar dasar.

    Imagen 3

    Gunakan contoh berikut untuk mengirim permintaan inpainting menggunakan model Imagen 3.

    Konsol

    1. Di Google Cloud konsol, buka halaman Vertex AI > Media Studio .

      Buka Media Studio

    2. Klik Upload. Di dialog file yang ditampilkan, pilih file yang akan diupload.
    3. Klik Perbaiki.
    4. Lakukan salah satu hal berikut:

      • Mengupload topeng Anda sendiri:
        1. Buat masker di komputer Anda.
        2. Klik Upload mask. Pada dialog yang ditampilkan, pilih mask yang akan diupload.
      • Tentukan mask Anda: di toolbar pengeditan, gunakan alat mask (kotak, kuas, atau alat inversi masked_transitions) untuk menentukan area yang akan ditambahi konten.
    5. Opsional: Di panel Parameters, sesuaikan opsi berikut:
      • Model: model Imagen yang akan digunakan
      • Jumlah hasil: jumlah hasil yang akan dibuat
      • Perintah negatif: item yang harus dihindari pembuatannya
    6. Pada kolom perintah, masukkan perintah untuk mengubah gambar.
    7. Klik Generate.

    Python

    Instal

    pip install --upgrade google-genai

    Untuk mempelajari lebih lanjut, lihat dokumentasi referensi SDK.

    Tetapkan variabel lingkungan untuk menggunakan Gen AI SDK dengan 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

    Untuk mengetahui informasi selengkapnya, lihat referensi API Edit gambar.

    Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • PROJECT_ID: Google Cloud Project ID Anda.
    • LOCATION: Region project Anda. Misalnya, us-central1, europe-west2, atau asia-northeast3. Untuk mengetahui daftar region yang tersedia, lihat Lokasi AI Generatif di Vertex AI.
    • TEXT_PROMPT: Perintah teks memandu gambar yang dihasilkan model. Saat Anda menggunakan perintah untuk penyisipan inpainting, gunakan deskripsi area yang diberi mask untuk mendapatkan hasil terbaik. Hindari perintah satu kata. Misalnya, gunakan "corgi lucu" bukan "corgi".
    • B64_BASE_IMAGE: Gambar dasar yang akan diedit atau di-upscale. Gambar harus ditentukan sebagai string byte berenkode base64. Batas ukuran: 10 MB.
    • B64_MASK_IMAGE: Gambar hitam putih yang ingin Anda gunakan sebagai lapisan mask untuk mengedit gambar asli. Gambar harus ditentukan sebagai string byte berenkode base64. Batas ukuran: 10 MB.
    • MASK_DILATION - float. Persentase lebar gambar untuk memperlebar masker ini. Nilai 0.01 direkomendasikan untuk mengompensasi mask input yang tidak sempurna.
    • EDIT_STEPS - bilangan bulat. Jumlah langkah pengambilan sampel untuk model dasar. Untuk penyisipan inpainting, mulai dari 35 langkah. Tingkatkan langkah-langkah ke batas atas 75 jika kualitasnya tidak memenuhi persyaratan Anda. Meningkatkan langkah juga akan meningkatkan latensi permintaan.
    • EDIT_IMAGE_COUNT - Jumlah gambar yang diedit. Nilai bilangan bulat yang diterima: 1-4. Nilai default: 4.

    Metode HTTP dan URL:

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

    Isi JSON permintaan:

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

    Untuk mengirim permintaan Anda, pilih salah satu opsi berikut:

    curl

    Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

    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

    Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

    $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
    Contoh respons berikut adalah untuk permintaan dengan "sampleCount": 2. Respons ini menampilkan dua objek prediksi, dengan byte gambar yang dihasilkan berenkode base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Imagen 2

    Gunakan contoh berikut untuk mengirim permintaan inpainting menggunakan model Imagen 2.

    Konsol

    1. Di Google Cloud konsol, buka halaman Vertex AI > Media Studio .

      Buka Media Studio

    2. Klik Upload. Di dialog file yang ditampilkan, pilih file yang akan diupload.
    3. Klik Perbaiki.
    4. Lakukan salah satu hal berikut:

      • Mengupload topeng Anda sendiri:
        1. Buat masker di komputer Anda.
        2. Klik Upload mask. Pada dialog yang ditampilkan, pilih mask yang akan diupload.
      • Tentukan mask Anda: di toolbar pengeditan, gunakan alat mask (kotak, kuas, atau alat inversi masked_transitions) untuk menentukan area yang akan ditambahi konten.
    5. Opsional. Di panel Parameter, sesuaikan opsi berikut:
      • Model: model Imagen yang akan digunakan
      • Jumlah hasil: jumlah hasil yang akan dibuat
      • Perintah negatif: item yang harus dihindari pembuatannya
    6. Pada kolom perintah, masukkan perintah baru untuk mengubah gambar.
    7. Klik Generate.

    Python

    Untuk mempelajari cara menginstal atau mengupdate Vertex AI SDK untuk Python, lihat Menginstal Vertex AI SDK untuk Python. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi 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

    Untuk mengetahui informasi selengkapnya tentang permintaan model imagegeneration, lihat referensi API model imagegeneration.

    Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • PROJECT_ID: Google Cloud Project ID Anda.
    • LOCATION: Region project Anda. Misalnya, us-central1, europe-west2, atau asia-northeast3. Untuk mengetahui daftar region yang tersedia, lihat Lokasi AI Generatif di Vertex AI.
    • TEXT_PROMPT: Perintah teks yang memandu gambar yang dihasilkan model. Kolom ini wajib diisi untuk pembuatan dan pengeditan.
    • B64_BASE_IMAGE: Gambar dasar yang akan diedit atau di-upscale. Gambar harus ditentukan sebagai string byte berenkode base64. Batas ukuran: 10 MB.
    • B64_MASK_IMAGE: Gambar hitam putih yang ingin Anda gunakan sebagai lapisan mask untuk mengedit gambar asli. Gambar harus ditentukan sebagai string byte berenkode base64. Batas ukuran: 10 MB.
    • EDIT_IMAGE_COUNT: Jumlah gambar yang diedit. Nilai default: 4.
    • GUIDANCE_SCALE_VALUE: Parameter (bilangan bulat) yang mengontrol seberapa besar model mematuhi perintah teks. Nilai yang lebih besar akan meningkatkan keselarasan antara perintah teks dan gambar yang dihasilkan, tetapi dapat mengurangi kualitas gambar. Nilai: 0 - 500. Default: 60.

    Metode HTTP dan URL:

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

    Isi JSON permintaan:

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

    Untuk mengirim permintaan Anda, pilih salah satu opsi berikut:

    curl

    Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

    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

    Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

    $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
    Contoh respons berikut adalah untuk permintaan dengan "sampleCount": 2. Respons ini menampilkan dua objek prediksi, dengan byte gambar yang dihasilkan berenkode base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Java

    Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai Vertex AI menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi API Java Vertex AI.

    Untuk melakukan autentikasi ke Vertex AI, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

    Dalam contoh ini, Anda menentukan model sebagai bagian dari EndpointName. EndpointName diteruskan ke metode predict yang dipanggil di PredictionServiceClient. Layanan ini menampilkan versi gambar yang telah diedit, yang kemudian disimpan secara lokal.

    Untuk mengetahui informasi selengkapnya tentang versi dan fitur model, lihat Model 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

    Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan memulai Vertex AI menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi API Node.js Vertex AI.

    Untuk melakukan autentikasi ke Vertex AI, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

    Dalam contoh ini, Anda memanggil metode predict pada PredictionServiceClient. Layanan ini menghasilkan gambar yang kemudian disimpan secara lokal. Untuk mengetahui informasi selengkapnya tentang versi dan fitur model, lihat Model 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();

    Menyisipkan dengan deteksi masker otomatis

    Gunakan contoh berikut untuk menentukan inpainting guna menyisipkan konten. Dalam contoh ini, Anda menentukan gambar dasar dan perintah teks. Imagen secara otomatis mendeteksi dan membuat area mask untuk mengubah gambar dasar.

    Imagen 3

    Gunakan contoh berikut untuk mengirim permintaan inpainting menggunakan model Imagen 3.

    Konsol

    1. Di Google Cloud konsol, buka halaman Vertex AI > Media Studio .

      Buka Media Studio

    2. Klik Upload. Di dialog file yang ditampilkan, pilih file yang akan diupload.
    3. Klik Perbaiki.
    4. Di toolbar pengeditan, klik background_replaceEkstrak masker.
    5. Pilih salah satu opsi ekstraksi mask:

      • Elemen latar belakang: mendeteksi elemen latar belakang dan membuat masker di sekitarnya.
      • Elemen latar depan: mendeteksi objek latar depan dan membuat mask di sekitarnya.
      • background_replaceOrang: mendeteksi orang dan membuat mask di sekelilingnya.
    6. Opsional: Di panel Parameters, sesuaikan opsi berikut:
      • Model: model Imagen yang akan digunakan
      • Jumlah hasil: jumlah hasil yang akan dibuat
      • Perintah negatif: item yang harus dihindari pembuatannya
    7. Pada kolom perintah, masukkan perintah baru untuk mengubah gambar.
    8. Klik sendGenerate.

    Python

    Instal

    pip install --upgrade google-genai

    Untuk mempelajari lebih lanjut, lihat dokumentasi referensi SDK.

    Tetapkan variabel lingkungan untuk menggunakan Gen AI SDK dengan 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

    Untuk mengetahui informasi selengkapnya, lihat referensi API Edit gambar.

    Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • PROJECT_ID: Google Cloud Project ID Anda.
    • LOCATION: Region project Anda. Misalnya, us-central1, europe-west2, atau asia-northeast3. Untuk mengetahui daftar region yang tersedia, lihat Lokasi AI Generatif di Vertex AI.
    • TEXT_PROMPT: Perintah teks memandu gambar yang dihasilkan model. Saat Anda menggunakan perintah untuk penyisipan inpainting, gunakan deskripsi area yang diberi mask untuk mendapatkan hasil terbaik. Hindari perintah satu kata. Misalnya, gunakan "corgi lucu" bukan "corgi".
    • B64_BASE_IMAGE: Gambar dasar yang akan diedit atau di-upscale. Gambar harus ditentukan sebagai string byte berenkode base64. Batas ukuran: 10 MB.
    • MASK_MODE - String yang menetapkan jenis pembuatan mask otomatis yang digunakan model. Nilai yang tersedia:
      • MASK_MODE_BACKGROUND: Membuat mask secara otomatis menggunakan segmentasi latar belakang.
      • MASK_MODE_FOREGROUND: Membuat mask secara otomatis menggunakan segmentasi latar depan.
      • MASK_MODE_SEMANTIC: Secara otomatis membuat mask menggunakan segmentasi semantik berdasarkan segmentasi kelas segmentation classes yang Anda tentukan dalam array maskImageConfig.maskClasses. Contoh:
                  "maskImageConfig": {
                    "maskMode": "MASK_MODE_SEMANTIC",
                    "maskClasses": [175, 176], // bicycle, car
                    "dilation": 0.01
                  }
                
    • MASK_DILATION - float. Persentase lebar gambar untuk memperlebar masker ini. Nilai 0.01 direkomendasikan untuk mengompensasi mask input yang tidak sempurna.
    • EDIT_STEPS - bilangan bulat. Jumlah langkah pengambilan sampel untuk model dasar. Untuk penyisipan inpainting, mulai dari 35 langkah. Tingkatkan langkah-langkah ke batas atas 75 jika kualitasnya tidak memenuhi persyaratan Anda. Meningkatkan langkah juga akan meningkatkan latensi permintaan.
    • EDIT_IMAGE_COUNT - Jumlah gambar yang diedit. Nilai bilangan bulat yang diterima: 1-4. Nilai default: 4.

    Metode HTTP dan URL:

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

    Isi JSON permintaan:

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

    Untuk mengirim permintaan Anda, pilih salah satu opsi berikut:

    curl

    Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

    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

    Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

    $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
    Contoh respons berikut adalah untuk permintaan dengan "sampleCount": 2. Respons ini menampilkan dua objek prediksi, dengan byte gambar yang dihasilkan berenkode base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Imagen 2

    Gunakan contoh berikut untuk mengirim permintaan inpainting menggunakan model Imagen 2.

    Konsol

    1. Di Google Cloud konsol, buka halaman Vertex AI > Media Studio .

      Buka Media Studio

    2. Di panel tugas di bagian bawah, klik Edit gambar.

    3. Klik Upload untuk memilih gambar yang disimpan secara lokal yang akan diedit.

    4. Di toolbar pengeditan, klik background_replaceEkstrak.

    5. Pilih salah satu opsi ekstraksi mask:

      • Elemen latar belakang - Mendeteksi elemen latar belakang dan membuat mask di sekitarnya.
      • Elemen latar depan - Mendeteksi objek latar depan dan membuat mask di sekitarnya.
      • background_replaceOrang - Mendeteksi orang dan membuat mask di sekitarnya.
    6. Opsional: Di panel Parameters, sesuaikan Number of results, Negative prompt, Text prompt guidance, atau parameter lainnya.

    7. Pada kolom perintah, masukkan perintah untuk mengubah gambar.

    8. Klik Generate.

    Python

    Untuk mempelajari cara menginstal atau mengupdate Vertex AI SDK untuk Python, lihat Menginstal Vertex AI SDK untuk Python. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi 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

    Untuk mengetahui informasi selengkapnya tentang permintaan model imagegeneration, lihat referensi API model imagegeneration.

    Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • PROJECT_ID: Google Cloud Project ID Anda.
    • LOCATION: Region project Anda. Misalnya, us-central1, europe-west2, atau asia-northeast3. Untuk mengetahui daftar region yang tersedia, lihat Lokasi AI Generatif di Vertex AI.
    • TEXT_PROMPT: Perintah teks yang memandu gambar yang dihasilkan model. Kolom ini wajib diisi untuk pembuatan dan pengeditan.
    • B64_BASE_IMAGE: Gambar dasar yang akan diedit atau di-upscale. Gambar harus ditentukan sebagai string byte berenkode base64. Batas ukuran: 10 MB.
    • EDIT_IMAGE_COUNT: Jumlah gambar yang diedit. Nilai default: 4.
    • MASK_TYPE: Mendorong model untuk membuat mask, sehingga Anda tidak perlu memberikannya. Oleh karena itu, saat memberikan parameter ini, Anda harus menghilangkan objek mask. Nilai yang tersedia:
      • background: Membuat mask secara otomatis ke semua area kecuali objek, orang, atau subjek utama dalam gambar.
      • foreground: Membuat mask secara otomatis untuk objek, orang, atau subjek utama dalam gambar.
      • semantic: Gunakan segmentasi otomatis untuk membuat area mask untuk satu atau beberapa kelas segmentasi. Tetapkan class segmentasi menggunakan parameter classes dan nilai class_id yang sesuai. Anda dapat menentukan hingga 5 kelas. Saat Anda menggunakan jenis masker semantik, objek maskMode akan terlihat seperti berikut:
        "maskMode": {
          "maskType": "semantic",
          "classes": [class_id1, class_id2]
        }
    • GUIDANCE_SCALE_VALUE: Parameter (bilangan bulat) yang mengontrol seberapa besar model mematuhi perintah teks. Nilai yang lebih besar akan meningkatkan keselarasan antara perintah teks dan gambar yang dihasilkan, tetapi dapat mengurangi kualitas gambar. Nilai: 0 - 500. Default: 60.

    Metode HTTP dan URL:

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

    Isi JSON permintaan:

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

    Untuk mengirim permintaan Anda, pilih salah satu opsi berikut:

    curl

    Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

    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

    Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

    $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
    Contoh respons berikut adalah untuk permintaan dengan "sampleCount": 2. Respons ini menampilkan dua objek prediksi, dengan byte gambar yang dihasilkan berenkode base64.
    {
      "predictions": [
        {
          "bytesBase64Encoded": "BASE64_IMG_BYTES",
          "mimeType": "image/png"
        },
        {
          "mimeType": "image/png",
          "bytesBase64Encoded": "BASE64_IMG_BYTES"
        }
      ]
    }
    

    Batasan

    Bagian berikut menjelaskan batasan fitur hapus objek Imagen.

    Piksel yang dimodifikasi

    Piksel yang dibuat oleh model yang tidak ada dalam mask tidak dijamin identik dengan input dan dibuat pada resolusi model (seperti 1024x1024). Perubahan yang sangat kecil mungkin ada pada gambar yang dihasilkan.

    Jika Anda menginginkan pelestarian gambar yang sempurna, sebaiknya gabungkan gambar yang dihasilkan dengan gambar input, menggunakan mask. Biasanya, jika resolusi gambar input adalah 2K atau lebih tinggi, gambar yang dihasilkan dan gambar input harus digabungkan.

    Masukkan batasan

    Sisipan biasanya cocok dengan gaya gambar dasar. Namun, kata kunci tertentu dapat memicu output yang menyerupai gaya kartun, meskipun Anda ingin membuat output fotorealistik.

    Salah satu contoh yang sering kami lihat adalah warna yang tidak akurat. Misalnya, "jerapah kuning" cenderung menghasilkan jerapah kartun, karena jerapah fotorealistik berwarna cokelat dan krem. Demikian pula, warna fotorealistik tetapi tidak alami sulit dibuat.

    Langkah berikutnya

    Baca artikel tentang Imagen dan produk AI Generatif lainnya di Vertex AI: