Tesseract gegen Tabellen. Anerkennung von Dokumenten

Trotz der Digitalisierung von allem und jedem ist in einer Zeit, in der die Menschheit kurz davor steht, eine Neuro-Schnittstelle zu schaffen, wenn KI alltäglich geworden ist, die klassische Aufgabe, Daten aus einem Scan / Bild zu erhalten, immer noch relevant.





Guten Tag. Ich heiße Aleksey. Ich arbeite als Programmierer in einer Firma, die Geräte verkauft. Ich hatte meine eigenen Best Practices zum Erkennen und Laden von Daten in ein Buchhaltungsprogramm, und es waren nur die Manager, die Dutzende von Seiten mit PDF-Dokumenten manuell eingegeben haben, die nicht einfach in EDF übertragen werden konnten. Ich lud sie ein, meine Lösung auszuprobieren.





Ursprünglich wurde ABBYY Cloud zur Erkennung verwendet, ist jedoch nicht kostenlos und der Testmodus ist nicht lang genug. Ich habe beschlossen, meine API in Python zu schreiben, wo die gesamte Kraft der freien Tesseracta genutzt wird. Das Problem ist, dass Tesseract eine Texterkennung ist und keine Tabelle definiert, was sich als wenig nützlich herausstellt. Erst am Tag zuvor habe ich den Artikel https://vc.ru/ml/139816-povyshenie-kachestva-raspoznavaniya-skanov-dokumentov-s-tablicami-s-pomoshchyu-vychisleniya-koordinat-yacheek gelesen, in dem alle Tabellenzellen erhalten werden Mit openCV wird jede Zelle durch Tesseract geführt und somit können die richtigen Daten erhalten werden. Ich habe beschlossen, diese Methode auszuprobieren. In der Post geht es darum, was passiert ist.





Für den Test habe ich von der Demo-Basis 1c TORG-12 genommen. Dieses Formular hat eine ziemlich komplexe Struktur, viele Tabellen, viel Text, viele Daten. Genau das, was Sie brauchen.





pdf , gostscript . ImageMagick, - . cmd , gostscript .





, openCV , QR-. pyzbar.





, . , . , , . - .





clahe = cv2.createCLAHE(clipLimit=50, tileGridSize=(50, 50))
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)  
l, a, b = cv2.split(lab) 
l2 = clahe.apply(l)  
lab = cv2.merge((l2, a, b))  
img2 = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR) 

gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 75, 255, cv2.THRESH_BINARY_INV )

kernel = np.ones((2, 2), np.uint8)
obr_img = cv2.erode(thresh, kernel, iterations=1)

obr_img = cv2.GaussianBlur(obr_img, (3,3), 0)
      
      



, . , . 5 , delta.





contours, hierarchy = cv2.findContours(obr_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_TC89_L1)
coordinates = []
ogr = round(max(img.shape[0], img.shape[1]) * 0.005)
delta = round(ogr/2 +0.5)
ind = 1;
for i in range(0, len(contours)):
	l, t, w, h = cv2.boundingRect(contours[i])
	if (h > ogr and w > ogr):
    # 
    # 
    # 
    #
    #
    #
    #
    #
  	coordinates.append((0, ind, 0, l, t, w, h, ''))
    ind = ind + 1
      
      



, . sqlite3 coordinates. . , hierarchy, , . .





, . - . , .





, , - . , , . . , , . , , , , , , .





2 :













. , . , . . , , , , . - . . , , . . . . / 2*. . , - , . .





. . 4 . , , "". "" , , . - , 4 , .









. . tesseract , 3 , . , "-". "-", "---00", . .





text1 = pytesseract.image_to_string(image[t1:t2,l1:l2], lang=lang, config='--psm 6')
text2 = pytesseract.image_to_string(image[t1:t2,l1:l2], lang=lang, config='')
text3 = pytesseract.image_to_string(image[t1+round(delta/2):t2-round(delta/2),l1+round(delta/2):l2-round(delta/2)], lang=lang, config='--psm 7')
text1 = text1.replace("\n", " ")
text2 = text2.replace("\n", " ")
text3 = text3.replace("\n", " ")
text1 = re.sub(' *[^ \(\)--\d\w\/\\\.\-,:; ]+ *', ' ', text1)
text2 = re.sub(' *[^ \(\)--\d\w\/\\\.\-,:; ]+ *', ' ', text2)
text3 = re.sub(' *[^ \(\)--\d\w\/\\\.\-,:; ]+ *', ' ', text3)

while text1.find('  ')!=-1:
    text1 = text1.replace('  ',' ')
while text2.find('  ') != -1:
    text2 = text2.replace('  ', ' ')
while text3.find('  ') != -1:
    text3 = text3.replace('  ', ' ')
      
      



. , . , . , -, , , . , , . , , , . , , ? , 2 , . . , , , . , ; ; , . .





. . 4 . "". , , . .





, , . , . API JSON, 1 . , . . . 1 pdf 20 , . , Tesserocr Pytesseract, .





https://github.com/Trim891/API. PyCharm "", GitHub, *.py requirements.txt. , , , , , ; " , ", , , - ; , , 2 . .





PS Es gibt viele Kommentare in den Dateien, viele unnötige Dinge und im Allgemeinen ist Shit Code ein kreatives Durcheinander. Es war alles für den internen Gebrauch, es gab keine Zeit, sich zu verkleiden =)








All Articles