Android için resim oluşturma kılavuzu

ziyaret edin.

MediaPipe Image Generator görevi, metin istemine göre görseller oluşturmanıza olanak tanır. Bu görev, difüzyon teknikleriyle görüntüler oluşturmak için metin-resim modeli kullanır.

Görev, isteğe bağlı bir koşul resmiyle birlikte giriş olarak bir metin istemini kabul eder geliştirebileceği ve referans olarak kullanabileceği bir modeldir. Resim Oluşturucu sırasında modele sağlanan belirli kavramlara dayalı görüntüler de üretebilir. yeniden eğitmektir. Daha fazla bilgi için LoRA olarak değiştirin.

Bu talimatlarda açıklanan kod örneğini şu adreste bulabilirsiniz: GitHub'a gidin. Özellikler, modeller ve yapılandırma seçenekleri hakkında daha fazla bilgi Bu görev hakkında daha fazla bilgi için Genel Bakış'ı inceleyin.

Kod örneği

MediaPipe Tasks örnek kodu, bir Resim Oluşturucu'nun temel uygulamasıdır. Android için uygulama. Uygulamayı kendi Android cihazınız için başlangıç noktası olarak kullanabilirsiniz veya mevcut bir uygulamada değişiklik yaparken ona referansta bulunması iyi olur. Resim Oluşturucu örneği kod şurada barındırılıyor: GitHub'a gidin.

Kodu indirme

Aşağıdaki talimatlarda, örneğin yerel bir kopyasını nasıl oluşturacağınız gösterilmektedir kodu oluşturmak için git komut satırı aracını kullanın.

Ö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 yöntemini kullanacak şekilde yapılandırın. Böylece, yalnızca Resim Oluşturucu örnek uygulamasına ait dosyaları içerir:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generator/android
    

Örnek kodun yerel sürümünü oluşturduktan sonra projeyi içe aktarabilirsiniz. Android Studio'ya gidip uygulamayı çalıştırın. Talimatlar için bkz. Android.

Temel bileşenler

Aşağıdaki dosyalarda bu resim oluşturma örneği için önemli bir kod bulunuyor uygulama:

  • ImageGenerationHelper.kt: Görevi başlatır ve görüntü oluşturma işlemini tamamlar.
  • DiffusionActivity.kt: Eklentiler veya LoRA ağırlıkları etkinleştirilmediğinde resimler oluşturur.
  • PluginActivity.kt Kullanıcıların koşul sağlamasına olanak tanıyan eklenti modellerini uygular. kullanabilirsiniz.
  • LoRAWeightActivity.kt: Temeli özelleştirmek için kullanılan LoRA ağırlıklarına erişir ve bunları işler ve belirli kavramların resimlerini oluşturmalarını sağlayan araçlardır.

Kurulum

Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili kullanmak için özel olarak projeleri kodlayın. Şu konularda genel bilgi için: dahil olmak üzere MediaPipe görevlerini kullanmak için geliştirme ortamınızı platform sürümü gereksinimleri hakkında daha fazla bilgi için Android.

Bağımlılıklar

Resim Oluşturucu görevi, com.google.mediapipe:tasks-vision-image-generator kitaplığı. Bu bağımlılığı ekle build.gradle dosyasına kopyalayın:

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ığını ekleyin AndroidManifest.xml bağımlılığı. Daha fazla bilgi için uses-native-library kapanış etiketinin hemen öncesine yapıştırı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 Image Generator görevi, uyumlu ve eğitilmiş bir temel modeli gerektirir karar veriyorum. Bir modeli indirdikten sonra gerekli bağımlılıkları yükleyin ve uygun bir biçime dönüştürmesidir. Ardından, dönüştürülmüş model olarak kullanabilirsiniz.

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

Temel modeli indir

Resim Oluşturucu, temel modelinin runwayml/stable-diffusion-v1-5 EMA-only model biçimi, aşağıdakilere göre model: 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ı:

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

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

<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ını ekleyin (İsteğe bağlı)

Eklenti modeli kullanmayı planlıyorsanız modelin indirilmelidir. İlave model gerektiren eklentiler için modellerin APK içinde paketlenmiş olması veya isteğe bağlı olarak indirilmesi gerekir. Eklenti modelleri hafiftir (~23 MB) ve doğrudan APK'nın içinde paketlenebilir. Ancak, eklenti modellerinin isteğe bağlı olarak indirilmesi önerilir.

Bir modeli şununla özelleştirdiyseniz: LoRA, bunları istediğiniz zaman indirebilirsiniz. Daha fazla daha fazla bilgi için LoRA ağırlıkları eklenti modeline bakın.

Görevi oluşturma

MediaPipe Resim Oluşturucu görevi,createFromOptions() görevi görebilir. createFromOptions() işlevi, yapılandırma için değerleri kabul eder seçenekleri vardır. Yapılandırma seçenekleri hakkında daha fazla bilgi edinmek için Yapılandırma seçenekleri bulabilirsiniz.

Yapılandırma seçenekleri

Bu görev, Android uygulamaları için aşağıdaki yapılandırma seçeneklerini içerir:

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

Görev, kullanıcıların durum resimleri eklemesine olanak tanıyan eklenti modellerini de destekler. görev girişinde yer alır. Temel model bu bilgileri geliştirip referans olarak kullanabilir. üretiliyor. Bu durum resimleri, yüz önemli noktaları, kenar dış çizgileri ve Derinlik tahminleri: Bu tahminler, modelin gerekli bilgileri edinip ve görseller üretmenizi sağlar.

Temel modeline bir eklenti modeli eklerken, seçenekleri vardır. Face belirgin işaret eklentisi, Canny kenarı olan faceConditionOptions kullanır. eklentisi edgeConditionOptions kullanır ve Depth eklentisi depthConditionOptions.

Canny Edge seçenekleri

edgeConditionOptions içinde 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ü için birinci eşik. Float 100
threshold2 Histerezis prosedürünün ikinci eşiği. Float 200
apertureSize Sobel operatörü için diyafram boyutu. Genel aralık 3-7 arasındadır. Integer 3
l2Gradient Görüntü gradyanının büyüklüğünü hesaplamak için L2 normunun kullanılıp kullanılmadığı, kullanılmasıyla ilgilidir. BOOLEAN False
EdgePluginModelBaseOptions Yolu belirleyen BaseOptions nesnesi ilişkilendirme modelini kullanır. BaseOptions nesne N/A

Bu yapılandırma seçeneklerinin işleyiş şekli hakkında daha fazla bilgi edinmek için Canny kenar dedektörü.

Yüzle ilgili önemli nokta seçenekleri

faceConditionOptions içinde aşağıdaki seçenekleri yapılandırın.

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
minFaceDetectionConfidence Yüz tanıma için gereken minimum güven puanı kabul edilir. Float [0.0,1.0] 0.5
minFacePresenceConfidence Yüz tanımanın minimum güven puanı puanı. Float [0.0,1.0] 0.5
faceModelBaseOptions Yolu belirleyen BaseOptions nesnesi durum resmini oluşturan model için geçerlidir. BaseOptions nesne N/A
FacePluginModelBaseOptions Yolu belirleyen BaseOptions nesnesi ilişkilendirme modelini kullanır. BaseOptions nesne N/A

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

Derinlik seçenekleri

depthConditionOptions içinde aşağıdaki seçenekleri yapılandırın.

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
depthModelBaseOptions Yolu belirleyen BaseOptions nesnesi durum resmini oluşturan model için geçerlidir. BaseOptions nesne N/A
depthPluginModelBaseOptions Yolu belirleyen BaseOptions nesnesi ilişkilendirme modelini kullanır. BaseOptions nesne N/A

Yalnızca temel modelle oluştur

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

imageGenerator = ImageGenerator.createFromOptions(context, options)

Eklentilerle oluşturma

İsteğe bağlı bir eklenti modeli uyguluyorsanız, setPluginModelBaseOptions ile eklenti modeli. Eklenti modeli, indirilmiş ek model kullanmak için, BaseOptions

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)
    

Kenarlı

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 aşağıdaki işlemler için loraWeightsFilePath parametresini kullanın: yol konumunu işaret eder.

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

imageGenerator = ImageGenerator.createFromOptions(context, options)

Verileri hazırlama

Resim Oluşturucu şu girişleri kabul eder:

  • prompt (gerekli): Oluşturulacak resmi açıklayan metin istemi.
  • iterations (gerekli): Resmi oluşturmak için yapılan toplam iterasyon sayısıdır. CEVAP başlangıç noktası 20’dir.
  • seed (gerekli): Görüntü oluşturma sırasında kullanılan rastgele çekirdek.
  • condition image (isteğe bağlı): Modelin referans olarak kullandığı görüntü oluşturuyor. Yalnızca eklenti modeli kullanılırken geçerlidir.
  • condition type (isteğe bağlı): Görevle kullanılan eklenti modelinin türü. Yalnızca eklenti modeli kullanılırken geçerlidir.

Yalnızca temel modeli içeren 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 ayrıca conditionType parametresini seçip eklenti modelini ve sourceConditionImage parametresini durum görüntüsünü oluşturur.

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

Eklenti modeli kullanıyorsanızcreateConditionImage durum resmi:

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

Durum resmini oluşturduktan sonra, iterasyon, çekirdek ve yineleme sayısı gibi ayrıntıları ifade eder.

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

LoRA ağırlıkları olan girişler

LoRA ağırlıkları kullanıyorsanız jetonun metin isteminde bulunduğundan emin olun. temsil ettiği spesifik kavramı içeren bir resim oluşturmayı ağırlıklar.

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

Görevi çalıştırma

Şurada sağlanan girişleri kullanarak bir resim oluşturmak için generate() yöntemini kullanın: geri dönüp bakarsınız. Bu işlem tek bir oluşturulmuş görüntü üretir.

Yalnızca temel modelle 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ş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 süreci sürecin nasıl ilerlediğini gösterir. Jetonun yer alır ve aynı kodu çalıştırır.

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

Ayrıca, Resim Oluşturucu, her bir görüntü oluşturma işleminde iterasyon (iterations giriş parametresinde tanımlandığı gibi). Bunları görüntülemek için ara sonuçlar, setInputs yöntemini çağırın ve ardından execute() yöntemini çağırın her bir adımdan oluşur. Ara değeri görüntülemek için showResult parametresini true olarak ayarlayın sonuç.

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şturulanImageGeneratorResult resmi, tamamlanma zamanının zaman damgası ve varsa koşullu resim bir giriş olarak sağlandı.

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

Aşağıdaki resim, yalnızca bir modeli oluşturmaktır.

Girişler:

  • İstem: "gevşek geniş kenarlı şapka takmış renkli bir çizgi film rakun ormanda yürüyen bir çubuk tutan, animasyonlu, üç dörtlük görünüm, resim"
  • Başlangıç noktası: 312687592
  • Yineleme sayısı: 20

Oluşturulan resim: