ปรับแต่งรูปภาพตามการควบคุมโดยใช้ Imagen


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

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

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

ข้ามไปยังโค้ด

ประเภทของรูปภาพอ้างอิงการควบคุม

รูปภาพอ้างอิงสำหรับการปรับแต่งที่ควบคุมได้อาจเป็นรอยขีดเขียน รูปภาพขอบ Canny หรือตาข่ายใบหน้า



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

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

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

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

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

  • imagen-3.0-capability-001

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

ส่งคำขอการปรับแต่งที่ควบคุม

ตัวอย่างต่อไปนี้แสดงคำขอการปรับแต่งที่ควบคุมได้ซึ่งขอให้ โมเดลสร้างรูปภาพใหม่โดยอิงตามรูปภาพอ้างอิงที่ระบุ (ในตัวอย่างนี้ คือภาพวาดอวกาศ เช่น จรวดและดวงจันทร์) เนื่องจากรูปภาพอ้างอิงเป็นภาพร่างหรือโครงร่างที่วาดด้วยมืออย่างคร่าวๆ จึงใช้ประเภทการควบคุม CONTROL_TYPE_SCRIBBLE

หากรูปภาพอ้างอิงเป็นรูปภาพขอบ Canny หรือตาข่ายใบหน้า คุณก็ใช้ตัวอย่างนี้ได้เช่นกัน แต่ต้องมีการเปลี่ยนแปลงต่อไปนี้

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

Swift

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

Kotlin

// 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 'referenceImage' is a pre-loaded Bitmap.
    // In a real app, this might come from the user's device or a URL.
    val referenceImage: Bitmap = TODO("Load your reference image Bitmap here")

    // Define the subject reference using the reference image.
    val controlReference = ImagenControlReference(
        image = referenceImage,
        referenceID = 1,
        controlType = CONTROL_TYPE_SCRIBBLE
    )

    // Provide a prompt that describes the final image.
    // The "[1]" links the prompt to the subject reference with ID 1.
    val prompt = "A cat flying through outer space arranged like the space scribble[1]"

    // Use the editImage API to perform the controlled customization.
    // Pass the list of references, the prompt, and an editing configuration.
    val editedImage = model.editImage(
        references = listOf(controlReference),
        prompt = prompt,
        config = ImagenEditingConfig(
            editSteps = 50 // Number of editing steps, a higher value can improve quality
        )
    )

    // Process the result
}

Java

// 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 'referenceImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
Bitmap referenceImage = null; // TODO("Load your image Bitmap here");

// Define the subject reference using the reference image.
ImagenControlReference controlReference = new ImagenControlReference.Builder()
        .setImage(referenceImage)
        .setReferenceID(1)
        .setControlType(CONTROL_TYPE_SCRIBBLE)
        .build();

// Provide a prompt that describes the final image.
// The "[1]" links the prompt to the subject reference with ID 1.
String prompt = "A cat flying through outer space arranged like the space scribble[1]";

// Define the editing configuration.
ImagenEditingConfig imagenEditingConfig = new ImagenEditingConfig.Builder()
        .setEditSteps(50) // Number of editing steps, a higher value can improve quality
        .build();

