Daha önceki bir yazımda tesseract OCR kurulumundan bahsetmiştim. Bu yazı kapsamında aradan geçen zaman zarfında Tesseract kütüphanesinde ne gibi gelişmeler olduğundan bahsedip, örnek uygulama geliştireceğiz.
Açık kaynak Tesseract OCR kütüphanesini Python ile kullanmamıza imkan sağlayan iki farklı wrapper ;
Bu konuyla ilgili bir önceki yazımda pytesseract kurulumundan bahsedip, örnek görüntüler üzerinden kütüphaneyi test etmiştim. Aradan geçen zaman zarfında tesseract version 4' ün beta sürümü yayınlandı. Bu sürümde neler değişti diye bakacak olursak, OCR çalışmalarının da derin öğrenmeden nasibini aldığını söyleyebiliriz. Tesseract 4 ile birlikte LSTM ağ modeli tabanlı yeni bir yöntem benimsendi ve versiyon 3'e göre daha hızlı ve güvenilir olduğu söylenmekte.
Örnek uygulamamıza geçmeden önce, ilk olarak tesserocr 'yi bilgisayarımıza nasıl yükleyeceğimize bakalım ;
Anaconda kullanıyorsanız :
conda install -c simonflueckiger tesserocr
conda install -c simonflueckiger/label/tesseract-4.0.0-master tesserocr
komutları ile kolayca yükleyebilirsiniz.
Alternatif olarak kullandığınız Python versiyonuna göre uygun windows release 'ini bu linkten indirip,
pip install tesserocr-2.2.2-cp36-cp36m-win_amd64.whl
komutu ile yükleyebilirsiniz. Farklı işletim sistemleri ve daha detaylı bilgi için tıklayınız. Buraya kadar sorun yoksa, Artık import tesserocr komutu ile tesserocr 'nin yüklenip yüklenmediğini test edebilirsiniz.
Eğer "Failed to init API, possibly an invalid tessdata path" hatası alırsanız, tek yapmanız gereken tessdata yı indirip, indirdiğiniz klasörü Python 'un kurulu olduğu dizine kopyalamak. (örnek; indirdiğim tessdata klasörünü, Python'un kurulu olduğu "C:\Users\IbrahimD\Anaconda3" içerisine kopyaladım)
Bir görüntüyü okuyup, tesseract ile metne çevirmek için;
import tesserocr
from PIL import Image
print(tesserocr.tesseract_version())
#print(tesserocr.get_languages())
img = Image.open('galata.png')
print(tesserocr.image_to_text(img))
Buraya kadar kurulumu yaptık ve bir görüntüyü okuyup tesserocr image_to_text fonksiyonu ile karakterleri buldurduk. Bir video üzerinde bu işlemi yapmak istediğimizde ise, bu işlemin gerçek zamanlı yapılabilmesi için biraz fazla işlem gücü gerektirdiğini/zaman aldığını göreceksiniz.
Video üzerinden OCR uygulama örneği gerçekleştirmek için şöyle bir yol izledim. Videoda belirli bir alanı seçip bu alandaki yazıları OCR ile tanımak istiyorum diyelim. Buradaki temel nokta şu; OCR ile seçilmiş bu alandaki görüntüyü sürekli olarak metne çevirmeyi denemeli miyim? İşin bu kısmı OCR'dan bağımsız ve geliştirilmeye/öneriye açık. Benim önerdiğim yöntemde, seçili alan içim SIFT algoritması ile keypoint leri buldum ve bulunan bu keypoint sayısına göre seçili alan için OCR algoritmasını çalıştırdım. Siz burada arka plan çıkarma yöntemlerini uygulayıp, videoda seçili olan alana yeni birşey gelip gelmediğini kontrol ederek (örneğin birisinin seçili alana bir kağıda yazmış olduğu yazıyı göstermesi gibi) OCR metodunu çağırmayı deneyebilirsiniz. Benim gerçekleştirmiş olduğum basit video uygulaması için örnek Python kodları ve çıktıyı aşağıda inceleyebilirsiniz.
# -*- coding: utf-8 -*- """ Created on Mon Jun 11 17:30:54 2018 @author: IbrahimD """ import tesserocr from PIL import Image import cv2 import numpy as np print(tesserocr.tesseract_version()) sift = cv2.xfeatures2d.SIFT_create() cap = cv2.VideoCapture("video3.mp4") n = 5 kernel = np.ones((n,n),np.uint8) ret, frame = cap.read() frame = cv2.resize(frame, (640,480)) r = cv2.selectROI(frame) x,y,w,h = r[0],r[1],r[2],r[3] whiteLower = (200, 0, 0) whiteUpper = (255, 255, 255) while(cap.isOpened()): ret, frame = cap.read() #read a frame if ret==False: print("No Camera found") break frame = cv2.resize(frame, (640,480)) imCrop = frame[y:y+h, x:x+w].copy() gray = cv2.cvtColor(imCrop, cv2.COLOR_BGR2GRAY) ret,th = cv2.threshold(gray,150,255,cv2.THRESH_BINARY) th = cv2.erode(th,kernel,iterations = 1) kp, des = sift.detectAndCompute(th,None) text = str(len(kp)) if len(kp)>150: img = Image.fromarray(th) text = tesserocr.image_to_text(img) cv2.putText(frame, text, (10,50), cv2.FONT_HERSHEY_SIMPLEX,0.7, (0, 0, 255), 2) cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,255),2) cv2.imshow("frame",frame) cv2.imshow("selected",th) k = cv2.waitKey(30) & 0xff if k == 27: break cv2.waitKey(0)
Her türlü görüş, öneri ve sorularınızı iletebilirsiniz...
hocam bazı videolarda
YanıtlaSilThe latest installers can be downloaded here: tesseract-ocr-setup-3.05.02-20180621.exe, tesseract-ocr-w32-setup-v4.0.0.20181030.exe (32 bit)
yukarıdaki linkteki exe dosyasını indirip kuruyorlar. sonra klasörün yolunu gösteriyorlar. sizin anlattığınız ile bir farkı varmı acaba
Bilmiyorum, denemedim bahsettiğiniz yöntemi
SilMerhaba görüntülerdeki textleri türkçe karakter olarak almak istiyorum. Örneğin bıçak kelimesini bicak olarak algılıyor. Ben bu şekilde olmasını istemiyorum. Bunun için ne yapabilirim?
YanıtlaSilİndirdiğiniz tessdata içerisinde Türkçe model var mı? (tur.traineddata)
Silhocam merhaba
YanıtlaSilBen sadece belirli bir karakteri ayırt edebilmesini istiyorsam "örneğin Türkiye kelimesinden t harfi gibi" nasıl yapmalıyım?
Tesseract görüntüdeki metni veriyor size zaten, Metni elde ettikten sonra istediğiniz karakteri aratabilirsiniz.
Sil