Android için resim oluşturma kılavuzu

MediaPipe Resim Oluşturucu görevi, metin istemine dayalı resimler oluşturmanızı sağlar. Bu görev, difüzyon teknikleri kullanarak görüntüler oluşturmak için metin-görüntü modelinden yararlanır.

Görev, giriş olarak bir metin istemini ve modelin genişletip oluşturma için referans olarak kullanabileceği isteğe bağlı bir koşul görüntüsünü kabul eder. Görüntü Oluşturucu, eğitim veya yeniden eğitim sırasında modele sağlanan belirli kavramlara dayalı görüntüler de oluşturabilir. Daha fazla bilgi için LoRA ile özelleştirme bölümüne bakın.

Bu talimatlarda açıklanan kod örneğine GitHub'dan ulaşabilirsiniz. Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel Bakış'a bakın.

Kod örneği

MediaPipe Görevleri örnek kodu, Android için Image Üretici 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 başvuruda bulunabilirsiniz. Resim Oluşturucu örnek kodu GitHub'da barındırılır.

Kodu indirme

Aşağıdaki talimatlar, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasını nasıl oluşturacağınızı göstermektedir.

Ö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 az ödeme yöntemini 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_generator/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 Kurulum Kılavuzu'na bakın.

Temel bileşenler

Aşağıdaki dosyalar, bu görüntü oluşturma örnek uygulaması için önemli kodu 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ı etkin olmadığında resim oluşturur.
  • PluginActivity.kt: Kullanıcıların giriş olarak bir koşul görüntüsü sağlamalarına olanak tanıyan eklenti modellerini uygular.
  • LoRAWeightActivity.kt: Temel modellerini özelleştirmek ve belirli kavramların görüntülerini 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ı kurmanın temel adımları ve projelerinizi özel olarak Image Üretici'yi kullanmak amacıyla kodlama açıklanmaktadır. Platform sürümü gereksinimleri de dahil olmak üzere, MediaPipe görevlerini kullanmak amacıyla geliştirme ortamınızı ayarlama hakkında genel bilgiler 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. 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ümlere sahip cihazlar için yerel OpenCL kitaplığı bağımlılığını AndroidManifest.xml öğesine ekleyin. Daha fazla bilgi için uses-native-library etiketiyle ilgili belgelere göz atın.

Bazı Android cihazlar ek kitaplıklar da gerektirebilir:

<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, eğitilmiş bir temel modeli gerektirir. Bir modeli indirdikten sonra gerekli bağımlılıkları yükleyin ve ilgili modeli uygun bir biçime dönüştürün. Ardından, dönüştürülen modeli Android cihaza aktarın.

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

Temel modelini indirin

Resim Oluşturucu, temel modelinin şu modele göre 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 indirme ve LoRA ağırlıkları ekleme (İsteğe bağlı)

Bir eklenti modeli kullanmayı planlıyorsanız modelin indirilmesi gerekip gerekmediğini kontrol edin. Ek model gerektiren eklentiler, eklenti modellerinin APK'da paket haline getirilmesi veya isteğe bağlı olarak indirilmiş olması gerekir. Eklenti modelleri hafiftir (yaklaşık 23 MB) ve doğrudan APK'nın içinde paketlenebilir. Ancak, eklenti modellerini isteğe bağlı olarak indirmenizi öneririz.

Bir modeli LoRA ile özelleştirdiyseniz isteğe bağlı olarak indirebilirsiniz. Daha fazla bilgi için LoRA ağırlıkları eklenti modeli bölümüne bakın.

Görevi oluşturma

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 edinmek için Yapılandırma seçenekleri bölümüne bakın.

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 resim oluşturma aracı model dizini. PATH
loraWeightsFilePath LoRA ağırlıkları dosyasının 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

Görev, eklenti modellerini de destekler. Bu özellik sayesinde kullanıcılar, koşul görüntülerine görev girişine ekleyebilirler. Bunu da temel modeli geliştirip oluşturma işlemi için referans olarak kullanabilir. Bu durum görüntüleri; modelin görüntü oluşturmak için ek bağlam ve bilgi olarak kullandığı yüz önemli noktaları, kenar dış çizgileri ve derinlik tahminleri olabilir.

Temel modeline bir eklenti modeli eklerken eklenti seçeneklerini de yapılandırın. Face belirgin işareti eklentisi faceConditionOptions, Canny Edge eklentisi edgeConditionOptions ve Depth eklentisi depthConditionOptions kullanır.

Canny Edge seçenekleri

edgeConditionOptions sayfasında aşağıdaki seçenekleri yapılandırın.

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
threshold1 Histerez işlemi için ilk eşik. Float 100
threshold2 Histerez işlemi 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 Görüntü gradyanı büyüklüğünü hesaplamak için varsayılan L1 normu yerine L2 normunun kullanılıp kullanılmadığı. BOOLEAN False
EdgePluginModelBaseOptions Eklenti modelinin yolunu belirleyen BaseOptions nesnesi. BaseOptions nesne N/A

Bu yapılandırma seçeneklerinin nasıl çalıştığıyla ilgili daha fazla bilgi için Canny uç algılayıcı konusuna bakın.

Yüz işareti seçenekleri

faceConditionOptions sayfasında 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 belirgin işareti algılamada yüz varlığı için minimum güven puanı. Float [0.0,1.0] 0.5
faceModelBaseOptions Koşul görüntüsünü oluşturan modelin yolunu ayarlayan BaseOptions nesnesi. BaseOptions nesne N/A
FacePluginModelBaseOptions Eklenti modelinin yolunu belirleyen BaseOptions nesnesi. BaseOptions nesne N/A

Bu yapılandırma seçeneklerinin nasıl çalıştığı hakkında daha fazla bilgi için Yüz İşaretçisi görevi bölümüne bakın.

Derinlik seçenekleri

depthConditionOptions sayfasında aşağıdaki seçenekleri yapılandırın.

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
depthModelBaseOptions Koşul görüntüsünü oluşturan modelin yolunu ayarlayan BaseOptions nesnesi. BaseOptions nesne N/A
depthPluginModelBaseOptions Eklenti modelinin yolunu belirleyen BaseOptions nesnesi. BaseOptions nesne N/A

Yalnızca temel modeliyle oluşturun

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

imageGenerator = ImageGenerator.createFromOptions(context, options)

Eklentilerle oluştur

İsteğe bağlı bir eklenti modeli uyguluyorsanız setPluginModelBaseOptions ile eklenti modeli için temel seçenekleri ayarlayın. Eklenti modeli, koşul görüntüsünü oluşturmak için indirilen ek bir model gerektiriyorsa yolu BaseOptions alanında belirtin.

Yüz belirgin işareti

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)
    

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ıyla oluşturma

LoRA ağırlıklarını dahil ediyorsanız yol konumunu işaret etmek 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 (gerekli): Oluşturulacak resmi açıklayan metin istemi.
  • iterations (gerekli): Resmi oluşturmak için gereken toplam iterasyon. 20, iyi bir başlangıç noktasıdır.
  • seed (gerekli): Görüntü oluşturma sırasında kullanılan rastgele başlangıç noktası.
  • condition image (isteğe bağlı): Modelin, oluşturma için referans olarak kullandığı görüntü. Yalnızca eklenti modeli kullanılırken geçerlidir.
  • condition type (isteğe bağlı): Görevde kullanılan eklenti modelinin türü. Yalnızca eklenti modeli kullanılırken geçerlidir.

Yalnızca temel modelinin kullanıldığı 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 görüntüsünü oluşturmak için sourceConditionImage parametresini de kullanın.

Seçenek Adı Açıklama Değer
conditionType Temel modeline uygulanan eklenti modeli. {"FACE", "EDGE", "DEPTH"}
sourceConditionImage Koşul görüntüsünü oluşturmak için kullanılan kaynak görüntü. MPImage nesne

Eklenti modeli kullanıyorsanız durum görüntüsünü oluşturmak için createConditionImage bileşenini kullanın:

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

Koşul görüntüsünü oluşturduktan sonra istem, başlangıç noktası ve yineleme sayısıyla birlikte bir 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 kavrama sahip bir görüntü oluşturmayı planlıyorsanı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 bir görüntü oluşturmak için generate() yöntemini kullanın. Bu işlem, oluşturulmuş tek bir resim üretir.

Yalnızca temel modeliyle oluştur

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ştur

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ı ile özelleştirilmiş bir modelle görüntü oluşturma süreci, standart temel modeliyle yapılan sürece benzer. Jetonun isteme dahil edildiğinden 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 ayrıca, iterations giriş parametresinde tanımlandığı gibi her yineleme sırasında oluşturulan ara görüntülerin çıkışını sağlayabilir. Bu ara sonuçları görüntülemek için setInputs yöntemini, 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 görüntü, yalnızca temel modeli kullanılarak aşağıdaki girişlerden oluşturulmuştur.

Girdiler:

  • İstem: "dikey, geniş kenarlı şapka takmış ve elinde sopayla ormanda yürüyen renkli bir çizgi film rakun, animasyonlu, üç çeyrek görüntü, resim"
  • Tohum: 312687592
  • Yineleme sayısı: 20

Oluşturulan resim: