Android'de TensorFlow Lite ile Çiçekleri Tanıyın

1. Giriş

657431be3173fa86.png android.png

Not: Bu codelab'de test için fiziksel bir cihaz gerekir

TensorFlow çok amaçlı bir makine öğrenimi çerçevesidir. TensorFlow, buluttaki kümeler genelinde büyük modelleri eğitmekten telefonunuz gibi yerleşik bir sistemde modelleri yerel olarak çalıştırmaya kadar her yerde kullanılabilir.

Bu codelab'de, Android cihazlarda görüntü tanıma modeli çalıştırmak için TensorFlow Lite kullanılır.

Android Studio 4.1 veya sonraki bir sürümü yükleme

Henüz yüklemediyseniz TensorFlow Lite modelinizi eğitirken AndroidStudio 4.1 veya üstünü indirip yükleyin.

Neler öğreneceksiniz?

  • TensorFlow Lite Model Maker'ı kullanarak kendi özel resim sınıflandırıcınızı nasıl eğitebilirsiniz?
  • Özel modeli CameraX kullanarak bir Android uygulamasına entegre etmek için TensorFlow Lite modelini içe aktarmak üzere Android Studio'yu kullanma.
  • Modelinizi hızlandırmak için telefonunuzda GPU'yu kullanma

Ne oluşturacaksınız?

Çiçekleri tanımlamak için TensorFlow görüntü tanıma programı çalıştıran basit bir kamera uygulaması.

f11c2821f2c8311d.png

Lisans: Ücretsiz kullanım

2. Colab'i kullanarak bir çiçek figürü eğitin

Model eğitimini başlatmadan önce Android Studio 4.1 veya sonraki bir sürümü indirip yüklemeye başlayın.

Çiçeklerin tanınması için Keras ile sınıflandırıcıyı TensorFlow Lite aktarım eğitimiyle nasıl eğiteceğinizi gösteren Colab dosyasını açın.

3. Çalışma dizinini ayarlama

Git deposunu klonlama

Aşağıdaki komut, bu codelab için gerekli olan dosyaları içeren Git deposunu klonlar:

git clone https://github.com/hoitab/TFLClassify.git

Şimdi, depoyu klonladığınız dizine gidin. Bu codelab'in geri kalanında üzerinde çalışacağınız yer:

cd TFLClassify

4. Android iskelet uygulamasını kurma

android.png

Android Studio 4.1 veya sonraki bir sürümü yükleme

Henüz yüklemediyseniz AndroidStudio 4.1 veya sonraki bir sürümünü yükleyin.

Projeyi Android Studio ile açma

Aşağıdaki adımları uygulayarak Android Studio ile bir proje açın:

  1. Android Studio'yu 7f2480ded53a193b.png açın. Yüklendikten sonra "Mevcut projeyi aç"ı seçin şu pop-up'tan:

f3b8bea7e3b39376.png

  1. Dosya seçicide, çalışma dizininizde TFLClassify/build.gradle öğesini seçin.
  1. "Gradle Senkronizasyonu" alırsınız pop-up ile birlikte gradle sarmalayıcısının kullanımıyla ilgili sorular sorabilirsiniz. "Tamam"ı tıklayın.

d68b4d7189e6c1e4.png

  1. Henüz etkinleştirmediyseniz telefonunuzda geliştirici modelini ve USB Hata Ayıklama özelliğini etkinleştirin. Bu tek seferlik bir kurulumdur. Bu talimatları uygulayın.
  2. Hem projeniz hem de telefonunuz hazır olduğunda, TFL_Classify.start uygulamasını seçip araç çubuğundaki çalıştır düğmesine 86934b7b01ad7565.png basarak projeyi gerçek bir cihazda çalıştırabilirsiniz:

60a77ef126c1373d.png

  1. Şimdi Tensorflow Demo'nun kameranıza erişmesine izin verin:

b63cba02bb36b7e3.png

  1. Telefonunuzda aşağıdaki ekranda, gerçek sonuçların yerine rastgele sayılar gösterilir.

82c603596afa35f1.png

5. Android uygulamasına TensorFlow Lite'ı ekleme

  1. Sol taraftaki proje gezgininde start modülünü seçin:

cede7f2b8b23c1a7.png

  1. start modülünü sağ tıklayın veya File öğesini, ardından New > Other TensorFlow Lite Model

bf243d9fdd27e20a.png

  1. Daha önce özel olarak eğitilmiş FlowerModel.tflite öğesini indirdiğiniz model konumunu seçin.

cfee18cc6674a408.png

  1. Finish simgesini tıklayın.
  2. En sonda aşağıdakini göreceksiniz. FlowerModel.tflite başarıyla içe aktarılır ve başlamanıza yardımcı olacak bazı örnek kodların yanı sıra giriş / çıkış gibi modelle ilgili üst düzey bilgileri gösterir.

