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

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

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

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

कोड का उदाहरण

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

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

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

उदाहरण के तौर पर दिया गया कोड डाउनलोड करने के लिए:

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

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

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

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

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

सेटअप

इस सेक्शन में, डेवलपमेंट एनवायरमेंट और कोड प्रोजेक्ट सेट अप करने के मुख्य चरणों के बारे में बताया गया है. ऐसा खास तौर पर, इमेज जनरेटर का इस्तेमाल करने के लिए किया जाता है. MediaPipe Tasks का इस्तेमाल करने के लिए, डेवलपमेंट एनवायरमेंट सेट अप करने के बारे में सामान्य जानकारी पाने के लिए, 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) या इसके बाद के वर्शन वाले डिवाइसों के लिए, नेटिव OpenCL लाइब्रेरी डिपेंडेंसी जोड़ें. ज़्यादा जानकारी के लिए, uses-native-library टैग के दस्तावेज़ देखें.

AndroidManifest.xml फ़ाइल में ये uses-native-library टैग जोड़ें:

<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 सोबल ऑपरेटर के लिए एपर्चर का साइज़. आम तौर पर, यह संख्या 3 से 7 के बीच होती है. Integer 3
l2Gradient डिफ़ॉल्ट L1 नॉर्म के बजाय, इमेज ग्रेडिएंट मैग्नीट्यूड का हिसाब लगाने के लिए, L2 नॉर्म का इस्तेमाल किया जाता है या नहीं. BOOLEAN False
EdgePluginModelBaseOptions BaseOptions ऑब्जेक्ट, जो प्लग इन मॉडल के लिए पाथ सेट करता है. BaseOptions ऑब्जेक्ट N/A

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

चेहरे के लैंडमार्क के विकल्प

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)

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

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

  • prompt (ज़रूरी है): जनरेट की जाने वाली इमेज के बारे में बताने वाला टेक्स्ट प्रॉम्प्ट.
  • iterations (ज़रूरी है): इमेज जनरेट करने के लिए कुल इटरेशन. 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

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