Uygulamanıza Özel Model Entegre Etme

1. Başlamadan önce

Bu serideki ilk Codelab'de, bir görüntünün içeriğini ayrıştırmak için Görüntü Etiketleme'yi kullanan çok basit bir uygulama oluşturmuştunuz. Bir papatya resmi gönderdiğinizde, size taç yaprak veya gökyüzü gibi şeyler gördüğünü söylüyor. Ardından, ikinci Codelab'de beş farklı çiçek türünü tanıyan yeni ve özel bir modeli eğitmek için Python'a geçtiniz.

Bu codelab'de, ilk laboratuvardaki uygulamayı ikinci laboratuvardaki modelle güncelleyeceksiniz.

Bu kod laboratuvarının tam kaynak kodunu bu depoyu klonlayarak edinebilirsiniz. Android ve iOS için alt dizinler görürsünüz. İsterseniz önceki codelab'in kodunu ImageClassifierStep1 olarak kullanabilirsiniz. Bu codelab'in tamamlanmış kodu ImageClassifierStep2 olarak mevcuttur.

Ön koşullar

  • Bu öğrenme rotasındaki ilk iki codelab'i tamamlamış olmanız gerekir.

Neler oluşturacak ve öğreneceksiniz?

  • Önceki laboratuvarda eğitilmiş özel bir modeli Android veya iOS uygulamasına entegre etme

İhtiyacınız olanlar

  • Laboratuvarın Android bölümü için developer.android.com/studio adresinden Android Studio'yu edinin.
  • Laboratuvarın iOS bölümü için Apple App Store'da bulunan Xcode

2. Başlangıç uygulamasını edinme

Öncelikle Android veya iOS'te İlk Bilgisayarla Görme Uygulamanızı Oluşturma Codelab'indeki uygulamaya ihtiyacınız olacak. Laboratuvarı tamamladıysanız bu dosyanın adı ImageClassifierStep1 olur. Laboratuvarı tamamlamak istemiyorsanız bitmiş sürümü depodan klonlayabilirsiniz.

Android Studio'da açın, gerekli güncellemeleri yapın ve hazır olduğunda uygulamanın çalıştığından emin olmak için uygulamayı çalıştırın. Aşağıdakine benzer bir tablo görürsünüz:

f3703d45d1332d1d.png

Bu uygulama oldukça basit olsa da çok az kodla çok güçlü işlevler gösteriyor. Ancak bu çiçeğin yalnızca çiçek olarak değil, papatya olarak da tanınmasını istiyorsanız uygulamayı, Create a custom model for your image classifier (Resim sınıflandırıcınız için özel model oluşturma) adlı codelab'deki özel modelinizi kullanacak şekilde güncellemeniz gerekir.

3. Özel ML Kit modellerini kullanmak için build.gradle dosyasını güncelleme

  1. Android Studio'yu kullanarak uygulama düzeyindeki build.gradle dosyasını bulun. Bunu yapmanın en kolay yolu proje gezginini kullanmaktır. Üstte Android'in seçili olduğundan emin olun. Alt kısımda Gradle Scripts klasörünü görürsünüz.
  2. Modül için olanı açın. Uygulama adınızın ardından burada gösterildiği gibi ".app" ifadesi yer almalıdır (Modül: ImageClassifierStep1.app):

8fe1d04b40610047.png

  1. Dosyanın alt kısmında dependencies (bağımlılıklar) ayarını bulun. Burada şu satırı görmeniz gerekir:
implementation 'com.google.mlkit:image-labeling:17.0.1'

Sürüm numarası farklı olabilir. En son sürüm numarasını her zaman şu ML Kit sitesinden bulabilirsiniz: https://developers.google.com/ml-kit/vision/image-labeling/android

  1. Bunu özel görüntü etiketleme kitaplığı referansıyla değiştirin. Bunun sürüm numarasını şu adreste bulabilirsiniz: https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
  1. Ayrıca, önceki laboratuvarda oluşturduğunuz bir .tflite modeli de ekleyeceksiniz. Android Studio uygulamanızı derlerken bu modelin sıkıştırılmasını istemiyorsanız aynı build.gradle dosyasının Android bölümünde bu ayarı kullandığınızdan emin olun:
aaptOptions{
    noCompress "tflite"
}

Başka bir ayarın içinde olmadığından emin olun. Doğrudan android etiketinin altına yerleştirilmelidir. Aşağıda bununla ilgili bir örnek verilmiştir:

62d546bff11d2a50.png

4. TFLite modelini ekleme

Önceki codelab'de özel modelinizi oluşturup model.tflite olarak indirdiniz.

Projenizde, şu anda flower1.jpg içeren öğeler klasörünüzü bulun. Modeli ilgili klasöre aşağıdaki şekilde kopyalayın:

  1. Android Studio'da Assets klasörünü sağ tıklayın. Açılan menüde Finder'da göster'i seçin. (Windows'da "Gezgin'de göster", Linux'ta "Dosyalarda göster")

db30b47e419a326b.png

  1. Dosya sistemindeki dizine yönlendirilirsiniz. model.tflite dosyasını flower1.jpg. ile birlikte bu dizine kopyalayın.

36de0c51bec1c19e.png

Android Studio, öğeler klasörünüzdeki her iki dosyayı da gösterecek şekilde güncellenir:

e9f4e9f394d9b357.png

Artık kodunuzu güncellemeye hazırsınız.

5. Özel model için kodunuzu güncelleme

İlk adım, özel modeli yüklemek için bazı kodlar eklemektir.

  1. MainActivity dosyanızda, onCreate bölümüne setContentView(R.layout.activity_main) yazan satırın hemen altına aşağıdakileri ekleyin.

Bu işlem, model.tflite öğesinden oluşturmak için bir LocalModel kullanır. Android Studio, "LocalModel"i kırmızıya çevirerek hata verirse kitaplığı içe aktarmak için ALT + Enter tuşlarına basın. Bu işlem, com.google.mlkit.common.model.LocalModel için bir içe aktarma işlemi ekler.

val localModel = LocalModel.Builder()
        .setAssetFilePath("model.tflite")
        .build()

Daha önce btn.setOnClickListener işleyicinizde varsayılan modeli kullanıyordunuz. Bu kodla ayarlandı:

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

Özel modeli kullanmak için bu değeri değiştirmeniz gerekir.

  1. Özel seçenekler nesnesi oluşturun:
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

Bu işlem, varsayılan seçenekleri özelleştirilmiş bir grupla değiştirir. Güven eşiği, döndürülecek tahminlerin kalitesi için bir sınır belirler. Bu codelab'in en üstündeki örnekte, resmin papatya olduğu durumda 4 tahmin vardı ve her birinin yanında bir değer vardı .Örneğin, "Gökyüzü" değeri 0,7632 idi.

Yüksek bir güven eşiği kullanarak daha düşük kaliteli sonuçları etkili bir şekilde filtreleyebilirsiniz. Örneğin, bu değeri 0,9 olarak ayarladığınızda önceliği bu değerden düşük olan hiçbir etiket döndürülmez. setMaxResultCount(), çok sayıda sınıf içeren modellerde kullanışlıdır ancak bu modelde yalnızca 5 sınıf olduğundan değeri 5 olarak bırakabilirsiniz.

Etiketleyici için seçenekleriniz olduğuna göre, etiketleyicinin örneğini şu şekilde değiştirebilirsiniz:

val labeler = ImageLabeling.getClient(options)

Kodunuzun geri kalanı değiştirilmeden çalışır. Mutlaka deneyin!

dd40c36c4edbb33.png

Burada, bu çiçeğin artık %95,9 olasılıkla papatya olarak tanımlandığını görebilirsiniz.

İkinci bir çiçek resmi eklediğinizi ve bu resimle yeniden çalıştırmayı denediğinizi varsayalım:

8556a5fbea487842.png

Görüntüde gül olduğunu tespit ediyor.

Neden sadece "gül" yerine güller yazdığını merak edebilirsiniz. Bunun nedeni, veri kümesinde etiketlerin klasör adlarıyla verilmesi ve maalesef bu klasör adlarının biraz tutarsız olmasıdır. Bazen tekil (ör. "papatya") bazen de çoğul (ör. "güller") kullanılır. Bunu, modelin resimdeki öğeleri saymaya çalışmasıyla karıştırmayın. Bu işlem, öğeleri saymaya çalışmaktan çok daha basittir ve yalnızca çiçek türlerini tanımlayabilir.

6. iOS Başlangıç Uygulamasını edinme

  1. Öncelikle ilk Codelab'deki uygulamaya ihtiyacınız olacak. Laboratuvarı tamamladıysanız bu dosyanın adı ImageClassifierStep1 olur. Laboratuvarı tamamlamak istemiyorsanız bitmiş sürümü depodan klonlayabilirsiniz. Pod'ların ve .xcworkspace'in depoda bulunmadığını lütfen unutmayın. Bu nedenle, bir sonraki adıma geçmeden önce .xcproject ile aynı dizinden "pod install" komutunu çalıştırdığınızdan emin olun.
  2. ImageClassifierStep1.xcworkspace dosyasını Xcode'da açın. ML Kit'i pod'ları kullanarak paketlediğiniz ve çalışma alanı bunları yükleyeceği için .xcproject yerine .xcworkspace dosyasını kullanmanız gerektiğini unutmayın.

Bu laboratuvarın geri kalanında uygulamayı, codelab'deki derleme hedeflerini desteklemesi gereken iPhone simülatöründe çalıştıracağım. Kendi cihazınızı kullanmak istiyorsanız proje ayarlarınızdaki derleme hedefini iOS sürümünüzle eşleşecek şekilde değiştirmeniz gerekebilir.

Kodu çalıştırdığınızda aşağıdakine benzer bir sonuç görürsünüz:

9e151ed18f99fb98.png

Çok genel sınıflandırmalara (ör. yaprak, çiçek, gökyüzü) dikkat edin. Önceki codelab'de oluşturduğunuz model, bu model de dahil olmak üzere 5 çeşit çiçeği (ör. papatya) tespit edecek şekilde eğitilmişti.

Bu codelab'in geri kalanında, uygulamanızı özel modelle yükseltmek için gerekenleri inceleyeceksiniz.

7. Özel ML Kit Image Labeler Pod'larını kullanma

İlk uygulama, temel ML Kit Image Labeler kitaplıklarını ve modelini almak için bir pod dosyası kullanıyordu. Özel resim etiketleme kitaplıklarını kullanmak için bunu güncellemeniz gerekir.

  1. Proje dizininizde podfile adlı dosyayı bulun. Dosyayı açtığınızda aşağıdakine benzer bir ekran görürsünüz:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. Pod beyanını ImageLabeling yerine ImageLabelingCustom olarak değiştirin. Örneğin:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. İşlemi tamamladığınızda, terminali kullanarak podfile'ı (ve .xcworkspace'i) içeren dizine gidin ve pod install komutunu çalıştırın.

bb5d78eb7c7ab975.png

Birkaç dakika sonra MLKitImageLabeling kitaplıkları kaldırılır ve özel kitaplıklar eklenir. Artık kodunuzu düzenlemek için .xcworkspace dosyanızı açabilirsiniz.

8. TFLite modelini Xcode'a ekleme

Önceki codelab'de özel bir model oluşturup model.tflite olarak indirmiştiniz. Bu bilgiyi elinizde bulundurmuyorsanız geri dönüp bu codelab'i çalıştırın veya buradaki Colab kodunu inceleyin. Google Colab'e erişiminiz yoksa not defterine bu bağlantıdan ulaşabilirsiniz.

  1. Çalışma alanı Xcode'da açıkken model.tflite dosyasını projenize sürükleyin. Bu dosya, ViewController.swift veya Main.storyboard gibi diğer dosyalarınızla aynı klasörde olmalıdır.
  2. Dosyayı ekleme seçeneklerinin bulunduğu bir iletişim kutusu açılır. Hedeflere ekle'nin seçildiğinden emin olun. Aksi takdirde, model bir cihaza dağıtıldığında uygulamayla birlikte paketlenmez.

Bu laboratuvarı adım adım takip ediyorsanız "Hedeflere ekle" girişinde ImageClassifierStep1, bitmiş koda geçtiyseniz ImageClassifierStep2 (gösterildiği gibi) olacağını unutmayın.

5b6a7f40c73f0f1f.png

Bu sayede modeli yükleyebilirsiniz. Bunu nasıl yapacağınızı bir sonraki adımda öğreneceksiniz.

9. Özel model için kodunuzu güncelleme

  1. ViewController.swift dosyanızı açın. Dosyanın üst kısmındaki "import MLKitImageLabeling" satırında bir hata görebilirsiniz. Bunun nedeni, pod dosyanızı güncellerken genel resim etiketleme kitaplıklarını kaldırmış olmanızdır. Bu satırı silebilir ve aşağıdaki bilgilerle güncelleyebilirsiniz:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

Bu kodları hızlıca okuyup aynı kodu tekrar ettiklerini düşünebilirsiniz. Ancak sonunda "Ortak" ve "Özel" var.

  1. Ardından, önceki adımda eklediğiniz özel modeli yükleyeceksiniz. getLabels() işlevini bulun. visionImage.orientation = image.imageOrientation satırının altına şu satırları ekleyin:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
  1. Genel ImageLabeler'ın seçeneklerini belirtme kodunu bulun. Bu kitaplıklar kaldırıldığından muhtemelen hata mesajı alıyorsunuz:
let options = ImageLabelerOptions()

CustomImageLabelerOptions kullanmak ve yerel modeli belirtmek için bu kodu aşağıdaki kodla değiştirin:

let options = CustomImageLabelerOptions(localModel: localModel)

Hepsi bu kadar. Uygulamanızı şimdi çalıştırmayı deneyin. Resmi sınıflandırmaya çalıştığınızda daha doğru sonuçlar elde edersiniz ve yüksek olasılıkla bir papatyaya baktığınızı görürsünüz.

238cd21748a97cf4.png

İkinci bir çiçek resmi eklediğinizi ve bu resimle yeniden çalıştırmayı denediğinizi varsayalım:

75f3970a6b509bfe.png

Uygulama, bu resmin "güller" etiketiyle eşleştiğini başarıyla tespit etti.

10. Tebrikler!

Artık bir resmin içeriğini tanımak için genel bir model kullanan bir uygulama oluşturmaktan, çiçek gibi belirli şeyleri tanımak için kendi makine öğrenimi modelinizi oluşturmaya ve ardından uygulamanızı özel modelinizi kullanacak şekilde güncellemeye geçtiniz.

Ortaya çıkan uygulama, paketlenmiş resim öğelerine dayandığı için elbette çok sınırlıydı. Ancak makine öğrenimi kısmı düzgün çalışıyor. Örneğin, canlı özet akışından kareler almak ve telefonunuzun hangi çiçekleri tanıdığını görmek için AndroidX Camera'yı kullanabilirsiniz.

Buradan sonra olasılıklar sınırsızdır. Çiçek dışında bir şey için kendi verileriniz varsa Bilgisayarla Görme kullanarak bunları tanıyan bir uygulama oluşturmak için gereken temellere sahipsiniz demektir. Bunlar, çok daha geniş bir dünyaya atılan ilk adımlardır. Bu adımları uygularken keyif aldığınızı umuyoruz.