// Use the editImage API to perform the controlled customization.
// Pass the list of references, the prompt, and an editing configuration.
Futures.addCallback(model.editImage(Collections.singletonList(controlReference), prompt, imagenEditingConfig), new FutureCallback<ImagenGenerationResponse>() {
    @Override
    public void onSuccess(ImagenGenerationResponse result) {
        if (result.getImages().isEmpty()) {
            Log.d("TAG", "No images generated");
        }
        Bitmap bitmap = result.getImages().get(0).asBitmap();
        // Use the bitmap to display the image in your UI
    }

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

Web

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

Dart

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 'referenceImage' is a pre-loaded Uint8List.
// In a real app, this might come from the user's device or a URL.
final Uint8List referenceImage = Uint8List(0); // TODO: Load your reference image data here

// Define the control reference using the reference image.
final controlReference = ImagenControlReference(
  image: referenceImage,
  referenceId: 1,
    controlType: ImagenControlType.scribble,
);

// Provide a prompt that describes the final image.
// The "[1]" links the prompt to the subject reference with ID 1.
final prompt = "A cat flying through outer space arranged like the space scribble[1]";

try {
  // Use the editImage API to perform the controlled customization.
  // Pass the list of references, the prompt, and an editing configuration.
  final response = await model.editImage(
    [controlReference],
    prompt,
    config: ImagenEditingConfig(
      editSteps: 50, // Number of editing steps, a higher value can improve quality
    ),
  );

  // 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 โปรดกลับมาดูอีกครั้งในปลายปีนี้

เทมเพลตพรอมต์

ในคำขอ คุณจะระบุรูปภาพอ้างอิง (สูงสุด 4 รูป) ได้โดยกำหนด ImagenControlReference ซึ่งคุณจะระบุรหัสอ้างอิงสำหรับรูปภาพ โปรดทราบว่ารูปภาพหลายรูปอาจมีรหัสอ้างอิงเดียวกันได้ (เช่น การขีดเขียนหลายรายการของแนวคิดเดียวกัน)

จากนั้นเมื่อเขียนพรอมต์ ให้อ้างอิงถึงรหัสเหล่านี้ เช่น คุณใช้ [1] ในพรอมต์เพื่ออ้างอิงถึงรูปภาพที่มีรหัสอ้างอิง 1

ตารางต่อไปนี้มีเทมเพลตพรอมต์ที่ใช้เป็นจุดเริ่มต้นในการเขียนพรอมต์เพื่อการปรับแต่งตามการควบคุมได้

กรณีการใช้งาน รูปภาพอ้างอิง เทมเพลตพรอมต์ ตัวอย่าง
การปรับแต่งที่มีการควบคุม วาดแผนที่ (1) สร้างรูปภาพที่สอดคล้องกับscribble map [1] เพื่อให้ตรงกับคำอธิบาย: ${STYLE_PROMPT} ${PROMPT} สร้างรูปภาพที่สอดคล้องกับscribble map [1]เพื่อ ให้ตรงกับคำอธิบาย: รูปภาพควรอยู่ในสไตล์ ภาพวาดสีน้ำมันแบบอิมเพรสชันนิสม์ที่มีรอยแปรงที่ผ่อนคลาย โดยมี บรรยากาศที่สว่างตามธรรมชาติและร่องรอยพู่กันที่เห็นได้ชัด ภาพด้านข้างของ รถยนต์ รถจอดอยู่บนพื้นผิวถนนที่เปียกและสะท้อนแสง โดยมีแสงไฟในเมือง สะท้อนอยู่ในแอ่งน้ำ
การปรับแต่งที่มีการควบคุม รูปภาพการควบคุม Canny (1) สร้างรูปภาพให้สอดคล้องกับedge map [1]เพื่อให้ตรงกับ คำอธิบาย: ${STYLE_PROMPT} ${PROMPT} สร้างรูปภาพที่สอดคล้องกับedge map [1]เพื่อให้ตรงกับ คำอธิบาย: รูปภาพควรอยู่ในสไตล์ภาพวาดสีน้ำมัน แบบอิมเพรสชันนิสม์ โดยมีรอยแปรงที่ผ่อนคลาย โดยมีบรรยากาศที่สว่างตามธรรมชาติ และร่องรอยของพู่กันที่เห็นได้ชัด ภาพด้านข้างของรถยนต์ รถจอดอยู่บนพื้นผิวถนนที่เปียกและสะท้อนแสง โดยมีแสงไฟในเมืองสะท้อนอยู่ใน แอ่งน้ำ
การปรับแต่งรูปภาพบุคคลด้วยอินพุต FaceMesh รูปภาพตัวแบบ (1-3)

รูปภาพควบคุม FaceMesh (1)
สร้างรูปภาพเกี่ยวกับ SUBJECT_DESCRIPTION [1] ในท่าทางของ CONTROL_IMAGE [2] ให้ตรงกับคำอธิบาย: ภาพบุคคลของ SUBJECT_DESCRIPTION [1] ${PROMPT} สร้างรูปภาพเกี่ยวกับa woman with short hair [1]ในท่าทางของcontrol image [2]ให้ตรงกับคำอธิบาย: ภาพบุคคลของa woman with short hair [1] ในสไตล์การ์ตูน 3 มิติที่มีพื้นหลังเบลอ ตัวละครน่ารักน่าเอ็นดูที่มีใบหน้ายิ้มแย้ม มองกล้อง โทนสีพาสเทล ...
การปรับแต่งรูปภาพบุคคลด้วยอินพุต FaceMesh รูปภาพตัวแบบ (1-3)

รูปภาพควบคุม FaceMesh (1)
สร้างรูปภาพ${STYLE_PROMPT}เกี่ยวกับSUBJECT_DESCRIPTION [1]ในท่าทางของCONTROL_IMAGE [2]ให้ตรงกับ คำอธิบาย: ภาพบุคคลของSUBJECT_DESCRIPTION [1] ${PROMPT} สร้างรูปภาพสไตล์การ์ตูน 3 มิติเกี่ยวกับa woman with short hair [1]ในท่าทางของcontrol image [2]ให้ตรงกับ คำอธิบาย: ภาพบุคคลของa woman with short hair [1] ในสไตล์การ์ตูน 3 มิติที่มีพื้นหลังเบลอ ตัวละครน่ารักน่าเอ็นดู มีใบหน้ายิ้มแย้ม มองกล้อง โทนสีพาสเทล ...



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

Use Case

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

เราขอแนะนำให้ใช้ความสามารถนี้สำหรับกรณีการใช้งานที่ต้องการ เนื่องจากเราได้ ฝึกโมเดลในกรณีการใช้งานเหล่านั้นและคาดว่าจะได้ผลลัพธ์ที่ดี ในทางกลับกัน หากคุณพยายามให้โมเดลทําสิ่งต่างๆ นอกเหนือจากกรณีการใช้งานที่ตั้งใจไว้ คุณก็ควรคาดหวังผลลัพธ์ที่ไม่ดี

กรณีการใช้งานที่ตั้งใจไว้

กรณีการใช้งานที่ตั้งใจไว้สำหรับการปรับแต่งตามการควบคุมมีดังนี้

  • สร้างรูปภาพตามพรอมต์และรูปภาพควบคุมขอบ Canny

  • สร้างรูปภาพตามพรอมต์และรูปภาพที่ขีดเขียน

  • ปรับแต่งสไตล์รูปภาพบุคคลโดยคงสีหน้าไว้

ตัวอย่างกรณีการใช้งานที่ไม่พึงประสงค์

ต่อไปนี้เป็นรายการ Use Case โดยสังเขปที่ไม่พึงประสงค์สำหรับการ ปรับแต่งตามการควบคุม โมเดลไม่ได้ผ่านการฝึกสำหรับกรณีการใช้งานเหล่านี้ และมีแนวโน้มที่จะให้ผลลัพธ์ที่ไม่ดี

  • สร้างรูปภาพโดยใช้สไตล์ที่ระบุในพรอมต์

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

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

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

  • ปรับแต่งรูปภาพที่มีคนตั้งแต่ 2 คนขึ้นไป และคงสีหน้าของบุคคลเหล่านั้นไว้

  • จัดรูปแบบรูปภาพสัตว์เลี้ยงและเปลี่ยนให้เป็นภาพวาด คงไว้หรือระบุ องค์ประกอบของรูปภาพ (เช่น สีน้ำ)