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:
- Clone repositori git menggunakan perintah berikut:
git clone https://github.com/google-ai-edge/mediapipe-samples
- 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: