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

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

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

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

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

رمز مثال "مهام MediaPipe" هو تنفيذ أساسي لمنشئ الصور تطبيق 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 وتشغيل التطبيق. للحصول على إرشادات، راجع دليل إعداد 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

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