Android के लिए इमेज जनरेट करने की गाइड

MediaPipe इमेज जनरेटर टास्क आपको टेक्स्ट प्रॉम्प्ट के आधार पर इमेज जनरेट करने देता है. यह टास्क, डिफ्यूज़न तकनीकों का इस्तेमाल करके इमेज जनरेट करने के लिए टेक्स्ट-टू-इमेज मॉडल का इस्तेमाल करता है.

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

इन निर्देशों में दिया गया कोड सैंपल, GitHub पर उपलब्ध है. इस टास्क की क्षमताओं, मॉडल, और कॉन्फ़िगरेशन विकल्पों के बारे में ज़्यादा जानकारी के लिए, खास जानकारी देखें.

कोड का उदाहरण

MediaPipe Tasks का उदाहरण कोड, Android के लिए इमेज जनरेटर ऐप्लिकेशन को बुनियादी तौर पर लागू करने का तरीका है. इस ऐप्लिकेशन का इस्तेमाल, अपने Android ऐप्लिकेशन के लिए शुरुआत करने की जगह के तौर पर किया जा सकता है. इसके अलावा, किसी मौजूदा ऐप्लिकेशन में बदलाव करते समय इसका इस्तेमाल भी किया जा सकता है. इमेज जनरेटर का उदाहरण कोड GitHub पर होस्ट किया गया है.

कोड डाउनलोड करें

नीचे दिए गए निर्देशों में git कमांड लाइन टूल का इस्तेमाल करके, उदाहरण कोड की लोकल कॉपी बनाने का तरीका बताया गया है.

उदाहरण कोड डाउनलोड करने के लिए:

  1. नीचे दिए गए निर्देश का इस्तेमाल करके, गिट रिपॉज़िटरी का क्लोन बनाएं:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. इसके अलावा, आपके पास सिर्फ़ इमेज जनरेटर उदाहरण वाले ऐप्लिकेशन की फ़ाइलें रखने के लिए, अपना गिट इंस्टेंस कॉन्फ़िगर करने का विकल्प है:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generator/android
    

उदाहरण कोड का स्थानीय वर्शन बनाने के बाद, प्रोजेक्ट को Android Studio में इंपोर्ट किया जा सकता है. इसके बाद, ऐप्लिकेशन को चलाया जा सकता है. निर्देशों के लिए, Android के लिए सेटअप गाइड देखें.

मुख्य कॉम्पोनेंट

इन फ़ाइलों में, इमेज जनरेट करने वाले इस ऐप्लिकेशन के उदाहरण के लिए ज़रूरी कोड मौजूद है:

  • ImageGenerationHelper.kt: टास्क शुरू करता है और इमेज जनरेट करने की प्रोसेस को मैनेज करता है.
  • DiffusionActivity.kt: प्लगिन या LoRA वेट की सुविधा चालू न होने पर, इमेज जनरेट करता है.
  • PluginActivity.kt: यह प्लगिन मॉडल लागू करता है. इसकी मदद से उपयोगकर्ता, इनपुट के तौर पर शर्त वाली इमेज दे सकते हैं.
  • LoRAWeightActivity.kt: LORA वेट को ऐक्सेस और मैनेज करता है. इसका इस्तेमाल बुनियादी मॉडल को पसंद के मुताबिक बनाने के लिए किया जाता है. साथ ही, इन मॉडल की मदद से खास कॉन्सेप्ट की इमेज जनरेट की जा सकती हैं.

सेटअप

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

डिपेंडेंसी

इमेज जनरेटर टास्क, com.google.mediapipe:tasks-vision-image-generator लाइब्रेरी का इस्तेमाल करता है. अपने Android ऐप्लिकेशन की build.gradle फ़ाइल में यह डिपेंडेंसी जोड़ें:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision-image-generator:latest.release'
}

Android 12 (एपीआई 31) या उसके बाद के वर्शन वाले डिवाइसों के लिए, AndroidManifest.xml में OpenCL लाइब्रेरी डिपेंडेंसी जोड़ें. ज़्यादा जानने के लिए, uses-native-library टैग के दस्तावेज़ देखें.

कुछ Android डिवाइसों के लिए अतिरिक्त लाइब्रेरी की ज़रूरत भी पड़ सकती है:

<uses-native-library android:name="libOpenCL.so" android:required="false" />
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false" />

मॉडल

MediaPipe इमेज जनरेटर टास्क को एक प्रशिक्षित फ़ाउंडेशन मॉडल की ज़रूरत होती है, जो इस टास्क के साथ काम करता हो. मॉडल डाउनलोड करने के बाद, ज़रूरी डिपेंडेंसी इंस्टॉल करें और डिवाइस के मॉडल को सही फ़ॉर्मैट में बदलें. फिर, बदले गए मॉडल को Android डिवाइस पर पुश करें.

इमेज जनरेटर के लिए उपलब्ध ट्रेनिंग मॉडल के बारे में ज़्यादा जानने के लिए, टास्क की खास जानकारी वाला मॉडल सेक्शन देखें.

फ़ाउंडेशन मॉडल डाउनलोड करें

इमेज जनरेटर के लिए ज़रूरी है कि फ़ाउंडेशन मॉडल, runwayml/stable-diffusion-v1-5 EMA-only के मॉडल फ़ॉर्मैट से मेल खाए: runwayml/stable-diffusion-v1-5.

डिपेंडेंसी इंस्टॉल करें और मॉडल को बदलें

$ pip install torch typing_extensions numpy Pillow requests pytorch_lightning absl-py

convert.py स्क्रिप्ट चलाएं:

$ python3 convert.py --ckpt_path <ckpt_path> --output_path <output_path>

बदले गए मॉडल को डिवाइस में पुश करें

<output_path> फ़ोल्डर के कॉन्टेंट को Android डिवाइस में पुश करें.

$ adb shell rm -r /data/local/tmp/image_generator/ # Remove any previously loaded weights
$ adb shell mkdir -p /data/local/tmp/image_generator/
$ adb push <output_path>/. /data/local/tmp/image_generator/bins

प्लग इन मॉडल डाउनलोड करें और LoRA वेट जोड़ें (ज़रूरी नहीं)

अगर आपको प्लगिन मॉडल का इस्तेमाल करना है, तो देखें कि उस मॉडल को डाउनलोड करना ज़रूरी है या नहीं. जिन प्लग इन को किसी अतिरिक्त मॉडल की ज़रूरत होती है उनके लिए, प्लग इन मॉडल को या तो APK में बंडल किया जाना चाहिए या मांग पर डाउनलोड किया जाना चाहिए. प्लग इन मॉडल हल्के (~23 एमबी) होते हैं और इन्हें सीधे APK में बंडल किया जा सकता है. हालांकि, हमारा सुझाव है कि आप मांग पर प्लगिन के मॉडल डाउनलोड करें.

अगर आपने LoRA की मदद से किसी मॉडल को पसंद के मुताबिक बनाया है, तो उसे मांग पर डाउनलोड करें. ज़्यादा जानकारी के लिए, LoRA वेट की जानकारी देने वाले प्लगिन मॉडल को देखें.

टास्क बनाएं

MediaPipe इमेज जनरेटर टास्क, टास्क को सेट अप करने के लिए createFromOptions() फ़ंक्शन का इस्तेमाल करता है. createFromOptions() फ़ंक्शन, कॉन्फ़िगरेशन के विकल्पों के लिए वैल्यू स्वीकार करता है. कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन के विकल्प देखें.

कॉन्फ़िगरेशन विकल्प

इस टास्क में, Android ऐप्लिकेशन के कॉन्फ़िगरेशन के ये विकल्प मौजूद हैं:

विकल्प का नाम ब्यौरा वैल्यू रेंज
imageGeneratorModelDirectory मॉडल का वेट सेव करने वाली इमेज जनरेटर मॉडल डायरेक्ट्री. PATH
loraWeightsFilePath LoRA वेट की फ़ाइल का पाथ सेट करता है. ज़रूरी नहीं है. हालांकि, ऐसा सिर्फ़ तब किया जा सकता है, जब मॉडल को LoRA की मदद से पसंद के मुताबिक बनाया गया हो. PATH
errorListener गड़बड़ी की जानकारी देने वाला वैकल्पिक लिसनर सेट करता है. N/A

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

फ़ाउंडेशन मॉडल में प्लगिन मॉडल जोड़ते समय, प्लगिन के विकल्प भी कॉन्फ़िगर करें. फ़ेस लैंडमार्क प्लगिन के लिए faceConditionOptions का इस्तेमाल किया जाता है. Canny Edge वाला प्लगिन edgeConditionOptions का इस्तेमाल करता है, और डेप्थ प्लगिन depthConditionOptions का इस्तेमाल करता है.

कैनी एज के विकल्प

edgeConditionOptions में ये विकल्प कॉन्फ़िगर करें.

विकल्प का नाम ब्यौरा वैल्यू रेंज डिफ़ॉल्ट मान
threshold1 हिस्टेरिज़िस प्रोसेस के लिए पहली थ्रेशोल्ड. Float 100
threshold2 हिस्टेसिस प्रोसेस के लिए दूसरा थ्रेशोल्ड. Float 200
apertureSize Sobel ऑपरेटर के लिए एपर्चर का साइज़. सामान्य रेंज 3-7 के बीच होती है. Integer 3
l2Gradient डिफ़ॉल्ट L1 मानक के बजाय, इमेज ग्रेडिएंट के परिमाण का हिसाब लगाने के लिए, L2 मानक का इस्तेमाल किया गया है या नहीं. BOOLEAN False
EdgePluginModelBaseOptions BaseOptions ऑब्जेक्ट, जो प्लगिन मॉडल के लिए पाथ सेट करता है. BaseOptions ऑब्जेक्ट N/A

इन कॉन्फ़िगरेशन विकल्पों के काम करने के तरीके के बारे में ज़्यादा जानकारी के लिए, Canny एज डिटेक्टर देखें.

फ़ेस लैंडमार्क के विकल्प

faceConditionOptions में ये विकल्प कॉन्फ़िगर करें.

विकल्प का नाम ब्यौरा वैल्यू रेंज डिफ़ॉल्ट मान
minFaceDetectionConfidence चेहरे की पहचान करने के लिए सबसे कम कॉन्फ़िडेंस स्कोर, जिसे कामयाब माना जाता है. Float [0.0,1.0] 0.5
minFacePresenceConfidence फ़ेस लैंडमार्क की पहचान करने में, चेहरे की मौजूदगी का पता लगाने के लिए सबसे कम कॉन्फ़िडेंस स्कोर. Float [0.0,1.0] 0.5
faceModelBaseOptions BaseOptions ऑब्जेक्ट, जो शर्त की इमेज बनाने वाले मॉडल के लिए पाथ सेट करता है. BaseOptions ऑब्जेक्ट N/A
FacePluginModelBaseOptions BaseOptions ऑब्जेक्ट, जो प्लगिन मॉडल के लिए पाथ सेट करता है. BaseOptions ऑब्जेक्ट N/A

कॉन्फ़िगरेशन के इन विकल्पों के काम करने के तरीके के बारे में ज़्यादा जानने के लिए, फ़ेस लैंडमार्क टास्क देखें.

डेप्थ के विकल्प

depthConditionOptions में ये विकल्प कॉन्फ़िगर करें.

विकल्प का नाम ब्यौरा वैल्यू रेंज डिफ़ॉल्ट मान
depthModelBaseOptions BaseOptions ऑब्जेक्ट, जो शर्त की इमेज बनाने वाले मॉडल के लिए पाथ सेट करता है. BaseOptions ऑब्जेक्ट N/A
depthPluginModelBaseOptions BaseOptions ऑब्जेक्ट, जो प्लगिन मॉडल के लिए पाथ सेट करता है. BaseOptions ऑब्जेक्ट N/A

सिर्फ़ फ़ाउंडेशन मॉडल का इस्तेमाल करके बनाएं

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

imageGenerator = ImageGenerator.createFromOptions(context, options)

प्लग इन की मदद से बनाएं

अगर कोई वैकल्पिक प्लगिन मॉडल लागू किया जा रहा है, तो setPluginModelBaseOptions की मदद से प्लगिन मॉडल के लिए, बुनियादी विकल्प सेट करें. अगर प्लगिन मॉडल को शर्त की इमेज बनाने के लिए डाउनलोड किए गए किसी दूसरे मॉडल की ज़रूरत है, तो BaseOptions में पाथ बताएं.

फ़ेस लैंडमार्क

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

val faceModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("face_landmarker.task")
    .build()

val facePluginModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("face_landmark_plugin.tflite")
    .build()

val faceConditionOptions = FaceConditionOptions.builder()
    .setFaceModelBaseOptions(faceModelBaseOptions)
    .setPluginModelBaseOptions(facePluginModelBaseOptions)
    .setMinFaceDetectionConfidence(0.3f)
    .setMinFacePresenceConfidence(0.3f)
    .build()

val conditionOptions = ConditionOptions.builder()
    .setFaceConditionOptions(faceConditionOptions)
    .build()

imageGenerator =
    ImageGenerator.createFromOptions(context, options, conditionOptions)
    

कैनी एज

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

val edgePluginModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("canny_edge_plugin.tflite")
    .build()

val edgeConditionOptions = EdgeConditionOptions.builder()
    .setThreshold1(100.0f)
    .setThreshold2(100.0f)
    .setApertureSize(3)
    .setL2Gradient(false)
    .setPluginModelBaseOptions(edgePluginModelBaseOptions)
    .build()

val conditionOptions = ConditionOptions.builder()
    .setEdgeConditionOptions(edgeConditionOptions)
    .build()

imageGenerator =
    ImageGenerator.createFromOptions(context, options, conditionOptions)
    

गहराई

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

val depthModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("depth_model.tflite")
    .build()

val depthPluginModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("depth_plugin.tflite")
    .build()

val depthConditionOptions =
    ConditionOptions.DepthConditionOptions.builder()
        .setDepthModelBaseOptions(depthModelBaseOptions)
        .setPluginModelBaseOptions(depthPluginModelBaseOptions)
        .build()

val conditionOptions = ConditionOptions.builder()
    .setDepthConditionOptions(depthConditionOptions)
    .build()

imageGenerator =
    ImageGenerator.createFromOptions(context, options, conditionOptions)
    

LoRA वेट की मदद से बनाएं

अगर आपने LoRA के वज़न को शामिल किया है, तो पाथ की जगह बताने के लिए loraWeightsFilePath पैरामीटर का इस्तेमाल करें.

val options = ImageGeneratorOptions.builder()
    .setLoraWeightsFilePath(weightsPath)
    .setImageGeneratorModelDirectory(modelPath)
    .build()

imageGenerator = ImageGenerator.createFromOptions(context, options)

डेटा तैयार करना

इमेज जनरेटर, ये इनपुट स्वीकार करता है:

  • प्रॉम्प्ट (ज़रूरी है): जनरेट की जाने वाली इमेज के बारे में जानकारी देने वाला टेक्स्ट प्रॉम्प्ट.
  • इटरेशन (ज़रूरी): इमेज जनरेट करने के लिए कुल दोहराव. एक अच्छा शुरुआती पॉइंट 20 है.
  • seed (ज़रूरी): इमेज जनरेट करने के दौरान इस्तेमाल किया गया रैंडम बीज.
  • स्थिति की इमेज (ज़रूरी नहीं): वह इमेज जिसका इस्तेमाल मॉडल, जनरेट करने के लिए रेफ़रंस के तौर पर करता है. प्लगिन मॉडल का इस्तेमाल करने पर ही लागू होता है.
  • स्थिति का टाइप (ज़रूरी नहीं): टास्क के साथ इस्तेमाल किए गए प्लगिन मॉडल का टाइप. प्लगिन मॉडल का इस्तेमाल करने पर ही लागू होता है.

सिर्फ़ फ़ाउंडेशन मॉडल वाले इनपुट

fun setInput(prompt: String, iteration: Int, seed: Int) {
    imageGenerator.setInputs(prompt, iteration, seed)
}

प्लग इन वाले इनपुट

अगर वैकल्पिक प्लगिन मॉडल लागू किया जा रहा है, तो प्लगिन मॉडल चुनने के लिए conditionType पैरामीटर और कंडीशनल इमेज को जनरेट करने के लिए sourceConditionImage पैरामीटर का भी इस्तेमाल करें.

विकल्प का नाम ब्यौरा वैल्यू
conditionType फ़ाउंडेशन मॉडल पर लागू किया गया प्लगिन मॉडल. {"FACE", "EDGE", "DEPTH"}
sourceConditionImage शर्त की इमेज बनाने के लिए इस्तेमाल की गई सोर्स इमेज. MPImage ऑब्जेक्ट

