Imagen का इस्तेमाल करके, किसी विषय के आधार पर इमेज को पसंद के मुताबिक बनाना


इस पेज पर, Firebase AI Logic एसडीके टूल का इस्तेमाल करके, Imagen की कस्टमाइज़ेशन की सुविधा इस्तेमाल करने का तरीका बताया गया है. इस सुविधा की मदद से, किसी विषय के आधार पर इमेज में बदलाव किया जा सकता है या नई इमेज जनरेट की जा सकती हैं.

यह कैसे काम करता है: आपको एक टेक्स्ट प्रॉम्प्ट और कम से कम एक रेफ़रंस इमेज देनी होती है. इसमें किसी खास विषय (जैसे, कोई प्रॉडक्ट, व्यक्ति या पालतू जानवर) को दिखाया गया हो. मॉडल इन इनपुट का इस्तेमाल करके, नई इमेज जनरेट करता है. यह इमेज, रेफ़रंस इमेज में मौजूद विषय पर आधारित होती है.

उदाहरण के लिए, मॉडल से किसी बच्चे की फ़ोटो को कार्टून स्टाइल में बदलने या किसी तस्वीर में मौजूद साइकल का रंग बदलने के लिए कहा जा सकता है.

कोड पर जाएं



शुरू करने से पहले

यह सुविधा सिर्फ़ तब उपलब्ध होती है, जब Vertex AI Gemini API को एपीआई उपलब्ध कराने वाली कंपनी के तौर पर इस्तेमाल किया जा रहा हो.

अगर आपने अब तक शुरुआती गाइड नहीं पढ़ी है, तो इसे पढ़ें. इसमें बताया गया है कि Firebase प्रोजेक्ट कैसे सेट अप करें, अपने ऐप्लिकेशन को Firebase से कैसे कनेक्ट करें, एसडीके कैसे जोड़ें, चुने गए एपीआई उपलब्ध कराने वाली कंपनी के लिए बैकएंड सेवा को कैसे शुरू करें, और ImagenModel इंस्टेंस कैसे बनाएं.

इस सुविधा के साथ काम करने वाले मॉडल

Imagen, capability मॉडल की मदद से इमेज में बदलाव करने की सुविधा देता है:

  • imagen-3.0-capability-001

ध्यान दें कि Imagen मॉडल के लिए, global लोकेशन की जानकारी नहीं दी जा सकती.

विषय को पसंद के मुताबिक बनाने का अनुरोध भेजना

यहां दिए गए सैंपल में, विषय के हिसाब से इमेज को पसंद के मुताबिक बनाने का अनुरोध दिखाया गया है. इसमें मॉडल से, दी गई रेफ़रंस इमेज के आधार पर नई इमेज जनरेट करने के लिए कहा गया है. इस उदाहरण में, रेफ़रंस इमेज के तौर पर बिल्ली की इमेज दी गई है. बिल्ली एक जानवर है. इसलिए, यह विषय के टाइप ImagenSubjectReferenceType.ANIMAL का इस्तेमाल करती है.

अगर आपका विषय कोई व्यक्ति या प्रॉडक्ट है, तो इस उदाहरण का इस्तेमाल किया जा सकता है. हालांकि, इसमें ये बदलाव करने होंगे:

  • अगर आपका विषय व्यक्ति है, तो विषय का टाइप ImagenSubjectReferenceType.PERSON इस्तेमाल करें. इमेज जनरेट करने के लिए, इस तरह का अनुरोध चेहरे के मेश को कंट्रोल करने वाली इमेज के साथ या उसके बिना भेजा जा सकता है.

  • अगर आपका विषय प्रॉडक्ट है, तो विषय का टाइप ImagenSubjectReferenceType.PRODUCT इस्तेमाल करें.

प्रॉम्प्ट लिखने के बारे में जानने के लिए, इस पेज पर बाद में प्रॉम्प्ट टेंप्लेट देखें. साथ ही, यह भी जानें कि उनमें रेफ़रंस इमेज का इस्तेमाल कैसे किया जाता है.

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 subjectReference = ImagenSubjectReference(
        image = referenceImage,
        referenceID = 1,
        description = "cat",
        subjectType = ImagenSubjectReferenceType.ANIMAL
    )

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

    // Use the editImage API to perform the subject customization.
    // Pass the list of references, the prompt, and an editing configuration.
    val editedImage = model.editImage(
        referenceImages = listOf(subjectReference),
        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.
ImagenSubjectReference subjectReference = new ImagenSubjectReference.Builder()
        .setImage(referenceImage)
        .setReferenceID(1)
        .setDescription("cat")
        .setSubjectType(ImagenSubjectReferenceType.ANIMAL)
        .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[1] flying through outer space";

// 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 subject customization.
// Pass the list of references, the prompt, and an editing configuration.
Futures.addCallback(model.editImage(Collections.singletonList(subjectReference), 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 subject reference using the reference image.
final subjectReference = ImagenSubjectReference(
  image: referenceImage,
  referenceId: 1,
  description: 'cat',
  subjectType: ImagenSubjectReferenceType.animal,
);

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

try {
  // Use the editImage API to perform the subject customization.
  // Pass the list of references, the prompt, and an editing configuration.
  final response = await model.editImage(
    [subjectReference],
    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 मॉडल की मदद से इमेज में बदलाव करने की सुविधा काम नहीं करती. इस साल के आखिर में फिर से देखें!

प्रॉम्प्ट टेंप्लेट

अनुरोध में, आपको रेफ़रंस इमेज (ज़्यादा से ज़्यादा चार इमेज) देनी होती हैं. इसके लिए, आपको ImagenSubjectReference तय करना होता है. इसमें आपको किसी इमेज के लिए रेफ़रंस आईडी (और विषय के बारे में जानकारी भी दी जा सकती है) तय करना होता है. ध्यान दें कि एक से ज़्यादा इमेज के लिए, एक ही रेफ़रंस आईडी हो सकता है. उदाहरण के लिए, एक ही बिल्ली की कई फ़ोटो.

इसके बाद, प्रॉम्प्ट लिखते समय इन आईडी का इस्तेमाल करें. उदाहरण के लिए, प्रॉम्प्ट में [1] का इस्तेमाल करके, रेफ़रंस आईडी 1 वाली इमेज का रेफ़रंस दिया जाता है. अगर आपने विषय के बारे में जानकारी दी है, तो उसे प्रॉम्प्ट में भी शामिल किया जा सकता है. इससे प्रॉम्प्ट को मैन्युअल तरीके से पढ़ना आसान हो जाता है.

इस टेबल में, प्रॉम्प्ट टेंप्लेट के बारे में बताया गया है. ये टेंप्लेट, किसी विषय (जैसे कि कोई प्रॉडक्ट, व्यक्ति या पालतू जानवर) के हिसाब से प्रॉम्प्ट लिखने के लिए शुरुआती बिंदु हो सकते हैं.

इस्तेमाल का उदाहरण रेफ़रंस इमेज प्रॉम्प्ट टेंप्लेट उदाहरण
प्रॉडक्ट की इमेज को स्टाइल करना - विज्ञापन सब्जेक्ट की इमेज (ज़्यादा से ज़्यादा चार) SUBJECT_DESCRIPTION [1] के बारे में एक इमेज बनाओ, ताकि वह इस जानकारी से मेल खाए: ${PROMPT}

Luxe Elixir hair oil, golden liquid in glass bottle [1] के बारे में एक इमेज बनाओ, जो इस जानकारी से मेल खाती हो: किसी महिला के हाथ की क्लोज़-अप, हाई-की इमेज, जिसमें वह Luxe Elixir hair oil, golden liquid in glass bottle [1] को पूरी तरह से सफ़ेद बैकग्राउंड के सामने पकड़े हुए है. महिला के हाथ पर अच्छी रोशनी पड़ रही है और फ़ोकस बोतल पर है. बैकग्राउंड थोड़ा ब्लर है, ताकि प्रॉडक्ट पर ज़ोर दिया जा सके. रोशनी मंद-मंद हो और चारों ओर फैली हुई हो. इससे बोतल और हाथ के आस-पास हल्की चमक दिखे. कुल मिलाकर, कंपोज़िशन आसान और शानदार है. इससे प्रॉडक्ट के शानदार लुक का पता चलता है.

प्रॉडक्ट की इमेज को स्टाइल करना - एट्रिब्यूट में बदलाव करना सब्जेक्ट की इमेज (ज़्यादा से ज़्यादा चार) SUBJECT_DESCRIPTION की इमेज जनरेट करो, लेकिन ${PROMPT}

Seiko watch [1] की इमेज जनरेट करो, लेकिन नीले रंग में.

चेहरे के मेश इनपुट के बिना, व्यक्ति की इमेज को स्टाइल में बदलना सब्जेक्ट की इमेज (ज़्यादा से ज़्यादा चार) SUBJECT_DESCRIPTION [1] के बारे में एक इमेज बनाओ, जो इस ब्यौरे से मेल खाती हो: SUBJECT_DESCRIPTION [1] की एक पोर्ट्रेट फ़ोटो ${PROMPT} a woman with short hair[1] के बारे में एक इमेज बनाओ, ताकि वह इस ब्यौरे से मेल खाए: a woman with short hair[1] का पोर्ट्रेट, 3D कार्टून स्टाइल में और धुंधले बैकग्राउंड के साथ. एक प्यारा और सुंदर किरदार, मुस्कुराते हुए चेहरे के साथ, कैमरे की ओर देख रहा है, हल्के रंग का टोन ...
चेहरे के मेश इनपुट के बिना, व्यक्ति की इमेज को स्टाइल में बदलना सब्जेक्ट की इमेज (ज़्यादा से ज़्यादा चार) ब्यौरे से मिलती-जुलती STYLE_DESCRIPTION [2] इमेज बनाओ. ब्यौरा: SUBJECT_DESCRIPTION [1] STYLE_PROMPT का पोर्ट्रेटSUBJECT_DESCRIPTION [1] ब्यौरे से मेल खाने वाली 3d-cartoon style [2] इमेज बनाओ: a woman with short hair [1] का पोर्ट्रेट 3D कार्टून स्टाइल में, जिसमें बैकग्राउंड धुंधला हो.a woman with short hair [1] एक प्यारा और सुंदर किरदार, मुस्कुराते हुए चेहरे के साथ, कैमरे की ओर देख रहा है, हल्के रंग का टोन ...
चेहरे के मेश इनपुट के साथ व्यक्ति की इमेज को स्टाइल करना सब्जेक्ट की इमेज (ज़्यादा से ज़्यादा 3)

चेहरे के मेश को कंट्रोल करने वाली इमेज (1)
Face mesh from the control image [2] की SUBJECT_DESCRIPTION [1] वाली इमेज जनरेट करो. ${PROMPT} face mesh from the control image [2] की मदद से the person [1] की इमेज जनरेट करो. व्यक्ति का चेहरा सामने की ओर होना चाहिए और उसके चेहरे पर कोई भाव नहीं होना चाहिए. बैकग्राउंड में ... दिखाओ
चेहरे के मेश इनपुट के साथ व्यक्ति की इमेज को स्टाइल करना सब्जेक्ट की इमेज (ज़्यादा से ज़्यादा 3)

चेहरे के मेश को कंट्रोल करने वाली इमेज (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] का पोर्ट्रेट, 3D-कार्टून स्टाइल में और धुंधले बैकग्राउंड के साथ. एक प्यारा और सुंदर किरदार, मुस्कुराते हुए चेहरे के साथ, कैमरे की ओर देख रहा है, हल्के रंग का टोन ...
चेहरे के मेश इनपुट के साथ व्यक्ति की इमेज को स्टाइल करना सब्जेक्ट की इमेज (ज़्यादा से ज़्यादा 3)

चेहरे के मेश को कंट्रोल करने वाली इमेज (1)
STYLE_DESCRIPTION [3] के बारे में एक इमेज बनाओ. इस इमेज में SUBJECT_DESCRIPTION [1] को CONTROL_IMAGE [2] के पोज़ में दिखाओ, ताकि यह इस ब्यौरे से मेल खाए: SUBJECT_DESCRIPTION [1] का एक पोर्ट्रेट ${PROMPT} control image [2] की पोज़ में a woman with short hair [1] की 3d-cartoon style [3] इमेज बनाओ, ताकि वह इस ब्यौरे से मेल खाए: a woman with short hair [1] का पोर्ट्रेट 3D-कार्टून स्टाइल में, जिसका बैकग्राउंड धुंधला हो. मुस्कुराते हुए चेहरे वाला एक प्यारा और सुंदर किरदार, जो कैमरे की ओर देख रहा है. इसका रंग हल्का है ...



सबसे सही तरीके और सीमाएं

अगर आपको किसी व्यक्ति को अपने विषय के तौर पर इस्तेमाल करना है, तो हमारा सुझाव है कि आपकी रेफ़रंस इमेज में मौजूद चेहरे में ये प्रॉपर्टी होनी चाहिए:

  • वह इमेज के बीच में हो और कम से कम आधी इमेज पर मौजूद हो
  • सामने से दिखने वाले व्यू में, सभी दिशाओं में घुमाया गया हो (रोल, पिच, और यॉ)
  • चश्मा या मास्क जैसी चीज़ों से ढका हुआ न हो

इस्तेमाल के उदाहरण

कस्टम बनाने की सुविधा में, फ़्री-स्टाइल प्रॉम्प्टिंग की सुविधा मिलती है. इससे ऐसा लग सकता है कि मॉडल, ट्रेनिंग के दौरान सीखी गई बातों के अलावा भी कई काम कर सकता है. यहां दिए गए सेक्शन में, कस्टम बनाने की सुविधा के इस्तेमाल के उदाहरण दिए गए हैं. साथ ही, इस्तेमाल के ऐसे उदाहरण दिए गए हैं जिनमें इस सुविधा का इस्तेमाल नहीं किया जाना चाहिए. हालांकि, ये उदाहरण पूरी तरह से नहीं दिए गए हैं.

हमारा सुझाव है कि आप इस सुविधा का इस्तेमाल, उन मामलों के लिए करें जिनके लिए इसे बनाया गया है. ऐसा इसलिए, क्योंकि हमने मॉडल को उन मामलों के लिए ट्रेन किया है और हमें उनसे अच्छे नतीजे मिलने की उम्मीद है. इसके उलट, अगर मॉडल को ऐसे काम करने के लिए कहा जाता है जो उसके इस्तेमाल के मकसद से अलग हैं, तो आपको खराब नतीजे मिल सकते हैं.

इस्तेमाल के उदाहरण

यहां अनुमति के साथ इस्तेमाल के कुछ उदाहरण दिए गए हैं. इनमें विषय के आधार पर, ईमेल को पसंद के मुताबिक बनाया गया है:

  • किसी व्यक्ति की फ़ोटो को स्टाइल में बदलना.

  • किसी व्यक्ति की फ़ोटो को स्टाइल में बदलें और उसके चेहरे के हाव-भाव को बरकरार रखें.

  • (कम सफलता) किसी प्रॉडक्ट, जैसे कि सोफ़ा या कुकी को अलग-अलग प्रॉडक्ट ऐंगल के साथ अलग-अलग सीन में दिखाएं.

  • ऐसे प्रॉडक्ट के अलग-अलग वर्शन जनरेट करना जिनमें सटीक जानकारी मौजूद न हो.

  • किसी व्यक्ति की फ़ोटो को स्टाइल में बदलो. हालांकि, उसके चेहरे के भाव में कोई बदलाव नहीं होना चाहिए.

इस्तेमाल के ऐसे उदाहरण जो मकसद के मुताबिक नहीं हैं

यहां, अनचाहे इस्तेमाल के उदाहरणों की सूची दी गई है. ये उदाहरण, विषय के आधार पर की गई पसंद के मुताबिक बनाने की सुविधा से जुड़े हैं. इस सूची में इनके अलावा, कई और उदाहरण शामिल हो सकते हैं. मॉडल को इस्तेमाल के इन उदाहरणों के लिए ट्रेन नहीं किया गया है. इसलिए, हो सकता है कि यह खराब नतीजे दे.

  • दो या उससे ज़्यादा लोगों को अलग-अलग सीन में रखें. हालांकि, उनकी पहचान को सुरक्षित रखें.

  • अलग-अलग सीन में दो या उससे ज़्यादा लोगों को शामिल करो. साथ ही, उनकी पहचान को सुरक्षित रखो. इसके अलावा, स्टाइल के लिए इनपुट के तौर पर दी गई उदाहरण इमेज का इस्तेमाल करके, आउटपुट इमेज की स्टाइल तय करो.

  • दो या उससे ज़्यादा लोगों की फ़ोटो को स्टाइल करें. हालांकि, इस दौरान उनकी पहचान ज़ाहिर नहीं होनी चाहिए.

  • पालतू जानवर की पहचान को बनाए रखते हुए, उसे अलग-अलग सीन में रखें.

  • किसी पालतू जानवर की फ़ोटो को स्टाइल में बदलकर, उसे ड्रॉइंग में बदल दो.

  • किसी पालतू जानवर की फ़ोटो को स्टाइल में बदलो और उसे ड्राइंग में बदलो. साथ ही, इमेज की स्टाइल (जैसे कि वॉटर कलर) को बनाए रखो या उसे तय करो.

  • किसी पालतू जानवर और व्यक्ति को अलग-अलग सीन में रखें. हालांकि, दोनों की पहचान को बरकरार रखें.

  • किसी पालतू जानवर और एक या उससे ज़्यादा लोगों की फ़ोटो को स्टाइल करें और उसे ड्रॉइंग में बदलें.

  • दो प्रॉडक्ट को अलग-अलग सीन में, अलग-अलग ऐंगल से दिखाएं.

  • किसी प्रॉडक्ट, जैसे कि कुकी या सोफ़े को अलग-अलग सीन में रखें. साथ ही, प्रॉडक्ट को अलग-अलग ऐंगल से दिखाएं और इमेज की किसी खास स्टाइल का इस्तेमाल करें. जैसे, फ़ोटो जैसा दिखने वाला, खास रंगों, लाइटिंग स्टाइल या ऐनिमेशन वाला.

  • किसी प्रॉडक्ट को दूसरे सीन में रखें. साथ ही, कंट्रोल इमेज में बताए गए सीन की खास कंपोज़िशन को बनाए रखें.

  • किसी इमेज को इनपुट के तौर पर इस्तेमाल करके, दो प्रॉडक्ट को अलग-अलग सीन में रखें. साथ ही, उन्हें अलग-अलग ऐंगल से दिखाएं. जैसे, खास रंगों, लाइटिंग स्टाइल या ऐनिमेशन वाली फ़ोटो जैसा दिखने वाला प्रॉडक्ट.

  • दो प्रॉडक्ट को अलग-अलग सीन में रखें. साथ ही, कंट्रोल इमेज में बताए गए सीन की खास कंपोज़िशन को बनाए रखें.