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

1. Giriş

MediaPipe nedir?

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

Metinden görüntü oluşturma, MediaPipe Solutions'un sunduğu çeşitli makine öğrenimi görevlerinden biridir.

Bu Codelab'de, çoğunlukla boş bir Android uygulamasıyla başlayacak ve doğrudan Android cihazınızda yeni resimler oluşturabilecek hale gelene kadar birden fazla adımda ilerleyeceksiniz.

Neler öğreneceksiniz?

  • MediaPipe Görevler ile Android uygulamasında yerel olarak çalışan metinden görüntü oluşturma özelliğini uygulama.

İhtiyacınız olanlar

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

2. Android uygulamasına MediaPipe Tasks ekleme

Android başlangıç uygulamasını indirin

Bu codelab, görüntü oluşturmanın temel sürümü için kullanılacak kullanıcı arayüzünden oluşan önceden hazırlanmış bir örnekle başlar. Bu başlangıç uygulamasını resmi MediaPipe Samples deposunda burada bulabilirsiniz. Depoyu klonlayın veya Kod > ZIP İndir'i tıklayarak ZIP dosyasını indirin.

Uygulamayı Android Studio'ya aktarma

  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_generation_basic/android/start dizinini açın.
  2. Henüz MediaPipe Tasks bağımlılığını eklemediğiniz için bu aşamada uygulama derlenmez.

build.gradle dosyasına gidip // 1. Adım - Bağımlılık ekle bölümüne ilerleyerek uygulamayı düzeltin ve çalıştırın. Ardından, 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ısmındaki yeşil çalıştır okunu ( 7e15a9c9e1620fe7.png) tıklayarak her şeyin doğru şekilde açıldığını ve yüklendiğini doğrulayın. Uygulamanın, iki radyo düğmesi ve BAŞLAT etiketli bir düğmenin bulunduğu bir ekranda açıldığını görürsünüz. Bu düğmeyi tıklarsanız hemen bir metin isteminden ve OLUŞTUR etiketli bir düğmenin yanı sıra diğer seçeneklerden oluşan ayrı bir kullanıcı arayüzüne yönlendirilirsiniz.

83c31de8e8a320ee.png 78b8765e832024e3.png

Maalesef başlangıç uygulamasının kapsamı bu kadar. Bu uygulamayı nasıl tamamlayacağınızı ve cihazınızda yeni resimler oluşturmaya nasıl başlayacağınızı öğrenmenin zamanı geldi.

3. Görsel 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 kısmında imageGenerator adlı bir değişken görürsünüz. Bu, görüntü oluşturma uygulamanızdaki ağır işleri yapacak Görev nesnesidir.

Bu nesnenin hemen altında, aşağıdaki yorumu içeren initializeImageGenerator() adlı bir işlev görürsünüz: // 2. Adım: Resim oluşturucuyu başlatın. Tahmin edebileceğiniz gibi, ImageGenerator nesnesini burada başlatırsınız. Resim oluşturma modeli yolunu ayarlamak ve ImageGenerator nesnesini başlatmak için bu işlev 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() adlı başka bir işlev görürsünüz. Bu işlev üç parametre kabul eder: Oluşturulan resmi tanımlamak için kullanılacak bir istem dizesi, yeni resmi oluştururken Görev'in geçmesi gereken iterasyon sayısı ve aynı tohum kullanıldığında aynı resmi oluştururken aynı istemi temel alan bir resmin yeni sürümlerini oluşturmak için kullanılabilecek bir tohum 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 ilk parametreleri ayarlamaktır.

setInput() gövdesini ("// 3. Adım: Girişleri kabul et" yorumunu göreceğiniz yer) şu satırla değiştirin:

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

Oluşturma işlemi sonraki iki adımda gerçekleşir. generate() işlevi, setInput ile aynı girişleri kabul eder ancak tek seferlik bir çağrı olarak bir resim oluşturur ve herhangi bir ara adım resmi döndürmez. Bu işlevin gövdesini ("// 4. Adım: yinelemeleri göstermeden oluştur" yorumunu içeren) 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 arka plan iş parçacığında çağırmanız gerekir. Bu konu hakkında daha fazla bilgiyi bu kod laboratuvarının ilerleyen bölümlerinde bulabilirsiniz.

Bu dosyada uygulayacağınız son adım, execute() işlevini doldurmaktır (5. Adım olarak etiketlenmiştir). Bu işlev, ImageGenerator execute() işleviyle gerçekleştirilecek oluşturma tek adımı için bir ara resim döndürüp döndürmeyeceğini belirten bir parametre 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 açıklamalarımız bu kadar. Sonraki bölümde, bu örneğin mantığını yöneten ViewModel dosyasını dolduracaksınız.

4. Uygulamayı Birleştirme

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

Dosyanın üst kısmında // 6. Adım - model yolunu ayarlayın yorumunu görürsünüz. Burada, uygulamanıza resim oluşturmak için gerekli model dosyalarını nerede bulabileceğini bildirirsiniz. Bu örnekte değeri /data/local/tmp/image_generator/bins/ olarak ayarlayacaksınız.

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

Ardından, generateImage() işlevine gidin. Bu işlevin alt kısmında, sırasıyla döndürülen iterasyonlar veya hiç iterasyon içermeyen resimler oluşturmak için kullanılacak 7. ve 8. adımları görürsünüz. Bu işlemlerin her ikisi de eşzamanlı olarak gerçekleştiğinden, bir işleyiciye sarmalandığını fark edeceksiniz. Başlamak için // 7. Adım - Yinelemeleri göstermeden oluşturma ifadesini, ImageGenerationHelper dosyasından generate() işlevini çağırmak için bu kod bloğunu kullanarak değiştirebilir, ardından kullanıcı arayüzü durumunu güncelleyebilirsiniz.

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

8. adım biraz daha zordur. execute() işlevi, resim oluşturma için tüm adımları yerine yalnızca bir adımı gerçekleştirdiğinden, her adımı bir döngü aracılığıyla ayrı ayrı çağırmanız gerekir. Ayrıca, geçerli adımın kullanıcıya gösterilip gösterilmeyeceğini de belirlemeniz gerekir. Son olarak, mevcut iterasyonun gösterilmesi gerekiyorsa kullanıcı arayüzü durumunu güncellersiniz. Bunların hepsini hemen 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şturucuyu başlatabilir ve ardından bir metin istemiyle 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ız gerektiğidir. Çalıştığı bilinen üçüncü taraf modeller, bu MediaPipe görevi için bunları dönüştürme ve cihazınıza kopyalama hakkında en güncel bilgileri edinmek için resmi dokümanların bu bölümünü inceleyebilirsiniz.

Dosyaları doğrudan geliştirme cihazınıza kopyalamanın yanı sıra, Firebase Depolama'yı gerekli dosyaları çalışma zamanında doğrudan kullanıcının cihazına indirecek şekilde ayarlayabilirsiniz.

5. Uygulamayı dağıtma ve test etme

Tüm bunları tamamladıktan sonra, metin isteklerini kabul edip tamamen cihaz üzerinde yeni resimler oluşturabilen çalışan bir uygulamanız olur. Uygulamayı test etmek için fiziksel bir Android cihaza dağıtın. Ancak bunu en az 8 GB belleğe sahip bir cihazda denemeniz gerektiğini 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ü (nihai veya iterasyonlu) seçin ve ardından BAŞLAT düğmesine basın.
  3. Sonraki ekranda istediğiniz özellikleri ayarlayın ve aracın ne tür sonuçlar oluşturduğunu görmek için OLUŞTUR düğmesini tıklayın.

e46cfaeb9d3fc235.gif

6. Tebrikler!

Başardınız! Bu codelab'de, Android uygulamasına cihaz üzerinde metinden resme dönüştürme özelliğini nasıl ekleyeceğinizi öğrendiniz.

Sonraki adımlar

Görsel oluşturma görevi ile şunları da yapabilirsiniz:

  • Oluşturulan resimleri eklentiler aracılığıyla yapılandırmak için bir temel resim kullanın veya Vertex AI aracılığıyla kendi ek LoRA ağırlıklarınızı eğitin.
  • ADB aracını kullanmaya gerek kalmadan cihazınızdaki model dosyalarını almak için Firebase Depolama'yı kullanın.

Bu deneysel görevle oluşturacağınız tüm harika çalışmaları görmeyi heyecanla bekliyoruz. MediaPipe ekibinin daha fazla kod laboratuvarı ve içeriğini takip edin.