Tugas MediaPipe Image Generator 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, beserta gambar kondisi opsional yang dapat ditambah dan digunakan model sebagai referensi untuk pembuatan. Generator Gambar juga dapat menghasilkan gambar berdasarkan konsep tertentu 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 informasi selengkapnya tentang kemampuan, model, dan opsi konfigurasi tugas ini, lihat Ringkasan.
Contoh kode
Kode contoh 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. Kode contoh 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, konfigurasikan instance git untuk menggunakan checkout jarang, sehingga Anda hanya
memiliki file untuk aplikasi contoh Image Generator:
cd mediapipe 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: Melakukan inisialisasi tugas dan menangani pembuatan gambar.
- DiffusionActivity.kt: Menghasilkan gambar saat plugin atau bobot LoRA tidak diaktifkan.
- PluginActivity.kt: Mengimplementasikan 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 menghasilkan gambar konsep tertentu.
Penyiapan
Bagian ini menjelaskan langkah-langkah utama untuk menyiapkan lingkungan pengembangan dan project kode secara khusus untuk menggunakan Image Generator. Untuk informasi umum tentang menyiapkan lingkungan pengembangan 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 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 menjadi format yang sesuai. Kemudian, kirimkan model yang dikonversi ke perangkat Android.
Untuk informasi selengkapnya tentang model terlatih yang tersedia untuk Image Generator, lihat bagian Model ringkasan tugas.
Mendownload model dasar
Generator Gambar mewajibkan 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>
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
Mendownload model Plugin dan menambahkan bobot LoRA (Opsional)
Jika Anda ingin menggunakan model plugin, periksa apakah model harus didownload. Untuk plugin yang memerlukan model tambahan, model plugin harus dipaketkan dalam APK atau didownload sesuai permintaan. Model plugin ringan (~23 MB) dan dapat dipaketkan langsung dalam APK. Namun, sebaiknya download 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.
Membuat tugas
Tugas MediaPipe Image Generator 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 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 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 |
Nilai minimum kedua untuk prosedur histeresis. | Float |
200 |
apertureSize |
Ukuran aperture untuk operator Sobel. Rentang biasanya antara 3-7. | Integer |
3 |
l2Gradient |
Apakah norma L2 digunakan untuk menghitung magnitudo gradien gambar, bukan norma L1 default. | BOOLEAN |
False |
EdgePluginModelBaseOptions |
Objek BaseOptions yang menetapkan jalur
untuk model plugin. |
Objek BaseOptions |
N/A |
Untuk 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 dari 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 jalurnya 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)
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
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.
- 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 model dasar saja
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 beserta perintah, seed, 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)
}
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
}
Membuat dengan bobot LoRA
Proses pembuatan gambar dengan model yang disesuaikan dengan bobot LoRA mirip dengan proses dengan model fondasi 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
perantara 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 waktu penyelesaian, dan gambar bersyarat jika
disediakan sebagai input.
val bitmap = BitmapExtractor.extract(result.generatedImage())
Gambar berikut dibuat dari input berikut, hanya menggunakan model dasar.
Input:
- Perintah: "rakun kartun berwarna-warni yang mengenakan topi bertepi lebar dan longgar yang memegang tongkat sambil berjalan di hutan, animasi, tampilan tiga perempat, lukisan"
- Seed: 312687592
- Iterasi: 20
Gambar yang dihasilkan: