Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
MLKit ( Google Text Recognition ) üzerinde çalışan oldu mu ?
#1
Herkese kolay gelsin diyerek bir sorumu ileteyim.

- Android yakasında yapay zeka ile uygulamaları biraz da akıllandırma işlemlerine eğilmek için kolları sıvadım.

- "Text Recognition" işlemini google makine öğrenmesi apileri ile yapmayı deneyerek başlamaya karar verdim. 

- Bilgi sahibi olmayanlar için ML Kit, Google'ın cihaz üzerinde makine öğrenimi uzmanlığını Android ve iOS uygulamalarına taşıyan bir mobil SDK'dır.

- Biraz ilkel olacak ama elimdeki lisans Delphi 10.3 üzerine upgrade edilmiş Delphi 10.4.2 olunca son sürümlerin JAVA eklemleme nimetlerinden faydalanamıyorum. API için ihtiyaç duyulan JAR kütüphaneleri ve bu kütüphaneden faydalanacak helper sınıfları harici olarak classes.dex içine monte etmek ve ondan sonra üretilen yeni birleşik classes.dex'i Delphi'nin varsayılan dex dosyasını deployment içinden yerine koymak için üç gün mesai harcadım. ( Önce android stdudio ile başaramayınca javac, dx.bat ile elle manuel yapmak zorunda kaldım, benim beceriksizliğim )

- Şimdi soruma geleyim. 

- Bu işlemleri yaptım yapmasına ama; kukla işlemler ile sınıftan sahte cevaplar döndüren test / sandbox java dosyasından sonuç alabiliyorum.

package com.arman.firebaseocr;

import android.graphics.Bitmap;

public class MLKitHelper {
   public MLKitHelper() {
       // Boş constructor
   }

   public void recognizeText(Bitmap bitmap, MLKitCallback callback) {
       // Dummy response
       callback.onSuccess("Test başarılı - ML Kit olmadan çalışıyor!");
   }

   public void recognizeTextWithRotation(Bitmap bitmap, int rotation, MLKitCallback callback) {
       callback.onSuccess("Test (rotation: " + rotation + ") - Çalışıyor!");
   }

   public void close() {
       // Boş
   }
}


- Gerçek SDK için sınıf olarak aşağıdaki kodu uyguluyorum. Yapay Zeka başvurularım (Claude, ChatGPT, CoPilot) sonuç vermediler. Üçü de yeni sürüm Delphi'deki GRADLE kullanımını destekliyor, eski sürümler için çözüm üretemediler. Ben de ısrarla DEX yakasında daha önce NFC vb TCKimlik kartı okuma resim alma vs. işlemlerimi yaptmışken bunu neden yapamayayım diye bir meydan okuma olarak gördüm. PES edene kadar çalışmaya devam.

   public MLKitHelper() {
       try {
           Class<?> textRecognitionClass = Class.forName("com.google.mlkit.vision.text.TextRecognition");
           Class<?> optionsClass = Class.forName("com.google.mlkit.vision.text.TextRecognizerOptions");
           Class<?> builderClass = Class.forName("com.google.mlkit.vision.text.TextRecognizerOptions$Builder");

           Object builder = builderClass.getConstructor().newInstance();
           Object options = builder.getClass().getMethod("build").invoke(builder);

           recognizer = textRecognitionClass.getMethod("getClient", optionsClass).invoke(null, options);

           isMLKitAvailable = true;
           Log.d(TAG, "ML Kit initialized");

       } catch (Exception e) {
           Log.e(TAG, "ML Kit init failed: " + e.getMessage());
           isMLKitAvailable = false;
       }
   }


bu kodu içerisinden sonuç alamıyor henüz INIT aşamasında Invoke error: method not found hatasıyla karşı karşıya kalıyorum. 

Bilgi :

JAR kütüphanelerim aşağıda. Bunların içindeki .class dosyalarını klasör bazında extract edip kendiminkileri dahil ederek yeniden birleşik tek bir JAR dosyası ve ondan türetilen DEX dosyasını Delphi'ninki ile birleştirdim. Zaten yeni sürüm Delphi'lerin yaptığı da bu.

text-recognition-16.0.0.aar
play-services-mlkit-text-recognition-common-19.0.0.aar
vision-common-17.3.0.aar


JAVA tarafından manuel olarak eklediğim CLASS_LIST ve ürettiğim ortak kütüphane dexmerged-mlkit.jar bu mesaj ekindeki zip içerisinde

Sözün özü : Bu ML Kit erişimini herhangi bir delphi sürümünde yapan oldu mu daha önce ? INIT aşamasında bu Invoke error: method not found error kaynağı ne olabilir, eksik olan ne olabilir. 

İlave olarak eğer JAVA bilgisine güvenenlerden bu kütüphanede eksik olan ilave edilmesi gerek meta vb. şu eksik diyeceğiniz varsa onun ilave edilmiş halini paylaşırsanız sevinirim.


Ek Dosyalar
.zip   dexmerged-mlkit.zip (Dosya Boyutu: 554,01 KB / İndirme Sayısı: 6)
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#2
Winsoft 'un şu ürünü işini görebilir. Özel birşey yapmak istiyorsanız kaynaklarını inceleyebilirsiniz. Bu üründe MLKit kullanıyor. https://www.winsoft.sk/aocrml.htm

Kaynaklarını bulamazsanız özelden yardımcı olabilirim.
SRHT
Cevapla
#3
@ARM  Teşekkür ederim, özel bir şey yapmak değil istediğim... 

Üçüncü parti bileşen lisanslarıyla uğraşmadan dahili çözüm aradım. 

Daha önce Winsoft'un Tesseract bazlı olduğunu biliyordum, şimdi siz deyince baktım ki ML Kit'i de dahil etmiş portfoyüne. İşin içinden çıkamazsam aklımda olsun teşekkürler.
 

Adım adım ilerleyecek şekilde, başlangıçta iddialı olmayan TBitmap içerisindeki arkası temizlenmiş tek satır kodu (düz rakamlar) metne dönüştürmekle başlarım istedim.

Sonra ilerleyen süreçte kameradan gösterilen bir metni periyodik fotoğraf çekip arkasını temizleyip metne dönüştürme hızına bakarım diye düşündüm. Kamerada görüntü üzerine bölgeler çizerek vs. özelleştirerek performansı arttırma vb.

Google ML Kit dokümanlarında offline çalışabildiği yazıyor. Internet ihtiyacı olmadan yani. Böylece kapalı devre karakter font belli olan bazı yazılar ( örneğin TCKimlik kartı arka yüzeyindeki MRZ kodlarını okumak ) gibi daha önceki projelerime entegre ederim diye değerlendirdim.

İlk adım için tesseract üzerinden yürürken ML Kit ile tanışınca onunla başladım.

Üzerinde biraz daha çalışıp gelişmeler konusunda buradan bilgi veririm.

NOT : Şimdilik INI konusundaki sorunu aştım, modüle erişim için "TextRecognizerOptionsInterface" üzerinde çalışıyorum.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#4
https://github.com/Spelt/ZXing.Delphi projesi gibi tamamiyle native MLKit alternatifi bir çalışma olsa daha güzel olur.
ZXing'in delphi versiyonunu tamamiyle delphi ile çözmeleri güzel bir çalışma olmuş. Java'dan bağımsız. Wrapper, JNI yok. Hem IOS, Android, Win.. gibi ortamlarda da çalışır.

Bende MLKit'in "document scanner" tarafıyla biraz uğraştım( Üçüncü parti bir bileşen bulamadım.
Native olarak yapabilir miyim diye epeyce uğraştım ancak başka işlerlede uğraştığım için oldukça zaman alıcı bir konu(OpenCV vs.. kullanmadan).
Kısmen tamamlasamda tam olarak istediğim sonucu henüz elde edemedim.
Mobil tarafta görüntü işleme ile barkod okuma, döküman tarama, nesne tesbiti, el ve yüz tesbiti gibi konular oldukça gerekli.

Çalışmanızı takdir ediyorum @mrmarman hocam, umarım başarılı sonuçlar elde edersiniz.
SRHT
Cevapla
#5
Şu an MLKit ile yapmaya çalıştığım teknik ile TESSERACT ile çözüm ürettim. Rakamları OCR edip metne çeviriyor.

Burada maksat, her Android güncellemesinde yeni Delphi sürümü ihtiyacına gerek olmadan dahili çözümler üretmek.

Delphi'nin santandart CLASSES.DEX dosyasını alıp içine kendi kütüphanelerimizi ekleme işlemini standart bir işleme dönüştürmeyi başardım gibi.

DEX içine aşağıdaki sınıfları koyup yeniden paketledim.

added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/arman/(in = 0) (out= 0)(stored 0%)
adding: com/arman/ocr/(in = 0) (out= 0)(stored 0%)
adding: com/arman/ocr/BuildConfig.class(in = 591) (out= 403)(deflated 31%)
adding: com/arman/ocr/TessHelper.class(in = 3450) (out= 1768)(deflated 48%)
adding: com/googlecode/(in = 0) (out= 0)(stored 0%)
adding: com/googlecode/leptonica/(in = 0) (out= 0)(stored 0%)
adding: com/googlecode/leptonica/android/(in = 0) (out= 0)(stored 0%)
adding: com/googlecode/leptonica/android/AdaptiveMap.class(in = 2265) (out= 1147)(deflated 49%)
adding: com/googlecode/leptonica/android/Binarize.class(in = 2642) (out= 1337)(deflated 49%)
adding: com/googlecode/leptonica/android/Box.class(in = 3328) (out= 1794)(deflated 46%)
adding: com/googlecode/leptonica/android/Boxa.class(in = 2517) (out= 1411)(deflated 43%)
adding: com/googlecode/leptonica/android/Clip.class(in = 1083) (out= 573)(deflated 47%)
adding: com/googlecode/leptonica/android/Constants$SortBy.class(in = 406) (out= 248)(deflated 38%)
adding: com/googlecode/leptonica/android/Constants$SortOrder.class(in = 412) (out= 250)(deflated 39%)
adding: com/googlecode/leptonica/android/Constants$StorageFlag.class(in = 416) (out= 253)(deflated 39%)
adding: com/googlecode/leptonica/android/Constants.class(in = 1674) (out= 729)(deflated 56%)
adding: com/googlecode/leptonica/android/Convert.class(in = 1099) (out= 635)(deflated 42%)
adding: com/googlecode/leptonica/android/Edge$EdgeOrientationFlag.class(in = 417) (out= 250)(deflated 40%)
adding: com/googlecode/leptonica/android/Edge.class(in = 1548) (out= 891)(deflated 42%)
adding: com/googlecode/leptonica/android/Enhance.class(in = 1394) (out= 780)(deflated 44%)
adding: com/googlecode/leptonica/android/GrayQuant.class(in = 1406) (out= 829)(deflated 41%)
adding: com/googlecode/leptonica/android/JpegIO.class(in = 2228) (out= 1200)(deflated 46%)
adding: com/googlecode/leptonica/android/MorphApp$TophatType.class(in = 411) (out= 254)(deflated 38%)
adding: com/googlecode/leptonica/android/MorphApp.class(in = 2326) (out= 1137)(deflated 51%)
adding: com/googlecode/leptonica/android/Pix.class(in = 5654) (out= 2649)(deflated 53%)
adding: com/googlecode/leptonica/android/Pixa$1.class(in = 226) (out= 167)(deflated 26%)
adding: com/googlecode/leptonica/android/Pixa$PixIterator.class(in = 1560) (out= 727)(deflated 53%)
adding: com/googlecode/leptonica/android/Pixa.class(in = 7460) (out= 3220)(deflated 56%)
adding: com/googlecode/leptonica/android/ReadFile.class(in = 4232) (out= 2072)(deflated 51%)
adding: com/googlecode/leptonica/android/Rotate.class(in = 1974) (out= 1013)(deflated 48%)
adding: com/googlecode/leptonica/android/Scale$1.class(in = 860) (out= 496)(deflated 42%)
adding: com/googlecode/leptonica/android/Scale$ScaleType.class(in = 1242) (out= 602)(deflated 51%)
adding: com/googlecode/leptonica/android/Scale.class(in = 2603) (out= 1291)(deflated 50%)
adding: com/googlecode/leptonica/android/Skew.class(in = 1374) (out= 778)(deflated 43%)
adding: com/googlecode/leptonica/android/WriteFile.class(in = 2774) (out= 1414)(deflated 49%)
adding: com/googlecode/tesseract/(in = 0) (out= 0)(stored 0%)
adding: com/googlecode/tesseract/android/(in = 0) (out= 0)(stored 0%)
adding: com/googlecode/tesseract/android/BuildConfig.class(in = 618) (out= 396)(deflated 35%)
adding: com/googlecode/tesseract/android/PageIterator.class(in = 1234) (out= 690)(deflated 44%)
adding: com/googlecode/tesseract/android/ResultIterator.class(in = 3202) (out= 1534)(deflated 52%)
adding: com/googlecode/tesseract/android/TessBaseAPI$OcrEngineMode.class(in = 426) (out= 256)(deflated 39%)
adding: com/googlecode/tesseract/android/TessBaseAPI$PageIteratorLevel$Level.class(in = 524) (out= 278)(deflated 46%)
adding: com/googlecode/tesseract/android/TessBaseAPI$PageIteratorLevel.class(in = 738) (out= 398)(deflated 46%)
adding: com/googlecode/tesseract/android/TessBaseAPI$PageSegMode$Mode.class(in = 504) (out= 273)(deflated 45%)
adding: com/googlecode/tesseract/android/TessBaseAPI$PageSegMode.class(in = 1091) (out= 520)(deflated 52%)
adding: com/googlecode/tesseract/android/TessBaseAPI$ProgressNotifier.class(in = 437) (out= 215)(deflated 50%)
adding: com/googlecode/tesseract/android/TessBaseAPI$ProgressValues.class(in = 1088) (out= 522)(deflated 52%)
adding: com/googlecode/tesseract/android/TessBaseAPI.class(in = 12385) (out= 5100)(deflated 58%)
adding: com/googlecode/tesseract/android/TessPdfRenderer.class(in = 1263) (out= 680)(deflated 46%)


Sonunda bu mesaj ekindeki ZIP paketinde görebileceğiniz, Delphi 10.4.2 sürüme uygun yeni bir classes.dex dosyası oluşturdum.
Deployment kısmında Delphi'nin varsayılan olarak koyduğu \classes remote path konumuna  koyulan kendi classes.dex dosyasını unchecked yapıp bu kendiminkini ekledim.
İlave olarak ihtiyaç duyulan  aşağıdaki dosyaları da 64Bit library konumuna ilave ettim.

libjpgt.so
liblept.so
libpngt.so
libtess.so

bir de olmazsa olmazı TRAINED_DATA olarak eng.traineddata dosyasını da ilave edince mutlu son.

Çalıştı ve bitmap içindeki metni okudu.

Ben ama ML Kit için biraz daha çalışıcam. Çünkü sadece metin okuma değil, face detection, barcode vb. bir sürü yönü var bunun. 

MLKit için dahili olan .JAR kütüphanesinde gerekli olan önemli bir sınıf olan TextRecognizerOptions yer almadığını bir sürü alternatif kütüphane yaz boz yaparak acı içinde öğrenmiş oldum, koymamışlar. Sadece online olan kısımda var.

INIT aşamasında takılmasının nedeni de buymuş.

denediğim alternatifler ve hangi API kütüphanelerini denediklerim aşağıda
   public MLKitHelper() {
       try {
           Log.v(TAG, "MLKitHelper() giris...");

        // recognizer = TextRecognition.getClient(new TextRecognizerOptions.Builder().build());
        // When using Latin script library
         //recognizer = TextRecognition.getClient();
         //recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS);
           recognizer = TextRecognition.getClient(new TextRecognizerOptions.Builder().build());

           isMLKitAvailable = true;

           Log.d(TAG, "ML Kit basariyla baslatildi");
       } catch (Exception e) {
           Log.e(TAG, "ML Kit baslatilamadi: " + e.getMessage());
           isMLKitAvailable = false;
       }
   }


