Panduan pembuatan gambar untuk Android

Tugas Pembuat Gambar MediaPipe memungkinkan Anda membuat gambar berdasarkan perintah teks. Tugas ini menggunakan model teks-ke-gambar untuk menghasilkan gambar menggunakan teknik difusi.

Tugas ini menerima perintah teks sebagai input, bersama dengan gambar kondisi opsional yang dapat ditambah dan digunakan model sebagai referensi untuk pembuatan. Generator Gambar juga dapat menghasilkan gambar berdasarkan konsep tertentu yang diberikan kepada 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

Kode contoh Tugas MediaPipe adalah implementasi dasar aplikasi Generator Gambar untuk Android. Anda dapat menggunakan aplikasi tersebut sebagai titik awal untuk aplikasi Android Anda sendiri, atau merujuk ke aplikasi tersebut saat memodifikasi aplikasi yang sudah ada. Kode contoh Generator Gambar dihosting di GitHub.

Mendownload kode

Petunjuk berikut menunjukkan cara membuat salinan lokal dari kode contoh 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, konfigurasikan instance git untuk menggunakan checkout sparse sehingga Anda hanya memiliki file untuk aplikasi contoh Generator Gambar:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generator/android
    

Setelah membuat versi lokal dari 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: Menghasilkan gambar saat plugin atau bobot LoRA tidak diaktifkan.
  • PluginActivity.kt: Menerapkan model plugin, yang memungkinkan pengguna menyediakan gambar kondisi sebagai input.
  • LoRAWeightActivity.kt: Mengakses dan menangani bobot LoRA, yang digunakan untuk menyesuaikan model dasar dan memungkinkannya menghasilkan gambar konsep tertentu.

Penyiapan

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

Dependensi

Tugas Generator 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 baru, tambahkan dependensi library OpenCL native ke AndroidManifest.xml. Untuk selengkapnya, lihat dokumentasi tentang tag uses-native-library.

Beberapa perangkat Android mungkin juga memerlukan library tambahan:

<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 Generator Gambar MediaPipe memerlukan model dasar terlatih yang kompatibel dengan tugas ini. Setelah mendownload model, instal dependensi yang diperlukan dan konversikan model tersebut ke dalam format yang sesuai. Kemudian, kirim model yang dikonversi ke perangkat Android.

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

Download model dasar

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

Menginstal dependensi dan mengonversi 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>

Mengirim 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

Mendownload model Plugin dan menambahkan bobot LoRA (Opsional)

Jika Anda ingin menggunakan model plugin, periksa apakah model tersebut harus didownload. Untuk plugin yang memerlukan model tambahan, model plugin harus dipaketkan dalam APK atau didownload sesuai permintaan. Model plugin berukuran ringan (~23 MB) dan dapat dipaketkan langsung di APK. Namun, sebaiknya download model plugin sesuai permintaan.

Jika Anda telah menyesuaikan model dengan LoRA, download model secara on demand. Untuk mengetahui informasi selengkapnya, lihat model plugin bobot LoRA.

Membuat tugas

Tugas Generator Gambar MediaPipe menggunakan fungsi createFromOptions() untuk menyiapkan tugas. Fungsi createFromOptions() menerima nilai untuk opsi konfigurasi. Untuk 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 ditambah dan digunakan oleh model dasar sebagai referensi untuk pembuatan. Gambar kondisi ini dapat berupa penanda wajah, garis batas tepi, dan estimasi kedalaman, yang digunakan model sebagai konteks dan informasi tambahan untuk membuat gambar.

Saat menambahkan model plugin ke model dasar, konfigurasikan juga opsi plugin. Plugin tolok ukur wajah menggunakan faceConditionOptions, plugin Canny edge menggunakan edgeConditionOptions, dan plugin Depth menggunakan depthConditionOptions.

Opsi canny edge

Konfigurasikan opsi berikut di edgeConditionOptions.

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

Untuk informasi lebih lanjut tentang cara kerja opsi konfigurasi ini, lihat Pendeteksi tepi Canny.

Opsi tempat terkenal wajah

Konfigurasikan opsi berikut di faceConditionOptions.

Nama Opsi Deskripsi Rentang Nilai Nilai Default
minFaceDetectionConfidence Skor keyakinan minimum untuk deteksi wajah agar dianggap berhasil. Float [0.0,1.0] 0.5
minFacePresenceConfidence Skor keyakinan minimum skor kehadiran wajah dalam deteksi struktur 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 Penanda Wajah.

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 jalurnya di BaseOptions.

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

Tepi Canny

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)
    

Berkesan dalam

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 mengarah 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 menghasilkan gambar. Titik awal yang baik adalah 20.
  • seed (wajib): Seed acak yang digunakan selama pembuatan gambar.
  • condition image (opsional): Gambar yang digunakan model sebagai referensi untuk pembuatan. Hanya berlaku saat menggunakan model plugin.
  • condition type (opsional): Jenis model plugin yang digunakan dengan tugas. Hanya berlaku saat menggunakan model plugin.

Input dengan hanya 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 image 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, seed, dan jumlah iterasi.

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

Input dengan bobot LoRA

Jika Anda menggunakan bobot LoRA, pastikan token berada dalam prompt teks jika Anda ingin membuat gambar dengan konsep spesifik yang diwakili oleh bobot tersebut.

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

Menjalankan tugas

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

Membuat hanya dengan 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
}

Buat dengan bobot LoRA

Proses pembuatan gambar dengan model yang disesuaikan dengan bobot LoRA mirip dengan proses pembuatan 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 dihasilkan selama setiap iterasi, seperti yang ditentukan dalam parameter input iterations. Untuk melihat hasil menengah ini, panggil metode setInputs, lalu panggil execute() untuk menjalankan setiap langkah. Setel parameter showResult ke true untuk menampilkan hasil antara.

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 menyertakan gambar yang dihasilkan, stempel waktu waktu penyelesaian, dan gambar bersyarat jika diberikan sebagai input.

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

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

Input:

  • Prompt: "rakun kartun penuh warna mengenakan topi bertepi lebar floppy memegang tongkat berjalan di hutan, animasi, tampilan tiga perempat, melukis"
  • Seed: 312687592
  • Iterasi: 20

Gambar yang dihasilkan: