MediaPipe ile Android'de Cihaz Üzerinde Resim Oluşturma

1. Giriş

MediaPipe nedir?

MediaPipe Çözümleri, uygulamalarınıza makine öğrenimi (ML) çözümleri uygulamanıza olanak tanır. Kullanıcılara anında, ilgi çekici ve faydalı çıkışlar sunan, önceden oluşturulmuş işleme ardışık düzenlerini yapılandırmak için bir çerçeve sunar. Hatta varsayılan modelleri güncellemek için bu çözümlerin birçoğunu MediaPipe Model Maker ile özelleştirebilirsiniz.

Metinden Görüntüye oluşturma, MediaPipe Çözümleri'nin sunduğu çeşitli makine öğrenimi görevlerinden biridir.

Bu Codelab'de çoğunlukla sade bir Android uygulamasıyla başlayacak, ardından doğrudan Android cihazınızda yeni resimler oluşturana kadar birkaç adımla ilerleyeceksiniz.

Neler öğreneceksiniz?

  • MediaPipe Tasks ile bir Android uygulamasında yerel olarak çalıştırılan metin-görsel oluşturma işlemini uygulama.

Gerekenler

  • Android Studio'nun yüklü bir sürümü (bu codelab, Android Studio Giraffe ile yazılmış ve test edilmiştir).
  • En az 8 GB RAM'e sahip bir Android cihaz
  • Android uygulaması geliştirme ve önceden yazılmış Python komut dosyalarını çalıştırma becerisi hakkında temel düzeyde bilgi sahibi olma.

2. Android uygulamasına MediaPipe Görevleri ekleme

Android başlangıç uygulamasını indirin

Bu codelab, görüntü üretmenin temel bir sürümü için kullanılacak kullanıcı arayüzünden oluşan önceden hazırlanmış bir örnekle başlar. Başlangıç uygulamasını buradaki resmi MediaPipe Samples deposunda bulabilirsiniz. Depoyu klonlayın veya Kod > seçeneğini tıklayarak zip dosyasını indirin ZIP dosyasını indir.

Uygulamayı Android Studio'ya aktarın

  1. Android Studio'yu açın.
  2. Android Studio'ya hoş geldiniz ekranında sağ üst köşedeki 'ı seçin.

a0b5b070b802e4ea.png

  1. Depoyu klonladığınız veya indirdiğiniz yere gidin ve codelabs/image_production_basic/android/start dizinini açın.
  2. Bu aşamada, MediaPipe Tasks bağımlılığını henüz dahil etmediğiniz için uygulama derleme yapmamalıdır.

build.gradle dosyasına gidip aşağı kaydırarak // Adım 1 - Bağımlılık ekle'ye giderek uygulamayı düzeltir ve çalışmasını sağlarsınız. Buradan aşağıdaki satırı ekleyin ve Android Studio'nun üst kısmındaki banner'da görünen Şimdi Senkronize Et düğmesine basın.

// Step 1 - Add dependency
implementation 'com.google.mediapipe:tasks-vision-image-generator:latest.release'

Senkronizasyon tamamlandıktan sonra, Android Studio'nun sağ üst köşesindeki yeşil çalıştır okunu ( 7e15a9c9e1620fe7.png) tıklayarak her şeyin doğru şekilde açılıp yüklendiğini doğrulayın. Uygulamayı iki radyo düğmesi ve BAŞLAT etiketli bir düğme bulunan bir ekranda görürsünüz. Bu düğmeyi tıklarsanız hemen bir metin istemi ve diğer seçeneklerin yanı sıra OLUŞTUR etiketli bir düğmeden oluşan ayrı bir kullanıcı arayüzüne yönlendirilirsiniz.

83c31de8e8a320ee.png 78b8765e832024e3.png

Ne yazık ki bu, başlangıç uygulamasının kapsamıyla ilgili. O yüzden bu uygulamayı bitirip cihazınızda yeni resimler oluşturmaya nasıl başlayacağınızı öğrenmenin zamanı geldi.

3. Resim Oluşturucu'yu ayarlama

Bu örnekte, resim oluşturma işleminin büyük kısmı ImageGenerationHelper.kt dosyasında gerçekleşir. Bu dosyayı açtığınızda, sınıfın üst tarafında imageGenerator adlı bir değişken görürsünüz. Bu, görüntü oluşturma uygulamanızın zor kısmını üstlenecek Görev nesnesidir.

Bu nesnenin hemen altında, şu yorumu içeren initializeImageGenerator() adında bir işlev görürsünüz: // 2. Adım - Resim oluşturucuyu başlatın. Tahmin edebileceğiniz gibi, ImageGenerator nesnesini ilk kullanıma hazırlayacağınız yerdir. Görüntü oluşturma modeli yolunu ayarlamak ve ImageGenerator nesnesini başlatmak için bu işlevin gövdesini aşağıdaki kodla değiştirin:

// Step 2 - initialize the image generator
val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

imageGenerator = ImageGenerator.createFromOptions(context, options)

Bunun altında, setInput() adında başka bir işlev göreceksiniz. Bu, üç parametreyi kabul eder: oluşturulan resmi tanımlamak için kullanılacak bir prompt dizesi, yeni resim oluşturulurken Görevin gerçekleştirmesi gereken iterasyon sayısı ve aynı başlangıç noktası kullanıldığında aynı resmi oluştururken aynı isteme göre bir resmin yeni sürümlerini oluşturmak için kullanılabilen çekirdek değeri. Bu işlevin amacı, ara adımları gösteren bir resim oluşturmaya çalıştığınızda resim oluşturucu için bu başlangıç parametrelerini ayarlamaktır.

Devam edin ve setInput() gövdesini (yorumu göreceğiniz yer // 3. Adım - girişleri kabul edin) şu satırla değiştirin:

// Step 3 - accept inputs
imageGenerator.setInputs(prompt, iteration, seed)

Sonraki iki adım, oluşturma aşamasında gerçekleşir. generate() işlevi, setInput ile aynı girişleri kabul eder, ancak herhangi bir ara adım resmi döndürmeyen tek seferlik bir çağrı olarak görsel oluşturur. Bu işlevin gövdesini (yorumu da içeren // 4. Adım - yineleme göstermeden oluştur) aşağıdakiyle değiştirebilirsiniz:

// Step 4 - generate without showing iterations
val result = imageGenerator.generate(prompt, iteration, seed)
val bitmap = BitmapExtractor.extract(result?.generatedImage())
return bitmap

Bu görevin eş zamanlı olarak gerçekleştiğini bilmeniz önemlidir. Bu nedenle, işlevi bir arka plan ileti dizisinden çağırmanız gerekir. Bu codelab'in ilerleyen bölümlerinde bu konu hakkında daha fazla bilgi edineceksiniz.

Bu dosyada gerçekleştireceğiniz son adım, generate() işlevini (5. Adım olarak etiketlenir) doldurmaktır. Bu komut, ImageGenerator generate() işleviyle gerçekleştirilecek olan tek adım için bir ara resim döndürüp döndürülmeyeceğini bildiren bir parametreyi kabul eder. İşlev gövdesini şu kodla değiştirin:

// Step 5 - generate with iterations
val result = imageGenerator.execute(showResult)

if (result == null || result.generatedImage() == null) {
    return Bitmap.createBitmap(512, 512, Bitmap.Config.ARGB_8888)
        .apply {
            val canvas = Canvas(this)
            val paint = Paint()
            paint.color = Color.WHITE
            canvas.drawPaint(paint)
        }
}

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

return bitmap

Yardımcı dosyayla ilgili bu kadar. Sonraki bölümde, bu örneğin mantığını işleyen ViewModel dosyasını dolduracaksınız.

4. Uygulamayı Bir Araya Getirmek

MainViewModel dosyası, kullanıcı arayüzü durumlarını ve bu örnek uygulamayla ilgili diğer mantığı işler. Şimdi açabilirsin.

Dosyanın üst kısmına doğru, // 6. Adım - model yolunu ayarlama açıklamasını görürsünüz. Burada uygulamanıza, görüntü üretme için gerekli olan model dosyalarını nerede bulacağını söylersiniz. Bu örnekte, değeri /data/local/tmp/image_generator/bins/ olarak ayarlarsınız.

// Step 6 - set model path
private val MODEL_PATH = "/data/local/tmp/image_generator/bins/"

Buradan, generateImage() işlevine gidin. Bu işlevin alt kısmında hem 7. Adım hem de 8. Adım'ı görürsünüz. Bunlar sırasıyla döndürülen iterasyonlu ya da hiç iterasyonlu resimler oluşturmak için kullanılır. Bu işlemlerin ikisi de eşzamanlı olarak gerçekleştiğinden, bunların bir eş yordam içine yerleştirildiğini fark edeceksiniz. İlk olarak // 7. Adım - Yineleme göstermeden oluşturma işlemini bu kod bloğuyla değiştirerek ImageGenerationHelper dosyasından generate() çağrısı yapın ve ardından kullanıcı arayüzü durumunu güncelleyin.

// Step 7 - Generate without showing iterations
val result = helper?.generate(prompt, iteration, seed)
_uiState.update {
    it.copy(outputBitmap = result)
}

8. adım biraz daha karmaşıktır. Yürütme() işlevi, görüntü oluşturma için tüm adımlar yerine yalnızca bir adım gerçekleştirdiğinden, bir döngü aracılığıyla her bir adımı tek tek çağırmanız gerekir. Ayrıca, geçerli adımın kullanıcıya gösterilip gösterilmeyeceğini de belirlemeniz gerekir. Son olarak, geçerli yinelemenin gösterilmesi gerekiyorsa kullanıcı arayüzü durumunu güncellersiniz. Artık tüm bunları yapabilirsiniz.

// Step 8 - Generate with showing iterations
helper?.setInput(prompt, iteration, seed)
for (step in 0 until iteration) {
    isDisplayStep =
        (displayIteration > 0 && ((step + 1) % displayIteration == 0))
    val result = helper?.execute(isDisplayStep)

    if (isDisplayStep) {
        _uiState.update {
            it.copy(
                outputBitmap = result,
                generatingMessage = "Generating... (${step + 1}/$iteration)",
            )
        }
    }
}

Bu noktada uygulamanızı yükleyebilir, resim oluşturma aracını başlatabilir ve ardından metin istemine göre yeni bir resim oluşturabilirsiniz

... ancak şimdi resim oluşturucuyu başlatmaya çalıştığınızda uygulama kilitleniyor. Bunun nedeni, model dosyalarınızı cihazınıza kopyalamanızdır. Çalıştığı bilinen üçüncü taraf modellerle ilgili en güncel bilgilere ulaşmak, modelleri bu MediaPipe görevi için dönüştürmek ve cihazınıza kopyalamak üzere resmi belgelerin bu bölümünü inceleyebilirsiniz.

Dosyaları doğrudan geliştirme cihazınıza kopyalamanın yanı sıra, çalışma zamanında gerekli dosyaları doğrudan kullanıcının cihazına indirecek şekilde Firebase Storage'ı kurmak da mümkündür.

5. Uygulamayı dağıtma ve test etme

Tüm bunların ardından, metin istemlerini kabul edebilen ve cihaz üzerinde tamamen yeni resimler oluşturabilen çalışan bir uygulamanız olmalıdır. Devam edin ve uygulamayı test etmek için fiziksel bir Android cihaza dağıtın. Ancak, bu işlemi en az 8 GB belleğe sahip bir cihazla denemek isteyebileceğinizi unutmayın.

  1. Uygulamayı çalıştırmak için Android Studio araç çubuğunda Çalıştır'ı ( 7e15a9c9e1620fe7.png) tıklayın.
  2. Oluşturma adımlarının türünü seçin (son veya yinelemeli) ve ardından BAŞLAT düğmesine basın.
  3. Bir sonraki ekranda istediğiniz özellikleri ayarlayın ve aracın sunduğu önerileri görmek için OLUŞTUR düğmesini tıklayın.

e46cfaeb9d3fc235.gif

6. Tebrikler!

Başardınız! Bu codelab'de, Android uygulamalarına cihaz üzerinde metin-görsel oluşturma işlemini nasıl ekleyeceğinizi öğrendiniz.

Sonraki adımlar

Görsel oluşturma göreviyle yapabileceğiniz diğer şeyler:

  • Eklentiler aracılığıyla oluşturulan resimleri yapılandırmak için temel resim kullanabilir veya Vertex AI aracılığıyla kendi ek LoRA ağırlıklarınızı eğitebilirsiniz.
  • Cihazınızdaki model dosyalarını ADB aracı kullanmanıza gerek kalmadan almak için Firebase Storage'ı kullanın.

Bu deneysel görevle elde ettiğiniz etkileyici çalışmaları görmeyi sabırsızlıkla bekliyoruz. MediaPipe Ekibi'nin daha da fazla codelab'ini ve içeriğini takip etmeye devam edin.