دليل إنشاء الصور لنظام التشغيل Android

تتيح لك مهمة MediaPipe Image Generator إنشاء صور بناءً على طلب نصي. تستخدم هذه المهمة نموذج تحويل النص إلى صورة لإنشاء صور باستخدام تقنيات الانتشار.

تقبل المهمة مطالبة نصية كإدخال، بالإضافة إلى صورة شرطية اختيارية يمكن أن يعززها النموذج واستخدامه كمرجع للإنشاء. بإمكان "منشئ الصور" أيضًا إنشاء صور بناءً على مفاهيم محدّدة يتم تقديمها للنموذج أثناء التدريب أو إعادة التدريب. لمزيد من المعلومات، يُرجى الاطّلاع على التخصيص باستخدام LoRA.

يتوفّر نموذج الرمز البرمجي الموضّح في هذه التعليمات على GitHub. للحصول على مزيد من المعلومات حول الإمكانيات والنماذج وخيارات الإعداد لهذه المهمة، يُرجى الاطّلاع على نظرة عامة.

مثال الرمز البرمجي

يُعد مثال الرمز البرمجي لمهام MediaPipe تطبيقًا أساسيًا لتطبيق Image Generator لنظام Android. يمكنك استخدام التطبيق كنقطة بداية لتطبيق Android الخاص بك، أو الرجوع إليه عند تعديل تطبيق حالي. تتم استضافة مثال الرمز البرمجي لـ "منشئ الصور" على GitHub.

تنزيل الرمز

توضّح لك التعليمات التالية كيفية إنشاء نسخة محلية من رمز المثال باستخدام أداة سطر الأوامر git.

لتنزيل نموذج الرمز:

  1. استنسِخ مستودع git باستخدام الأمر التالي:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. يمكنك اختياريًا ضبط مثيل git لاستخدام طريقة الدفع المتفرقة، بحيث لا يكون لديك سوى ملفات مثال تطبيق Image Generator:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generator/android
    

بعد إنشاء نسخة محلية من الرمز النموذجي، يمكنك استيراد المشروع إلى "استوديو Android" وتشغيل التطبيق. للحصول على التعليمات، يمكنك مراجعة دليل الإعداد لنظام التشغيل Android.

المكونات الرئيسية

تحتوي الملفات التالية على الرمز المهم لتطبيق مثال إنشاء الصور هذا:

  • 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'
}

بالنسبة إلى الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android (واجهة برمجة التطبيقات 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 Image Generator نموذج أساس مدرَّب متوافقًا مع هذه المَهمّة. بعد تنزيل نموذج، قم بتثبيت التبعيات المطلوبة وقم بتحويل نموذجه إلى تنسيق مناسب. بعد ذلك، ادفع النموذج المحوَّل إلى جهاز 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 Image Generator الدالة createFromOptions() لإعداد المهمة. تقبل الدالة createFromOptions() قيمًا لخيارات الضبط. لمزيد من المعلومات حول خيارات الضبط، يُرجى الاطّلاع على خيارات الضبط.

خيارات الضبط

تشمل هذه المهمة خيارات الضبط التالية لتطبيقات Android:

اسم الخيار الوصف نطاق القيمة
imageGeneratorModelDirectory دليل نموذج منشئ الصور الذي يخزِّن أوزان النموذج. PATH
loraWeightsFilePath لضبط المسار على ملف الأوزان LoRA. اختيارية ولا تنطبق إلا إذا تم تخصيص النموذج من خلال LoRA. PATH
errorListener لضبط أداة معالجة الأخطاء الاختيارية. N/A

تدعم المهمة أيضًا نماذج المكوّنات الإضافية، التي تتيح للمستخدمين تضمين صور الحالات في إدخال المهمة، والتي يمكن أن يعززها النموذج الأساسي واستخدامه كمرجع للإنشاء. يمكن أن تكون صور الحالة هذه معالم الوجه ومخططات الحواف وتقديرات العمق، التي يستخدمها النموذج كسياق ومعلومات إضافية لإنشاء الصور.

عند إضافة نموذج مكوِّن إضافي إلى نموذج الأساس، يمكنك أيضًا تهيئة خيارات المكوِّن الإضافي. يستخدم المكوّن الإضافي لمعالم الوجه faceConditionOptions، ويستخدم المكوّن الإضافي Canny Edge edgeConditionOptions، والمكوّن الإضافي Depth يستخدم depthConditionOptions.

خيارات حواف Canny

اضبط الخيارات التالية في edgeConditionOptions.

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
threshold1 الحد الأول لإجراء الهستيرات. Float 100
threshold2 الحد الثاني لإجراء التوتر. Float 200
apertureSize حجم فتحة العدسة لعامل Sobel. يتراوح النطاق النموذجي بين 3 و7. Integer 3
l2Gradient تحدّد هذه السمة ما إذا تم استخدام قاعدة L2 لاحتساب مقدار تدرّج الصورة، بدلاً من القاعدة التلقائية L1. 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

لمزيد من المعلومات حول آلية عمل خيارات الإعداد هذه، يمكنك الاطّلاع على مهمة Facemarker.

خيارات العمق

اضبط الخيارات التالية في 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)
}

بعد إنشاء صورة الشرط، قم بتضمينها كمدخل مع الطلب والأساسي وعدد التكرارات.

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

الصورة التي يتم إنشاؤها: