Firebase ML Kit ile Android Text Recognition (Metin Tanıma)

Muhammed Burak Çakır
HardwareAndro
Published in
7 min readAug 17, 2020

Uzun bir aranın ardından tekrardan merhabalar.

Bu yazımda sizlere Firebase ML Kit ile bir görsel üzerinden Text Recognition (Metin Tanıma) işlemini nasıl gerçekleştireceğimizi aktaracağım. Benim Text Recognition ile ilk karşılaşmam Google Translate ile kitabımdaki metinleri algılatıp başka bir dile çevirtmek amacıyla olmuştu. Kısa sürede çok fazla çıktı verebilmesi sayesinde işinizi çok kolaylaştırıyor.

Text Recognition (Metin Tanıma) Nedir?

Metin tanıma, bir görüntü veya nesne üzerinde işlem yaparak içerdiği metinleri algılamayı hedefler. Bu nesne, günlük hayatta kullandığımız kredi kartı, kartvizit gibi nesneler olabilirken, bir toplu taşıma aracında gördüğünüz reklam veya hazırladığınız bir belge dahi olabilir.

Firebase ML(Machine Learning) Kit Nedir?

ML Kit, Google tarafından makine öğrenmesi yeteneklerinin mobil uygulamalarda güçlü ve uygulanması kolay bir paket yapısıyla kullanılabilmesini amaçlayan bir SDK’dir.

SDK’nin temel amacı, makine öğrenmesi alanında tecrübesiz olan programcıların dahi basit kod bloklarıyla beraber, bu alandaki fonksiyonları uygulamalarına entegre edebilmesidir.

Bizler de bu yazıda, kısa kod bloklarıyla beraber metin tanıma işlemimizi gerçekleştireceğiz.

On-device Text Recognition- Cloud-based Text Recognition

Firebase ML Kit, on-device(cihaz üzerinde) veya cloud-based(bulut tabanlı sistem üzerinde) olarak çalışabiliyor. Cloud sistemi üzerinde çalıştığınızda daha doğru sonuçlar almanız ve daha fazla dil (Çince, Arapça, …) ve karakter üzerinde doğru çıktı almanız mümkün.

Cihaz üzerinde kullanıldığında ise sadece Latin karakterleri algılayabiliyor fakat bir bulut sistemine ihtiyaç olmadığından daha hızlı çalışıyor. Biz projemizde on-device olarak kullanacağız.

Yazım boyunca Java ve Kotlin kodlarını beraber paylaşacağım.

Projemizi hazırlamaya başlayalım.

Öncelikle, ML Kit’i uygulamamızda kullanabilmemiz için Firebase Console üzerinden projemizi oluşturup “google-services.json” dosyamızı projemize eklemeliyiz. Eklemediğimiz taktirde alacağımız hata:

“File google-services.json is missing. The Google Services Plugin cannot function without it.”

Hep beraber projemize nasıl Firebase ekleyeceğimizi öğrenelim.

1- Öncelikle Firebase Console’a giriş yapalım.

2- Önümüzde açılan sayfada “Proje Ekle” alanına tıklayalım.

Firebase Yeni Proje Ekleme

3.1- Projemize, Firebase üzerinde görüntülenecek ismi verelim.

Proje Adlandırma

3.2- Bu adımda Firebase, projenizde Google Analytics’in faydalarını, özelliklerini belirtir ve Analytics’i etkinleştirmek isteyip istemediğinizi sorar. Kararınıza göre aşağıdaki Switch bileşenine tıklayıp devam edebilirsiniz.

Google Analytics Giriş

3.3- Eğer onay verirseniz, Google Analytics’i yapılandırmak için hesap seçimi yapmanızı ister. Seçeneklerde önceden yapılandırdığınız projeler de çıkabilir. “Default Account for Firebase” seçeneğini işaretleyip devam edebilirsiniz.

Google Analytics Yapılandırma

4- Projemiz oluştu. Firebase’i uygulamamıza ekleyebilmemiz için Console sayfamızda için bir platform seçmemiz gerekir. Android iconunu seçip devam edelim.

Firebase için Platform Seçimi

5.1- Projemizin package ismini belirtmeliyiz. Eğer bilmiyorsak,

Gradle Scripts → build.gradle (Module.app) → android → defaultConfig → applicationId

applicationId "packagename"

kod satırında veya Manifest üzerinden

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="packagename"
>

package isminizi öğrenebilirsiniz.

5.2.1- Bir sonraki adımda, Firebase tarafından oluşturulan “google-services.json” dosyasını projemize eklemeliyiz.

Ekleme işlemini gerçekleştirmek için, Android Studio üzerinden “Android” yerine “Project” görünümüne geçmeliyiz. Görselde nasıl yapılacağını görebilirsiniz.

5.2.2- Görünümü değiştirdikten sonra elimizdeki “google-services.json” dosyamızı, app modülü içine ekleyebiliriz. Görselde paket yapısını görebilirsiniz. Ekledikten sonra “Project” görünümünden “Android” görünümüne geçmeyi unutmayalım.

5.3- Burada belirtilen diğer kod bloklarını da projemize ekleyip gradle dosyamızı “Sync Now” ile senkronize etmeyi unutmayalım. Aksi taktirde kütüphaneye erişilemeyecektir.

Firebase Analytics dependency’i gradle dosyamıza eklemeyi unutmayalım.

implementation 'com.google.firebase:firebase-analytics:17.2.2'

Google Services Plugin, “google-services.json” dosyamızı kullanarak uygulamamızı Firebase ile yapılandırır.

5.4- Onayımızı aldık. Yüklemeyi başarıyla tamamladık.

5.5- (Opsiyonel) Projenizi on-device kullanıyorsanız, Play Store’a yüklediğinizde meta-data kod bloğunu Manifest dosyanızda Application’a eklemeniz faydanıza olacaktır. Bu sayede, uygulamanız indirilirken ML modeli de uygulamayla beraber indirilecektir. Aksi durumda, ML modeli uygulamada kullanma talebinden önce indirilmeyecektir. Burada beraber yüklenmesini sağlamak uygulama içinde ki yükünüzü hafifletecektir.

5.6- Google Analytics’in de başarılı yüklendiğini kontrol etmek için,

Ayarlar → Entegrasyonlar seçeneğine gelip kontrol edebilirsiniz.

6- Text Recognition koduna geçmeden önce, kamera ve galeri ile ilgili gerekli kod bloklarını sınıfımıza ekleyelim.

6.1- Kamera ile Fotoğraf Çekmek (Java):

Kamera ile Fotoğraf Çekmek (Kotlin):

6.2- Galeriden görsel seçmek (Java)

Galeriden görsel seçmek (Kotlin)

Galeri ve kamerayı beraber kullanacağız. Bu sebeple onActivityResult metodlarını beraber kullanalım.

onActivityResult (Java):

onActivityResult (Kotlin):

7- Text Recognition ile devam edelim.

7.1- Önce, projemizde ML Kit SDK’yi kullanabilmek için, Kit Dependency’i gradle dosyamıza ekleyelim.

implementation 'com.google.firebase:firebase-ml-vision:24.0.3'

7.2- Kod bloklarına geçmeden önce, SDK mantığını kavramaya çalışalım.

Öncelikle, seçtiğimiz görseli Bitmap’e çeviriyoruz.

Daha sonra FirebaseVisionImage nesnesini oluşturuyoruz ve constructor’a Bitmap nesnesini yolluyoruz.

Java :

FirebaseVisionImage firebaseVisionImage = FirebaseVisionImage.fromBitmap(((BitmapDrawable) imgRecognition.getDrawable()).getBitmap());

Kotlin :

val firebaseVisionImage = FirebaseVisionImage.fromBitmap((imgRecognition.getDrawable() as BitmapDrawable).bitmap)

FirebaseVisionImage bu şekilde görselin hem on-device modellerde, hemde cloud-based modellerde kullanılmasını sağlar.

FirebaseVisionTextRecognizer sınıfı ile görsel process metodu ile işlenerek metin algılama süreci gerçekleştirilir.

Kod işlemlerini gerçekleştirdikten sonra,

addOnSuccessListener()

metodu ile onSuccess() ve onFailure() ile algılama sonucu kontrol edilir. Başarı durumunda, FirebaseVisionText nesnesi ile algılanan metni elde ederiz. Bu noktadan sonra algılanan metni yönetmek ve ekrana bastırmak bizim kontrolümüzdedir.

Java:

Kotlin:

7.3- Success durumunda çalışacak processTextRecognitionResult() metoduna bakalım. Bu metod, FirebaseVisionText objesini parametre olarak alıyor.

İşleme tutulmuş görselden dönen sonuçları yönetmemizi sağlayan FirebaseVisionText sınıfı temelde iki metoda sahip.

  • getText() : Algılanan tüm metni geri döndürüyor.
  • getTextBlocks() : TextBlock türünden bir liste döndürüyor. Burada TextBlock, yine metin olarak algılanıyor. Fakat metnin tamamını veya bir kısmını paragraf veya grup şeklinde geri döndürüyor.

Görselde belli bir alanın üstünde çıktı almak veya çalışmak istiyorsak, TextBlock yapısını kullanmak daha doğru olacaktır.

TextBlock kendi içinde farklı metodlara sahip. Bu metodlar sayesinde belirlenen bloğun içinde algılanan metni alabiliyoruz veya tam tersi olarak istediğimiz metnin, görsel içinde nerede olduğunu bulabiliyoruz.

Biz genelde temel olarak elimizdeki görselden çıktı olarak metin almak isteriz. Bu sebeple kafa karıştırmamak adına bu konuya girmeyeceğim.

7.4- Öncelikle metin bloklarımızı alalım ve metnin algılanmadığı durumda kullanıcıyı bilgilendirelim.

Java:

Kotlin:

7.5- Eğer algılanan metnin boyutu 0'dan büyükse, metni alıp yönetme işlemlerine başlayalım.

Java:

Kotlin:

Böylelikle, TextBlock nesnesinden dönen metni döngü ile aldık ve ekrana bastırdık.

8- Hep beraber farklı denemeler yapalım.

Deneme yapacağımız temel görsel:

Sonuç:

Daha fazla metin içeren bir görsel ile deneyelim.

Sonuç :

Kamera ile görüntü almayı deneyelim.

Görüntü : https://quotefancy.com/quote/1732579/Aaron-Swartz-Information-is-power-But-like-all-power-there-are-those-who-want-to-keep-it

Son olarak bir kitap kapağını kamera ile deneyelim. Farklı bir duruma da şahit olacağız. Burada “Geleceği Değiştiren Dokuz Algoritma” kitabının kapak fotoğrafını kullanacağım. Kapağın arka planı 0 ve 1ler ile dolu. Tanıma işlemi etkilenecek mi ona da bakalım.

Burada iki sorunumuz var.

1- John kelimesi, h harfinin altında “0” olmasından dolayı b olarak algılanıyor. Bu karşılaşılabilen normal bir durum.

2- Sadece yazarın ismi gözüküyor. Bunun sebebi ise, burada Text Recognition metinleri satır satır alıyor. Bizim kodumuz:

detectedText = textBlock.text
txtDisplay.setText(detectedText)

Burada textBlock’u alıp TextView’e gönderiyoruz. Fakat satır satır gittiği durumda sadece son giden textBlock nesnesinin taşıdığı metin ekrana bastırılacaktır. Üst adımlarda kullandığımız 4 satırlık metin içeren görselde ise tüm metin tek parça olarak algılanmıştı. Bu sorunu çözmek adına,

detectedText = textBlock.text

detectedText’e, gelen her yeni textBlock’unu ekleyerek atayalım.

detectedText += textBlock.text

Böylelikle gelen metinleri birleştirebiliriz. Tekrar deneyelim.

Metnimiz biraz hatalı geldi fakat eksiklik kalmadı. Hatalarda görüntü kalitesinin düşmesinin etkisi olmasıyla beraber, birbirine benzeyen harflerde sapmaların çok kolay gerçekleşmesi söz konusu.

Aynı zamanda arkadaki 0 ve 1ler de çıktıyı etkiliyor.

Sonuç olarak galeri üzerinden görsel seçtiğimizde daha verimli sonuçlar alabiliyoruz. Fakat kamera devreye girdiğinde sıkıştırma ile oluşan görüntü kaybı, sonuçlardaki verimliliği azaltıyor.

Bu durumda daha iyi bir kamera kütüphanesi veya API kullanmak verimi arttırabilir. Aynı zamanda bulut tabanlı ML Kit modellerinde de alınan sonuçlar daha verimli olacaktır. Burada ihtiyacınıza göre farklı reaksiyonlar alabilirsiniz.

Bu yazımda, hep beraber Firebase ML Kit Text Recognition (Metin Tanıma) işlemini nasıl gerçekleştirebileceğimizi gördük.

Faydanılan kaynaklar

Text Recognition:

1- Firebase Documentation

2- Google CodeLab

3- Google Developers

Camera:

1- Google Developers

Proje Github linki:

https://github.com/mburakcakir/AndroidTextRecognition

Java ve Kotlin kodu beraber bulunmakta. Manifest üzerinden ufak bir Activity değişikliği ile Java veya Kotlin kodlarını kullanabilirsiniz.

Faydalı olması dileğiyle.

--

--