Tugas Generator Gambar MediaPipe memungkinkan Anda membuat gambar berdasarkan perintah teks. 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 pembuatan. Generator Gambar juga dapat membuat gambar berdasarkan konsep tertentu yang diberikan pada model selama pelatihan atau pelatihan ulang. Untuk informasi selengkapnya, lihat menyesuaikan dengan kebijakan privasi.
Contoh kode yang dijelaskan dalam petunjuk ini tersedia di GitHub. Untuk mengetahui informasi selengkapnya terkait kemampuan, model, dan opsi konfigurasi. tugas ini, lihat Ringkasan.
Contoh kode
Kode contoh Tugas MediaPipe adalah implementasi dasar dari Generator Gambar untuk Android. Anda dapat menggunakan aplikasi ini sebagai titik awal untuk Android Anda sendiri aplikasi Anda, atau merujuk ke sana saat memodifikasi aplikasi yang ada. Contoh Generator Gambar di-host oleh GitHub.
Mendownload kode
Petunjuk berikut menunjukkan cara membuat salinan lokal dari 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 Anda untuk menggunakan checkout sparse, sehingga Anda memiliki
hanya file untuk aplikasi contoh Image Generator:
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 petunjuk, lihat Panduan Penyiapan untuk Android.
Komponen utama
File berikut berisi kode penting untuk contoh pembuatan gambar ini aplikasi:
- ImageGenerationHelper.kt: Melakukan inisialisasi tugas dan menangani pembuatan gambar.
- DiffusionActivity.kt: Menghasilkan gambar saat plugin atau bobot LoRA tidak diaktifkan.
- PluginActivity.kt: Menerapkan model plugin, yang memungkinkan pengguna memberikan kondisi gambar sebagai input.
- LoRAWeightActivity.kt: Mengakses dan menangani bobot LoRA, yang digunakan untuk menyesuaikan fondasi model dan memungkinkannya menghasilkan gambar konsep tertentu.
Penyiapan
Bagian ini menjelaskan langkah-langkah utama untuk menyiapkan lingkungan pengembangan dan membuat kode project secara khusus untuk menggunakan Generator Gambar. Untuk informasi umum tentang menyiapkan lingkungan pengembangan untuk menggunakan tugas MediaPipe, termasuk persyaratan versi platform, lihat Panduan penyiapan untuk Android.
Dependensi
Tugas Image Generator 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 library OpenCL native
dependensi ke AndroidManifest.xml
. Untuk informasi selengkapnya, lihat dokumentasi di
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 mengonversi model data ke dalam format yang sesuai. Kemudian, dorong objek yang telah dikonversi model ini ke perangkat Android.
Untuk mengetahui informasi selengkapnya tentang model terlatih yang tersedia untuk Generator Gambar, lihat tugasnya ringkasan bagian Model.
Download model dasar
Generator Gambar mengharuskan model dasar cocok dengan
Format model runwayml/stable-diffusion-v1-5 EMA-only
, berdasarkan hal berikut
model:
runwayml/stable-diffusion-v1-5.
Menginstal dependensi dan mengonversi model
$ pip install torch typing_extensions numpy Pillow requests pytorch_lightning absl-py
Jalankan
convert.py
skrip:
$ 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
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, plugin model harus dipaketkan dalam APK atau didownload sesuai permintaan. Model plugin ringan (~23 MB) dan dapat langsung dipaketkan di APK. Namun, kita sebaiknya download model plugin sesuai permintaan.
Jika Anda telah menyesuaikan model dengan LoRA mengunduhnya sesuai permintaan. Untuk selengkapnya lihat informasi selengkapnya tentang model plugin bobot LoRA.
Membuat tugas
Tugas Generator Gambar MediaPipe menggunakan fungsi createFromOptions()
untuk menyiapkan
tugas Anda. Fungsi createFromOptions()
menerima nilai untuk konfigurasi
lainnya. Untuk informasi selengkapnya mengenai opsi konfigurasi, lihat Konfigurasi
lainnya.
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 telah 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 ditambahkan dan digunakan oleh model dasar sebagai referensi untuk pembuatan. Gambar kondisi ini bisa menjadi {i>landmark<i} 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 plugin
lainnya. Plugin Face landmark menggunakan faceConditionOptions
, edge Canny
plugin ini menggunakan edgeConditionOptions
, sedangkan plugin Depth menggunakan
depthConditionOptions
.
Opsi edge Canny
Konfigurasi 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 histeresis. | Float |
200 |
apertureSize |
Ukuran bukaan untuk operator Sobel. Rentang biasanya antara 3-7. | Integer |
3 |
l2Gradient |
Apakah norma L2 digunakan untuk menghitung besarnya gradien gambar, alih-alih norma L1 {i>default<i}. | 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 Pendeteksi tepi yang lucu.
Opsi penanda wajah
Konfigurasi opsi berikut di faceConditionOptions
.
Nama Opsi | Deskripsi | Rentang Nilai | Nilai Default |
---|---|---|---|
minFaceDetectionConfidence |
Skor keyakinan minimum deteksi wajah yang akan dianggap berhasil. | Float [0.0,1.0] |
0.5 |
minFacePresenceConfidence |
Skor keyakinan minimum untuk kehadiran wajah skor 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 informasi selengkapnya tentang cara kerja opsi konfigurasi ini, lihat Tugas Face Landmarker.
Opsi kedalaman
Konfigurasi 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)
Buat 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 image kondisi, tentukan jalur 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
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.
- iterasi (wajib): Total iterasi untuk menghasilkan gambar. J 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 teks. 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 conditionType
parameter untuk memilih model plugin dan parameter sourceConditionImage
untuk
buat gambar kondisi.
Nama Opsi | Deskripsi | Nilai |
---|---|---|
conditionType |
Model plugin yang diterapkan pada 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 prompt, seed, dan jumlah iterasi.
imageGenerator.setInputs(
prompt,
conditionalImage,
conditionType,
iteration,
seed
)
Input dengan bobot LoRA
Jika Anda menggunakan bobot LoRA, pastikan token tersebut ada dalam prompt teks jika Anda bermaksud membuat gambar dengan konsep spesifik 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 dengan model dasar saja
fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
val result = imageGenerator.generate(prompt, iteration, seed)
val bitmap = BitmapExtractor.extract(result?.generatedImage())
return bitmap
}
Buat 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 menghasilkan gambar dengan model yang disesuaikan dengan bobot LoRA adalah mirip dengan proses dengan model dasar standar. Pastikan token disertakan dalam prompt dan menjalankan 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
}
Generasi iteratif
Generator Gambar juga dapat menghasilkan output gambar perantara yang dihasilkan dalam setiap
iterasi, seperti yang ditentukan dalam parameter input iterations
. Untuk melihat
hasil perantara, panggil metode setInputs
, lalu panggil execute()
untuk menjalankan
setiap langkah. Setel parameter showResult
ke true
untuk menampilkan perantara
hasil pengujian tersebut.
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 kode
gambar, stempel waktu waktu penyelesaian, dan gambar bersyarat jika ada
disediakan sebagai input.
val bitmap = BitmapExtractor.extract(result.generatedImage())
Gambar berikut dihasilkan dari input berikut, hanya dengan menggunakan model dasar Anda.
Input:
- Perintah: "rakun kartun warna-warni memakai topi floppy lebar memegang tongkat berjalan melintasi hutan, animasi, tampilan tiga perempat, melukis"
- Seed: 312687592
- Iterasi: 20
Gambar yang dihasilkan: