Android için resim oluşturma kılavuzu

MediaPipe Resim Oluşturucu görevi, metin istemlerine göre resim oluşturmanıza olanak tanır. Bu görevde, difüzyon tekniklerini kullanarak görüntü oluşturmak için metinden görsele dönüştürme modeli kullanılır.

Görev, giriş olarak bir metin istemi ve modelin artırıp oluşturma işlemi için referans olarak kullanabileceği isteğe bağlı bir koşul resmi kabul eder. Resim Oluşturucu, eğitim veya yeniden eğitim sırasında modele sağlanan belirli kavramlara göre de resim oluşturabilir. Daha fazla bilgi için LoRA ile özelleştirme başlıklı makaleyi inceleyin.

Bu talimatlarda açıklanan kod örneğini GitHub'da bulabilirsiniz. Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel bakış bölümüne bakın.

Kod örneği

MediaPipe Tasks örnek kodu, Android için bir resim oluşturucu uygulamasının temel bir uygulamasıdır. Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken referans olarak kullanabilirsiniz. Resim Oluşturucu örnek kodu GitHub'da barındırılır.

Kodu indirme

Aşağıdaki talimatlarda, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasının nasıl oluşturulacağı gösterilmektedir.

Örnek kodu indirmek için:

  1. Aşağıdaki komutu kullanarak git deposunu klonlayın:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. İsteğe bağlı olarak, git örneğinizi seyrek kontrol kullanacak şekilde yapılandırın. Böylece, yalnızca Resim Oluşturucu örnek uygulamasının dosyalarına sahip olursunuz:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generation/android
    

Örnek kodun yerel bir sürümünü oluşturduktan sonra projeyi Android Studio'ya aktarabilir ve uygulamayı çalıştırabilirsiniz. Talimatlar için Android için Kurulum Kılavuzu'na bakın.

Temel bileşenler

Aşağıdaki dosyalar, bu resim oluşturma örneği uygulamasının önemli kodunu içerir:

  • ImageGenerationHelper.kt: Görevi başlatır ve görüntü oluşturma işlemini yönetir.
  • DiffusionActivity.kt: Eklentiler veya LoRA ağırlıkları etkinleştirilmediğinde resimler oluşturur.
  • PluginActivity.kt: Eklenti modellerini uygular ve kullanıcıların giriş olarak koşullu resim sağlamalarına olanak tanır.
  • LoRAWeightActivity.kt: temel modelleri özelleştirmek ve belirli kavramların resimlerini oluşturmalarını sağlamak için kullanılan LoRA ağırlıklarına erişir ve bu ağırlıkları işler.

Kurulum

Bu bölümde, geliştirme ortamınızı ve kod projelerinizi özellikle Resim Oluşturucu'yu kullanacak şekilde ayarlamayla ilgili temel adımlar açıklanmaktadır. Platform sürümü gereksinimleri dahil olmak üzere, geliştirme ortamınızı MediaPipe görevlerini kullanmak için ayarlama hakkında genel bilgi için Android için kurulum kılavuzuna bakın.

Bağımlılıklar

Resim Oluşturucu görevi com.google.mediapipe:tasks-vision-image-generator kitaplığını kullanır. Aşağıdaki bağımlılık dosyasını Android uygulamanızın build.gradle dosyasına ekleyin:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision-image-generator:latest.release'
}

Android 12 (API 31) veya sonraki sürümleri çalıştıran cihazlar için yerel OpenCL kitaplığı bağımlılığını ekleyin. Daha fazla bilgi için uses-native-library etiketiyle ilgili dokümanları inceleyin.

AndroidManifest.xml dosyasına aşağıdaki uses-native-library etiketlerini ekleyin:

<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

MediaPipe Resim Oluşturucu görevi, bu görevle uyumlu bir eğitimli temel model gerektirir. Bir modeli indirdikten sonra gerekli bağımlılıkları yükleyin ve modeli uygun bir biçime dönüştürün. Ardından, dönüştürülmüş modeli Android cihaza aktarın.

Resim Oluşturucu için kullanılabilen eğitilmiş modeller hakkında daha fazla bilgi için göreve genel bakıştaki Modeller bölümüne bakın.

Temel modeli indirme

Görüntü Oluşturucu, temel modelin aşağıdaki modele dayalı olarak runwayml/stable-diffusion-v1-5 EMA-only model biçimiyle eşleşmesini gerektirir: runwayml/stable-diffusion-v1-5.

Bağımlılıkları yükleme ve modeli dönüştürme

$ pip install torch typing_extensions numpy Pillow requests pytorch_lightning absl-py

convert.py komut dosyasını çalıştırın:

$ python3 convert.py --ckpt_path <ckpt_path> --output_path <output_path>

Dönüştürülmüş modeli cihaza aktarma

<output_path> klasörünün içeriğini Android cihaza aktarın.

$ 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

Eklenti modellerini indirin ve LoRA ağırlıkları ekleyin (isteğe bağlı)

Eklenti modeli kullanmak istiyorsanız modelin indirilip indirilmeyeceğini kontrol edin. Ek model gerektiren eklenti modelleri, APK'ya eklenmeli veya isteğe bağlı olarak indirilmelidir. Eklenti modelleri hafiftir (~23 MB) ve doğrudan APK'ya dahil edilebilir. Ancak, eklenti modellerini isteğe bağlı olarak indirmenizi öneririz.

LoRA ile bir modeli özelleştirdiyseniz bu modelleri isteğe bağlı olarak indirin. Daha fazla bilgi için LoRA ağırlıkları eklenti modeline bakın.

Görevi oluşturun

MediaPipe Resim Oluşturucu görevi, görevi ayarlamak için createFromOptions() işlevini kullanır. createFromOptions() işlevi, yapılandırma seçenekleri için değerleri kabul eder. Yapılandırma seçenekleri hakkında daha fazla bilgi için Yapılandırma seçenekleri başlıklı makaleyi inceleyin.

Yapılandırma seçenekleri

Bu görevde, Android uygulamaları için aşağıdaki yapılandırma seçenekleri bulunur:

Seçenek Adı Açıklama Değer Aralığı
imageGeneratorModelDirectory Model ağırlıklarını depolayan resim oluşturucu model dizini. PATH
loraWeightsFilePath LoRA ağırlık dosyasının yolunu belirler. İsteğe bağlıdır ve yalnızca model LoRA ile özelleştirildiyse geçerlidir. PATH
errorListener İsteğe bağlı bir hata işleyici ayarlar. N/A

Görev, kullanıcıların görev girişine koşul resimleri eklemesine olanak tanıyan eklenti modellerini de destekler. Temel model, bu resimleri artırabilir ve oluşturma işlemi için referans olarak kullanabilir. Bu koşul resimleri, modelin resim oluşturmak için ek bağlam ve bilgi olarak kullandığı yüz önemli noktaları, kenar dış hatları ve derinlik tahminleri olabilir.

Temel modele eklenecek eklenti modelinin seçeneklerini de yapılandırın. Yüz yer işareti eklentisi faceConditionOptions, keskin kenar eklentisi edgeConditionOptions ve derinlik eklentisi depthConditionOptions kullanır.

Keskin kenar seçenekleri

edgeConditionOptions'te aşağıdaki seçenekleri yapılandırın.

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
threshold1 Hysteresis işlemi için ilk eşik. Float 100
threshold2 Hysteresis işlemi için ikinci eşik. Float 200
apertureSize Sobel operatörü için diyafram açıklığı. Tipik aralık 3-7 arasındadır. Integer 3
l2Gradient Resim gradyan büyüklüğünü hesaplamak için varsayılan L1 normu yerine L2 normunun kullanılıp kullanılmayacağı. BOOLEAN False
EdgePluginModelBaseOptions Eklenti modelinin yolunu ayarlayan BaseOptions nesnesi. BaseOptions nesnesi N/A

Bu yapılandırma seçeneklerinin işleyiş şekli hakkında daha fazla bilgi için Keskin kenar algılayıcı başlıklı makaleyi inceleyin.

Yüz yer işareti seçenekleri

faceConditionOptions'te aşağıdaki seçenekleri yapılandırın.

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
minFaceDetectionConfidence Yüz algılamanın başarılı olarak kabul edilmesi için gereken minimum güven puanı. Float [0.0,1.0] 0.5
minFacePresenceConfidence Yüz yer işareti algılamada yüz varlığı puanının minimum güven puanı. Float [0.0,1.0] 0.5
faceModelBaseOptions Koşul resmini oluşturan modelin yolunu ayarlayan BaseOptions nesnesi. BaseOptions nesnesi N/A
FacePluginModelBaseOptions Eklenti modelinin yolunu ayarlayan BaseOptions nesnesi. BaseOptions nesnesi N/A

Bu yapılandırma seçeneklerinin işleyiş şekli hakkında daha fazla bilgi için Yüz İşaretçisi görevi başlıklı makaleyi inceleyin.

Derinlik seçenekleri

depthConditionOptions'te aşağıdaki seçenekleri yapılandırın.

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
depthModelBaseOptions Koşul resmini oluşturan modelin yolunu ayarlayan BaseOptions nesnesi. BaseOptions nesnesi N/A
depthPluginModelBaseOptions Eklenti modelinin yolunu ayarlayan BaseOptions nesnesi. BaseOptions nesnesi N/A

Yalnızca temel model ile oluşturma

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

imageGenerator = ImageGenerator.createFromOptions(context, options)

Eklentilerle içerik oluşturma

İsteğe bağlı bir eklenti modeli uyguluyorsanız eklenti modelinin temel seçeneklerini setPluginModelBaseOptions ile ayarlayın. Eklenti modeli, koşul resmini oluşturmak için indirilmiş ek bir model gerektiriyorsa BaseOptions içinde yolu belirtin.

Yüz önemli noktası

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 Kenar

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)
    

Derin

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)
    

LoRA ağırlıkları ile oluşturma

LoRA ağırlıkları ekliyorsanız yol konumunu belirtmek için loraWeightsFilePath parametresini kullanın.

val options = ImageGeneratorOptions.builder()
    .setLoraWeightsFilePath(weightsPath)
    .setImageGeneratorModelDirectory(modelPath)
    .build()

imageGenerator = ImageGenerator.createFromOptions(context, options)

Verileri hazırlama

Resim Oluşturucu aşağıdaki girişleri kabul eder:

  • prompt (zorunlu): Oluşturulacak resmi açıklayan metin istemi.
  • iterations (zorunlu): Resmi oluşturmak için gereken toplam iterasyon sayısı. 20, iyi bir başlangıç noktasıdır.
  • seed (zorunlu): Resim oluşturma sırasında kullanılan rastgele tohum.
  • durum resmi (isteğe bağlı): Modelin oluşturma işlemi için referans olarak kullandığı resim. Yalnızca eklenti modeli kullanılırken geçerlidir.
  • koşul türü (isteğe bağlı): Görevle birlikte kullanılan eklenti modelinin türü. Yalnızca eklenti modeli kullanılırken geçerlidir.

Yalnızca temel model içeren girişler

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

Eklenti içeren girişler

İsteğe bağlı bir eklenti modeli uyguluyorsanız eklenti modelini seçmek için conditionType parametresini ve koşul resmini oluşturmak için sourceConditionImage parametresini de kullanın.

Seçenek Adı Açıklama Değer
conditionType Temel modele uygulanan eklenti modeli. {"FACE", "EDGE", "DEPTH"}
sourceConditionImage Durum resmini oluşturmak için kullanılan kaynak resim. MPImage nesnesi

Eklenti modeli kullanıyorsanız koşul resmini oluşturmak için createConditionImage öğesini kullanın:

fun createConditionImage(
    inputImage: MPImage,
    conditionType: ConditionType
): Bitmap {
    val result =
        imageGenerator.createConditionImage(inputImage, conditionType)
    return BitmapExtractor.extract(result)
}

Koşul resmini oluşturduktan sonra istem, başlangıç değeri ve iterasyon sayısıyla birlikte giriş olarak ekleyin.

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

LoRA ağırlıklarına sahip girişler

LoRA ağırlıkları kullanıyorsanız ağırlıklarla temsil edilen belirli bir kavramı içeren bir resim oluşturmak istiyorsanız jetonun metin isteminde bulunduğundan emin olun.

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

Görevi çalıştırma

Önceki bölümde sağlanan girişleri kullanarak resim oluşturmak için generate() yöntemini kullanın. Bu işlem tek bir resim oluşturur.

Yalnızca temel model ile oluşturma

fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
    val result = imageGenerator.generate(prompt, iteration, seed)
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

Eklentilerle oluşturma

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
}

LoRA ağırlıklarıyla oluşturma

LoRA ağırlıklarıyla özelleştirilmiş bir modelle görüntü oluşturma işlemi, standart bir temel modeldeki işleme benzer. Jetonun istemde yer aldığından emin olun ve aynı kodu çalıştırın.

fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
    val result = imageGenerator.generate(prompt, iteration, seed)
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

Yinelemeli oluşturma

Resim Oluşturucu, iterations giriş parametresinde tanımlandığı gibi her iterasyonda oluşturulan ara resimleri de çıkış olarak verebilir. Bu ara sonuçları görüntülemek için setInputs yöntemini çağırın, ardından her adımı çalıştırmak için execute() yöntemini çağırın. Ara sonuçları görüntülemek için showResult parametresini true olarak ayarlayın.

fun execute(showResult: Boolean): Bitmap {
    val result = imageGenerator.execute(showResult)

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

    return bitmap
}

Sonuçları işleme ve görüntüleme

Resim Oluşturucu, oluşturulan resmi, tamamlanma zamanının zaman damgasını ve giriş olarak sağlanmışsa koşullu resmi içeren bir ImageGeneratorResult döndürür.

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

Aşağıdaki resim, yalnızca bir temel model kullanılarak aşağıdaki girişlerden oluşturulmuştur.

Girişler:

  • İstem: "Geniş kenarlı şapka takan, elinde sopayla ormanda yürüyen renkli bir karikatür rakun, animasyonlu, üç çeyrek görünüm, resim"
  • Seed: 312687592
  • İterasyonlar: 20

Oluşturulan resim: