18 Haziran 2018 Pazartesi

Tesseract versiyon 4 ile OCR (optik karakter tanıma) uygulaması

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...

Hiç yorum yok:

Yorum Gönder