MediaPipe इमेज जनरेटर टास्क की मदद से, टेक्स्ट प्रॉम्प्ट के आधार पर इमेज जनरेट की जा सकती हैं. इस टास्क में, टेक्स्ट-टू-इमेज मॉडल का इस्तेमाल करके, डिफ़्यूज़न तकनीकों का इस्तेमाल करके इमेज जनरेट की जाती हैं.
यह टास्क, इनपुट के तौर पर टेक्स्ट प्रॉम्प्ट के साथ-साथ, वैकल्पिक शर्त वाली इमेज भी स्वीकार करता है. मॉडल, इस इमेज को बेहतर बना सकता है और इमेज जनरेट करने के लिए रेफ़रंस के तौर पर इस्तेमाल कर सकता है. इमेज जनरेटर, ट्रेनिंग या फिर से ट्रेनिंग के दौरान मॉडल को दिए गए खास कॉन्सेप्ट के आधार पर भी इमेज जनरेट कर सकता है. ज़्यादा जानकारी के लिए, LoRA की मदद से पसंद के मुताबिक बनाना लेख पढ़ें.
इन निर्देशों में बताया गया कोड सैंपल, GitHub पर उपलब्ध है. इस टास्क की सुविधाओं, मॉडल, और कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानने के लिए, खास जानकारी देखें.
कोड का उदाहरण
MediaPipe Tasks का उदाहरण कोड, Android के लिए इमेज जनरेटर ऐप्लिकेशन का बुनियादी वर्शन है. इस ऐप्लिकेशन का इस्तेमाल, अपने Android ऐप्लिकेशन को बनाने के लिए शुरुआती बिंदु के तौर पर किया जा सकता है. इसके अलावा, किसी मौजूदा ऐप्लिकेशन में बदलाव करते समय भी इसका इस्तेमाल किया जा सकता है. इमेज जनरेटर के उदाहरण के कोड को GitHub पर होस्ट किया गया है.
कोड डाउनलोड करना
यहां दिए गए निर्देशों में, git कमांड-लाइन टूल का इस्तेमाल करके, उदाहरण के कोड की लोकल कॉपी बनाने का तरीका बताया गया है.
उदाहरण के तौर पर दिया गया कोड डाउनलोड करने के लिए:
- नीचे दिए गए कमांड का इस्तेमाल करके, Git डेटा स्टोर करने की जगह को क्लोन करें:
git clone https://github.com/google-ai-edge/mediapipe-samples
- इसके अलावा, अपने 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
जनरेट की गई इमेज: