Panduan pembuatan gambar untuk Android

Tugas MediaPipe Image Generator memungkinkan Anda membuat gambar berdasarkan perintah teks. Tugas ini menggunakan model text-to-image untuk membuat gambar menggunakan teknik difusi.

Tugas ini menerima perintah teks sebagai input, beserta gambar kondisi opsional yang dapat ditingkatkan dan digunakan model sebagai referensi untuk pembuatan. Generator Gambar juga dapat menghasilkan gambar berdasarkan konsep spesifik yang diberikan ke model selama pelatihan atau pelatihan ulang. Untuk mengetahui informasi selengkapnya, lihat menyesuaikan dengan LoRA.

Contoh kode yang dijelaskan dalam petunjuk ini tersedia di GitHub. Untuk mengetahui informasi selengkapnya tentang kemampuan, model, dan opsi konfigurasi tugas ini, lihat Ringkasan.

Contoh kode

Contoh kode MediaPipe Tasks adalah implementasi dasar aplikasi Image Generator untuk Android. Anda dapat menggunakan aplikasi ini sebagai titik awal untuk aplikasi Android Anda sendiri, atau merujuknya saat mengubah aplikasi yang ada. Contoh kode Image Generator dihosting di GitHub.

Mendownload kode

Petunjuk berikut menunjukkan cara membuat salinan lokal contoh kode menggunakan alat command line git.

Untuk mendownload kode contoh:

  1. Clone repositori git menggunakan perintah berikut:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Secara opsional, konfigurasi instance git Anda untuk menggunakan sparse checkout, sehingga Anda hanya memiliki file untuk aplikasi contoh Image Generator:
    cd mediapipe-samples
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generation/android
    

Setelah membuat versi lokal kode contoh, Anda dapat mengimpor project ke Android Studio dan menjalankan aplikasi. Untuk mengetahui petunjuknya, lihat Panduan Penyiapan untuk Android.

Komponen utama

File berikut berisi kode penting untuk aplikasi contoh pembuatan gambar ini:

  • ImageGenerationHelper.kt: Menginisialisasi tugas dan menangani pembuatan gambar.
  • DiffusionActivity.kt: Membuat gambar saat plugin atau bobot LoRA tidak diaktifkan.
  • PluginActivity.kt: Menerapkan model plugin, yang memungkinkan pengguna memberikan gambar kondisi sebagai input.
  • LoRAWeightActivity.kt: Mengakses dan menangani bobot LoRA, yang digunakan untuk menyesuaikan model dasar dan memungkinkannya membuat gambar konsep tertentu.

Penyiapan

Bagian ini menjelaskan langkah-langkah utama untuk menyiapkan lingkungan pengembangan dan project kode secara khusus untuk menggunakan Pembuat Gambar. Untuk informasi umum tentang menyiapkan lingkungan pengembangan untuk menggunakan tugas MediaPipe, termasuk persyaratan versi platform, lihat Panduan penyiapan untuk Android.

Dependensi

Tugas Pembuat Gambar menggunakan library com.google.mediapipe:tasks-vision-image-generator. Tambahkan dependensi ini ke file build.gradle aplikasi Android Anda:

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

Untuk perangkat dengan Android 12 (API 31) atau yang lebih tinggi, tambahkan dependensi library OpenCL native. Untuk mengetahui informasi selengkapnya, lihat dokumentasi tentang tag uses-native-library.

Tambahkan tag uses-native-library berikut ke file 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" />

Model

Tugas MediaPipe Image Generator memerlukan model dasar terlatih yang kompatibel dengan tugas ini. Setelah mendownload model, instal dependensi yang diperlukan dan konversi model ke format yang sesuai. Kemudian, kirimkan model yang dikonversi ke perangkat Android.

Untuk mengetahui informasi selengkapnya tentang model terlatih yang tersedia untuk Pembuat Gambar, lihat ringkasan tugas di bagian Model.

Download model dasar

Generator Gambar mewajibkan model dasar cocok dengan format model stable-diffusion-v1-5/stable-diffusion-v1-5 EMA-only, berdasarkan model berikut: stable-diffusion-v1-5/stable-diffusion-v1-5 EMA-only.

Instal dependensi dan konversi model

$ pip install torch typing_extensions numpy Pillow requests pytorch_lightning absl-py

Jalankan skrip convert.py:

$ python3 convert.py --ckpt_path <ckpt_path> --output_path <output_path>

Mendorong model yang dikonversi ke perangkat

Kirim konten folder <output_path> ke perangkat 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

Download model Plugin dan tambahkan bobot LoRA (Opsional)

