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ümelerde 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 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
  • TensorFlow Lite modelini içe aktarmak için Android Studio'yu kullanma ve CameraX kullanarak özel modeli bir Android uygulamasına entegre etme.
  • 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: Kullanımı ücretsizdir

2. Colab kullanarak çiçek tanıma aracı eğitme

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

TensorFlow Lite aktarımla öğrenme kullanarak çiçekleri tanımak için Keras ile sınıflandırıcı eğitmenin nasıl yapılacağını gösteren Colab'i açın.

3. Çalışma dizinini ayarlama

Git deposunu klonlama

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

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

Ardından, 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ı ayarlama

android.png

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

Yüklü değilse Android Studio 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 bu pop-up'tan "Open an Existing project" (Mevcut bir projeyi aç) seçeneğini belirleyin:

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ılıp kullanılmayacağını soran bir "Gradle Sync" pop-up'ı gösterilir. "Tamam"ı tıklayın.

d68b4d7189e6c1e4.png

  1. Henüz yapmadıysanız telefonunuzda geliştirici modelini ve USB üzerinden hata ayıklamayı 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 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, gerçek sonuçların gösterileceği yerlerde 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, ardından New > Other > TensorFlow Lite Model simgesini tıklayın.

bf243d9fdd27e20a.png

  1. Daha önce özel olarak eğitilmiş FlowerModel.tflite modelini indirdiğiniz konumu seçin.

cfee18cc6674a408.png

  1. Finish simgesini tıklayın.
  2. En sonunda aşağıdakileri görürsünüz. FlowerModel.tflite başarıyla içe aktarılır ve giriş / çıkışın yanı sıra başlamanıza yardımcı olacak bazı örnek kodlar da dahil olmak üzere modelle ilgili üst düzey bilgiler gösterilir.

82840065f0d59def.png

6. İsteğe bağlı: Yapılacaklar listesinin tamamını inceleme

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

  1. Ne yapacağımızı görmek için yapılacaklar listesine göz atabilirsiniz. Bunu yapmak için üst menü çubuğundan View > Tool Windows > TODO simgesini seçin.

5de29b413574f25c.png

  1. Varsayılan olarak, tüm modüllerdeki tüm yapılacaklar listelenir. Bu da biraz kafa karıştırıcı olabilir. Yapılacaklar panelinin yanındaki gruplandırma ölçütü düğmesini tıklayıp Modules seçeneğini belirleyerek yalnızca başlangıç yapılacaklarını ayırabiliriz.

5d8fe7b102340208.png

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

8d0f14a039995b20.png

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

  1. Yapılacaklar listesinde YAPILACAK 1'i tıklayın veya MainActivity.kt dosyasını açıp YAPILACAK 1'i bulun ve şu 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 Analyzer'ın analiz yönteminde, kamera girişini ImageProxy Bitmap biçimine 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. Görüntüyü işleyin ve sonuç üzerinde aşağıdaki işlemleri gerçekleştirin:
  • Sonuçları, en yüksek olasılık önce gelecek şekilde score özelliği altındaki olasılığa göre azalan sırada sıralayın.
  • MAX_RESULT_DISPLAY sabitiyle tanımlanan ilk k sonuç alınır. İ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ıralanmış ve filtrelenmiş sonuçları, veri bağlama yoluyla Recognition tarafından kullanılmaya hazır RecyclerView 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ı yorum satırı yapı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çerek uygulamayı gerçek bir cihazda çalıştırın ve araç çubuğundaki çalıştır düğmesine 86934b7b01ad7565.png basın:

60a77ef126c1373d.png

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

f11c2821f2c8311d.png

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

TensorFlow Lite, mobil cihazınızda çıkarım hızını artırmak için çeşitli donanım hızlandırıcıları destekler. GPU, TensorFlow Lite'ın bir temsilci mekanizması aracılığıyla kullanabileceğ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 listesindeki 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 yapılacaklar listesinde YAPILACAKLAR 6'yı tıklayın. flowerModel'in basit başlatma işlemini aşağıdakilerle 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 model başlatıcıyı 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çerek uygulamayı gerçek bir cihazda çalıştırın ve araç çubuğundaki çalıştır düğmesine 86934b7b01ad7565.png basın:

60a77ef126c1373d.png

9. Sırada ne var?

Daha fazla bilgi için aşağıdaki bağlantılara göz atabilirsiniz: