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

1. Giriş

657431be3173fa86.png android.png

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

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

Bu kod laboratuvarında, Android cihazda 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ükleyin

Henüz yüklemediyseniz TensorFlow Lite modelinizi eğitirken Android Studio 4.1 veya sonraki bir sürümü indirip yükleyin.

Neler öğreneceksiniz?

  • TensorFlow Lite Model Maker'ı kullanarak kendi özel görüntü sınıflandırıcınızı eğitme.
  • Özel modeli CameraX'i 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 telefonunuzdaki 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'ı kullanarak çiçek tanıyıcı eğitme

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

TensorFlow Lite aktarımla öğrenim özelliğini kullanarak çiçekleri tanıması için Keras ile sınıflandırıcının nasıl eğitileceğini gösteren Colab sayfasını açın.

3. Çalışma dizinini ayarlama

Git deposunu klonlama

Aşağıdaki komut, bu kod laboratuvarının çalışması için gereken dosyaları içeren Git deposunu klonlar:

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

Ardından, deposu yeni klonladığınız dizine gidin. Bu codelab'in geri kalanında burada çalışacaksınız:

cd TFLClassify

4. Android iskelet uygulamasını ayarlama

android.png

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

Henüz yüklemediyseniz Android Studio 4.1 veya sonraki bir sürümü 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 bu pop-up'tan "Mevcut bir projeyi aç"ı seçin:

f3b8bea7e3b39376.png

  1. Dosya seçicide, çalışma dizininizden TFLClassify/build.gradle öğesini seçin.
  1. Projeyi ilk kez açtığınızda gradle sarmalayıcısının kullanılmasıyla ilgili bir "Gradle Senkronizasyonu" pop-up'ı görürsünüz. "Tamam"ı tıklayın.

d68b4d7189e6c1e4.png

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

60a77ef126c1373d.png

  1. Ardından Tensorflow Demo'nun kameranıza erişmesine izin verin:

b63cba02bb36b7e3.png

  1. Telefonunuzda, gerçek sonuçların gösterileceği yerin yerine rastgele sayıların yer aldığı aşağıdaki ekranı görürsünüz.

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'yi, ardından New > Other > TensorFlow Lite Model'i tıklayın.

bf243d9fdd27e20a.png

  1. Özel olarak eğitilmiş FlowerModel.tflite modelini daha önce indirdiğiniz model konumunu seçin.

cfee18cc6674a408.png

  1. Finish simgesini tıklayın.
  2. Sonunda aşağıdakileri görürsünüz. FlowerModel.tflite başarıyla içe aktarıldı. Bu model, giriş / çıkış ve başlamanıza yardımcı olacak bazı örnek kodlar da dahil olmak üzere modelle ilgili üst düzey bilgileri gösterir.

82840065f0d59def.png

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

TODO listesi, codelab'i güncellemeniz gereken tam konuma gitmenizi kolaylaştırır. Gelecekteki işlerinizi hatırlatmak için Android projenizde de kullanabilirsiniz. Kod yorumlarını kullanarak TODO anahtar kelimesini yazarak yapılacaklar listesi öğeleri ekleyebilirsiniz. Yapılacaklar listesine erişmek için:

  1. Ne yapacağımızı öğrenmenin en iyi yolu TODO listesine göz atmaktır. Bunu yapmak için üst menü çubuğundan View > Tool Windows > TODO

5de29b413574f25c.png

  1. Varsayılan olarak, tüm modüllerdeki tüm TODO'ları listeler. Bu da biraz kafa karıştırıcı olabilir. TODO panelinin yan tarafındaki grupla düğmesini tıklayıp Modules'ü seçerek yalnızca başlangıç TODO'larını sıralayabiliriz.

5d8fe7b102340208.png

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

8d0f14a039995b20.png

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

  1. TODO listesinde TODO 1'i tıklayın veya MainActivity.kt dosyasını açıp TODO 1'i bulun, modeli şu satırı ekleyerek 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 Analyzer'ın analyze yönteminde, kamera girişi ImageProxyBitmap'e dönüştürmemiz ve çıkarım süreci için bir TensorImage nesnesi oluşturmamız gerekir.
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çta aşağıdaki işlemleri yapın:
  • Sonuçları, score özelliği altında olasılığa göre azalan düzende sıralayın. En yüksek olasılığa sahip sonuçlar önce gelir.
  • MAX_RESULT_DISPLAY sabitiyle tanımlanan ilk k sonucu alın. İsteğe bağlı olarak daha fazla veya daha az sonuç elde etmek 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ıralı ve filtrelenmiş 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. Daha önce gördüğümüz sahte sonuçların oluşturulmasına yardımcı olan aşağıdaki satırları yoruma alı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 simgesini seçip araç çubuğundaki çalıştırma düğmesine 86934b7b01ad7565.png basarak uygulamayı gerçek bir cihazda çalıştırın:

60a77ef126c1373d.png

  1. Telefonunuzda, gerçek sonuçların gösterileceği yerin yerine rastgele sayıların yer aldığı aşağıdaki ekranı görürsünüz:

f11c2821f2c8311d.png

8. İsteğe bağlı: GPU temsilcisi ile çıkarım hızlandırma

TensorFlow Lite, mobil cihazınızda çıkarım işlemini hızlandırmak için çeşitli donanım hızlandırıcıları destekler. GPU, TensorFlow Lite'ın bir temsilci 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 dosyasını açın veya TODO listesinin altındaki TODO 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 TODO listesinde TODO 6'yı tıklayın. flowerModel'in basit başlatma işlemini aşağıdakiyle 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. Model başlatıcıyı, yöntem girişine options ekleyerek bunu kullanacak şekilde 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 simgesini seçip araç çubuğundaki çalıştırma 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 şu bağlantılara göz atabilirsiniz: