כיצד לבצע OCR עם Tesseract, OpenCV ו-Python PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python

בפוסט בבלוג זה ננסה להסביר את הטכנולוגיה העומדת מאחורי מנוע ה- Tesseract הנפוץ ביותר ששודרג עם הידע האחרון שנחקר בזיהוי תווים אופטי. מאמר זה ישמש גם כמדריך / הדרכה כיצד ליישם OCR בפיתון באמצעות מנוע Tesseract. אנו נעבור בין המודולים הבאים:

  • תכונות OCR של טסראקט
  • עיבוד מוקדם של OCR באמצעות OpenCV
  • מפעיל טסראקט עם CLI ופייתון
  • מגבלות של מנוע Tesseract

תוכן העניינים

מבוא

OCR = זיהוי תווים אופטי. במילים אחרות, מערכות OCR הופכות תמונה דו מימדית של טקסט, שיכולה להכיל טקסט מודפס או בכתב יד מייצוג התמונה שלה לטקסט קריא במכונה. OCR כתהליך מורכב בדרך כלל ממספר תהליכי משנה לביצוע מדויק ככל האפשר. תהליכי המשנה הם:

  • עיבוד מראש של התמונה
  • לוקליזציה של טקסט
  • פילוח תווים
  • זיהוי תווים
  • לאחר עיבוד

תהליכי המשנה ברשימה שלמעלה כמובן יכולים להיות שונים, אך אלה הם שלבים בערך הדרושים כדי להתקרב לזיהוי תווים אוטומטי. בתוכנת OCR, המטרה העיקרית היא לזהות ולתפוס את כל המילים הייחודיות בשפות שונות מתווי טקסט כתובים.

במשך כמעט שני עשורים, נעשה שימוש נרחב במערכות זיהוי תווים אופטי כדי לספק הזנת טקסט אוטומטית למערכות ממוחשבות. עם זאת, בכל הזמן הזה, מערכות OCR קונבנציונליות (כמו OCR אזורי) מעולם לא התגברו על חוסר היכולת שלהם לקרוא יותר מקומץ של גופנים ופורמטים של דפים. סוג מרווח פרופורציונלי (הכולל כמעט את כל העותקים), גופני מדפסת לייזר, ואפילו גופנים לא פרופורציונליים רבים של מכונות כתיבה, נותרו מחוץ להישג ידן של מערכות אלו. וכתוצאה מכך, OCR קונבנציונלי מעולם לא השיג יותר מאשר השפעה שולית על המספר הכולל של המסמכים הזקוקים להמרה לצורה דיגיטלית.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python
תהליך זיהוי תווים אופטיים (באדיבות)

מנועי OCR מהדור הבא מתמודדים עם הבעיות הללו שהוזכרו לעיל ממש טובות על ידי שימוש במחקר העדכני ביותר בתחום הלמידה העמוקה. על ידי מינוף השילוב של דגמים עמוקים ומערכות נתונים ענקיות הזמינות לציבור, דגמים משיגים דיוק עדכני במשימות הנתונות. בימינו אפשר גם ליצור נתונים סינתטיים עם גופנים שונים המשתמשים ברשתות אדפרסריות generative ומעט גישות יצירתיות אחרות.

זיהוי תווים אופטיים נותר א בעיה מאתגרת כאשר טקסט מופיע בסביבות בלתי מוגבלות, כמו סצינות טבעיות, בגלל עיוותים גיאומטריים, רקע מורכב וגופנים מגוונים. הטכנולוגיה עדיין מחזיקה בפוטנציאל עצום בגלל מקרי השימוש השונים של OCR מבוסס למידה עמוקה כמו


יש לכם בראש בעיית OCR? רוצה להפחית את עלויות הזנת הנתונים של הארגון שלך? פנה אל ננונטים ולבנות מודלים של OCR לחלץ טקסט מתמונות or לחלץ נתונים מקובצי PDF עם AI מבוסס PDF OCR!


כלי OCR בקוד פתוח

יש הרבה זיהוי תווים אופטי תוכנה זמינה. לא מצאתי השוואה איכותית ביניהם, אבל אכתוב על כמה מהם שנראים הכי ידידותיים למפתחים.

טסרקט - מנוע OCR עם קוד פתוח שצבר פופולריות בקרב מפתחי OCR. למרות שזה יכול להיות כואב ליישם ולשנות לפעמים, לא היו יותר מדי אלטרנטיבות חינמיות OCR חינמיות וחזקות ביותר בשוק. טסרקט החל כדוקטורט. פרויקט מחקר במעבדות HP, בריסטול. זה זכה לפופולריות רבה ופותח על ידי HP בין השנים 1984 ל -1994. בשנת 2005 פרסמה HP את Tesseract כתוכנת קוד פתוח. מאז 2006 הוא פותח על ידי גוגל.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python
השוואה בין מגמות של גוגל לכלים שונים של קוד פתוח

OCRopus - OCRopus היא מערכת OCR עם קוד פתוח המאפשרת הערכה קלה ושימוש חוזר של רכיבי ה- OCR על ידי חוקרים וחברות כאחד. אוסף של תוכניות לניתוח מסמכים, ולא מערכת OCR-turn-key. כדי להחיל אותו על המסמכים שלך, ייתכן שתצטרך לבצע עיבוד מוקדם של תמונות, ואולי גם להכשיר דגמים חדשים. בנוסף לסקריפטים לזיהוי עצמם, ישנם מספר סקריפטים לעריכת ותיקון אמת של הקרקע, מדידת שיעורי שגיאות, קביעת מטריצות בלבול שקל לשימוש ועריכה.


שֶׁל הָעֵינַיִם - Oular פועל בצורה הטובה ביותר על מסמכים המודפסים באמצעות לחץ יד, כולל מסמכים שנכתבו במספר שפות. זה פועל באמצעות שורת הפקודה. זוהי מערכת OCR היסטורית עדכנית. התכונות העיקריות שלו הן:

  • למידה ללא פיקוח של גופנים לא ידועים: מחייבת רק תמונות מסמכים וקורפוס של טקסט.
  • יכולת טיפול במסמכים רועשים: דיו לא עקבי, מרווח, יישור אנכי
  • תמיכה במסמכים רב-לשוניים, כולל מסמכים שיש בהם החלפת קוד משמעותית ברמת המילה.
  • למידה בלתי מבוקרת של דפוסי וריאוגרפיה אורתוגרפית כולל איות ארכאי ושורטטורי מדפסת.
  • תעתיק משותף סימולטני לצורות דיפלומטיות (מילוליות) והן לנורמליות.


סוויפטוק אני אזכיר גם את מנוע ה- OCR שנכתב בסוויפט מכיוון שישנה פיתוח עצום לקידום השימוש בסוויפט כשפת תכנות פיתוח המשמשת ללמידה עמוקה. לבדוק בלוג כדי לגלות יותר מדוע. SwiftOCR היא ספריית OCR מהירה ופשוטה המשתמשת ברשתות עצביות לצורך זיהוי תמונה. SwiftOCR טוען כי המנוע שלהם עולה על ביצועי הספריה הידועה של Tessaract.

בפוסט בבלוג זה נניח להתמקד ב- Tesseract OCR וגלה יותר כיצד זה עובד ואיך משתמשים בו.


Tesseract OCR

Tesseract הוא מנוע לזיהוי טקסט פתוח (OCR), זמין תחת רישיון Apache 2.0. ניתן להשתמש בו ישירות, או (עבור מתכנתים) באמצעות API כדי לחלץ טקסט מודפס מתמונות. הוא תומך במגוון רחב של שפות. ל-Tesseract אין ממשק משתמש מובנה, אבל יש כמה זמינים מה- דף שלישי שלישי. Tesseract תואם לשפות תכנות ומסגרות רבות באמצעות עטיפות שניתן למצוא כאן. ניתן להשתמש בו עם ניתוח הפריסה הקיים כדי לזהות טקסט בתוך מסמך גדול, או להשתמש בו יחד עם גלאי טקסט חיצוני כדי לזהות טקסט מתמונה של שורת טקסט אחת.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python
זרימת תהליך OCR לבניית API עם Tesseract מ- בלוג

Tesseract 4.00 כולל תת מערכת רשת עצבית חדשה המוגדרת כמזהה שורת טקסט. מקורו ב LSTM מבוסס Python של OCRopus יישום אך עוצב מחדש עבור Tesseract ב- C ++. מערכת הרשת העצבית ב- Tesseract מתארכת מראש את TensorFlow אך היא תואמת אותה, מכיוון שקיימת שפת תיאור רשת הנקראת Variative Graph Specification Language (VGSL), הזמינה גם עבור TensorFlow.

כדי לזהות תמונה המכילה תו בודד, אנו משתמשים בדרך כלל ברשת עצבית מפותלת (CNN). טקסט באורך שרירותי הוא רצף של תווים, ובעיות כאלה נפתרות באמצעות RNNs ו- LSTM הוא סוג פופולרי של RNN. קרא פוסט זה למידע נוסף על LSTM.


טכנולוגיה - איך זה עובד

LSTMs נהדרים בלימוד רצפי אך מאטים הרבה כאשר מספר המדינות גדול מדי. יש תוצאות אמפיריות המרמזות שעדיף לבקש מ- LSTM ללמוד רצף ארוך מאשר רצף קצר של שיעורים רבים. טסראקט התפתח מדגם OCRopus בפיתון שהיה מזלג של LSMT ב- C ++, שנקרא CLSTM. CLSTM הוא יישום של מודל הרשת העצבים החוזרים LSTM ב- C ++, באמצעות ספריית Eigen לצורך חישובים מספריים.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python
תהליך OCR של Tesseract 3 מ- מאמר

Legacy Tesseract 3.x היה תלוי בתהליך הרב שלבי בו אנו יכולים להבדיל בין שלבים:

  • מציאת מילים
  • מציאת שורות
  • סיווג תווים

מציאת מילים נעשתה על ידי ארגון שורות טקסט לכתמים, והקווים והאזורים מנותחים לקבלת טקסט קבוע או טקסט יחסי. שורות טקסט מחולקות למילים בצורה שונה בהתאם לסוג מרווח התווים. ההכרה מתבצעת כתהליך דו-מעברי. בקטע הראשון נעשה ניסיון להכיר כל מילה בתורו. כל מילה שמשביעת רצון מועברת לסיווג אדפטיבי כנתוני אימונים. לאחר מכן, המסווג האדפטיבי מקבל סיכוי לזהות בצורה מדויקת יותר טקסט בהמשך העמוד.

המודרניזציה של הכלי Tesseract הייתה מאמץ על ניקוי קוד והוספת מודל LSTM חדש. תמונת הקלט מעובדת בקופסאות (מלבן) קו אחר שורה המוזנת במודל LSTM ומעניקה פלט. בתמונה למטה נוכל לדמיין כיצד זה עובד.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python
כיצד Tesseract משתמש במודל LSTM הצגה

לאחר הוספת כלי אימונים חדש והדרכת הדגם עם הרבה נתונים וגופנים, Tesseract משיג ביצועים טובים יותר. ובכל זאת, לא מספיק טוב כדי לעבוד על טקסט כתוב וגופנים מוזרים. אפשר לכוונן או לשנות מחדש את השכבות העליונות לניסוי.


מתקין Tesseract

התקנת טסרקט בחלונות קלה בעזרת הקבצים הבינאריים המורכבים מראש כאן. אל תשכח לערוך את המשתנה של הסביבה "נתיב" ולהוסיף נתיב tesseract. להתקנת לינוקס או מק הוא מותקן עם פקודות מעטות.

לאחר ההתקנה ודא שהכל עובד על ידי הקלדת הפקודה בטרמינל או ב- cmd:

$ tesseract --version

ותראה את הפלט הדומה ל:

tesseract 4.0.0
leptonica-1.76.0
libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.8
Found AVX2
Found AVX
Found SSE

אתה יכול להתקין את עטיפת הפיתון לטס-אפקט לאחר מכן באמצעות pip.
$ pip install pytesseract

ספריית Tesseract נשלחת עם כלי שורת פקודה שימושי הנקרא tesseract. אנו יכולים להשתמש בכלי זה לביצוע OCR על תמונות והפלט נשמר בקובץ טקסט. אם אנו רוצים לשלב את Tesseract בקוד C ++ או Python שלנו, אנו נשתמש ב- API של Tesseract.


מפעיל טסראקט עם CLI

התקשר אל מנוע Tesseract שעל התמונה תמונה_נתיב ולהמיר תמונה לטקסט, שנכתבו שורה אחר שורה בשורת הפקודה על ידי הקלדת הדברים הבאים:

$ tesseract image_path stdout

לכתיבת טקסט הפלט בקובץ:

$ tesseract image_path text_result.txt

כדי לציין את שם מודל השפה, כתוב קיצור דרך לשפה אחרי -l דגל, כברירת מחדל זה לוקח שפה אנגלית:

$ tesseract image_path text_result.txt -l eng

כברירת מחדל, Tesseract מצפה לעמוד טקסט כאשר הוא מפלח תמונה. אם אתה רק מבקש לבצע OCR אזור קטן, נסה מצב פילוח אחר, באמצעות ה –Psm טַעֲנָה. ישנם 14 מצבים זמינים שניתן למצוא כאן. כברירת מחדל, Tesseract אוטומציה מלאה של פילוח הדפים אך אינה מבצעת איתור התמצאות וזיהוי סקריפט. כדי לציין את הפרמטר, הקלד את הדברים הבאים:

$ tesseract image_path text_result.txt -l eng --psm 6

יש גם טיעון אחד חשוב יותר, מצב מנוע OCR (oem). ל- Tesseract 4 שני מנועי OCR - מנוע Legacy Tesseract ומנוע LSTM. ישנם ארבעה מצבי פעולה שנבחרו באמצעות האפשרות –oem.
0 מנוע מדור קודם בלבד.
1 מנוע LSTM רשתות עצביות בלבד.
2 מנועי Legacy + LSTM.
3 ברירת מחדל, על סמך מה שיש.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python
תוצאה של מנוע ה- Tesseract OCR

OCR עם Pytesseract ו- OpenCV

Pytesseract הוא עטיפה למנוע Tesseract-OCR. זה שימושי גם כתסריט הפקודה עצמאי לטס-אקט, שכן הוא יכול לקרוא את כל סוגי התמונות הנתמכות על ידי ספריות ההדמיה של הכרית ולפטוניקה, כולל jpeg, png, gif, bmp, tiff ואחרים. מידע נוסף על גישה לפיתון נקרא כאן. ניתן למצוא את הקוד ללימוד זה מאגר.

import cv2 import pytesseract img = cv2.imread('image.jpg') # Adding custom options
custom_config = r'--oem 3 --psm 6'
pytesseract.image_to_string(img, config=custom_config)

עיבוד מוקדם לטסרקט

כדי להימנע מכל הדרכים בהן יכול ליפול הדיוק של פלט ה- Tesseract, עליך לוודא שהתמונה מתאימה מעובד מראש.

זה כולל שינוי גודל, בינאריזציה, הסרת רעשים, הסרת שקע וכו '.

כדי לעבד מראש תמונה עבור OCR, השתמש באחת מהפונקציות הבאות לפיתון או עקוב אחר תיעוד OpenCV.

import cv2
import numpy as np img = cv2.imread('image.jpg') # get grayscale image
def get_grayscale(image): return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # noise removal
def remove_noise(image): return cv2.medianBlur(image,5) #thresholding
def thresholding(image): return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] #dilation
def dilate(image): kernel = np.ones((5,5),np.uint8) return cv2.dilate(image, kernel, iterations = 1) #erosion
def erode(image): kernel = np.ones((5,5),np.uint8) return cv2.erode(image, kernel, iterations = 1) #opening - erosion followed by dilation
def opening(image): kernel = np.ones((5,5),np.uint8) return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) #canny edge detection
def canny(image): return cv2.Canny(image, 100, 200) #skew correction
def deskew(image): coords = np.column_stack(np.where(image > 0)) angle = cv2.minAreaRect(coords)[-1] if angle < -45: angle = -(90 + angle) else: angle = -angle (h, w) = image.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) return rotated #template matching
def match_template(image, template): return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED) 

בואו נעבוד עם דוגמה כדי לראות דברים טוב יותר. כך נראית התמונה המקורית שלנו -

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python
מערכת הכתיבה אורבש

לאחר עיבוד מראש עם הקוד הבא

image = cv2.imread('aurebesh.jpg') gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)

ותכנון התמונות שהתקבלו, אנו מקבלים את התוצאות הבאות.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python
התמונה לאחר עיבוד מראש

הפלט של התמונה המקורית נראה כך -

GALACTIC BASIC
(AUREBESH) RE HFVMEVEIiZwoyv Ze
ABC DE F GH I JK LM
N—0- PQ RST Uv WX
2 | Ff 8 G& Pf fF § 5 op 7
ee
5, jf FF Ty ee ee
=
334 477 OED

כך נראה הפלט עבור תמונות מעובדות מראש שונות -

תמונת קצה של קאני (לא כל כך טובה) -

CAE Cn Cae AS
(AUREBESE) EA Na
oe SS
(Ne CI (ENE
a, ee oe ea
2
a a A: rc
|, |
a
Sear eo/e ecm emclomt Cia cuoomct mi im

תמונה מוגבלת -

GALACTIC BASIC
(AVREBESH)
RS 7FVMeEVEi1iFf o£
A B C D EF GH IJ K LM
AOoder7Nnvroroava
N O P Q@R S$ TU VW XK Y¥ Z
7 ee For 8 Ro Pf F Boao om #
0 12 3 4 5 6 7 8 9 , . !
>» 1kr7 @ by FEN
2? S$ ( Por Foy of ee
ASGSANDIE
CH AE EO KH NG OO SH TH

תמונת פתיחה -

GALACTIC BASIC
(AUREZEBELSH)
KEE VTMEUOU EB iw oN es
A BC D EF F @ H | J K LT Ww
AOGdrcrT7WTt HYOAVa4
WO P Q R BS T U VW WK y Z
i J
Oo 1 2 3 46 8 7 SC Ps,
VY ir- -rp,ptUuY?
a a a
AGoOAnNnoOID
CH AE BO KH ®@ OO SH TH


קבלת תיבות סביב טקסט

באמצעות Pytesseract, באפשרותך לקבל את פרטי תיבת הגבול עבור תוצאות ה- OCR שלך באמצעות הפרטים הבאים קוד.

הסקריפט שלמטה יתן לך מידע על תיבת הגבלה עבור כל תו שמזוהה על ידי tesseract במהלך OCR.

import cv2
import pytesseract img = cv2.imread('image.jpg') h, w, c = img.shape
boxes = pytesseract.image_to_boxes(img) for b in boxes.splitlines(): b = b.split(' ') img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

אם אתה רוצה תיבות סביב מילים במקום תווים, הפונקציה image_to_data יבוא שימושי. אתה יכול להשתמש ב- image_to_data פונקציה עם סוג פלט שצוין עם pytesseract Output.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python

יש לך בעיה ב- OCR? רוצים לספור חשבוניות, מסמכי PDF או לוחיות מספריות? ראש אל ננונטים ובנו דגמי OCR בחינם!


אנו נשתמש בתמונת החשבונית לדוגמא שלמעלה בכדי לבדוק את תפוקות הקטנות שלנו.

import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg') d = pytesseract.image_to_data(img, output_type=Output.DICT)
print(d.keys())

זה אמור לתת לך את הפלט הבא -
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])

בעזרת מילון זה אנו יכולים לאתר כל מילה, מידע על תיבת הגבול שלהם, הטקסט בהם וציוני הביטחון עבור כל אחת מהן.

אתה יכול לשרטט את התיבות באמצעות הקוד למטה -

n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

כך זה ייראה עבור התמונה של חשבונית לדוגמה.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python


התאמת תבנית טקסט

קח את הדוגמא של ניסיון למצוא היכן נמצא תאריך בתמונה. כאן התבנית שלנו תהיה דפוס ביטוי רגיל שאנו נתאים לתוצאות ה- OCR שלנו כדי למצוא את תיבות הגבול המתאימות. אנו נשתמש ב- regex מודול ו image_to_data פונקציה לכך.

import re
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys()) date_pattern = '^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)dd$' n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: if re.match(date_pattern, d['text'][i]): (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

כצפוי, אנו מקבלים תיבה אחת סביב תאריך החשבונית בתמונה.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python

מצבי פילוח עמודים

ישנן כמה דרכים בהן ניתן לנתח דף טקסט. ה- api tesseract מספק מספר מצבי פילוח עמודים אם ברצונך להריץ OCR רק באזור קטן או בכיוונים שונים וכו '.

הנה רשימה של מצבי פילוח העמודים הנתמכים לפי tesseract -

0 כיוון וזיהוי סקריפטים (OSD) בלבד.
1 פילוח עמודים אוטומטי עם OSD.
2 פילוח עמודים אוטומטי, אך ללא OSD או OCR.
3 פילוח עמודים אוטומטי לחלוטין, אך ללא OSD. (בְּרִירַת מֶחדָל)
4 נניח עמודה אחת של טקסט בגדלים משתנים.
5 נניח חסימה אחידה אחת של טקסט מיושר אנכית.
6 נניח גוש טקסט אחיד יחיד.
7 התייחס לתמונה כאל קו טקסט יחיד.
8 התייחס לתמונה כמילה אחת.
9 התייחס לתמונה כמילה אחת במעגל.
10 התייחס לתמונה כאל דמות אחת.
11 טקסט דליל. מצא כמה שיותר טקסט ללא סדר מסוים.
12 טקסט דליל עם OSD.
13 קו גולמי. התייחס לתמונה כאל קו טקסט יחיד, תוך עקיפת פריצות ספציפיות לטסרקט.

לשינוי מצב פילוח העמודים שלך, שנה את --psm טיעון במחרוזת התצורה המותאמת אישית שלך לכל אחד מקודי המצב שצוינו לעיל.


גלה כיוון ותסריט

אתה יכול לזהות את כיוון הטקסט בתמונה שלך וגם את הסקריפט בו הוא כתוב. התמונה הבאה -
כיצד לבצע OCR עם Tesseract, OpenCV ו-Python
לאחר שעבר על הקוד הבא -

osd = pytesseract.image_to_osd(img)
angle = re.search('(?<=Rotate: )d+', osd).group(0)
script = re.search('(?<=Script: )d+', osd).group(0)
print("angle: ", angle)
print("script: ", script)

ידפיס את הפלט הבא.

angle: 90
script: Latin

אתר ספרות בלבד

קח לדוגמה את התמונה הזו -
כיצד לבצע OCR עם Tesseract, OpenCV ו-Python
הטקסט שחולץ מתמונה זו נראה כך.

‘Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no 43876324
Dated 17%h Nov2018
Pono 76496234

ניתן לזהות רק ספרות על ידי שינוי התצורה לדברים הבאים

custom_config = r'--oem 3 --psm 6 outputbase digits'
print(pytesseract.image_to_string(img, config=custom_config))

הפלט ייראה כך.

-- . 43876324
172018
0 76496234

תווים ברשימת ההיתרים

נניח שאתה רוצה רק לאתר תווים מסוימים מהתמונה הנתונה ולהתעלם מהשאר. אתה יכול לציין את רשימת התווים הלבנה שלך (כאן השתמשנו בכל התווים הקטנים מ- a עד z בלבד) באמצעות התצורה הבאה.

custom_config = r'-c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyz --psm 6'
print(pytesseract.image_to_string(img, config=custom_config))

תפוקה -

customername
roject
tnvoleeno
ated alliumenergyservices
e
thovo

תווים ברשימה השחורה

אם אתה בטוח שחלק מהתווים או הביטויים בהחלט לא יופיעו בטקסט שלך (ה- OCR יחזיר טקסט שגוי במקום תווים ברשימה שחורה אחרת), אתה יכול לרשום את התווים האלה באמצעות התצורה הבאה.

custom_config = r'-c tessedit_char_blacklist=0123456789 --psm 6'
pytesseract.image_to_string(img, config=custom_config)

תפוקה -

Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no
Dated %h Nov%
Pono

זהה במספר שפות

אתה יכול לבדוק את השפות הזמינות על ידי הקלדת זה בטרמינל

$ tesseract --list-langs

להורדת tesseract לשימוש שפה ספציפי

$ sudo apt-get install tesseract-ocr-LANG

כאשר LANG הוא קוד שלוש האותיות בשפה שאתה צריך. אתה יכול לגלות את ערכי LANG כאן.

ניתן להוריד את .traindata קובץ לשפה שאתה צריך ממנה כאן ולמקם אותו $TESSDATA_PREFIX ספרייה (זה אמור להיות זהה למקום בו tessdata ספרייה מותקנת) והיא אמורה להיות מוכנה לשימוש.

הערות - רק שפות שיש להן .traineddata פורמט הקובץ נתמך על ידי tesseract.

כדי לציין את השפה בה אתה זקוק לפלט ה- OCR שלך, השתמש ב- -l LANG טיעון בתצורה שבה LANG הוא קוד האות בן 3 אותיות באיזו שפה אתה רוצה להשתמש.

custom_config = r'-l eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

קח לדוגמה את התמונה הזו -
כיצד לבצע OCR עם Tesseract, OpenCV ו-Python
אתה יכול לעבוד עם מספר שפות על ידי שינוי הפרמטר LANG ככזה -

custom_config = r'-l grc+tha+eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

ותקבל את הפלט הבא -

Here’s some Greek: Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ. 6 Thai Here’s some Thai: ν᾿ ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส

הערות - השפה שצוינה תחילה ל- -l הפרמטר הוא השפה הראשית.

למרבה הצער ל- Tesseract אין תכונה לגילוי שפת הטקסט בתמונה באופן אוטומטי. פיתרון חלופי ניתן על ידי מודול פייתון אחר הנקרא langdetect אשר ניתן להתקין באמצעות pip.

$ pip install langdetect

מודול זה שוב, אינו מגלה את שפת הטקסט באמצעות תמונה אלא זקוק לקלט מחרוזת כדי לאתר את השפה ממנה. הדרך הטובה ביותר לעשות זאת היא באמצעות תחילה להשתמש ב- tesseract כדי לקבל טקסט OCR בכל השפות שתרגישו שם, באמצעות langdetect כדי למצוא אילו שפות כלולות בטקסט OCR ואז להפעיל שוב את OCR עם השפות שנמצאו.

נניח שיש לנו טקסט שחשבנו שהוא באנגלית ובפורטוגזית.

custom_config = r'-l eng+por --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config) from langdetect import detect_langs
detect_langs(txt)

זה אמור להוציא רשימת שפות בטקסט וההסתברויות שלהן.

[en:0.714282468983554, es:0.2857145605644145]

קודי השפה בהם משתמש langdetect עקוב אחר קודי ISO 639-1. להשוואה, אנא בדקו זֶה ו זֶה. אנו מגלים כי השפה המשמשת בטקסט היא אנגלית וספרדית במקום.

אנו מקבלים את הטקסט שוב ​​על ידי שינוי התצורה ל

custom_config = r'-l eng+spa --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)

הערות – Tesseract מתפקד בצורה גרועה כאשר בתמונה עם מספר שפות, השפות שצוינו בתצורה שגויות או אינן מוזכרות כלל. זה יכול להטעות לא מעט את מודול langdetect גם כן.


באמצעות tessdata_fast

אם המהירות מהווה דאגה מרכזית עבורך, אתה יכול להחליף את דגמי שפת ה- Tessdata במודלים של Tessdata_fast שהם גרסאות שלמות של 8 סיביות של דגמי ה- Tessdata.

על פי ה- tessdata_fast GitHub -

מאגר זה מכיל גרסאות שלמות מהירות של דגמים מאומנים עבור מנוע OCR של קוד פתוח Tesseract.

דגמים אלו עובדים רק עם מנוע ה- LSTM OCR של Tesseract 4.

  • אלו הם פשרה על מהירות/דיוק לגבי מה שהציע את ה"תמורה לכסף" הטובה ביותר מבחינת מהירות מול דיוק.
  • עבור שפות מסוימות זה עדיין הטוב ביותר, אך לרוב לא.
  • תצורת הרשת "התמורה הטובה ביותר לכסף" הוכללה לאחר מכן עבור מהירות נוספת.
  • רוב המשתמשים ירצו להשתמש בקבצי הנתונים המאומנים האלה כדי לבצע OCR ואלה יישלחו כחלק מהפצות לינוקס, למשל. אובונטו 18.04.
  • כוונון עדין / אימון מצטבר לא להיות אפשרי מאלה fast דגמים, מכיוון שהם מספר שלם של 8 סיביות.
  • בעת השימוש בדגמים במאגר זה, רק מנוע ה- OCR מבוסס LSTM נתמך. המורשת tesseract מנוע אינו נתמך עם קבצים אלה, כך שמצבי ה-oem של Tesseract '0' ו-'2' לא יעבדו איתם.

להשתמש tessdata_fast דגמים במקום tessdataכל מה שאתה צריך לעשות זה להוריד את ה- tessdata_fast קובץ נתוני שפה מ- כאן ולמקם אותו בתוך שלך $TESSDATA_PREFIX במדריך.


צריך דיגיטציה של מסמכים, קבלות או חשבוניות אבל עצלן מכדי לקוד? ראש אל ננונטים ובנו דגמי OCR בחינם!


הדרכת טסרקט על נתונים מותאמים אישית

Tesseract 4.00 כולל מנוע זיהוי עצבי חדש מבוסס רשת המספק דיוק גבוה משמעותית בתמונות של מסמכים. רשתות עצביות דורשות נתוני אימונים באופן משמעותי ומתאמנים הרבה יותר לאט מאשר Tesseract בבסיס. עבור שפות מבוססות לטינית, נתוני הדגם הקיימים שסופקו הוכשרו על כ -400000 שורות טקסט המשתרעות על כ- 4500 גופנים.

כדי להריץ בהצלחה את הדרכת ההדרכה Tesseract 4.0 LSTM, אתה צריך להתקין עבודה של כלי ההדרכה Tesseract 4 ו- Tesseract 4, וכן יש את סקריפט ההדרכה וקבצי נתונים הדרושים בספריות מסוימות. לְבַקֵר ריפו github לקבצים וכלים.

Tesseract 4.00 לוקח כמה ימים עד שבועיים לאימונים מאפס. אפילו עם כל נתוני האימונים החדשים הללו, לכן הנה כמה אפשרויות לאימונים:

  • לכוונן - החל משפה מיומנת קיימת, אימן על הנתונים הנוספים הספציפיים שלך. לדוגמא הדרכה על מערך נתונים בכתב יד וכמה גופנים נוספים.
  • חותכים את השכבה העליונה - מהרשת ואימון מחדש של שכבה עליונה חדשה באמצעות הנתונים החדשים. אם כוונון עדין לא עובד, סביר להניח שזו האפשרות הטובה הבאה. האנלוגיה למה זה שימושי, קחו למשל מודלים שהוכשרו על מערך הנתונים של ImageNet. המטרה היא לבנות מסווג חתול או כלב, שכבות נמוכות במודל טובות בהפשטה ברמה נמוכה כמו פינות, קווים אופקיים ואנכיים, אך שכבות גבוהות יותר במודל משלבות את התכונות הללו ומזהות אוזניים, עיניים, אף של חתול או כלב וכולי. על ידי אימון מחדש רק בשכבות העליונות אתה משתמש בידע משכבות נמוכות יותר ומשלב עם מערך הנתונים החדש והשונה שלך.
  • התאפקו מאפס - זו גישה איטית מאוד אלא אם כן יש לך הכשרה מאוד ייצוגית וגדולה מספיק לבעיה שלך. המשאב הטוב ביותר לאימונים מאפס הוא ביצוע זה ריפו github.

מדריך כיצד להתאמן על הנתונים המותאמים אישית שלך וליצור .traineddata ניתן למצוא קבצים כאן, כאן ו כאן.

לא נכסה את הקוד להכשרה באמצעות Tesseract בפוסט הבלוג הזה.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python

מגבלות טסרקט

טסראקט פועל בצורה הטובה ביותר כאשר יש פילוח נקי של טקסט חזית מהרקע. בפועל, זה יכול להיות מאתגר ביותר להבטיח סוגים אלה של התקנה. ישנן מגוון סיבות לכך שאינך מקבל פלט באיכות טובה מ- Tesseract כמו אם בתמונה יש רעש על הרקע. ככל שאיכות התמונה טובה יותר (גודל, ניגודיות, ברק) כך תוצאת ההכרה טובה יותר. זה דורש מעט עיבוד מוקדם כדי לשפר את תוצאות ה- OCR, תמונות צריכות להיות בקנה מידה מתאים, לקבל ניגודיות גבוהה ככל האפשר, והטקסט צריך להיות מיושר אופקית. Tesseract OCR הוא די חזק אך אכן יש את המגבלות הבאות.

מגבלות טסראקט שהוסכמו ברשימה.

  • ה- OCR אינו מדויק כמו כמה פתרונות מסחריים העומדים לרשותנו.
  • לא מסתדר עם תמונות המושפעות מחפצים כולל חסימה חלקית, פרספקטיבה מעוותת ורקע מורכב.
  • הוא אינו מסוגל לזהות את כתב היד.
  • הוא עלול למצוא ג'יבריש ולדווח על כך כפלט OCR.
  • אם מסמך מכיל שפות מחוץ לשפות המוצגות בטיעוני -l LANG, התוצאות עשויות להיות גרועות.
  • לא תמיד זה טוב לנתח את סדר הקריאה הטבעי של מסמכים. לדוגמה, הוא עלול שלא להכיר בכך שמסמך מכיל שתי עמודות, ועשוי לנסות לחבר טקסט על פני עמודות.
  • סריקות באיכות ירודה עשויות לייצר OCR באיכות ירודה.
  • זה לא חושף מידע על איזה טקסט של משפחת גופנים שייכים.


יש כמובן דרך טובה יותר, הרבה יותר פשוטה ואינטואיטיבית לביצוע משימות OCR.


OCR עם Nanonets

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python

השמיים ממשק ה- API של Nanonets OCR מאפשר לך לבנות דגמי OCR בקלות. אינך צריך לדאוג מעיבוד מוקדם של התמונות שלך או לדאוג מתבניות תואמות או לבנות מנועים מבוססי כללים כדי להגדיל את הדיוק של דגם ה- OCR שלך.

אתה יכול להעלות את הנתונים שלך, להעיר אותם, להגדיר את המודל להתאמן ולהמתין לקבלת תחזיות דרך ממשק משתמש מבוסס דפדפן מבלי לכתוב שורת קוד אחת, לדאוג ל- GPUs או למצוא את הארכיטקטורות המתאימות למודלי הלמידה העמוקה שלך. תוכל גם לרכוש את תגובות JSON מכל חיזוי כדי לשלב אותה במערכות שלך ולבנות אפליקציות המופעלות על ידי למידת מכונות הבנויות על אלגוריתמים מהמתקדמים ותשתית חזקה.

באמצעות GUI: https://app.nanonets.com/

באפשרותך להשתמש בממשק ה- API של Nanonets-OCR על ידי ביצוע השלבים שלהלן: ‌

שלב 1: שיבט את ה- Repo, התקן תלות

git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm

שלב 2: השג את מפתח ה- API החינמי שלך
השג את מפתח ה- API שלך בחינם http://app.nanonets.com/#/keys

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python

שלב 3: הגדר את מפתח ה- API כמשתנה לסביבה

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

שלב 4: צור דגם חדש

python ./code/create-model.py

הערה: זה מייצר MODEL_ID הדרוש לך לשלב הבא

שלב 5: הוסף מזהה מודל כמשתנה לסביבה

export NANONETS_MODEL_ID=YOUR_MODEL_ID

הערה: תקבל את YOUR_MODEL_ID מהצעד הקודם

שלב 6: העלה את נתוני ההדרכה
נתוני האימונים נמצאים ב- images (קבצי תמונות) ו- annotations (הערות לקבצי התמונה)

python ./code/upload-training.py

שלב 7: דגם הרכבת
לאחר העלאת התמונות, התחל לאמן את הדגם

python ./code/train-model.py

שלב 8: קבל מצב דגם
הדגם לוקח ~ שעתיים לאימונים. תקבל דוא"ל ברגע שהמודל יוכשר. בינתיים אתה בודק את מצב הדגם

python ./code/model-state.py

שלב 9: עשה חיזוי
ברגע שהמודל מאומן. אתה יכול לבצע תחזיות באמצעות המודל

python ./code/prediction.py ./images/151.jpg


ננוטות ובני אדם בלולאה

‌‌המסך 'מתון' מסייע לתהליכי התיקון והכניסה ומפחית את עומס העבודה של הבודק הידני בכמעט 90% ומפחית את העלויות ב-50% עבור הארגון.

כיצד לבצע OCR עם Tesseract, OpenCV ו-Python

התכונות כוללות

  1. עקוב אחר תחזיות נכונות
  2. עקוב אחר אלו שגויים
  3. בצע תיקונים לא מדויקים
  4. מחק את אלה שגויים
  5. מלא את התחזיות החסרות
  6. סנן תמונות עם טווחי תאריכים
  7. קבל ספירות של תמונות מנוהלות לעומת תמונות שלא הונחו

כל השדות מובנים כ- GUI קל לשימוש המאפשר למשתמש לנצל את הטכנולוגיה של ה- OCR ולסייע בשיפורו ככל שיהיה, מבלי שיצטרך להקליד קוד כלשהו או להבין כיצד הטכנולוגיה עובדת.


יש לכם בראש בעיית OCR? רוצה להפחית את עלויות הזנת הנתונים של הארגון שלך? פנה אל ננונטים ולבנות מודלים של OCR לחלץ טקסט מתמונות or לחלץ נתונים מקובצי PDF!


סיכום

בדיוק כפי שלמידה עמוקה השפיעה על כמעט כל היבט של ראיית מחשב, הדבר נכון גם לגבי זיהוי תווים וזיהוי כתב יד. מודלים מבוססי למידה עמוקה הצליחו להשיג דיוק חסר תקדים בזיהוי טקסט, הרבה מעבר למסורתי מיצוי מידע ו עיבוד תמונה למידת מכונה גישות.

טסראקט מציגה ביצועים טובים כאשר תמונות המסמכים פועלות לפי ההנחיות הבאות:

  • נקה פילוח של טקסט חזית מהרקע
  • מיושרים אופקית וקבוצתיים בהתאם
  • תמונה באיכות גבוהה ללא טשטוש ורעש

המהדורה האחרונה של Tesseract 4.0 תומכת ב- OCR מבוסס למידה מעמיקה המדויקת באופן משמעותי. מנוע ה- OCR עצמו בנוי על רשת זיכרון ארוך טווח (LSTM), מעין רשת עצבית חוזרת (RNN).

Tesseract מושלם לסריקת מסמכים נקיים ומגיע עם די די גבוה ושונות גופנים מכיוון שההכשרה שלו הייתה מקיפה. הייתי אומר שטסרקט הוא כלי עבודה אם המשימה שלך היא סריקת ספרים, מסמכים וטקסט מודפס על רקע לבן ונקי.


לקריאה נוספת

עדכון:
הרבה אנשים שאלו אותנו איך הם יכולים לקבל תאריך בצורה של טקסט או שימוש כאשר הוא מזהה תאריך או כל מידע ספציפי אחר כדי שיוכלו לצרף לרשימה.
הנה התשובה:
בקוד לצייר תיבה תוחמת מסביב לתיבת התאריך, תבחין בקו התואם לתבנית הביטוי הרגולרי עם d['text']. זה מצייר תיבה רק אם התבנית תואמת. אתה יכול פשוט לחלץ מהם את הערכים d['text'] ברגע שהתבנית תואמת וצרף אותם לרשימה.

עדכון 2:
כדי להתייחס לשאלות בנושא OCR שאינו אנגלי, עדכנו רשימות קריאה נוספות.

בול זמן:

עוד מ AI & Machine Learning