Tesseract ve OpenCV Kullanarak Derin Öğrenme Tabanlı Metin Tanıma

Bu yazıda, Tesseract ve OpenCV kütüphanelerini kullanarak resimlerdeki metnin nasıl tanınacağını öğreneceğiz. Görüntülerden metin çıkarma yöntemi, Optik Karakter Tanıma (OKT) veya bazen de sadece metin tanıma olarak adlandırılır.

Tesseract, birçok görüntü biçimini ve kademeli olarak çok sayıda dili desteklemeye başladığı 3.x sürümüyle olgunluk kazanmıştır. Tesseract 3.x, geleneksel bilgisayarlı görü algoritmalarına dayanmaktadır. Geçtiğimiz birkaç yıl içinde, derin öğrenme temelli yöntemler, geleneksel makine öğrenmesi tekniklerini, bilgisayarlı görünün birçok alanında doğruluk açısından büyük bir farkla aşmıştır. El yazısı tanıma, öne çıkan örneklerden biridir. Bunun sonucunda, Tesseract'ın de bir derin öğrenme temelli tanıma altyapısına kavuşması sadece bir zamanlama meselesiydi.

Tesseract, dördüncü sürümünde bir çeşit Tekrarlayan Nöral Ağ (RNN) olan Uzun Kısa Süreli Bellek (LSTM) tabanlı tanıma motoru gerçeklemiştir. Tek bir karakter içeren resimleri tanımak için genel olarak Konvolüsyonel Sinir Ağları (CNN) kullanılır. Rastgele uzunlukta metinse bir karakter dizisidir ve bu tür problemler RNN'ler kullanılarak çözülür. LSTM de popüler bir RNN biçimidir.

Tesseract'ın dördüncü sürümünde eski OKT motoru da bulunur, ancak LSTM motoru öntanımlı olandır ve biz de bu yazıda sadece bu yeni motoru kullanacağız.

Tesseract kütüphanesi tesseract adlı kullanışlı bir komut satırı aracıyla birlikte gelir. Bu aracı görüntülerde OKT yapmak ve çıktıyı bir metin dosyasına kaydetmek için kullanabiliriz. Tesseract'ı C++ veya Python kodumuza entegre etmek istiyorsak da Tesseract'ın uygulama programlama arayüzünü kullanırız.

Tesseract Temel Kullanımı

Tesseract'ı çok temel şekilde aşağıdakileri belirterek kullanabiliriz:

Girdi Dosya Adı

Aşağıdaki örnekler için tisikkirlir.jpg dosyasını kullanacağız.

OKT Dili

Örneklerimizdeki dil Türkçe'dir (tur). Komut satırında dil -l seçeneği kullanılarak belirtilir.

OKT Motor Kipi (oem)

Tesseract 4, iki OKT motoruna sahiptir: eski Tesseract motoru ve LSTM temelli yeni motor. --oem seçeneğiyle dört çalışma kipinden biri seçilebilir:
  • 0 Yalnızca eski motor.
  • 1 Yalnızca LSTM temelli motor.
  • 2 Eski + LSTM motor.
  • 3 Öntanımlı (hangilerinin mevcut olduğuna göre).

Sayfa Bölümleme Kipi (psm)

Metnin yapısı hakkında ek bilgi olduğunda, sayfa bölümleme kipi çok yararlı olabilir. Buradaki örneklerde psm = 3'e (yani PSM_AUTO) bağlı kalacağız.

PSM belirtilmemişse, komut satırı ve Python sürümlerinde öntanımlı değer 3'tür, C++'taysa 6'dır. Komut satırı sürümünde ve C++'ta aynı sonuçları almıyorsanız sayfa bölümleme kipini açıkça belirtmeyi deneyebilirsiniz.

Tesseract'taki sayfa bölümleme kipleri aşağıdaki gibidir:
  • 0 Yalnızca yönlendirme ve yazı algılama (OSD).
  • 1 OSD ile otomatik sayfa segmentasyonu.
  • 2 OSD veya OKT olmadan otomatik sayfa segmentasyonu.
  • 3 OSD olmadan tam otomatik sayfa segmentasyonu (öntanımlı)
  • 4 Değişken boyutlarda metinlerden oluştan tek bir sütun varsay.
  • 5 Dikey olarak hizalanmış bir metin bloğu varsay.
  • 6 Tek bir metin bloğu varsay.
  • 7 Resmi tek bir metin satırı varmış gibi ele al.
  • 8 Resmi tek bir sözcük varmış gibi ele al.
  • 9 Resmi bir daire içinde tek bir sözcük varmış gibi ele al.
  • 10 Resmi tek karakter varmış gibi ele al.
  • 11 Aralıklı metin. Belirli bir sıra olmaksızın mümkün olduğunca çok metin bul.
  • 12 OSD'li ayrık metin.
  • 13 Ham satır. Tesseract'a özgü hack'leri atlayarak resmi tek bir metin satırı olarak ele al.

Komut Satırı Kullanımı

Aşağıdaki örnekler, tesseract komut satırı aracını kullanarak OKT'nın nasıl yapıldığını gösterir. Dil, Türkçe olarak seçilmiştir ve OKT motor kipi 1'e (yalnızca LSTM) ayarlanmıştır.
# Çıktı terminalde
$ tesseract tisikkirlir.jpg stdout -l tur --oem 1 --psm 3 
# Çıktı çıktı.txt dosyasında
$ tesseract tisikkirlir.jpg çıktı -l tur --oem 1 --psm 3

C++ UPA'sının Kullanımı

C++ sürümünde, öncelikle tesseract/baseapi.h ve leptonica/allheaders.h başlıklarını içeri aktarmamız gerekir. Sonra TessBaseAPI sınıfının bir örneğine işaretçi oluşturuyoruz. Dilini Türkçe (tur) ve OKT motorunu tesseract::OEM_LSTM_ONLY olarak (bu, komut satırındaki --oem 1 seçeneğine eşdeğerdir) ilklendiriyoruz. Son olarak, görüntüyü okumak için OpenCV'yi kullanıyoruz ve bu resmi SetImage metodunu kullanarak OKT motoruna aktarıyoruz. Çıktı metni de GetUTF8Text() kullanılarak okunur.


Bu C++ kodunu terminalde aşağıdaki komutu çalıştırarak derleyebilirsiniz:
g++ -O3 -std=c++11 simple-ocr.cpp `pkg-config --cflags --libs tesseract opencv`-o simple-ocr
Artık bir resmin yolunu programa geçerek kullanabilirsiniz:
./simple-ocr tisikkirlir.jpg

Dil Paketi Hatası

tessdata/tur.traineddata veri dosyası açılırken hata oluştuğunu söyleyen bir mesajla karşılaşabilirsiniz. Bu kullanılan dil paketinin (tessdata/tur.traineddata) doğru yerde olmadığı anlamına gelir. Bunu iki şekilde çözebilirsiniz:

  • Seçenek 1: Dosyanın beklenen yolda olduğundan emin olun (ör. Linux'ta yol, kullandığınız dağıtıma göre /usr/share/tesseract/tessdata/tur.traineddata veya /usr/share/tesseract-ocr/4.00/tessdata/tur.traineddata olabilir).
  • Seçenek 2: tessdata isminde bir dizin oluşturun, tur.traineddata dosyasını indirin ve bu dosyayı tessdata dizininin içine kaydedin. Sonra Tesseract'ı bu dizindeki dil paketini kullanacak şekilde yönlendirebilirsiniz:
tesseract tisikkirlir.jpg stdout --tessdata-dir tessdata -l tur --oem 1 --psm 3
Benzer şekilde, C++ kodunda da 18. satırı değiştirmemiz gerekir:
ocr->Init("tessdata", "tur", tesseract::OEM_LSTM_ONLY);

Kullanım Senaryoları

Tesseract genel amaçlı bir OKT motorudur, ancak yaygın bir yazı tipinde düz beyaz arka planda temiz siyah metinler olduğunda en iyi şekilde çalışır. Metnin yönü yatay olduğunda ve yüksekliği en az 20 piksel olduğunda da daha iyi sonuç verir. Metnin çevreleyen bir kenarlığı varsa bunlar rastgele metin olarak algılanabilir.

Örneğin, bir kitabı yüksek kaliteli bir tarayıcıyla taradıysanız sonuçlar mükemmel olur. Ancak arka planda karmaşık arkaplan desenli bir pasaport taradıysanız metin tanıma işlemi işe yaramayabilir. Bu gibi durumlarda işe yarar sonuçlar elde etmek için kullanılması gereken birkaç hile vardır. Bunlar sonraki yazıların konusu olabilir. Şimdi nispeten kolay örneklere göz atalım.

Karikatür ve Çizgi Romanlar

Karikatür ve çizgi romanlar en zor hedeflerden biridir. Çünkü metinler yaygın olmayan yazıtipleriyle oluşturulmuştur ve yerleşimleri epey rastgeledir. Örnek olarak Yiğit Özgür'ün Tişikkirlir Sipirmin karikatürüne bakalım:
Yazdığımız örnek programın bu karikatür için verdiği çıktı şu şekilde:
İŞTE CÜZDANIN . DİKKAT ET,
ÇOK YANKESİCİ VAR ETRAFTA,
TEŞEKKÜRLER SÜPERMEN.
ir
HAYVANIN OĞLU ÖYLE ANİ YAPTIM
KAHRAMAN YETİŞ-
SİZİN YÜZÜNÜZDEN
MİYO ÜKEDEK
Ne yazık ki pek tatmin edici değil. Ama Google Cloud Vision API'siyle aşağıdaki gibi iyi sonuçlar alınabiliyorsa yazdığımız programda iyileştirilebilecek pek çok şey var demektir.

Kitaplar

Şimdi programımızı bir kitap sayfası üzerinde çalıştırıp verdiği sonuca bakalım.

Gündelik Şeylerin Psikopatalojisi
eni modern bir jet yolcu uçağının pilot kabinine koysa- lar, burada başarılı olmamak beni ne şaşırtır ne de ca- B..4 nımı sıkardı. Öyleyse neden kapılar, elektrik düğmele- ri, su muslukları ve ocaklarda sorun yaşıyorum? Okurun, “Ka- pılar mı?” dediğini duyabiliyorum. “Kapı açmada sorun mu ya- şıyorsun?” Evet. Çekilmesi gereken kapıları itiyor, itilmesi gere- ken kapıları çekiyorum; çekilmesi ya da itilmesi gerekmeyen, ka- yar kapılarınsa içinden geçmeye çalışıyorum. Dahası, bu gerek- siz sorunları başkalarının da yaşadığını görüyorum. Benim ka- pılarla olan sorunlarım o kadar iyi bilinir ki çetretilli kapılardan sıklıkla “Norman kapıları” diye söz edilir. Adınızın doğru dürüst çalışmayan kapılarla ünlendiğini düşünün. Eminim, anne baba- mın benim için planladıkları bu değildi. (Arama motoruna İngi- lizce olarak tırnak içinde “Norman kapıları” yazın, ne kadar çok sonuç alacağınızı göreceksiniz. Bazıları çok eğlenceli.)
Kapı kadar basit bir şey nasıl böylesine karmaşık olabilir? Bir kapı, olabilecek en basit aygıt gibi görünür. Bir kapıyla yapabi- leceğiniz pek fazla şey yoktur; açarsınız ya da kapatırsınız. Di- yelim, bir ofis binasındasınız, koridorda yürüyorsunuz. Önünü-
l
Metinde hafif bir eğim olmasına ve arka sayfadaki öğeler de fotoğrafta çıkmasına rağmen, Tesseract çok az hatayla makul bir iş çıkardı.

Gazete ve Dergiler

Gazetelerde ve dergilerde bolca sütun, fotoğraf ve farklı arkaplanlı başlıklar devreye girdiği için elde sonuçlar kitaplar kadar başarılı olmasa da çeşitli önişlemelerle işe yarar çıktılar elde edilebilir. Bizim programımızın örnek bir gazete sayfasında ne yaptığına bakacak olursak da:
İktidarın ana eksenini 'tasarruf' olarak tanımladığı bütçe için Kılıgdaroğlu'ndan sert eleştiri geldi 
Halka darbe bütcesi 
Yatırım ve tüketim daraldı 
sert değer kaybı, iç talepteki yavaşlamanın etki- siyle üçüncü çeyrekte ekonomideki büyüme yüzde 1.6'ya indi. Yatırım ve tüketim isteğinin azaldığını belirten eko- nomistler, 4. çeyrekte daralma bekliyor. En büyük küçük me inşaat ve imalat sanayisinde görüldü. » ide 
İŞSİZLİK ARTACAK 
görüşmelerine başlanan bütçeden halka yoksulluk ve işsiz- lik çıktı. Bakan Berat Albayrak, büt- çenin en önemli özelliğinin tasarruf olacağını söyledi. Albayrak, “yeterin- ce yatırım yapıldığını, artık yapılma- yacağını” belirtti. CHP lideri Kemal Kılıçdaroğlu da bütçenin “darbe büt- çesi” olduğunu savundu. 
SAKAT BÜTÇE 
bütçenin sakat ol- duğunu belirterek “Hem ekonomik krizde, hem de bir sivil darbe döne- minde hazırlanmıştır. Demokrasi- ye inanan herkesin hayır demesi ge- rekiyor” dedi. Kılıçdaroğlu, ocaktan itibaren CHP'li belediyelerin olduğu bütün yerlerde asgari ücretin net 2 bin 200 TL olacağını da söyledi. » 5'te
Görüldüğü gibi birkaç Tükçeye özgü harfin doğru tanınmaması dışında bir de farklı renkli ve arkaplanlı yazıların okunmamış olması sorunu var, bunlar dışında çıktı idare eder (çıktının sadece manşetle ilgili kısmı alınmıştır sadelik açısından).

Fiş ve Faturalar

Son olarak da taranan bir fişte Tesseract'ın ne kadar iyi bir performans gösterdiğini görelim.
MIGROS TICARET A.S.
CİTYCENTER ESENYURT IST MIGROS SATIS MGZ
ZAFER MAH. ADILE NASIT BUL.CITY CENTER $S
ESENYURT UNI.AP NO:1/13 ESENYURT/1ST TEL
BUYUK MÜKELLEFLER V.D.6220529513
http: //WWW.migros.com.tr
MERKEZ ADRESİ: ATATÜRK MAH. TURGUT ÖZAL
BULV. NO:7 ATAŞEHİR/İSTANBUL
MERSIS NO: 0622052951300016
TARİM  :13/12/2018
FİŞ NO :0120
SAAT o :11:50
Çi
#H8690998312142#
BALPARMAK KESTANE Bo X8 x79,90
#HW8695707000228#
MIGROS CIC.BALI 8506 © X8 x18,95
#H8691530313313#
ARIFOGLU ZERDECAL 48 x9,95
#8690998151826#
xx BALPARMAK YAYLA V © X8 x32,90
KAAN 1224
0.535 KG x 2,95 TL/KG
KARNABAHAR X8 x1,58
ARA TOPLAM x143,28
TOPKDV x10,61
TOPLAM x*143,28
ak pos 143.23
KDV KDV TUTARI KDV'Lİ TOPLAM
48 x10,61 x143,28
Yazının sonuna gelmiş bulunuyoruz. Sizin de OKT ile ilgili harika fikirleriniz varsa onları gerçekleştirmeye artık bir adım daha yakınsınız. İyi eğlenceler ve başarılar :)

Bu yazı birkaç alt bölümü hariç Deep Learning based Text Recognition (OCR) using Tesseract and OpenCV yazısının Türkçe çevirisidir. OpenCV hakkında daha pek çok bilgiyi bu günlükten öğrenebilirsiniz. Ayrıca OpenCV hakkında onlarca Türkçe kaynak da oluşmuş durumda, onlardan da yararlanabilirsiniz.

Yorumlar

  1. Bu yazım bir YL tezinde kaynak olarak gösterilmiş. Çalışmada önemli bir yer tutmuyor ama yine de insanın hoşuna gidiyor :)

    Gömülü sistem tabanlı bina içi otonom robot

    https://katalog.marmara.edu.tr/veriler/yordambt/cokluortam/FB3AFBDA-1E74-7947-8A2A-EA500E2BE18C/5d7abbe8d4acf.pdf

    YanıtlaSil

Yorum Gönder

sen de yaz yaz yaz buraya yaz bütün sözlerini

Bu blogdaki popüler yayınlar

Diğer Dillerde Hoşçakal

Mızıka Tabları Nasıl Okunur

conio.h