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

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

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

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

نمونه کد

کد مثال 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
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generation/android
    

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

اجزای کلیدی

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

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

راه اندازی

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

وابستگی ها

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

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

برای دستگاه‌های دارای Android 12 (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 مستلزم آن است که مدل پایه با فرمت مدل 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 Weights را ببینید.

کار را ایجاد کنید

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

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

این کار دارای گزینه های پیکربندی زیر برای برنامه های Android است:

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

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

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

گزینه های Canny edge

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

برای اطلاعات بیشتر در مورد نحوه عملکرد این گزینه های پیکربندی، به کار 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)
    

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)

داده ها را آماده کنید

Image Generator ورودی های زیر را می پذیرد:

  • prompt (لازم): اعلان متنی که تصویری را که باید تولید شود را توصیف می کند.
  • تکرارها (الزامی): کل تکرارها برای تولید تصویر. نقطه شروع خوب 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)
}

پس از ایجاد تصویر شرط، به عنوان ورودی به همراه دستور، seed و تعداد تکرارها وارد کنید.

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
}

نسل تکراری

Image Generator همچنین می تواند تصاویر میانی تولید شده را در طول هر تکرار، همانطور که در پارامتر ورودی iterations تعریف شده است، خروجی دهد. برای مشاهده این نتایج میانی، متد setInputs را فراخوانی کنید، سپس execute() برای اجرای هر مرحله فراخوانی کنید. برای نمایش نتایج میانی، پارامتر showResult را روی true تنظیم کنید.

fun execute(showResult: Boolean): Bitmap {
    val result = imageGenerator.execute(showResult)

    val bitmap =
        BitmapExtractor.extract(result.generatedImage())

    return bitmap
}

کنترل و نمایش نتایج

Image Generator یک ImageGeneratorResult را برمی‌گرداند که شامل تصویر تولید شده، مهر زمانی از زمان تکمیل، و تصویر مشروط در صورتی که به عنوان ورودی ارائه شده باشد.

val bitmap = BitmapExtractor.extract(result.generatedImage())

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

ورودی ها:

  • اعلان : "یک راکون کارتونی رنگارنگ با کلاه لبه پهن فلاپی و چوبی در دست دارد که در جنگل قدم می زند، متحرک، نمای سه چهارم، نقاشی"
  • بذر : 312687592
  • تکرار : 20

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