หน้านี้อธิบายวิธีใช้ความสามารถในการปรับแต่งจาก 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 หรือตาข่ายใบหน้า คุณก็ใช้ตัวอย่างนี้ได้เช่นกัน แต่ต้องมีการเปลี่ยนแปลงต่อไปนี้
- หากรูปภาพอ้างอิงเป็นรูปภาพขอบ Canny ให้ใช้ประเภทการควบคุม - CONTROL_TYPE_CANNY
- หากรูปภาพอ้างอิงเป็นตาข่ายใบหน้า ให้ใช้ประเภทการควบคุม - CONTROL_TYPE_FACE_MESHการควบคุมนี้ใช้ได้กับ การปรับแต่งเรื่องของบุคคลเท่านั้น
ดูเทมเพลตพรอมต์ในส่วนท้ายของหน้านี้เพื่อดูข้อมูลเกี่ยวกับการเขียนพรอมต์และวิธีใช้รูปภาพอ้างอิงภายในพรอมต์
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(
        referenceImages = 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 = ((ImagenInlineImage) 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 คนขึ้นไปและคงการแสดงออกทางสีหน้าของบุคคลเหล่านั้นไว้ 
- จัดรูปแบบรูปภาพสัตว์เลี้ยงและเปลี่ยนให้เป็นภาพวาด คงไว้หรือระบุ องค์ประกอบของภาพ (เช่น สีน้ำ)