Huawei ML Kit — Kotlin — Text Recognition (OnDevice, OnCloud, Camera Stream)

Murat Yaman
Huawei Developers - Türkiye
7 min readNov 3, 2020
img take photo recognize on Cloud function
img take photo recognize on Cloud function

Selamlar, bu yazımızda HMS ML Kit Altında bulunan Text Recognition yani Metin Tanıma yı inceleyelim.

Öncelikle “Text Recognition Ne Yapar” sorusu ile yola çıkalım ve ardından Text Recognition özelliklerini, destekledigi görüntü formatlarını, destekledigi diller hakkında bilgi aldıktan sonra Test projesi üzerinden detaylı inceleyelim.

Text Recognition Ne Yapar: Kart, makbuz, kağıt belge, etiket vb. Görüntülerden metin çıkarır ve bu metinler üzerinde işlemler yapmamıza olanak sağlar.

Text Recognition Özellikleri: 2 farklı yöntem ile Text Recognition yapılabilir. Text Recognition da kullanılan fonksiyon ile birlikte desteklediği diller degişiklik göstermektedir.

1. Cihaz üzerinden Text Recognition

internet erişimi olmadan kamera veya galeriden alınan görüntü üzerindeki Text Recognition işlemi yapar.

Desteklediği diller: Basitleştirilmiş Çince, Japonca, Korece ve Latin tabanlı diller

2. OnCloud(Bulut) üzerinden Text Recognition

Kamera veya galeriden alınan görüntü internet baglantısı ile buluta gönderip metin çıkarma işlemi sonucunda sonucu string tipinde geri gönderir. burada güvenlik sorusu akıllarda kalabilir kullanıcı acaba çektigim görüntünün kopyasını huawei saklıyor mu diye sorabilir. Huawei işlem yaptıktan sonra görüntüyü sildigini açıklıyor.

Desteklediği Diller: Basitleştirilmiş Çince, İngilizce, İspanyolca, Portekizce, İtalyanca, Almanca, Fransızca, Rusça, Japonca, Korece, Lehçe, Fince, Norveççe, İsveççe, Danca, Türkçe, Tayca, Arapça, Hintçe ve Endonezce dillerini destekler.

Bulut üzerinden çalışan Text Recognition hizmeti, cihaz üzerinde çalışan Text Recognition hizmetinden daha yüksek doğrulukta sonuçlar verir. Ancak, Uygulamalar bulut üzerindeki Text Recognition yı kullanarak kamera akışlarından Text Recognition işlemini gerçekleştiremezken, Cihaz üzerindeki Text Recognition sayesinde galerinizdeki statik fotoğraflardan veya kamera akışlarından metin tanıyabilir. Tüm bunlara ek olarak bulut API senkron olarak çalışmaz

Desteklenen görüntü formatları

Metin tanım işlemi için görüntülerin PNG, JPG, JPEG ve BMP biçimlerinde olmalıdır. Not: GIF resimleri desteklenmez.

Şimdiiii gayet zevkli ve güzel olan konuya gelelim. KODLAMAYA yukarıda bahsettigimiz kavramları kodlarken daha iyi anlayabilecegiz. Yapacagımız örnekte Galeriden alınan görüntü üzerinde Text Recognition yapma, Kamera ile çekilen görüntü ile Text Recognition yapma ve Kamera Akışısında Text Recognition konularını yapacagız beraber.

Haydi Başlayalımmm 😃

Gelişme süreci API geliştirmeden önce, gerekli geliştirme hazırlıklarını yapmanız, projenizde HMS Core SDK’nın Maven depo adresinin yapılandırıldığından ve bu hizmetin SDK’sının entegre edildiğinden emin olmanız gerekir.

-> Developer console üzerinden hesabınıza giriş yatıktan sonra (https://developer.huawei.com/consumer/en/console) AppGallery Connect sayfasını açın.

-> Buradan My Projects ‘i seçip Add Project Butonu ile proje oluşturun

Açılan ekranda

  1. Add App Butonu ile proje içerisinde uygulama oluşturun ve Android studio tarafında oluşturdugunuz uygulamanın bilgilerini girin.

2. Numarada ile belirtilen “Set” butonu ile Veri Depolama konumunu yapılandırın.

3. Numara ile belirtilen MANAGE APIs tabın da ML servisini etkinleştirin.

Uygulamayı oluşturduktan sonra agconnect-services. json dosyasını tıklayarak indirip Android studio da oluşturduğunuz projenin app dizinin altına kopyalayın.

Root dizinde bulunan build.gradle dosyasını açın ve allprojects -> repositories kısmına giderek HMS SDK için gerekli ayarlamaları yapınız.

3. App dizininde build.gradle dosyanıza ilgili bağımlılıkları ekleyelim.

Not: plugin komut satırını eklemeyi unutmayın.

Şimdi Ml Kit Servisini etkinleştirelim. My projects -> Build -> ML Kit sekmesi ile açılan ekranda sağ üstte bulunan enable now butonu ile aktif hale getirelim.

Uygulamamızın SHA-256 almak için android stüdio üzerinde sag palette bulunan gradle sekmesini açarak. app -> Tasks -> android -> signingReport adımından elde edilebilir. burada elde edilen SHA-256

Developer Consol -> My Projects -> Select your app -> General information tabında SHA-256 certificate fingerprint: alanına ekleyip sag tarafında bulunan tik i işaretlemeyi unutmayalım.

ML Kit Modelini Otomatik Olarak Güncellemek için AnroidManifest.xml dosyasına aşagıdaki ifadeleri ekleyelim.

ve son olarak Değiştirilen build.gradle dosyasını yeniden açın. Sync Now ‘ a tıklayın ve senkronizasyon tamamlanana kadar bekleyin.

Not: Default olarak HMS Core SDK tarafından saglanan tüm dilleri destekler. Eger uygulama içinde belirli dillere destek vermek istiyorsanız sadece onları belirtebilirsiniz.

Android> defaultConfig’e gidin, resConfig ekleyin ve desteklenen dilleri aşağıdaki gibi yapılandırın

Manifest dosyasında gerekli İzinleri Atama

Text Recognition OnDevice fonksiyonu için CAMERA ve WRİTE_EXTERNAL_STORAGE izinleri

Text Recognition OnCloud fonksiyonu için ise Text Recognition OnDevice fonksiyonu izinlerine ek olarak INTERNET iznine ihtiyaç duyar.

Uygulama için gerekli hazırlıkları tanımladık şimdi projemize başlayalım. Projemizin ekran görüntüsü aşagıdaki gibi olacak.

Projemizin ekran tasasrımı için activiy_main.xml dosyamıza aşagıdaki kodları ekleyelim.

Ekran tasarımında görüldüğü gibi projede 3 işlem uygulanıyor.

  1. Galeriden alınan resim üzerinde Text Recognition — OnDevice Fonksiyonunu üzerinden işlem yapıldı.
  2. Kameradan çekilen fotograf üzerinden Text Recognition — OnCloud Fonksiyonunu üzerinden işlem yapıldı.
  3. Kamera Akışında belirlenen görüntü üzerinden Text Recognition

Yukarıda verilen kod sınıfında Kamera ve Dosya okuma yazma izinleri için requestCameraPermission() — (87,103) metodu çagrılarak CAMERA, WRİTE_EXTERNAL_STORA ve READ_EXTERNAL_STORAGE izinleri için istekte bulunulutor. ilgili izinlerin verilip verilmediği bilgisi onRequestPermissionresult() — (105 ,118) metodunda elde ediyoruz.

ilgili izin kontolleri saglandıktan sonra şimdi yukarıda tanımladıgımız 3 işlem için devam edebiliriz.

1. Galeriden alınan resim üzerinde Text Recognition — OnDevice

imgGetFromGalleryCard - (63,67) id li butonuna tıklanarak getImage() -(81–85) metodu çagrılır ve burada bir intent oluşturarak cihaz üzerindeki galerinin açılması sağlanır.

bu adımda kullanıcının galeriden herhangi bir fotografı seçmesi durumunda onActivityResult()- (121,138) metodunda gönderdigimiz GET_IMAGE_REQUEST_CODE ile seçilen imagi karşılıyoruz. (126,135) aldıgımız image i bitmap formatında performTextRecognitionOnDevice metoduna parametre olarak gonderelim. performTextRecognitionOnDevice Metodunda alınan bitmap i RecognitionUtil sınıfımızın asyncAnalyzeTextLocal metoduna parametre olarak gönderip Cihaz üzerinde TextRecognition işlemini sağlıyoruz.

2. Kameradan çekilen fotograf üzerinden Text Recognition — OnCloud

imgTakeFromCameraCard() -(53–57) id li Cardview componentine tıklanarak kamera ekranına geçiş için dispatchTakePictureIntent()-(178,197) metodu üzerinden intent oluşturulur ve çekim sonrası sonuç için onActivityResult metodu üzerinden gonderdiğimi REQUEST_TAKE_PHOTO request kodu ile karşılayabiliriz. burada setPic() metodu üzerinden ilgili özellikleri belirleyip bitmap a donüştürüp Recognition işlemi için performTextRecognitionOnCloud() metoduna fotografımızı bitmap parametre ile birlikte gönderiyoruz.

performTextRecognitionOnCloud() -(143,145) metodunda aldığımız bitmap üzerinden Cloud üzerinden recognition işlemi yapmak üzere RecognitionUtil Sınıfından asyncAnalyzeTextCloud metoduna gönderelim.

3. Kamera Akışı üzerinden Text Recognition

cameraStreamCard id li CardView in tıklanması ile cametaStream() metoduna gidelim.

cameraStream() (152,166)

Bir analizör oluşturun. — 153

Tanıma sonuçlarını işlemek için OcrDetectorProcessor sınıfını oluşturun. Bu sınıf, MLAnalyzer.MLTransactor <T> API’sini uygular ve tanıma sonuçlarını elde etmek ve belirli hizmetleri uygulamak için bu sınıftaki transactResult yöntemini kullanır. —(260,285)

Algılama sonucu işlemcisini, analiz cihazını sonuç işlemcisine bağlamak için ayarlayın. — 154

Bir nesne oluşturmak, analizörü kaydetmek ve kamera parametrelerini başlatmak için SDK’nın dahili LensEngine’ini kullanmak için senkronize API’yi çağırın. — 155

Kamerayı başlatmak, kamera akışlarını okumak ve tanıma gerçekleştirmek için SurfaceView çağırın. — (160,165)

artık kamera akışını görebiliyor durumdasınız. Kamera akışından recognize edilen metin OcrDetectorProcessor sınıfında bulunan transactResult metoduna metoduna düşer ve burada recognize edilen metni alıp işleyebilirsiniz.

img recognize text camera stream

OnDevice ve OnCloud Fonksiyonlarını kullandıgımız RecognitionUtil sınıfımızı inceleyelim.

onDeviceTextRecognition

yapmak için RecognitionUtil sınıfımızda asyncAnalyzeTextLocal() — (24,36) metodunu inceleyelim.

asyncAnalyzeTextLocal Cihaz üzerindeki Metin tanıma işlemi için cihaz üzerindeki parametreleri belirlemek için MLLocalTextSetting.Factory() nesnesi üzerinden .setLanguage(“en”) ile Tanınabilecek dilleri belirtebilirsiniz. — (29,33)

Cihaz üzerinden metin tanıma işlemi yapılacagı için MLAnalyzerFactory.getInstance().getLocalTextAnalyzer(settingLocal) nesnesini oluşturalım ve oluşturdugumuz setting parametrelerini getLocalTextAnalyzer a parametre olarak ekleyelim. — (34)

ve sonuç olarak Analiz işlemi için asyncAnalyseFrame() metoduna aldıgımız bitmap i gönderelim. — (35)

onCloudTextRecognition

yapmak için RecognitionUtil sınıfımızda asyncAnalyzeTextCloud() — (38,64) metodunu inceleyelim.

Bulut üzerinden recognition yaparken spesifik diller belirlemek için langualis dizisini oluşturalım. — (43,45)

asyncAnalyzeTextCloud oncloud üzerindeki Metin tanıma işlemi için parametreleri belirlemek için MLRemoteTextSetting.Factory() nesnesi üzerinden

tanınan metnin yogunlugunu belirlemek için DensityScene fonksiyonu uzerinde yogunluk parametrelerimizi ekleyebiliriz. — (51)

.setTextDensityScene(MLRemoteTextSetting.OCR_COMPACT_SCENE)

MLRemoteTextSetting.OCR_COMPACT_SCENE: yoğun metin tanıma MLRemoteTextSetting.OCR_LOOSE_SCENE: seyrek metin tanıma

spesifik dilleri eklemek için .setLanguageList(languageList) metoduna belirledigmiz dilleri ekleyeyelim. — (52)

Döndürülen metin kenarlık kutusunun biçimini ayarlayın .setBorderType(MLRemoteTextSetting.ARC) — (53)

MLRemoteTextSetting.NGON: Dörtgenin dört köşesinin koordinatlarını döndür.

MLRemoteTextSetting.ARC: Bir yaydaki çokgen kenarlığın köşelerini döndürür. 72 köşeye kadar koordinatlar döndürülebilir.

Bir analizör oluşturup. MLRemoteTextSetting kullanmaktır. tanımladıgımız setting remote nesnesini parametre olarak verelim. — (61)

mTextAnalyzer = MLAnalyzerFactory.getInstance().getRemoteTextAnalyzer(settingRemote)

son olarak asyncAnalyseFrame() metodumuza bitmap i mizi gönderelim.

asyncAnalyseFrame

RecognitionUtil sınıfımızda asyncAnalyzeTextLocal(), asyncAnalyzeTextCloud() metodlarında belirlenen recognition tipi belirlenip ve özellikleri atadıktan sonra analiz edecegimiz metodumuzdur.

Bitmap formatındaki görüntü verileri olan bitmap’i kullanarak bir MLFrame nesnesi oluşturun. — (71)

Metin tanıma için globalde oluşturdugumuz mTextAnalyzer( onDevice, OnCloud ) ile asyncAnalyseFrame metoduna oluşturdugumuz frame nesnesini parametre olarak verelim ve Task<MLText> tipinde bir nesne oluşturalım.— (73)

oluşturdugumuz task nesnesi ile succes ve failure durumlarını dinleyelim. sonucun başarılı olma durumunu addOnSuccessListener içerisinde dinlenir ve sonuç MLText formatında döner. — (74,77)

sonucun hata alması durumunda addOnFailureListener içerisinde dinlenip hata mesajını görebiliriz. — (78,80)

Github codelab kaynağı için:

Daha fazla ayrıntı için lütfen bağlantıları kontrol edin:

--

--