راهنمای تولید تصویر برای اندروید

وظیفه‌ی تولیدکننده‌ی تصویر MediaPipe به شما امکان می‌دهد تصاویر را بر اساس یک متن تولید کنید. این وظیفه از یک مدل تبدیل متن به تصویر برای تولید تصاویر با استفاده از تکنیک‌های انتشار استفاده می‌کند.

این وظیفه یک متن فوری را به عنوان ورودی می‌پذیرد، به همراه یک تصویر وضعیت اختیاری که مدل می‌تواند آن را تقویت کرده و به عنوان مرجع برای تولید استفاده کند. تولیدکننده تصویر همچنین می‌تواند تصاویر را بر اساس مفاهیم خاصی که در طول آموزش یا بازآموزی به مدل ارائه می‌شود، تولید کند. برای اطلاعات بیشتر، به سفارشی‌سازی با LoRA مراجعه کنید.

نمونه کد شرح داده شده در این دستورالعمل‌ها در GitHub موجود است. برای اطلاعات بیشتر در مورد قابلیت‌ها، مدل‌ها و گزینه‌های پیکربندی این وظیفه، به Overview مراجعه کنید.

مثال کد

کد نمونه‌ی MediaPipe Tasks یک پیاده‌سازی اولیه از یک برنامه‌ی Image Generator برای اندروید است. می‌توانید از این برنامه به عنوان نقطه‌ی شروع برای برنامه‌ی اندروید خود استفاده کنید یا هنگام تغییر یک برنامه‌ی موجود به آن مراجعه کنید. کد نمونه‌ی Image Generator در GitHub میزبانی می‌شود.

کد را دانلود کنید

دستورالعمل‌های زیر به شما نشان می‌دهند که چگونه با استفاده از ابزار خط فرمان git ، یک کپی محلی از کد مثال ایجاد کنید.

برای دانلود کد مثال:

  1. مخزن git را با استفاده از دستور زیر کلون کنید:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. به صورت اختیاری، نمونه git خود را طوری پیکربندی کنید که از پرداخت پراکنده استفاده کند، تا فقط فایل‌های مربوط به برنامه نمونه Image Generator را داشته باشید:
    cd mediapipe-samples
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generation/android
    

پس از ایجاد یک نسخه محلی از کد نمونه، می‌توانید پروژه را به اندروید استودیو وارد کرده و برنامه را اجرا کنید. برای دستورالعمل‌ها، به راهنمای راه‌اندازی برای اندروید مراجعه کنید.

اجزای کلیدی

فایل‌های زیر حاوی کد حیاتی برای این نمونه برنامه تولید تصویر هستند:

  • ImageGenerationHelper.kt : وظیفه را مقداردهی اولیه کرده و تولید تصویر را مدیریت می‌کند.
  • DiffusionActivity.kt : زمانی که افزونه‌ها یا وزن‌های LoRA فعال نباشند، تصاویر را تولید می‌کند.
  • PluginActivity.kt : مدل‌های افزونه را پیاده‌سازی می‌کند که به کاربران امکان می‌دهد یک تصویر وضعیت را به عنوان ورودی ارائه دهند.
  • LoRAWeightActivity.kt : به وزن‌های LoRA دسترسی پیدا می‌کند و آنها را مدیریت می‌کند، که برای سفارشی‌سازی مدل‌های پایه استفاده می‌شوند و آنها را قادر می‌سازند تا تصاویری از مفاهیم خاص تولید کنند.

راه‌اندازی

این بخش مراحل کلیدی برای تنظیم محیط توسعه و پروژه‌های کدنویسی شما را به طور خاص برای استفاده از Image Generator شرح می‌دهد. برای اطلاعات کلی در مورد تنظیم محیط توسعه برای استفاده از وظایف MediaPipe، از جمله الزامات نسخه پلتفرم، به راهنمای تنظیم برای اندروید مراجعه کنید.

وابستگی‌ها

وظیفه Image Generator از کتابخانه com.google.mediapipe:tasks-vision-image-generator استفاده می‌کند. این وابستگی را به فایل build.gradle برنامه اندروید خود اضافه کنید:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision-image-generator:latest.release'
}

برای دستگاه‌هایی با اندروید ۱۲ (API 31) یا بالاتر، وابستگی کتابخانه بومی OpenCL را اضافه کنید. برای اطلاعات بیشتر، به مستندات مربوط به برچسب uses-native-library مراجعه کنید.

تگ‌های uses-native-library زیر را به فایل AndroidManifest.xml اضافه کنید:

<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) به یک مدل پایه‌ی آموزش‌دیده نیاز دارد که با این وظیفه سازگار باشد. پس از دانلود یک مدل، وابستگی‌های مورد نیاز را نصب کنید و مدل را به یک فرمت مناسب تبدیل کنید. سپس، مدل تبدیل‌شده را به دستگاه اندروید منتقل کنید.

برای اطلاعات بیشتر در مورد مدل‌های آموزش‌دیده‌ی موجود برای Image Generator، به بخش مدل‌های نمای کلی وظایف مراجعه کنید.

دانلود مدل فونداسیون

ابزار Image Generator الزام می‌کند که مدل پایه با فرمت مدل stable-diffusion-v1-5/stable-diffusion-v1-5 EMA-only ، بر اساس مدل زیر مطابقت داشته باشد: stable-diffusion-v1-5/stable-diffusion-v1-5 EMA-only .

نصب وابستگی‌ها و تبدیل مدل

$ 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> را به دستگاه اندروید منتقل کنید.

$ 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 قرار داده شوند یا در صورت نیاز دانلود شوند. مدل‌های افزونه سبک هستند (حدود ۲۳ مگابایت) و می‌توانند مستقیماً در APK قرار داده شوند. با این حال، توصیه می‌کنیم مدل‌های افزونه را در صورت نیاز دانلود کنید.

اگر مدلی را با LoRA سفارشی کرده‌اید ، آنها را در صورت نیاز دانلود کنید. برای اطلاعات بیشتر، به مدل افزونه وزن‌های LoRA مراجعه کنید.

وظیفه را ایجاد کنید

وظیفه‌ی تولیدکننده‌ی تصویر MediaPipe از تابع createFromOptions() برای تنظیم وظیفه استفاده می‌کند. تابع createFromOptions() مقادیری را برای گزینه‌های پیکربندی می‌پذیرد. برای اطلاعات بیشتر در مورد گزینه‌های پیکربندی، به گزینه‌های پیکربندی مراجعه کنید.

گزینه‌های پیکربندی

این وظیفه گزینه‌های پیکربندی زیر را برای برنامه‌های اندروید دارد:

نام گزینه توضیحات محدوده ارزش
imageGeneratorModelDirectory دایرکتوری مدل مولد تصویر که وزن‌های مدل را ذخیره می‌کند. PATH
loraWeightsFilePath مسیر فایل وزن‌های LoRA را تنظیم می‌کند. اختیاری است و فقط در صورتی قابل اجرا است که مدل با LoRA سفارشی‌سازی شده باشد. PATH
errorListener یک شنونده‌ی خطای اختیاری تنظیم می‌کند. N/A

این وظیفه همچنین از مدل‌های افزونه پشتیبانی می‌کند که به کاربران اجازه می‌دهد تصاویر وضعیت را در ورودی وظیفه بگنجانند، که مدل پایه می‌تواند آنها را تقویت کرده و به عنوان مرجعی برای تولید استفاده کند. این تصاویر وضعیت می‌توانند نشانه‌های چهره، خطوط لبه و تخمین عمق باشند که مدل از آنها به عنوان زمینه و اطلاعات اضافی برای تولید تصاویر استفاده می‌کند.

هنگام افزودن یک مدل افزونه به مدل پایه، گزینه‌های افزونه را نیز پیکربندی کنید. افزونه Face landmark از faceConditionOptions ، افزونه Canny edge از edgeConditionOptions و افزونه Depth از depthConditionOptions استفاده می‌کند.

گزینه‌های هوشمندانه و هوشمندانه

گزینه‌های زیر را در edgeConditionOptions پیکربندی کنید.

نام گزینه توضیحات محدوده ارزش مقدار پیش‌فرض
threshold1 آستانه اول برای روش هیسترزیس. Float 100
threshold2 آستانه دوم برای روش هیسترزیس. Float 200
apertureSize اندازه دیافراگم برای عملگر Sobel. محدوده معمول بین ۳ تا ۷ است. Integer 3
l2Gradient اینکه آیا به جای هنجار پیش‌فرض L1، از هنجار L2 برای محاسبه‌ی بزرگی گرادیان تصویر استفاده شود یا خیر. 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

برای اطلاعات بیشتر در مورد نحوه عملکرد این گزینه‌های پیکربندی، به وظیفه Face Landmarker مراجعه کنید.

گزینه‌های عمق

گزینه‌های زیر را در 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)

آماده‌سازی داده‌ها

مولد تصویر ورودی‌های زیر را می‌پذیرد:

  • دستور (الزامی): متن دستوری که تصویر مورد نظر برای تولید را توصیف می‌کند.
  • تکرارها (الزامی): کل تکرارها برای تولید تصویر. نقطه شروع خوب ۲۰ است.
  • دانه (مورد نیاز): دانه تصادفی مورد استفاده در طول تولید تصویر.
  • تصویر وضعیت (اختیاری): تصویری که مدل به عنوان مرجع برای تولید استفاده می‌کند. فقط هنگام استفاده از مدل افزونه قابل اجرا است.
  • نوع شرط (اختیاری): نوع مدل افزونه‌ای که با وظیفه استفاده می‌شود. فقط هنگام استفاده از مدل افزونه قابل اجرا است.

ورودی‌هایی که فقط مدل فونداسیون را دارند

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())

تصویر زیر از ورودی‌های زیر و تنها با استفاده از یک مدل فونداسیون تولید شده است.

ورودی‌ها:

  • پیشنهاد : «یک راکون کارتونی رنگارنگ که کلاه لبه پهنی به سر دارد و چوبی در دست دارد و در جنگل قدم می‌زند، متحرک، نمای سه‌رخ، نقاشی»
  • بذر : ۳۱۲۶۸۷۵۹۲
  • تکرارها : ۲۰

تصویر تولید شده:

تصویر تولید شده از یک راکون که با درخواست مطابقت دارد