Denediğim kütüphaneler
dependencies {
   // ML Kit Text Recognition
 //implementation 'com.google.mlkit:text-recognition:16.0.1'
 //implementation 'com.google.mlkit:text-recognition-latin:16.0.0-beta6'
 //implementation 'com.google.mlkit:text-recognition:16.0.0-beta3'
 //implementation 'com.google.mlkit:text-recognition-latin:16.0.0'
   implementation 'com.google.mlkit:text-recognition:16.0.1'
 //implementation 'com.google.mlkit:text-recognition:16.0.1'

   // Gerekli Google Tasks destegi
   implementation 'com.google.android.gms:play-services-tasks:18.0.2'

   // Material Theme
   implementation 'com.google.android.material:material:1.11.0'

   // Unit Test
   testImplementation 'junit:junit:4.13.2'

   implementation 'androidx.annotation:annotation:1.7.0'
   annotationProcessor 'androidx.annotation:annotation:1.7.0'

}



Herkese başarılar.
2025-11-14-15-33-31.gif


Ek Dosyalar
.zip   export.zip (Dosya Boyutu: 2,14 MB / İndirme Sayısı: 7)
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#6
@mrmarman Abi mesajındaki gibi temiz/temizlenmiş ve sadece numeric değerlerle çalışacaksan tesseract elbette bir çözüm ama işin içine harfler girecekse hele hele captcha mantığında değişik açı, font vs de varsa tesseract a asla güvenme. Zamanında, seninde büyük yardımlarınla captcha çözümü ile uğraşmıştım, benim tecrübe ettiğim en kesin çözüm KNN Algoritması olmuştu.

Ama senin tabirinle esas işçilik, karakterleri parçalara ayırabilmek, birbirine yapışık veya kuyrukla birleştirilmiş karakterleri opencv kullanmadan parçalamak kendi adıma imkansızdı, o tarafı da native hallederim diyorsan, KNN ile %100 bağımsız bir yapı kurarsın.
Cevapla
#7
@Hayati

Tespitlerin çok doğru. Üzerine eğileceğim konu, belge fotoğrafından metin, sonra plaka okuma vb devam edecek. TC Kimlik kartı ve Pasaport MRZ karakterlerinden kütüphanemi oluşturup elle okuma yapıyorum ancak son kullanıcı ben olsaydım kolaydı.  

Kameradan eğri fotoğraflarda başarılı olamadım. Fotoğraf exif metadatasından kamera yönünü alsan da kartı ters tutup çektiğinde referans kayboluyor. Bu konuda yardıma bu üçüncü parti ücretsiz yapılar yetişsin istedim.

Platform Windows tabanlı olunca proje üretmek görece pratik ve kolay geliyor. Mobil taraf için delphi + java karışık bir çözüm gerekince işler zorlamaya başladı. 

Şimdiki iş Google Vision Demo projesini github'dan çalıştırıp sunucularından downlod edilecek train doayalarını kayıt altına alarak ve bunları kapalı devre proje kaynağına gömmek.

Market işi olmayacak ki olursa da ilk çalışmada inecek hali manifest içindeki dependency meselesi olduğunu biliyorum.

Değerli önerin için ayrıca teşekkür ederim. Aklımda tutarım.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#8
Mobil tarafa çok yabancıyım, cihazın kamera uygulaması manipüle edilemez diye düşünüyorum (ediliyorsa daha kolay), kendi "canvas" ında kamera açabiliyorsan, arayüze; foroğrafı, ID alanını kabaca işaretleyen/çerçeveleyen ve kullanıcının resim çekerken, çekeceği nesneyi yada kamera açısını oluşturduğun şablona uygun konuma getirmesini kısmen şart koşman kullanıcı deneyimini çok mu olumsuz etkiler?
Cevapla
#9
@Hayati  

Geçmişe göre görece işler oldukça kolaylaşmış. 
Bu yaşla birlikte kişisel tecrübe birikimi de olabilir, Google yakasında uyum sorunlarının aşılması da olabilir, yapay zeka robotlarının verimi arttırması da...

Dün MLKit Vision Demo çalıştırdım. Çok etkilendim. bkz. bu GitHub linki 

Bu demoyu indirip herkesin mutlaka denemesini tavsiye ederim. Emin olun bir sürü proje üretecek fikir içeriyor.
Android Studio ile build ederek direkt telefonda kurup çalıştırabiliyoruz. 

Hem Kotlin hem de Java sürümlerini uygulamanın açılış ekranında açılışında seçmeli yapmışlar. 

HIZI : 640x360 çözünürlükte 
[30] kare/saniye hızında  Nesne, yüz vs. vs.
[ 6]  kare/saniye hızında  TEXT RECOGNITION LATIN 

Neler yok ki : 

* Selfi kamerasından kişiyi arka plandan ayırma, 
* tam boy insan duruş pozisyonu üzerine çöp adam çizimi,
* yüz tanıma, 
* barcode, qrcode zaten geçtim ekrandaki metinleri farklı bloklar halinde kutular halinde ışık hızında hızla tanıma
* Nesne algılama ( ev eşyası, giyim eşyası vb diyor )
* Resimden içerisinde neler var liste çıkartma (image labeling)  ( oda, koltuk, duvar, perde, sandalye, televizyon .. bunlar salonda kamera yönünde bildirdikleri )

Şöyle ki sorduğun soruya istinaden kamera kısmını da JAVA tarafında açtırıp, OCR ettirip -ki kamera yönü, açısı, ışık miktarı abartı az değilse etkilenmeden-  TEXT akışı almaya başladığımızda, yine JAVA yakasında her gelen metni örneğin plaka formatında ve/veya MRZ tiplerinden öngördüğün bir formata sonuç alınırsa sonucu Delphi yakasına gönder diyecek CALLBACK fonksiyonlarını yazmak Delphi'dekiyle benzer yapıda olduğundan kolay geldi.

Şimdi onun üzerinde çalışıyorum.
Özetle çok eforlu işleri Delphi'de değil JAVA yakasına yollayıp, sonucu delphi yakasına uygulamada kullanıyorsun şeklinde bir akış planlıyorum.

Soracaklar olur, neden tüm projeni JAVA yakasında üretmiyorsun ? Bu konuda haklı bir soru; yoğurt yeme şekli diyelim, bir geçiş dönemi, alışkanlık / aşinalık diyelim. 

Delphi VCL uygulamalarıyla Delphi FMX MultiDevice uygulamaları konuşturup mevcut projelerde kullanmak için çevirmen olarak Delphi FMX Android ile çalışmak bana daha verimli geldi. O da şimdilik. Belki zamanla buna da lüzum kalmayacaktır, zaman gösterecek.

Telefondan çalıştırdığım dediğim bahsi geçen JAVA DEMO



Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#10
@mrmarman Abi sen ne yaptın! Sen olayı bambaşka boyuta taşımışsın. resmen "canım çekti" Smile
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  google play ve apple storede ücretli uygulama yayınlamak barissagir 4 608 15-09-2025, Saat: 15:03
Son Yorum: barissagir
  Çalışan kodlar iOS'a derlerken hata veriyor kajmerantime 8 1.290 10-09-2024, Saat: 09:11
Son Yorum: RAD Coder
  Google play console Android Api hatası lazanya 3 1.152 01-07-2024, Saat: 19:57
Son Yorum: lazanya
  Google play Uygulama yükleme hatası [Çözüldü] codder71 3 1.235 23-02-2024, Saat: 22:42
Son Yorum: codder71
  Türkçe Text To Speech yasaroguz332 2 963 15-12-2023, Saat: 16:30
Son Yorum: yasaroguz332



Konuyu Okuyanlar: 1 Ziyaretçi