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_generator/android
    

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

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

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

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

सेटअप

इस सेक्शन में, आपके डेवलपमेंट एनवायरमेंट को सेट अप करने और कोड प्रोजेक्ट का इस्तेमाल किया जा सकता है. इस पर सामान्य जानकारी के लिए MediaPipe के टास्क इस्तेमाल करने के लिए डेवलपमेंट एनवायरमेंट सेट अप करना. इसमें ये भी शामिल हैं प्लैटफ़ॉर्म वर्शन की ज़रूरी शर्तें, Google के सभी प्रॉडक्ट के लिए सेटअप गाइड 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 लाइब्रेरी जोड़ें AndroidManifest.xml पर निर्भरता. ज़्यादा जानकारी के लिए, 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 वेट प्लग इन मॉडल देखें.

टास्क बनाएं

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

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

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

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

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

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

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

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

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

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

चेहरे से जुड़े लैंडमार्क के विकल्प

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 है.
  • सीड (ज़रूरी): इमेज जनरेट करने के दौरान इस्तेमाल किया गया रैंडम सीड.
  • स्थिति वाली इमेज (ज़रूरी नहीं): वह इमेज जिसे मॉडल, रेफ़रंस के तौर पर इस्तेमाल करता है जेनरेशन. सिर्फ़ प्लगिन मॉडल का इस्तेमाल करते समय लागू होता है.
  • शर्त का टाइप (ज़रूरी नहीं): टास्क के साथ इस्तेमाल किए गए प्लगिन मॉडल का टाइप. सिर्फ़ प्लगिन मॉडल का इस्तेमाल करते समय लागू होता है.

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

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 वेट का इस्तेमाल किया जा रहा है, तो पक्का करें कि टेक्स्ट प्रॉम्प्ट में टोकन शामिल हो, अगर आपको इस तरह की इमेज जनरेट करनी है जिसे वज़न.

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 वेट के साथ पसंद के मुताबिक मॉडल के साथ इमेज जनरेट करने की प्रोसेस यह स्टैंडर्ड फ़ाउंडेशन मॉडल की प्रोसेस से मेल खाता है. पक्का करें कि टोकन को प्रॉम्प्ट में शामिल किया जाता है और उसी कोड को चलाया जाता है.

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

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