Jika Anda ingin menggunakan model plugin, periksa apakah model harus didownload. Untuk plugin yang memerlukan model tambahan, model plugin harus dibundel dalam APK atau didownload sesuai permintaan. Model plugin berukuran kecil (~23 MB) dan dapat digabungkan langsung dalam APK. Namun, sebaiknya Anda mendownload model plugin sesuai permintaan.

Jika Anda telah menyesuaikan model dengan LoRA, download model tersebut sesuai permintaan. Untuk mengetahui informasi selengkapnya, lihat model plugin bobot LoRA.

Buat tugas

Tugas Pembuat Gambar MediaPipe menggunakan fungsi createFromOptions() untuk menyiapkan tugas. Fungsi createFromOptions() menerima nilai untuk opsi konfigurasi. Untuk mengetahui informasi selengkapnya tentang opsi konfigurasi, lihat Opsi konfigurasi.

Opsi konfigurasi

Tugas ini memiliki opsi konfigurasi berikut untuk aplikasi Android:

Nama Opsi Deskripsi Rentang Nilai
imageGeneratorModelDirectory Direktori model generator gambar yang menyimpan bobot model. PATH
loraWeightsFilePath Menetapkan jalur ke file bobot LoRA. Opsional dan hanya berlaku jika model disesuaikan dengan LoRA. PATH
errorListener Menetapkan pemroses error opsional. N/A

Tugas ini juga mendukung model plugin, yang memungkinkan pengguna menyertakan gambar kondisi dalam input tugas, yang dapat diperkaya dan digunakan sebagai referensi untuk pembuatan oleh model dasar. Gambar kondisi ini dapat berupa penanda wajah, garis tepi, dan perkiraan kedalaman, yang digunakan model sebagai konteks dan informasi tambahan untuk membuat gambar.

Saat menambahkan model plugin ke model dasar, konfigurasi juga opsi plugin. Plugin penanda Wajah menggunakan faceConditionOptions, plugin tepi Canny menggunakan edgeConditionOptions, dan plugin Kedalaman menggunakan depthConditionOptions.

Opsi tepi Canny

Konfigurasikan opsi berikut di edgeConditionOptions.

Nama Opsi Deskripsi Rentang Nilai Nilai Default
threshold1 Nilai minimum pertama untuk prosedur histeresis. Float 100
threshold2 Ambang batas kedua untuk prosedur histeresis. Float 200
apertureSize Ukuran bukaan untuk operator Sobel. Rentang umum adalah antara 3-7. Integer 3
l2Gradient Apakah norma L2 digunakan untuk menghitung besarnya gradien gambar, bukan norma L1 default. BOOLEAN False
EdgePluginModelBaseOptions Objek BaseOptions yang menetapkan jalur untuk model plugin. Objek BaseOptions N/A

Untuk mengetahui informasi selengkapnya tentang cara kerja opsi konfigurasi ini, lihat Detektor tepi Canny.

Opsi penanda wajah

Konfigurasikan opsi berikut di faceConditionOptions.

Nama Opsi Deskripsi Rentang Nilai Nilai Default
minFaceDetectionConfidence Skor keyakinan minimum agar deteksi wajah dianggap berhasil. Float [0.0,1.0] 0.5
minFacePresenceConfidence Skor keyakinan minimum skor kehadiran wajah dalam deteksi penanda wajah. Float [0.0,1.0] 0.5
faceModelBaseOptions Objek BaseOptions yang menetapkan jalur untuk model yang membuat gambar kondisi. Objek BaseOptions N/A
FacePluginModelBaseOptions Objek BaseOptions yang menetapkan jalur untuk model plugin. Objek BaseOptions N/A

Untuk mengetahui informasi selengkapnya tentang cara kerja opsi konfigurasi ini, lihat tugas Face Landmarker.

Opsi kedalaman

Konfigurasikan opsi berikut di depthConditionOptions.

Nama Opsi Deskripsi Rentang Nilai Nilai Default
depthModelBaseOptions Objek BaseOptions yang menetapkan jalur untuk model yang membuat gambar kondisi. Objek BaseOptions N/A
depthPluginModelBaseOptions Objek BaseOptions yang menetapkan jalur untuk model plugin. Objek BaseOptions N/A

Membuat hanya dengan model dasar

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

imageGenerator = ImageGenerator.createFromOptions(context, options)

Membuat dengan plugin

Jika Anda menerapkan model plugin opsional, tetapkan opsi dasar untuk model plugin dengan setPluginModelBaseOptions. Jika model plugin memerlukan model tambahan yang didownload untuk membuat gambar kondisi, tentukan jalur di BaseOptions.

Penanda wajah

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)
    

Tebal

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)
    

Membuat dengan bobot LoRA

Jika Anda menyertakan bobot LoRA, gunakan parameter loraWeightsFilePath untuk menunjuk ke lokasi jalur.

val options = ImageGeneratorOptions.builder()
    .setLoraWeightsFilePath(weightsPath)
    .setImageGeneratorModelDirectory(modelPath)
    .build()

imageGenerator = ImageGenerator.createFromOptions(context, options)

Menyiapkan data

Generator Gambar menerima input berikut:

  • prompt (wajib): Perintah teks yang menjelaskan gambar yang akan dibuat.
  • iterations (wajib): Total iterasi untuk membuat gambar. Titik awal yang baik adalah 20.
  • seed (wajib): Seed acak yang digunakan selama pembuatan gambar.
  • gambar kondisi (opsional): Gambar yang digunakan model sebagai referensi untuk generasi. Hanya berlaku saat menggunakan model plugin.
  • jenis kondisi (opsional): Jenis model plugin yang digunakan dengan tugas. Hanya berlaku saat menggunakan model plugin.

Input hanya dengan model dasar

fun setInput(prompt: String, iteration: Int, seed: Int) {
    imageGenerator.setInputs(prompt, iteration, seed)
}

Input dengan plugin

Jika Anda menerapkan model plugin opsional, gunakan juga parameter conditionType untuk memilih model plugin dan parameter sourceConditionImage untuk membuat gambar kondisi.

Nama Opsi Deskripsi Nilai
conditionType Model plugin yang diterapkan ke model dasar. {"FACE", "EDGE", "DEPTH"}
sourceConditionImage Gambar sumber yang digunakan untuk membuat gambar kondisi. Objek MPImage

Jika Anda menggunakan model plugin, gunakan createConditionImage untuk membuat gambar kondisi:

fun createConditionImage(
    inputImage: MPImage,
    conditionType: ConditionType
): Bitmap {
    val result =
        imageGenerator.createConditionImage(inputImage, conditionType)
    return BitmapExtractor.extract(result)
}

Setelah membuat gambar kondisi, sertakan sebagai input bersama dengan perintah, nilai awal, dan jumlah iterasi.

imageGenerator.setInputs(
    prompt,
    conditionalImage,
    conditionType,
    iteration,
    seed
)

Input dengan bobot LoRA

Jika Anda menggunakan bobot LoRA, pastikan token ada dalam perintah teks jika Anda ingin membuat gambar dengan konsep tertentu yang diwakili oleh bobot.

fun setInput(prompt: String, iteration: Int, seed: Int) {
    imageGenerator.setInputs(prompt, iteration, seed)
}

Jalankan tugas

Gunakan metode generate() untuk membuat gambar menggunakan input yang diberikan di bagian sebelumnya. Tindakan ini akan menghasilkan satu gambar yang dibuat.

Membuat dengan hanya model dasar

fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
    val result = imageGenerator.generate(prompt, iteration, seed)
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

Membuat dengan plugin

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
}

Membuat dengan bobot LoRA

Proses pembuatan gambar dengan model yang disesuaikan dengan bobot LoRA mirip dengan proses dengan model dasar standar. Pastikan token disertakan dalam perintah dan jalankan kode yang sama.

fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
    val result = imageGenerator.generate(prompt, iteration, seed)
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

Pembuatan iteratif

Generator Gambar juga dapat menghasilkan gambar perantara yang dibuat selama setiap iterasi, seperti yang ditentukan dalam parameter input iterations. Untuk melihat hasil sementara ini, panggil metode setInputs, lalu panggil execute() untuk menjalankan setiap langkah. Tetapkan parameter showResult ke true untuk menampilkan hasil menengah.

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

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

    return bitmap
}

Menangani dan menampilkan hasil

Generator Gambar menampilkan ImageGeneratorResult, yang mencakup gambar yang dihasilkan, stempel waktu saat penyelesaian, dan gambar bersyarat jika ada yang diberikan sebagai input.

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

Gambar berikut dibuat dari input berikut, hanya menggunakan model dasar.

Input:

  • Perintah: "seekor rakun kartun berwarna-warni yang mengenakan topi lebar yang lemas memegang tongkat saat berjalan di hutan, animasi, tampilan tiga perempat, lukisan"
  • Seed: 312687592
  • Iterasi: 20

Gambar yang dihasilkan:

Gambar rakun yang dibuat sesuai dengan perintah