82840065f0d59def.png

6. İsteğe bağlı: Tüm yapılacaklar listesini kontrol etme

YAPILACAKLAR listesi, codelab'i güncellemeniz gereken konuma tam olarak gitmenizi kolaylaştırır. Bunu kendinize gelecekteki çalışmalarınızı hatırlatmak için Android projenizde de kullanabilirsiniz. Kod yorumlarını kullanarak yapılacaklar öğeleri ekleyebilir ve TODO anahtar kelimesini yazabilirsiniz. YAPILACAKLAR listesine erişmek için şunları yapabilirsiniz:

  1. Neler yapacağımızı görmenin en iyi yollarından biri YAPILACAKLAR listesine göz atmak. Bunu yapmak için üst menü çubuğundan seçim yapın View > Tool Windows TODO

5de29b413574f25c.png

  1. Varsayılan olarak, tüm modüllerdeki tüm YAPILACAKLAR listelendiği için biraz kafa karıştırıcıdır. YAPILACAKLAR panelinin yan tarafında bulunan gruplandırma ölçütü düğmesini tıklayıp Modules seçeneğini tıklayarak sadece başlangıçtaki YAPILACAKLAR'ı sıralayabiliriz.

5d8fe7b102340208.png

  1. Başlangıç modüllerindeki tüm öğeleri genişletin:

8d0f14a039995b20.png

7. Özel modeli TensorFlow Lite ile çalıştırın

  1. YAPILACAKLAR listesindeki 1. YAPILACAKLAR'ı tıklayın veya MainActivity.kt dosyasını açıp YAPILACAKLAR 1'i bulun. Aşağıdaki satırı ekleyerek modeli başlatın:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. CameraX Analiz Aracı analiz yönteminde, ImageProxy adlı kamera girişini Bitmap öğesine dönüştürmemiz ve çıkarım işlemi için bir TensorImage nesnesi oluşturmamız gerekiyor.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}
  1. Resmi işleyin ve sonuç üzerinde aşağıdaki işlemleri gerçekleştirin:
  • Sonuçları, ilk olarak en yüksek olasılığa sahip score özelliği altında olasılığa göre azalan düzende sıralayın.
  • MAX_RESULT_DISPLAY sabitiyle tanımlanan ilk k sonuçlarını alın. İsterseniz daha fazla veya daha az sonuç almak için bu değişkenin değerini değiştirebilirsiniz.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. Sıralanan ve filtrelenen sonuçları, Veri Bağlama aracılığıyla RecyclerView tarafından kullanılmaya hazır Recognition veri nesnelerine dönüştürün:
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. Önceden gördüğümüz sahte sonuçların oluşturulmasına yardımcı olmak için aşağıdaki satırları yorumlayın veya silin:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. TFL_Classify.start uygulamasını seçip araç çubuğundaki çalıştır düğmesine 86934b7b01ad7565.png basarak uygulamayı gerçek bir cihazda çalıştırın:

60a77ef126c1373d.png

  1. Telefonunuzda aşağıdaki ekranı göreceksiniz. Bu ekranda, gerçek sonuçların yerine rastgele sayılar gösterilir:

f11c2821f2c8311d.png

8. İsteğe bağlı: GPU yetkilendirmesi ile çıkarımı hızlandırın

TensorFlow Lite, mobil cihazınızda çıkarımı hızlandırmak için çeşitli donanım hızlandırıcıları destekler. GPU, TensorFlow Lite'ın yetki verme mekanizması aracılığıyla yararlanabileceği hızlandırıcılardan biridir ve kullanımı oldukça kolaydır.

  1. start modülü altında build.gradle'ı açın veya YAPILACAKLAR listesinin altındaki YAPILACAKLAR 5'i tıklayıp aşağıdaki bağımlılığı ekleyebilirsiniz:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. MainActivity.kt dosyasına geri dönün veya YAPILACAKLAR listesindeki 6. YAPILACAKLAR'ı tıklayın. FlowerModel'in basit başlatılması işlemini şununla değiştirin: GPU uyumluluk listesinin bir örneğini alın ve listelenen uyumlu GPU'lardan biri olup olmadığına bağlı olarak GPU'yu başlatın. Aksi takdirde modeli çalıştırmak için 4 CPU iş parçacığı başlatın:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. Yöntem girişine options ekleyerek bunu kullanmak için model başlatıcıyı değiştirin:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}
  1. TFL_Classify.start uygulamasını seçip araç çubuğundaki çalıştır düğmesine 86934b7b01ad7565.png basarak uygulamayı gerçek bir cihazda çalıştırın:

60a77ef126c1373d.png

9. Sırada Ne Var?

Daha fazla bilgi edinmek için aşağıdaki bağlantılardan yararlanabilirsiniz: