1. Genel Bakış
Firebase ML, modelinizi kablosuz olarak dağıtmanıza olanak tanır. Bu, uygulama boyutunu küçük tutmanıza ve ML modelini yalnızca gerektiğinde indirmenize, birden fazla modelle deneme yapmanıza veya uygulamanın tamamını yeniden yayınlamanıza gerek kalmadan ML modelinizi güncellemenize olanak tanır.
Bu codelab'de, statik bir TFLite modeli kullanan bir Android uygulamasını, Firebase'den dinamik olarak sunulan bir modeli kullanan bir uygulamaya dönüştüreceksiniz.
Ne öğreneceksin
- TFLite modellerini Firebase ML'ye dağıtın ve bunlara uygulamanızdan erişin
- Firebase Analytics ile model doğruluğunu ölçmek için kullanıcı geri bildirimlerini izleyin
- Firebase Performance aracılığıyla profil modeli performansı
- Remote Config aracılığıyla birden fazla dağıtılan modelden hangisinin yükleneceğini seçin
- Firebase A/B Testi aracılığıyla farklı modellerle denemeler yapın
İhtiyacınız olan şey
- En son Android Studio sürümü.
- Basit kod.
- Android 5.0+ ve Google Play hizmetleri 9.8 veya sonraki sürümlere sahip bir test cihazı ya da Google Play hizmetleri 9.8 veya sonraki sürümlere sahip bir Emülatör
- Bir cihaz kullanılıyorsa, bir bağlantı kablosu.
Bu öğreticiyi nasıl kullanacaksınız?
Android uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?
2. Örnek kodu alın
GitHub deposunu komut satırından kopyalayın.
$ git clone https://github.com/FirebaseExtended/codelab-digitclassifier-android.git
Git yüklü değilse örnek projeyi GitHub sayfasından veya bu bağlantıya tıklayarak da indirebilirsiniz.
3. Başlangıç uygulamasını içe aktarın
Android Studio'dan codelab-digitclassifier-android
dizinini seçin ( ) örnek kod indirmesinden ( Dosya > Aç > .../codelab-digitclassifier-android/start).
Artık başlangıç projenizi Android Studio'da açmalısınız.
4. Başlangıç uygulamasını çalıştırın
Artık projeyi Android Studio'ya aktardığınıza göre uygulamayı ilk kez çalıştırmaya hazırsınız. Android cihazınızı bağlayın ve Çalıştır'a tıklayın ( )Android Studio araç çubuğunda.
Uygulama cihazınızda başlatılmalıdır. Bu noktada bir rakam çizmeye çalışırsanız uygulamanın onu tanıyabilmesi gerekir.
5. Firebase konsol projesi oluşturun
Firebase'i projeye ekleyin
- Firebase konsoluna gidin.
- Proje ekle'yi seçin.
- Bir Proje adı seçin veya girin.
- Firebase konsolunda kalan kurulum adımlarını izleyin ve ardından Proje oluştur'u (veya mevcut bir Google projesini kullanıyorsanız Firebase Ekle'yi) tıklayın.
6. Firebase'i ekleyin
- Kurulum iş akışını başlatmak için yeni projenizin genel bakış ekranından Android simgesine tıklayın.
- Codelab'in paket adını girin:
org.tensorflow.lite.examples.digitclassifier
Google-services.json dosyasını uygulamanıza ekleyin
Paket adını kaydettikten ve İleri'yi seçtikten sonra, Firebase Android yapılandırma dosyanızı almak için google-services.json'u indir'e tıklayın ve ardından google-services.json dosyasını projenizdeki app
dizinine kopyalayın. Dosya indirildikten sonra konsolda gösterilen sonraki adımları atlayabilirsiniz (bu adımlar sizin için build-android-start projesinde zaten yapılmıştır).
Uygulamanıza Google hizmetleri eklentisini ekleyin
Google-services eklentisi, uygulamanızı Firebase'i kullanacak şekilde yapılandırmak için google-services.json dosyasını kullanır. Projenizin app
dizinindeki build.gradle.kts dosyasının üst kısmındaki plugins
bloğuna aşağıdaki satırı ekleyin:
app/build.gradle.kts
id("com.google.gms.google-services")
Daha sonra projedeki build.gradle.kts dosyanızın plugins
bloğuna aşağıdaki satırı ekleyin:
proje/build.gradle.kts
id("com.google.gms.google-services") version "4.3.15" apply false
Projenizi gradle dosyalarıyla senkronize edin
Uygulamanızda tüm bağımlılıkların mevcut olduğundan emin olmak için bu noktada projenizi gradle dosyalarıyla senkronize etmelisiniz. Android Studio araç çubuğundan Dosya > Projeyi Gradle Dosyalarıyla Eşitle'yi seçin.
7. Uygulamayı Firebase ile çalıştırın
google-services
eklentisini JSON dosyanızla yapılandırdığınıza göre artık uygulamayı Firebase ile çalıştırmaya hazırsınız. Android cihazınızı bağlayın ve Çalıştır'a tıklayın ( )Android Studio araç çubuğunda.
Uygulama cihazınızda başlatılmalıdır. Bu noktada uygulamanız yine de başarıyla oluşturulmalıdır.
8. Firebase ML'ye bir model dağıtın
Bir modeli Firebase ML'ye dağıtmak iki ana nedenden dolayı faydalıdır:
- Uygulama yükleme boyutunu küçük tutabilir ve modeli yalnızca ihtiyaç duyulduğunda indirebiliriz
- Model düzenli olarak ve uygulamanın tamamından farklı bir sürüm döngüsüyle güncellenebilir
Uygulamamızdaki statik modeli Firebase'den dinamik olarak indirilen bir modelle değiştirebilmemiz için onu Firebase ML'ye dağıtmamız gerekiyor. Model, konsol aracılığıyla veya Firebase Admin SDK kullanılarak programlı olarak dağıtılabilir. Bu adımda konsol üzerinden dağıtım yapacağız.
İşleri basit tutmak için halihazırda uygulamamızda bulunan TensorFlow Lite modelini kullanacağız. Öncelikle Firebase Konsolunu açın ve sol gezinme panelinde Makine Öğrenimi'ne tıklayın. İlk kez açıyorsanız 'Başlayın'ı tıklayın. Daha sonra "Özel" seçeneğine gidin ve "Özel model ekle" düğmesine tıklayın.
İstendiğinde modele mnist_v1
gibi açıklayıcı bir ad verin ve dosyayı codelab proje dizininden start/app/src/main/assets/mnist.tflite
altına yükleyin. Daha sonra bu TF Lite model dosyasını Android projesinden silebilirsiniz.
9. Modeli Firebase ML'den indirin
TFLite modelleri nispeten büyüyebileceğinden, uzak modeli Firebase'den uygulamanıza ne zaman indireceğinizi seçmek zor olabilir. İdeal olarak, uygulama başlatıldığında modeli hemen yüklemekten kaçınmak istiyoruz, çünkü modelimiz yalnızca bir özellik için kullanılıyorsa ve kullanıcı bu özelliği asla kullanmıyorsa, sebepsiz yere önemli miktarda veri indirmiş olacağız. Ayrıca sadece wifiye bağlanıldığında modellerin getirilmesi gibi indirme seçeneklerini de ayarlayabiliriz. Modelin ağ bağlantısı olmadan da kullanılabilir olduğundan emin olmak istiyorsanız, onu uygulama olmadan da yedek olarak paketlemeniz önemlidir.
Basitlik adına, varsayılan paketli modeli kaldıracağız ve uygulama başlatıldığında her zaman Firebase'den bir model indireceğiz. Bu şekilde rakam tanımayı çalıştırırken çıkarımın Firebase'den sağlanan modelle çalıştığından emin olabilirsiniz.
app/build.gradle.kts dosyasına Firebase Machine Learning bağımlılığını ekleyin
app/build.gradle.kts
implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")
Ardından modeli Firebase'den indirmek için mantık ekleyin.
digitClassifier.initialize(loadModelFile())
downloadModel("mnist_v1")
ile değiştireceğiz ve bu yöntemi uygulayacağız.
MainActivity.kt
private fun downloadModel(modelName: String): Task<CustomModel> {
val conditions = CustomModelDownloadConditions.Builder()
.requireWifi()
.build()
return FirebaseModelDownloader.getInstance()
.getModel(modelName, DownloadType.LOCAL_MODEL, conditions)
.addOnCompleteListener {
val model = it.result
if (model == null) {
showToast("Failed to get model file.")
} else {
showToast("Downloaded remote model: $modelName")
digitClassifier.initialize(model)
}
}
.addOnFailureListener {
showToast("Model download failed for $modelName, please check your connection.")
}
}
Uygulamanızı yeniden çalıştırın ve rakam sınıflandırıcıya bir rakam çizin. İndirme işlemi bittiğinde uzak modelin indirildiğini belirten bir Toast mesajı ve yeni modelinizin kullanıldığını belirten bir günlük görmelisiniz.
10. Model doğruluğunu ölçmek için kullanıcı geri bildirimlerini ve dönüşümlerini izleyin
Firebase için Google Analytics, kullanıcıların uygulamanızda nasıl ilerlediğini, nerede başarılı olduklarını ve nerede takılıp geri döndüklerini anlamanız için bir yol sağlar. Ayrıca uygulamanızın en çok kullanılan kısımlarını anlamak için de kullanılabilir.
Model tahminlerine ilişkin kullanıcı geri bildirimlerini takip ederek modelin doğruluğunu ölçeceğiz. Kullanıcının "EVET"i tıklaması, tahminin doğru olduğunu gösterecektir.
Modelimizin doğruluğunu takip etmek için bir Analytics olayı kaydedebiliriz. Öncelikle Analytics'i projede kullanılmadan önce bağımlılığa eklemeliyiz:
Firebase Analytics bağımlılığı ekleyin
app/build.gradle.kts
implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")
Olayları Günlüğe Kaydet
Daha sonra onCreate
işlevinde onclick dinleyicisini, correct_inference
olayını Firebase'e kaydedecek şekilde ayarlayacağız.
MainActivity.kt (onCreate)
// Setup YES button
yesButton?.setOnClickListener {
Firebase.analytics.logEvent("correct_inference", null)
}
Uygulamayı tekrar çalıştırın ve bir rakam çizin. Çıkarımın doğru olduğuna dair geri bildirim göndermek için birkaç kez "Evet" düğmesine basın.
Hata ayıklama analizi
Genellikle uygulamanız tarafından günlüğe kaydedilen etkinlikler yaklaşık bir saatlik bir süre boyunca bir araya toplanır ve birlikte yüklenir. Bu yaklaşım, son kullanıcıların cihazlarının pilini korur ve ağ veri kullanımını azaltır. Ancak analiz uygulamanızı doğrulamak amacıyla (ve analizlerinizi DebugView raporunda görüntülemek için), etkinlikleri minimum gecikmeyle yüklemek üzere geliştirme cihazınızda Hata Ayıklama modunu etkinleştirebilirsiniz.
Bir Android cihazda Analytics Hata Ayıklama modunu etkinleştirmek için aşağıdaki komutları yürütün:
adb shell setprop debug.firebase.analytics.app org.tensorflow.lite.examples.digitclassifier
Uygulamayı tekrar çalıştırın ve bir rakam çizin. Çıkarımın doğru olduğuna dair geri bildirim göndermek için birkaç kez "Evet" düğmesine basın. Artık Firebase konsolundaki hata ayıklama görünümü aracılığıyla günlük etkinliklerini neredeyse gerçek zamanlı olarak görüntüleyebilirsiniz. Sol gezinme çubuğundan Analytics > DebugView'a tıklayın.
11. Modelin Performansını Analiz Edin
Firebase Performance Monitoring, iOS, Android ve web uygulamalarınızın performans özellikleri hakkında fikir edinmenize yardımcı olan bir hizmettir.
Uygulamanızdan performans verilerini toplamak için Performans İzleme SDK'sını kullanırsınız ve ardından bu verileri Firebase konsolunda inceleyip analiz edersiniz. Performans İzleme, uygulamanızın performansının nerede ve ne zaman iyileştirilebileceğini anlamanıza yardımcı olur, böylece bu bilgileri performans sorunlarını düzeltmek için kullanabilirsiniz.
Burada çıkarım ve indirme çevresine mükemmel izler ekliyoruz
Bu önemlidir çünkü derin öğrenmede kullanılan daha büyük modellerin daha doğru olma potansiyeli vardır, ancak yanıt vermeleri daha uzun sürebilir. Deneyimimizde doğruluk ve hız arasında doğru dengeyi bulmaya çalışıyoruz.
Firebase Performans bağımlılığı ekleyin
proje/build.gradle.kts
plugins {
// ...
// Add the dependency for the Performance Monitoring plugin
id("com.google.firebase.firebase-perf") version "1.4.2" apply false
}
app/build.gradle.kts
plugins {
// ...
// Add the Performance Monitoring plugin
id("com.google.firebase.firebase-perf")
}
// ...
dependencies {
// ...
// Add the dependency for the Performance Monitoring library
implementation("com.google.firebase:firebase-perf")
}
Özel İzler Ekle
setupDigitClassifier()
işlevinde yeni bir downloadTrace oluşturun ve modeli indirmeden hemen önce başlatın. Daha sonra izlemeyi durduran bir başarı dinleyicisi ekleyin.
classifyDrawing()
işlevinde yeni bir classifyTrace oluşturun ve onu sınıflandırmadan hemen önce başlatın. Daha sonra başarı dinleyicisinde izlemeyi durdurun.
MainActivity.kt
class MainActivity : AppCompatActivity() {
// ...
private val firebasePerformance = FirebasePerformance.getInstance()
// ...
private fun setupDigitClassifier() {
// Add these lines to create and start the trace
val downloadTrace = firebasePerformance.newTrace("download_model")
downloadTrace.start()
downloadModel("mnist_v1")
// Add these lines to stop the trace on success
.addOnSuccessListener {
downloadTrace.stop()
}
}
// ...
private fun classifyDrawing() {
val bitmap = drawView?.getBitmap()
if ((bitmap != null) && (digitClassifier.isInitialized)) {
// Add these lines to create and start the trace
val classifyTrace = firebasePerformance.newTrace("classify")
classifyTrace.start()
digitClassifier
.classifyAsync(bitmap)
.addOnSuccessListener { resultText ->
// Add this line to stop the trace on success
classifyTrace.stop()
predictedTextView?.text = resultText
}
.addOnFailureListener { e ->
predictedTextView?.text = getString(
R.string.tfe_dc_classification_error_message,
e.localizedMessage
)
Log.e(TAG, "Error classifying drawing.", e)
}
}
}
Performans etkinliklerine ilişkin günlük mesajlarını görüntüleyin
- Uygulamanızın
AndroidManifest.xml
dosyasına aşağıdaki gibi bir<meta-data>
öğesi ekleyerek Performans İzleme için hata ayıklama günlüğünü etkinleştirin:
AndroidManifest.xml
<application>
<meta-data
android:name="firebase_performance_logcat_enabled"
android:value="true" />
</application>
- Herhangi bir hata mesajı için günlük mesajlarınızı kontrol edin.
- Performance Monitoring, günlük mesajlarını
FirebasePerformance
ile etiketler. Logcat filtrelemeyi kullanarak, aşağıdaki komutu çalıştırarak özellikle süre izlemeyi ve HTTP/S ağ isteği günlüğünü görüntüleyebilirsiniz:
adb logcat -s FirebasePerformance
- Performans İzleme'nin performans olaylarını günlüğe kaydettiğini gösteren aşağıdaki günlük türlerini kontrol edin:
-
Logging TraceMetric
-
Logging NetworkRequestMetric
12. Firebase ML'ye ikinci bir model dağıtın
Modelinizin daha iyi bir model mimarisine sahip veya daha büyük veya güncellenmiş bir veri kümesi üzerinde eğitilmiş yeni bir sürümünü bulduğumuzda, mevcut modelimizi yeni sürümle değiştirme isteği duyabiliriz. Ancak testlerde iyi performans gösteren bir model, üretimde de aynı derecede iyi performans göstermeyebilir. Bu nedenle orijinal modelimiz ile yeni modeli karşılaştırmak için üretimde A/B testi yapalım.
Firebase Model Yönetimi API'sini etkinleştirin
Bu adımda Firebase Model Management API'nin Python kodunu kullanarak TensorFlow Lite modelimizin yeni bir sürümünü dağıtmasını sağlayacağız.
ML modellerinizi depolamak için bir paket oluşturun
Firebase Konsolunuzda Depolama'ya gidin ve Başlayın'ı tıklayın.
Kovanızın kurulumunu yapmak için diyaloğu takip edin.
Firebase ML API'yi etkinleştirin
Google Cloud Console'da Firebase ML API sayfasına gidin ve Etkinleştir'i tıklayın.
Sorulduğunda Rakam Sınıflandırıcı uygulamasını seçin.
Yeni bir model eğitin ve Firebase ML'de Yayınlayın
Şimdi daha büyük bir veri kümesi kullanarak modelin yeni bir sürümünü eğiteceğiz ve ardından bunu Firebase Admin SDK'yı kullanarak doğrudan eğitim not defterinden programlı olarak dağıtacağız.
Hizmet hesabının özel anahtarını indirin
Firebase Admin SDK'yı kullanabilmemiz için önce bir hizmet hesabı oluşturmamız gerekecek. Bu bağlantıya tıklayarak Firebase konsolunun Hizmet Hesapları panelini açın ve Firebase Admin SDK için yeni bir hizmet hesabı oluşturmak üzere düğmeye tıklayın. İstendiğinde Yeni Özel Anahtar Oluştur düğmesini tıklayın. Colab not defterindeki isteklerimizi doğrulamak için hizmet hesabı anahtarını kullanacağız.
Artık yeni modeli eğitebilir ve dağıtabiliriz.
- Bu ortak çalışma not defterini açın ve kendi Drive'ınızın altında bir kopyasını oluşturun.
- Solundaki oynat düğmesine tıklayarak ilk hücre olan "Geliştirilmiş bir TensorFlow Lite modelini eğitin" öğesini çalıştırın. Bu, yeni bir modeli eğitecektir ve biraz zaman alabilir.
- İkinci hücreyi çalıştırmak bir dosya yükleme istemi oluşturacaktır. Hizmet hesabınızı oluştururken Firebase Console'dan indirdiğiniz json dosyasını yükleyin.
- Son iki hücreyi çalıştırın.
Colab dizüstü bilgisayarını çalıştırdıktan sonra Firebase konsolunda ikinci bir model görmelisiniz. İkinci modelin mnist_v2
olarak adlandırıldığından emin olun.
13. Remote Config aracılığıyla bir model seçin
Artık iki ayrı modelimiz olduğuna göre çalışma zamanında hangi modelin indirileceğini seçmek için bir parametre ekleyeceğiz. İstemcinin alacağı parametrenin değeri, istemcinin hangi modeli indireceğini belirleyecektir.
Firebase konsoluna Yapılandırma Kuralları ekleyin
Öncelikle Firebase konsolunu açın ve sol gezinme menüsündeki Remote Config düğmesine tıklayın. Daha sonra "Parametre Ekle" butonuna tıklayın.
Yeni parametreye model_name
adını verin ve ona varsayılan olarak "mnist_v1"
değerini verin. Remote config parametresine modelin adını yazarak test etmek istediğimiz her model için yeni bir parametre eklemeden birden fazla modeli test edebiliriz. Güncelleştirmeleri uygulamak için Değişiklikleri Yayınla'yı tıklayın.
Firebase RemoteConfig bağımlılığı ekleyin
app/build.gradle.kts
implementation("com.google.firebase:firebase-config-ktx")
Firebase Uzaktan Yapılandırmasını Yapılandırma
MainActivity.kt
private fun configureRemoteConfig() {
remoteConfig = Firebase.remoteConfig
val configSettings = remoteConfigSettings {
minimumFetchIntervalInSeconds = 3600
}
remoteConfig.setConfigSettingsAsync(configSettings)
}
Yapılandırma İsteme ve Kullanma
Yapılandırma için bir getirme isteği oluşturun ve yapılandırma parametrelerini alıp kullanmak için bir tamamlama işleyicisi ekleyin.
MainActivity.kt
private fun setupDigitClassifier() {
configureRemoteConfig()
remoteConfig.fetchAndActivate()
.addOnCompleteListener { task ->
if (task.isSuccessful) {
val modelName = remoteConfig.getString("model_name")
val downloadTrace = firebasePerformance.newTrace("download_model")
downloadTrace.start()
downloadModel(modelName)
.addOnSuccessListener {
downloadTrace.stop()
}
} else {
showToast("Failed to fetch model name.")
}
}
}
Uzaktan Yapılandırmayı Test Et
- Tıkla Çalıştır düğmesi.
- Mnist_v1 modelinin indirildiğini belirten Toast mesajını gördüğünüzden emin olun.
- Firebase Konsolu'na geri dönün, varsayılan değeri mnist_v2 olarak değiştirin ve güncellemeleri uygulamak için Değişiklikleri Yayınla'yı seçin.
- Uygulamayı yeniden başlatın ve bu sefer mnist_v2 modelinin indirildiğini belirten Toast mesajını kontrol edin.
14. A/B Testi Modelinin Etkinliği
Firebase A/B Testi, ürün ve pazarlama denemelerini çalıştırmayı, analiz etmeyi ve ölçeklendirmeyi kolaylaştırarak uygulama deneyiminizi optimize etmenize yardımcı olur. Son olarak, iki modelimizden hangisinin daha iyi performans gösterdiğini görmek için Firebase'in yerleşik A/B Testi davranışını kullanabiliriz.
Firebase konsolunda Analytics -> Etkinlikler'e gidin. correct_inference
olayı gösteriliyorsa bunu bir "Dönüşüm olayı" olarak işaretleyin, görüntülenmiyorsa Analytics -> Dönüşüm Etkinlikleri'ne gidip "Yeni Dönüşüm Etkinliği Oluştur"u tıklayıp correct_inference.
Şimdi Firebase konsolunda "Remote Config"e gidin, yeni eklediğimiz "model_name" parametresindeki daha fazla seçenek menüsünden "A/B testi" düğmesini seçin.
Aşağıdaki menüde varsayılan adı kabul edin.
Açılır menüden uygulamanızı seçin ve hedefleme kriterlerini aktif kullanıcıların %50'si olarak değiştirin.
correct_inference
olayını daha önce bir dönüşüm olarak ayarlayabildiyseniz bu etkinliği izlenecek birincil metrik olarak kullanın. Aksi takdirde, etkinliğin Analytics'te görünmesini beklemek istemiyorsanız, correct_inference
manually
ekleyebilirsiniz.
Son olarak, Varyantlar ekranında, kontrol grubu varyantınızı mnist_v1
kullanacak şekilde ve Variant A grubunuzu mnist_v2
kullanacak şekilde ayarlayın.
Sağ alt köşedeki İncele düğmesini tıklayın.
Tebrikler, iki ayrı modeliniz için başarıyla bir A/B testi oluşturdunuz! A/B testi şu anda taslak halindedir ve herhangi bir zamanda "Denemeyi Başlat" düğmesine tıklanarak başlatılabilir.
A/B testine daha yakından bakmak için A/B Testi belgelerine göz atın.
15. Tebrikler!
Bu codelab'de, uygulamanızdaki statik olarak paketlenmiş bir tflite varlığını Firebase'in dinamik olarak yüklenmiş bir TFLite modeliyle nasıl değiştireceğinizi öğrendiniz. TFLite ve Firebase hakkında daha fazla bilgi edinmek için diğer TFLite örneklerine ve Firebase başlangıç kılavuzlarına göz atın.
Neleri ele aldık?
- TensorFlow Lite
- Firebase ML
- Firebase Analizi
- Firebase Performans İzleme
- Firebase Uzaktan Yapılandırması
- Firebase A/B Testi
Sonraki adımlar
- Firebase ML Dağıtımını uygulamanıza uygulayın.