अगर प्लगिन मॉडल का इस्तेमाल किया जा रहा है, तो स्थिति की इमेज बनाने के लिए createConditionImage का इस्तेमाल करें:

fun createConditionImage(
    inputImage: MPImage,
    conditionType: ConditionType
): Bitmap {
    val result =
        imageGenerator.createConditionImage(inputImage, conditionType)
    return BitmapExtractor.extract(result)
}

शर्त की इमेज बनाने के बाद, प्रॉम्प्ट, सीड, और दोहराने की संख्या के साथ इनपुट के तौर पर शामिल करें.

imageGenerator.setInputs(
    prompt,
    conditionalImage,
    conditionType,
    iteration,
    seed
)

LoRA वज़न वाले इनपुट

अगर LoRA वेट का इस्तेमाल किया जा रहा है, तो पक्का करें कि टेक्स्ट प्रॉम्प्ट में टोकन मौजूद है. ऐसा तब होता है, जब आपको वज़न से दिखाए गए खास कॉन्सेप्ट की इमेज जनरेट करनी हो.

fun setInput(prompt: String, iteration: Int, seed: Int) {
    imageGenerator.setInputs(prompt, iteration, seed)
}

टास्क चलाएं

पिछले सेक्शन में दिए गए इनपुट की मदद से इमेज जनरेट करने के लिए, generate() तरीके का इस्तेमाल करें. इससे एक इमेज जनरेट होती है.

सिर्फ़ फ़ाउंडेशन मॉडल का इस्तेमाल करके जनरेट करें

fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
    val result = imageGenerator.generate(prompt, iteration, seed)
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

प्लगिन की मदद से जनरेट करें

fun generate(
    prompt: String,
    inputImage: MPImage,
    conditionType: ConditionType,
    iteration: Int,
    seed: Int
): Bitmap {
    val result = imageGenerator.generate(
        prompt,
        inputImage,
        conditionType,
        iteration,
        seed
    )
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

LoRA वेट की मदद से जनरेट करें

LoRA वेट के हिसाब से कस्टमाइज़ किए गए मॉडल से इमेज जनरेट करने की प्रोसेस, स्टैंडर्ड फ़ाउंडेशन मॉडल वाली प्रक्रिया जैसी है. पक्का करें कि प्रॉम्प्ट में टोकन शामिल है और उसी कोड को चलाएं.

fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
    val result = imageGenerator.generate(prompt, iteration, seed)
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

बार-बार जनरेट होना

iterations इनपुट पैरामीटर में बताए गए तरीके के मुताबिक, इमेज जनरेटर हर इटरेशन के दौरान जनरेट की गई इंटरमीडिएट इमेज भी दे सकता है. बीच के लेवल पर मिलने वाले इन नतीजों को देखने के लिए, setInputs तरीके को कॉल करें. इसके बाद, हर चरण को चलाने के लिए execute() को कॉल करें. बीच के लेवल पर मिलने वाले नतीजे दिखाने के लिए, showResult पैरामीटर को true पर सेट करें.

fun execute(showResult: Boolean): Bitmap {
    val result = imageGenerator.execute(showResult)

    val bitmap =
        BitmapExtractor.extract(result.generatedImage())

    return bitmap
}

नतीजे मैनेज करें और दिखाएं

इमेज जनरेटर, ImageGeneratorResult दिखाता है. इसमें जनरेट की गई इमेज, पूरा होने के समय का टाइमस्टैंप, और इनपुट के तौर पर दी गई शर्तों के हिसाब से इमेज शामिल होती है.

val bitmap = BitmapExtractor.extract(result.generatedImage())

नीचे दी गई इमेज, सिर्फ़ बुनियादी मॉडल का इस्तेमाल करके नीचे दिए गए इनपुट से जनरेट की गई है.

इनपुट:

  • प्रॉम्प्ट: "एक रंगीन कार्टून रकून, जिसने फ़्लॉप वाइड ब्रिम्ड हैट पहना हुआ है और उसने छड़ी पकड़े हुए जंगल में घूमते हुए एक छड़ी पकड़ रखी है, ऐनिमेशन वाला तीन-चौथाई व्यू दिख रहा है, पेंटिंग"
  • सीड: 312687592
  • इटरेशन: 20

जनरेट की गई इमेज: