تتيح لك مَهمة "منشئ صور MediaPipe" إنشاء صور استنادًا إلى موجّه نصي. هذا النمط نموذج تحويل النص إلى صورة لإنشاء صور باستخدام تقنيات الانتشار.
تقبل المهمة طلبًا نصيًا كإدخال، بالإضافة إلى صورة شرط اختيارية التي يمكن للنموذج تعزيزها واستخدامها كمرجع للإنشاء منشئ الصور إنشاء صور أيضًا بناءً على مفاهيم محددة يتم تقديمها إلى النموذج أثناء التدريب أو إعادة التدريب. لمزيد من المعلومات، راجع التخصيص باستخدام LoRA.
يتوفر نموذج التعليمة البرمجية الموضح في هذه التعليمات على GitHub. مزيد من المعلومات حول الإمكانات والنماذج وخيارات الضبط هذه المهمة، راجع نظرة عامة.
مثال على الرمز البرمجي
رمز مثال "مهام MediaPipe" هو تنفيذ أساسي لمنشئ الصور تطبيق 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_generator/android
بعد إنشاء نسخة محلية من نموذج الرمز، يمكنك استيراد المشروع. إلى استوديو Android وتشغيل التطبيق. للحصول على إرشادات، راجع دليل إعداد Android
المكوّنات الرئيسية
تحتوي الملفات التالية على الرمز المهمّ لمثال إنشاء الصور هذا. app:
- ImageGenerationHelper.kt: يؤدي هذا الإجراء إلى إعداد المهمة ومعالجة إنشاء الصور.
- DiffusionActivity.kt: يتم إنشاء الصور عند عدم تفعيل المكونات الإضافية أو قيم LoRA.
- PluginActivity.kt: تنفيذ نماذج المكون الإضافي، التي تمكّن المستخدمين من توفير شرط الصورة كإدخال.
- LoRAWeightActivity.kt: الوصول إلى أوزان LoRA والتعامل معها، والتي تُستخدم لتخصيص الأساس النماذج وتمكينها من إنشاء صور لمفاهيم محددة.
ضبط إعدادات الجهاز
يصف هذا القسم الخطوات الرئيسية لإعداد بيئة التطوير الرموز البرمجية خصيصًا لاستخدام "منشئ الصور". للحصول على معلومات عامة عن إعداد بيئة التطوير الخاصة بك لاستخدام مهام MediaPipe، بما في ذلك متطلبات إصدار النظام الأساسي، راجع دليل إعداد Android
التبعيات
تستخدم مهمة "منشئ الصور"
مكتبة com.google.mediapipe:tasks-vision-image-generator
. إضافة هذه التبعية
إلى ملف build.gradle
في تطبيق Android:
dependencies {
implementation 'com.google.mediapipe:tasks-vision-image-generator:latest.release'
}
بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 12 (API 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، وتنزيلها عند الطلب. لمزيد من المعلومات، معلومات حول ترجيحات LoRA نموذج المكوّن الإضافي.
إنشاء المهمة
تستخدم مهمة منشئ صور MediaPipe الدالة createFromOptions()
لإعداد
المهمة. تقبل الدالة createFromOptions()
قيم الإعدادات.
الخيارات. لمزيد من المعلومات حول خيارات الضبط، يُرجى الاطّلاع على الإعدادات.
الخيارات.
خيارات الإعداد
تتضمّن هذه المهمة خيارات الضبط التالية لتطبيقات Android:
اسم الخيار | الوصف | نطاق القيمة |
---|---|---|
imageGeneratorModelDirectory |
دليل نموذج منشئ الصور الذي يخزن الأوزان للنموذج. | PATH |
loraWeightsFilePath |
لتعيين المسار إلى ملف ترجيحات LoRA. اختيارية ولا تسري إلا إذا تم تخصيص النموذج باستخدام LoRA. | PATH |
errorListener |
تضبط هذه السياسة أداة معالجة للأخطاء اختيارية. | N/A |
تتوافق المهمة أيضًا مع نماذج المكوّنات الإضافية، والتي تتيح للمستخدمين تضمين صور الحالات. في إدخال المهمة، والذي يمكن لنموذج الأساس تعزيزه واستخدامه كمرجع لصناعة المحتوى. يمكن أن تكون صور الحالة هذه معالم الوجه ومخططات الحافة وتقديرات العمق، والتي يستخدمها النموذج كسياق ومعلومات إضافية لإنشاء الصور.
عند إضافة نموذج مكوّن إضافي إلى نموذج الأساس، يمكنك أيضًا ضبط المكوّن الإضافي
الخيارات. يستخدم المكوّن الإضافي لمعلم الوجه faceConditionOptions
، حافة Canny
يستخدم المكون الإضافي edgeConditionOptions
، ويستخدم المكون الإضافي Depth
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)
لعبة Canny Edge
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 (مطلوبة): القيمة العشوائية المستخدمة أثناء إنشاء الصور.
- condition image (صورة الحالة) (اختيارية): الصورة التي يستخدمها النموذج كمرجع لها الجيل. ينطبق فقط عند استخدام نموذج مكوِّن إضافي.
- condition type (نوع الشرط) (اختياري): نوع نموذج المكوِّن الإضافي المُستخدَم مع المهمة. ينطبق فقط عند استخدام نموذج مكوِّن إضافي.
الإدخالات التي تتضمّن نموذج الأساس فقط
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)
}
بعد إنشاء صورة الشرط، قم بتضمين in كمدخل مع السمة والمطالبة والأصل وعدد التكرارات.
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
الصورة التي يتم إنشاؤها: