Tesseract, OCR a PhantomJS

Blog Admin

Čo je to Tesseract ? Tesseract je nástroj na čítanie textu z obrázkov, teda je to jedna z OCR (Optical Character Recognition) metód. Treba však pri Tesseracte poznamenať, že sa jedná o OCR, ktoré funguje na všetkých hlavných operačných systémoch, teda na Windows, Linux a aj Mac; ktoré podporuje okolo 100 jazykov vrátane slovenčiny a ktoré zaznamenalo obrovský posun v presnosti a aj rýchlosti detekcie tým, že tvorcovia tohto open source začali používať pri detekcii textu neurónové siete.

Dá sa očakávať, že Tesseractu nebude dlho trvať, pokiaľ nám ponúkne perfektný nástroj na trasformáciu slovenských printových kníh do textovej podoby.

Použitie Tesseractu ako aj jeho inštalácia napr. pod Windowsom sú veľmi jednoduché. Na webovej stránke tu si môžete stiahnuť najnovšiu verziu Tesseractu. Verzia 4.0.0 Tesseractu je už skutočne na vysokej úrovni a v porovnaní s verziou 3.0.0 je omnoho presnejšia a aj rýchlejšia.

Keď máte už Tesseract nainštalovaný napr. vo Windowse nesmiete zabudnúť nastaviť path, aby bolo možné Tesseract spustiť z akéhokoľvek adresára. Potom už len stačí vložiť do príkazového riadka tento príkaz:

tesseract image.png result -l slk

a výsledok, teda text z obrázka s názvom image.png, bude v textovom súbore result.txt, ktorý nájdete v aktuálnom adresári. Jazyk sa nastavuje pomocou -l a skratka jazyka, v prípade slovenčiny je to -l slk, v prípade angličtiny použijeme príkaz:

tesseract image.png result -l eng

Zoznam jazykov a k verzii 4.0.0 Tesseractu prislúchajúcich jazykových súborov nájdete tu. Tie jazykové súbory, v ktorých zamýšľate pracovať je potrebné stiahnuť a vložiť do inštalačného adresára Tesseractu (platí pre Windows; pre Linux a Mac je to troška odlišné)

Aj v programe v jazyku python, ktorý si môžete spustiť kliknutím na button Spustiť skript nižšie, je Tesseract použitý v kombinácii s nástrojom na scanovanie webových stránok, ktorý sa nazýva PhantomJS. Do vstupného poľa zadáte adresu webovej stránky, ktorá sa má odfotiť pomocou PhantomJS a následne sa text zo screenshotu webovej stránky zobrazí nižšie pod obrázkom screenshotu. Tesne pod obrázkom screenshotu je zobrazený ešte pomocný obrázok pre Tesseract, v ktorom je všetko len čiernobiele, aby mal Tesseract dobrý kontrast pre rozpoznanie textu.

Zdrojový kód v jazyku Python 3.x

1
2
#!/opt/python/Python-3.6.5/python
# -*- coding: utf-8 -*-
import cgi
import cgitb
import sys
import os
cgitb.enable()

# ocr.py in python 3.x

print ("Content-Type: text/html; Charset='UTF-8'")
print ("")#use this double quote print statement to add a blank line in the script

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import webbrowser
from PIL import Image
import pytesseract
import cv2

# Create instance of FieldStorage 
data = cgi.FieldStorage() 

# Get data from fields
filename1 = str(data.getvalue('filename1'))
filename2 = str(data.getvalue('filename2'))
filename3 = str(data.getvalue('filename3'))
webpage = str(data.getvalue('webpage'))

fname1 = "/var/www/masternn/masternn/collect_static/webcrawler/screenshots/" + filename1
fname2 = "/var/www/masternn/masternn/collect_static/webcrawler/screenshots/" + filename2
fname3 = "/var/www/masternn/masternn/collect_static/webcrawler/screenshots/" + filename3
mydir = '/var/www/masternn/masternn/collect_static/webcrawler/screenshots/'

now = time.time()
old = now - 7200

for f in os.listdir(mydir):
    path = os.path.join(mydir, f)
    if os.path.isfile(path):
        stat = os.stat(path)
        if stat.st_ctime < old:
            os.remove(path) 

pytesseract.pytesseract.tesseract_cmd = '/usr/local/bin/tesseract'

driver1 = webdriver.PhantomJS(executable_path="/usr/local/bin/phantomjs", service_log_path="/opt/phantomjs/bin/ghostdriver.log", service_args=['--ignore-ssl-errors=true', '--ssl-protocol=any'])
driver1.get(webpage)
screenshot1 = driver1.save_screenshot(fname1)
driver1.quit() 

#CHROME_PATH = '/usr/bin/google-chrome'
#CHROMEDRIVER_PATH = '/usr/local/bin/chromedriver'
#WINDOW_SIZE = "1920,1080"

#chrome_options = Options()  
#chrome_options.add_argument("--headless")  
#chrome_options.add_argument("--window-size=%s" % WINDOW_SIZE)
#chrome_options.binary_location = CHROME_PATH

#def make_screenshot(url, output):
#    if not url.startswith('http') or not url.startswith('https'):
#        raise Exception('URLs need to start with "http(s)"')

#    driver2 = webdriver.Chrome(
#        executable_path=CHROMEDRIVER_PATH,
#        chrome_options=chrome_options
#    )  
#    driver2.get(url)
#    driver2.save_screenshot(output)
#    driver2.close()

#make_screenshot(webpage, fname2)


# load the example image and convert it to grayscale
image = cv2.imread(fname1)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

preprocess =  "thresh"

# check to see if we should apply thresholding to preprocess the
# image
if preprocess == "thresh":
    gray = cv2.threshold(gray, 0, 255,
        cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

# make a check to see if median blurring should be done to remove
# noise
elif preprocess == "blur":
    gray = cv2.medianBlur(gray, 3)

# write the grayscale image to disk as a temporary file so we can
# apply OCR to it

cv2.imwrite(fname2, gray)

# apply tesseract
os.system('/usr/local/bin/tesseract ' + fname2 + ' ' + fname3 + ' -l slk')

Autor príspevku: F. Gachulinec Dr., PhD.

Zadajte webovú stránku pre OCR a screenshot:

Tágy:
umelá inteligencia OpenCV OCR PhantomJS Python