Android için resim oluşturma kılavuzu

MediaPipe Image Generator görevi, metin istemine dayalı olarak 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ırabileceği ve oluşturma için referans olarak kullanabileceği isteğe bağlı bir koşul resmi kabul eder. Görüntü Oluşturucu, eğitim veya yeniden eğitim sırasında modele sağlanan belirli kavramlara dayalı olarak da görüntüler oluşturabilir. Daha fazla bilgi için LoRA ile özelleştirme başlıklı makaleyi inceleyin.

Bu talimatlarda açıklanan kod örneği GitHub'da mevcuttur. 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 Görevleri örnek kodu, Android için bir Görüntü Oluşturucu uygulamasının temel uygulamasıdır. Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken bu uygulamadan yararlanabilirsiniz. Image Generator ö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ı nasıl oluşturacağınız 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 ödeme kullanacak şekilde yapılandırın. Böylece yalnızca Image Generator örnek uygulamasına ait dosyalarınız olur:
    cd mediapipe-samples
    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 aktarıp uygulamayı çalıştırabilirsiniz. Talimatlar için Android Kurulum Kılavuzu'na bakın.

Temel bileşenler

Aşağıdaki dosyalar, bu görüntü 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 gerçekleştirir.
  • DiffusionActivity.kt: Eklentiler veya LoRA ağırlıkları etkinleştirilmediğinde resim oluşturur.
  • PluginActivity.kt: Kullanıcıların giriş olarak koşul resmi sağlamasına olanak tanıyan eklenti modellerini uygular.
  • 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 bunları işler.

Kurulum

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

Bağımlılıklar

Görüntü Oluşturucu görevi, com.google.mediapipe:tasks-vision-image-generator kitaplığını kullanır. Bu bağımlılığı 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ümlerin yüklü olduğu cihazlarda 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 Image Generator görevi, bu görevle uyumlu eğitilmiş bir 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ülen modeli Android cihaza aktarın.

Görüntü Üretici için kullanılabilen eğitilmiş modeller hakkında daha fazla bilgi için görev genel bakışındaki Modeller bölümüne bakın.

Temel modeli indirme

Görüntü Oluşturucu, temel modelin aşağıdaki modele göre stable-diffusion-v1-5/stable-diffusion-v1-5 EMA-only model biçimine uymasını gerektirir: stable-diffusion-v1-5/stable-diffusion-v1-5 EMA-only.

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ülen 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 indirme ve LoRA ağırlıkları ekleme (isteğe bağlı)

Eklenti modeli kullanmayı planlıyorsanız modelin indirilmesi gerekip gerekmediğini kontrol edin. Ek model gerektiren eklentilerde, eklenti modelleri APK'ya paketlenmeli veya isteğe bağlı olarak indirilmelidir. Eklenti modelleri (~23 MB) hafiftir ve doğrudan APK'ya dahil edilebilir. Ancak eklenti modellerini isteğe bağlı olarak indirmenizi öneririz.

LoRA ile özelleştirdiğiniz bir modeliniz varsa bu modeli isteğe bağlı olarak indirebilirsiniz. Daha fazla bilgi için LoRA ağırlıkları eklenti modelini inceleyin.

Görevi oluşturma

MediaPipe Image Generator görevi, görevi ayarlamak için createFromOptions() işlevini kullanır. createFromOptions() işlevi, yapılandırma seçeneklerinin değerlerini 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örev, Android uygulamaları için aşağıdaki yapılandırma seçeneklerine sahiptir:

Seçenek Adı Açıklama Değer aralığı
imageGeneratorModelDirectory Model ağırlıklarını depolayan görüntü oluşturucu model dizini. PATH
loraWeightsFilePath LoRA ağırlık dosyası yolunu ayarlar. İ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

Bu 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çin referans olarak kullanabilir. Bu koşul resimleri, modelin resim oluşturmak için ek bağlam ve bilgi olarak kullandığı yüz işaretleri, kenar çizgileri ve derinlik tahminleri olabilir.

Temel modele bir eklenti modeli eklerken eklenti seçeneklerini de yapılandırın. Yüz işareti eklentisi faceConditionOptions, Canny kenar eklentisi edgeConditionOptions ve Derinlik eklentisi depthConditionOptions kullanır.

Canny kenar seçenekleri

edgeConditionOptions bölümünde aşağıdaki seçenekleri yapılandırın.

Seçenek Adı Açıklama Değer aralığı Varsayılan değer
threshold1 Histerezis prosedürünün ilk eşiği. Float 100
threshold2 Histerezis prosedürü için ikinci eşik. Float 200
apertureSize Sobel operatörü için diyafram boyutu. Normal aralık 3-7 arasındadır. Integer 3
l2Gradient Varsayılan L1 normu yerine, resim gradyan büyüklüğünü hesaplamak için 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 Canny kenar algılayıcı başlıklı makaleyi inceleyin.

Yüzdeki önemli noktalarla ilgili seçenekler

faceConditionOptions bölümünde 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ı sayılması için gereken minimum güven puanı. Float [0.0,1.0] 0.5
minFacePresenceConfidence Yüz 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 İşaretleme Görevi başlıklı makaleyi inceleyin.

Derinlik seçenekleri

depthConditionOptions bölümünde 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 modelle 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 setPluginModelBaseOptions ile eklenti modelinin temel seçeneklerini ayarlayın. Eklenti modeli, koşul resmini oluşturmak için ek bir indirilmiş model gerektiriyorsa yolu BaseOptions içinde belirtin.

Yüzdeki önemli nokta

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)
    

Derinlik

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ıyla içerik üretme

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

Görüntü Oluşturucu aşağıdaki girişleri kabul eder:

  • prompt (gerekli): Oluşturulacak resmi açıklayan metin istemi.
  • iterations (gerekli): Görüntü oluşturmak için toplam yineleme sayısı. İyi bir başlangıç noktası 20'dir.
  • seed (gerekli): Görüntü oluşturma sırasında kullanılan rastgele başlangıç değeri.
  • condition_image (isteğe bağlı): Modelin oluşturma için referans olarak kullandığı resim. Yalnızca eklenti modeli kullanılırken geçerlidir.
  • condition type (koşul türü) [isteğe bağlı]: Görevle kullanılan eklenti modelinin türü. Yalnızca eklenti modeli kullanılırken geçerlidir.

Yalnızca temel modelle yapılan girişler

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

Eklentili girişler

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

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

Eklenti modeli kullanıyorsanız koşul resmi oluşturmak için createConditionImage simgesini 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 yineleme sayısı ile birlikte giriş olarak ekleyin.

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

LoRA ağırlıkları içeren girişler

LoRA ağırlıkları kullanıyorsanız ağırlıkların temsil ettiği belirli bir kavramla ilgili resim oluşturmak istiyorsanız jetonun metin isteminde olduğ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 oluşturulmuş resim üretir.

Yalnızca temel modeli kullanarak 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 üretme

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 üretme

LoRA ağırlıklarıyla özelleştirilmiş bir modelle görüntü oluşturma süreci, standart bir temel modelle görüntü oluşturma sürecine benzer. İstemde jetonun bulunduğundan 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

Görüntü Üretici, her yineleme sırasında oluşturulan ara görüntüleri de iterations giriş parametresinde tanımlandığı şekilde çı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östermek 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

Görüntü Oluşturucu, oluşturulan görüntüyü, tamamlanma zamanının zaman damgasını ve giriş olarak sağlanmışsa koşullu görüntüyü 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: "Ormanda yürürken elinde sopa tutan, geniş kenarlı şapka takmış renkli bir çizgi film rakunu, animasyon, üç çeyrek görünüm, resim"
  • Başlangıç numarası: 312687592
  • Yinelemeler: 20

Üretilmiş resim:

İsteme uygun şekilde üretilmiş bir rakun görüntüsü