นำวัตถุออกจากรูปภาพโดยใช้ Imagen


หน้านี้อธิบายวิธีใช้การเติมเต็มภาพโดยใช้ Imagen เพื่อนำวัตถุออกจากรูปภาพ โดยใช้ SDK ของ Firebase AI Logic

การวาดภาพเติมเป็นการแก้ไขตามมาสก์ประเภทหนึ่ง มาสก์คือการซ้อนทับแบบดิจิทัล ที่กำหนดพื้นที่เฉพาะที่คุณต้องการแก้ไข

วิธีการทำงาน: คุณระบุรูปภาพต้นฉบับและรูปภาพที่มาสก์ที่สอดคล้องกัน ซึ่งอาจเป็นรูปภาพที่ระบบสร้างขึ้นโดยอัตโนมัติหรือรูปภาพที่คุณระบุ ซึ่งกำหนดมาสก์เหนือออบเจ็กต์หรือชิ้นงานที่คุณต้องการนำออก นอกจากนี้ คุณยัง ระบุพรอมต์ข้อความที่อธิบายสิ่งที่คุณต้องการนำออก หรือ โมเดลสามารถตรวจหาออบเจ็กต์ที่จะนำออกได้อย่างชาญฉลาด จากนั้นโมเดลจะ นำออบเจ็กต์ออกและเติมพื้นที่ด้วยเนื้อหาใหม่ที่เหมาะสมตามบริบท

เช่น คุณสามารถมาสก์ลูกบอลและแทนที่ด้วยผนังเปล่าหรือสนามหญ้า ได้

ข้ามไปยังโค้ดสำหรับมาสก์ที่สร้างขึ้นโดยอัตโนมัติ ข้ามไปยังโค้ดสำหรับการระบุมาสก์

ก่อนเริ่มต้น

ใช้ได้เมื่อใช้ Vertex AI Gemini API เป็นผู้ให้บริการ API เท่านั้น

หากยังไม่ได้ดำเนินการ ให้ทำตามคู่มือเริ่มต้นใช้งาน ซึ่งอธิบายวิธีตั้งค่าโปรเจ็กต์ Firebase, เชื่อมต่อแอปกับ Firebase, เพิ่ม SDK, เริ่มต้นบริการแบ็กเอนด์สำหรับผู้ให้บริการ API ที่เลือก และสร้างอินสแตนซ์ ImagenModel

รุ่นที่รองรับความสามารถนี้

Imagen มีฟีเจอร์แก้ไขรูปภาพผ่านโมเดล capability ดังนี้

  • imagen-3.0-capability-001

โปรดทราบว่าโมเดล Imagen global ไม่รองรับตำแหน่ง

นำวัตถุออกโดยใช้มาสก์ที่สร้างขึ้นโดยอัตโนมัติ

ก่อนที่จะลองใช้ตัวอย่างนี้ ให้ทำส่วน ก่อนเริ่มต้นของคู่มือนี้ เพื่อตั้งค่าโปรเจ็กต์และแอป

ตัวอย่างต่อไปนี้แสดงวิธีใช้การวาดภาพเติมเพื่อนำเนื้อหาออกจากรูปภาพโดยใช้การสร้างมาสก์อัตโนมัติ คุณระบุรูปภาพต้นฉบับและพรอมต์ข้อความ แล้ว Imagen จะตรวจหาและสร้างพื้นที่มาสก์เพื่อแก้ไขรูปภาพต้นฉบับโดยอัตโนมัติ

Swift

Swift ไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาดูอีกครั้งในปลายปีนี้

Kotlin

หากต้องการนำออบเจ็กต์ที่มีมาสก์ที่สร้างขึ้นโดยอัตโนมัติออก ให้ระบุ ImagenBackgroundMask ใช้ editImage() และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.INPAINT_REMOVAL

// Using this SDK to access Imagen models is a Preview release and requires opt-in
@OptIn(PublicPreviewAPI::class)
suspend fun customizeImage() {
    // Initialize the Vertex AI Gemini API backend service
    // Optionally specify the location to access the model (for example, `us-central1`)
    val ai = Firebase.ai(backend = GenerativeBackend.vertexAI(location = "us-central1"))

    // Create an `ImagenModel` instance with an Imagen "capability" model
    val model = ai.imagenModel("imagen-3.0-capability-001")

    // This example assumes 'originalImage' is a pre-loaded Bitmap.
    // In a real app, this might come from the user's device or a URL.
    val originalImage: Bitmap = TODO("Load your original image Bitmap here")

    // Provide the prompt describing the content to be removed.
    val prompt = "ball"

    // Use the editImage API to remove the unwanted content.
    // Pass the original image, the prompt, and an editing configuration.
    val editedImage = model.editImage(
        referenceImages = listOf(
            ImagenRawImage(originalImage.toImagenInlineImage()),
            ImagenBackgroundMask(), // Use ImagenBackgroundMask() to auto-generate the mask.
        ),
        prompt = prompt,
        // Define the editing configuration for inpainting and insertion.
        config = ImagenEditingConfig(ImagenEditMode.INPAINT_REMOVAL)
    )

    // Process the resulting 'editedImage' Bitmap, for example, by displaying it in an ImageView.
}

Java

หากต้องการนำออบเจ็กต์ที่มีมาสก์ที่สร้างขึ้นโดยอัตโนมัติออก ให้ระบุ ImagenBackgroundMask ใช้ editImage() และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.INPAINT_REMOVAL

// Initialize the Vertex AI Gemini API backend service
// Optionally specify the location to access the model (for example, `us-central1`)
// Create an `ImagenModel` instance with an Imagen "capability" model
ImagenModel imagenModel = FirebaseAI.getInstance(GenerativeBackend.vertexAI("us-central1"))
        .imagenModel(
                /* modelName */ "imagen-3.0-capability-001");

ImagenModelFutures model = ImagenModelFutures.from(imagenModel);

// This example assumes 'originalImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
Bitmap originalImage = null; // TODO("Load your image Bitmap here");

// Provide the prompt describing the content to be removed.
String prompt = "ball";

// Define the list of sources for the editImage call.
// This includes the original image and the auto-generated mask.
ImagenRawImage rawOriginalImage =
    new ImagenRawImage(ImagenInlineImageKt.toImagenInlineImage(originalImage));
// Use ImagenBackgroundMask() to auto-generate the mask.
ImagenBackgroundMask rawMaskedImage = new ImagenBackgroundMask();

ImagenEditingConfig config = new ImagenEditingConfig();

// Use the editImage API to remove the unwanted content.
// Pass the original image, the auto-generated masked image, the prompt, and an editing configuration.
Futures.addCallback(model.editImage(Arrays.asList(rawOriginalImage, rawMaskedImage), prompt, config),
    new FutureCallback<ImagenGenerationResponse>() {
        @Override
        public void onSuccess(ImagenGenerationResponse result) {
            if (result.getImages().isEmpty()) {
                Log.d("ImageEditor", "No images generated");
            }
            Bitmap editedImage = ((ImagenInlineImage) result.getImages().get(0)).asBitmap();
            // Process and use the bitmap to display the image in your UI
        }

        @Override
        public void onFailure(Throwable t) {
            // ...
        }
    }, Executors.newSingleThreadExecutor());

Web

แอปบนเว็บไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาดูอีกครั้งในปลายปีนี้

Dart

หากต้องการนำออบเจ็กต์ที่มีมาสก์ที่สร้างขึ้นโดยอัตโนมัติออก ให้ระบุ ImagenBackgroundMask ใช้ editImage() และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.inpaintRemoval

import 'dart:typed_data';
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';

// Initialize FirebaseApp
await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);

// Initialize the Vertex AI Gemini API backend service
// Optionally specify a location to access the model (for example, `us-central1`)
final ai = FirebaseAI.vertexAI(location: 'us-central1');

// Create an `ImagenModel` instance with an Imagen "capability" model
final model = ai.imagenModel(model: 'imagen-3.0-capability-001');

TODO - FLUTTER// This example assumes 'originalImage' is a pre-loaded Uint8List.
// In a real app, this might come from the user's device or a URL.
final Uint8List originalImage = Uint8List(0); // TODO: Load your original image data here.

// Provide the prompt describing the content to be removed.
final prompt = 'ball';

try {
  // Use the editImage API to remove the unwanted content.
  // Pass the original image, the prompt, and an editing configuration.
  final response = await model.editImage(
    sources: [
      ImagenRawImage(originalImage),
      ImagenBackgroundMask(),  // Use ImagenBackgroundMask() to auto-generate the mask.
    ],
    prompt,
    // Define the editing configuration for inpainting and removal.
    config: const ImagenEditingConfig(
      editMode: ImagenEditMode.inpaintRemoval,
    ),
  );

  // Process the result.
  if (response.images.isNotEmpty) {
    final editedImage = response.images.first.bytes;
    // Use the editedImage (a Uint8List) to display the image, save it, etc.
    print('Image successfully generated!');
  } else {
    // Handle the case where no images were generated.
    print('Error: No images were generated.');
  }
} catch (e) {
  // Handle any potential errors during the API call.
  print('An error occurred: $e');
}

Unity

Unity ไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาดูอีกครั้งในปลายปีนี้

นำออบเจ็กต์ออกโดยใช้มาสก์ที่ให้ไว้

ก่อนที่จะลองใช้ตัวอย่างนี้ ให้ทำส่วน ก่อนเริ่มต้นของคู่มือนี้ เพื่อตั้งค่าโปรเจ็กต์และแอป

ตัวอย่างต่อไปนี้แสดงวิธีใช้การลบส่วนที่ไม่ต้องการออกจากรูปภาพเพื่อนำเนื้อหาออกจากรูปภาพ โดยใช้มาสก์ที่กำหนดไว้ในรูปภาพที่คุณระบุ คุณระบุรูปภาพต้นฉบับ พรอมต์ข้อความ และรูปภาพที่มาสก์

การระบุพรอมต์ข้อความเป็นทางเลือกหากคุณระบุรูปภาพที่มาสก์ Imagen สามารถตรวจจับออบเจ็กต์ที่จะนำออกจากพื้นที่ที่มาสก์ได้อย่างชาญฉลาด อย่างไรก็ตาม หากวัตถุที่ต้องการนำออกไม่ชัดเจน หรือคุณต้องการนำออกเฉพาะวัตถุบางอย่างในพื้นที่ที่มาสก์ไว้ ให้ระบุพรอมต์ข้อความเพื่อช่วยโมเดลนำวัตถุที่ถูกต้องออก

Swift

Swift ไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาดูอีกครั้งในปลายปีนี้

Kotlin

หากต้องการนำออบเจ็กต์ออกและระบุรูปภาพที่มาสก์ของคุณเอง ให้ระบุ ImagenRawMask พร้อมรูปภาพที่มาสก์ ใช้ editImage() และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.INPAINT_REMOVAL

// Using this SDK to access Imagen models is a Preview release and requires opt-in
@OptIn(PublicPreviewAPI::class)
suspend fun customizeImage() {
    // Initialize the Vertex AI Gemini API backend service
    // Optionally specify the location to access the model (for example, `us-central1`)
    val ai = Firebase.ai(backend = GenerativeBackend.vertexAI(location = "us-central1"))

    // Create an `ImagenModel` instance with an Imagen "capability" model
    val model = ai.imagenModel("imagen-3.0-capability-001")

    // This example assumes 'originalImage' is a pre-loaded Bitmap.
    // In a real app, this might come from the user's device or a URL.
    val originalImage: Bitmap = TODO("Load your original image Bitmap here")

    // This example assumes 'maskImage' is a pre-loaded Bitmap that contains the masked area.
    // In a real app, this might come from the user's device or a URL.
    val maskImage: Bitmap = TODO("Load your masked image Bitmap here")

    // Provide the prompt describing the content to be removed.
    val prompt = "ball"

    // Use the editImage API to remove the unwanted content.
    // Pass the original image, the masked image, the prompt, and an editing configuration.
    val editedImage = model.editImage(
        referenceImages = listOf(
            ImagenRawImage(originalImage.toImagenInlineImage()),
            ImagenRawMask(maskImage.toImagenInlineImage()), // Use ImagenRawMask() to provide your own masked image.
        ),
        prompt = prompt,
        // Define the editing configuration for inpainting and removal.
        config = ImagenEditingConfig(ImagenEditMode.INPAINT_REMOVAL)
    )

    // Process the resulting 'editedImage' Bitmap, for example, by displaying it in an ImageView.
}

Java

หากต้องการนำออบเจ็กต์ออกและระบุรูปภาพที่มาสก์ของคุณเอง ให้ระบุ ImagenRawMask พร้อมรูปภาพที่มาสก์ ใช้ editImage() และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.INPAINT_REMOVAL

// Initialize the Vertex AI Gemini API backend service
// Optionally specify the location to access the model (for example, `us-central1`)
// Create an `ImagenModel` instance with an Imagen "capability" model
ImagenModel imagenModel = FirebaseAI.getInstance(GenerativeBackend.vertexAI("us-central1"))
        .imagenModel(
                /* modelName */ "imagen-3.0-capability-001");

ImagenModelFutures model = ImagenModelFutures.from(imagenModel);

// This example assumes 'originalImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
Bitmap originalImage = null; // TODO("Load your original image Bitmap here");

// This example assumes 'maskImage' is a pre-loaded Bitmap that contains the masked area.
// In a real app, this might come from the user's device or a URL.
Bitmap maskImage = null; // TODO("Load your masked image Bitmap here");

// Provide the prompt describing the content to be removed.
String prompt = "ball";

// Define the list of source images for the editImage call.
ImagenRawImage rawOriginalImage =
    new ImagenRawImage(ImagenInlineImageKt.toImagenInlineImage(originalImage));
 // Use ImagenRawMask() to provide your own masked image.
ImagenBackgroundMask rawMaskedImage =
    new ImagenRawMask(ImagenInlineImageKt.toImagenInlineImage(maskImage));

ImagenEditingConfig config = new ImagenEditingConfig();

// Use the editImage API to remove the unwanted content.
// Pass the original image, the masked image, the prompt, and an editing configuration.
Futures.addCallback(model.editImage(Arrays.asList(rawOriginalImage, rawMaskedImage), prompt, config),
    new FutureCallback<ImagenGenerationResponse>() {
        @Override
        public void onSuccess(ImagenGenerationResponse result) {
            if (result.getImages().isEmpty()) {
                Log.d("ImageEditor", "No images generated");
            }
            Bitmap editedImage = ((ImagenInlineImage) result.getImages().get(0)).asBitmap();
            // Process and use the bitmap to display the image in your UI
        }

        @Override
        public void onFailure(Throwable t) {
            // ...
        }
    }, Executors.newSingleThreadExecutor());

Web

แอปบนเว็บไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาดูอีกครั้งในปลายปีนี้

Dart

หากต้องการนำออบเจ็กต์ออกและระบุรูปภาพที่มาสก์ของคุณเอง ให้ระบุ ImagenRawMask พร้อมรูปภาพที่มาสก์ ใช้ editImage() และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.inpaintRemoval

import 'dart:typed_data';
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';

// Initialize FirebaseApp
await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);

// Initialize the Vertex AI Gemini API backend service
// Optionally specify a location to access the model (for example, `us-central1`)
final ai = FirebaseAI.vertexAI(location: 'us-central1');

// Create an `ImagenModel` instance with an Imagen "capability" model
final model = ai.imagenModel(model: 'imagen-3.0-capability-001');

// This example assumes 'originalImage' is a pre-loaded Uint8List.
// In a real app, this might come from the user's device or a URL.
final Uint8List originalImage = Uint8List(0); // TODO: Load your original image data here.

// This example assumes 'maskImage' is a pre-loaded Uint8List that contains the masked area.
// In a real app, this might come from the user's device or a URL.
final Uint8List maskImage = Uint8List(0); // TODO: Load your masked image data here.

// Provide the prompt describing the content to be removed.
final prompt = 'ball';

try {
  // Use the editImage API to remove the unwanted content.
  // Pass the original image, the prompt, and an editing configuration.
  final response = await model.editImage(
    sources: [
      ImagenRawImage(originalImage),
      ImagenRawMask(maskImage), // Use ImagenRawMask() to provide your own masked image.
    ],
    prompt: prompt,
    // Define the editing configuration for inpainting and removal.
    config: const ImagenEditingConfig(
      editMode: ImagenEditMode.inpaintRemoval,
    ),
  );

  // Process the result.
  if (response.images.isNotEmpty) {
    final editedImage = response.images.first.bytes;
    // Use the editedImage (a Uint8List) to display the image, save it, etc.
    print('Image successfully generated!');
  } else {
    // Handle the case where no images were generated.
    print('Error: No images were generated.');
  }
} catch (e) {
  // Handle any potential errors during the API call.
  print('An error occurred: $e');
}

Unity

Unity ไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาดูอีกครั้งในปลายปีนี้

แนวทางปฏิบัติแนะนำและข้อจำกัด

เราขอแนะนำให้ขยายมาสก์เมื่อแก้ไขรูปภาพ ซึ่งจะช่วยให้ขอบของการแก้ไขเรียบเนียนขึ้นและดูสมจริงยิ่งขึ้น โดยทั่วไป เราขอแนะนำให้ใช้ค่าการขยาย ที่ 1% หรือ 2% (0.01 หรือ 0.02)


แสดงความคิดเห็น เกี่ยวกับประสบการณ์การใช้งาน Firebase AI Logic