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:
- 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 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: