Panduan pembuatan gambar untuk Android

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:

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