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:
- Aşağıdaki komutu kullanarak git deposunu klonlayın:
git clone https://github.com/google-ai-edge/mediapipe-samples
- İ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: