בפוסט בבלוג זה ננסה להסביר את הטכנולוגיה העומדת מאחורי מנוע ה- Tesseract הנפוץ ביותר ששודרג עם הידע האחרון שנחקר בזיהוי תווים אופטי. מאמר זה ישמש גם כמדריך / הדרכה כיצד ליישם OCR בפיתון באמצעות מנוע Tesseract. אנו נעבור בין המודולים הבאים:
- תכונות OCR של טסראקט
- עיבוד מוקדם של OCR באמצעות OpenCV
- מפעיל טסראקט עם CLI ופייתון
- מגבלות של מנוע Tesseract
תוכן העניינים
- מבוא
- כלי OCR בקוד פתוח
- Tesseract OCR
- OCR עם Pytesseract ו- OpenCV
- הדרכת טסרקט על נתונים מותאמים אישית
- מגבלות טסרקט
- OCR עם Nanonets
- סיכום
מבוא
OCR = זיהוי תווים אופטי. במילים אחרות, מערכות OCR הופכות תמונה דו מימדית של טקסט, שיכולה להכיל טקסט מודפס או בכתב יד מייצוג התמונה שלה לטקסט קריא במכונה. OCR כתהליך מורכב בדרך כלל ממספר תהליכי משנה לביצוע מדויק ככל האפשר. תהליכי המשנה הם:
- עיבוד מראש של התמונה
- לוקליזציה של טקסט
- פילוח תווים
- זיהוי תווים
- לאחר עיבוד
תהליכי המשנה ברשימה שלמעלה כמובן יכולים להיות שונים, אך אלה הם שלבים בערך הדרושים כדי להתקרב לזיהוי תווים אוטומטי. בתוכנת OCR, המטרה העיקרית היא לזהות ולתפוס את כל המילים הייחודיות בשפות שונות מתווי טקסט כתובים.
במשך כמעט שני עשורים, נעשה שימוש נרחב במערכות זיהוי תווים אופטי כדי לספק הזנת טקסט אוטומטית למערכות ממוחשבות. עם זאת, בכל הזמן הזה, מערכות OCR קונבנציונליות (כמו OCR אזורי) מעולם לא התגברו על חוסר היכולת שלהם לקרוא יותר מקומץ של גופנים ופורמטים של דפים. סוג מרווח פרופורציונלי (הכולל כמעט את כל העותקים), גופני מדפסת לייזר, ואפילו גופנים לא פרופורציונליים רבים של מכונות כתיבה, נותרו מחוץ להישג ידן של מערכות אלו. וכתוצאה מכך, OCR קונבנציונלי מעולם לא השיג יותר מאשר השפעה שולית על המספר הכולל של המסמכים הזקוקים להמרה לצורה דיגיטלית.
מנועי OCR מהדור הבא מתמודדים עם הבעיות הללו שהוזכרו לעיל ממש טובות על ידי שימוש במחקר העדכני ביותר בתחום הלמידה העמוקה. על ידי מינוף השילוב של דגמים עמוקים ומערכות נתונים ענקיות הזמינות לציבור, דגמים משיגים דיוק עדכני במשימות הנתונות. בימינו אפשר גם ליצור נתונים סינתטיים עם גופנים שונים המשתמשים ברשתות אדפרסריות generative ומעט גישות יצירתיות אחרות.
זיהוי תווים אופטיים נותר א בעיה מאתגרת כאשר טקסט מופיע בסביבות בלתי מוגבלות, כמו סצינות טבעיות, בגלל עיוותים גיאומטריים, רקע מורכב וגופנים מגוונים. הטכנולוגיה עדיין מחזיקה בפוטנציאל עצום בגלל מקרי השימוש השונים של OCR מבוסס למידה עמוקה כמו
יש לכם בראש בעיית OCR? רוצה להפחית את עלויות הזנת הנתונים של הארגון שלך? פנה אל ננונטים ולבנות מודלים של OCR לחלץ טקסט מתמונות or לחלץ נתונים מקובצי PDF עם AI מבוסס PDF OCR!
כלי OCR בקוד פתוח
יש הרבה זיהוי תווים אופטי תוכנה זמינה. לא מצאתי השוואה איכותית ביניהם, אבל אכתוב על כמה מהם שנראים הכי ידידותיים למפתחים.
טסרקט - מנוע OCR עם קוד פתוח שצבר פופולריות בקרב מפתחי OCR. למרות שזה יכול להיות כואב ליישם ולשנות לפעמים, לא היו יותר מדי אלטרנטיבות חינמיות OCR חינמיות וחזקות ביותר בשוק. טסרקט החל כדוקטורט. פרויקט מחקר במעבדות HP, בריסטול. זה זכה לפופולריות רבה ופותח על ידי HP בין השנים 1984 ל -1994. בשנת 2005 פרסמה HP את Tesseract כתוכנת קוד פתוח. מאז 2006 הוא פותח על ידי גוגל.
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 תואם לשפות תכנות ומסגרות רבות באמצעות עטיפות שניתן למצוא כאן. ניתן להשתמש בו עם ניתוח הפריסה הקיים כדי לזהות טקסט בתוך מסמך גדול, או להשתמש בו יחד עם גלאי טקסט חיצוני כדי לזהות טקסט מתמונה של שורת טקסט אחת.
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 לצורך חישובים מספריים.
Legacy Tesseract 3.x היה תלוי בתהליך הרב שלבי בו אנו יכולים להבדיל בין שלבים:
- מציאת מילים
- מציאת שורות
- סיווג תווים
מציאת מילים נעשתה על ידי ארגון שורות טקסט לכתמים, והקווים והאזורים מנותחים לקבלת טקסט קבוע או טקסט יחסי. שורות טקסט מחולקות למילים בצורה שונה בהתאם לסוג מרווח התווים. ההכרה מתבצעת כתהליך דו-מעברי. בקטע הראשון נעשה ניסיון להכיר כל מילה בתורו. כל מילה שמשביעת רצון מועברת לסיווג אדפטיבי כנתוני אימונים. לאחר מכן, המסווג האדפטיבי מקבל סיכוי לזהות בצורה מדויקת יותר טקסט בהמשך העמוד.
המודרניזציה של הכלי Tesseract הייתה מאמץ על ניקוי קוד והוספת מודל LSTM חדש. תמונת הקלט מעובדת בקופסאות (מלבן) קו אחר שורה המוזנת במודל 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 עם 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)
בואו נעבוד עם דוגמה כדי לראות דברים טוב יותר. כך נראית התמונה המקורית שלנו -
לאחר עיבוד מראש עם הקוד הבא
image = cv2.imread('aurebesh.jpg') gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)
ותכנון התמונות שהתקבלו, אנו מקבלים את התוצאות הבאות.
הפלט של התמונה המקורית נראה כך -
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? רוצים לספור חשבוניות, מסמכי 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 שלנו כדי למצוא את תיבות הגבול המתאימות. אנו נשתמש ב- 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)
כצפוי, אנו מקבלים תיבה אחת סביב תאריך החשבונית בתמונה.
מצבי פילוח עמודים
ישנן כמה דרכים בהן ניתן לנתח דף טקסט. ה- 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
טיעון במחרוזת התצורה המותאמת אישית שלך לכל אחד מקודי המצב שצוינו לעיל.
גלה כיוון ותסריט
אתה יכול לזהות את כיוון הטקסט בתמונה שלך וגם את הסקריפט בו הוא כתוב. התמונה הבאה -
לאחר שעבר על הקוד הבא -
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
אתר ספרות בלבד
קח לדוגמה את התמונה הזו -
הטקסט שחולץ מתמונה זו נראה כך.
‘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)
קח לדוגמה את התמונה הזו -
אתה יכול לעבוד עם מספר שפות על ידי שינוי הפרמטר 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 בפוסט הבלוג הזה.
מגבלות טסרקט
טסראקט פועל בצורה הטובה ביותר כאשר יש פילוח נקי של טקסט חזית מהרקע. בפועל, זה יכול להיות מאתגר ביותר להבטיח סוגים אלה של התקנה. ישנן מגוון סיבות לכך שאינך מקבל פלט באיכות טובה מ- Tesseract כמו אם בתמונה יש רעש על הרקע. ככל שאיכות התמונה טובה יותר (גודל, ניגודיות, ברק) כך תוצאת ההכרה טובה יותר. זה דורש מעט עיבוד מוקדם כדי לשפר את תוצאות ה- OCR, תמונות צריכות להיות בקנה מידה מתאים, לקבל ניגודיות גבוהה ככל האפשר, והטקסט צריך להיות מיושר אופקית. Tesseract OCR הוא די חזק אך אכן יש את המגבלות הבאות.
מגבלות טסראקט שהוסכמו ברשימה.
- ה- OCR אינו מדויק כמו כמה פתרונות מסחריים העומדים לרשותנו.
- לא מסתדר עם תמונות המושפעות מחפצים כולל חסימה חלקית, פרספקטיבה מעוותת ורקע מורכב.
- הוא אינו מסוגל לזהות את כתב היד.
- הוא עלול למצוא ג'יבריש ולדווח על כך כפלט OCR.
- אם מסמך מכיל שפות מחוץ לשפות המוצגות בטיעוני -l LANG, התוצאות עשויות להיות גרועות.
- לא תמיד זה טוב לנתח את סדר הקריאה הטבעי של מסמכים. לדוגמה, הוא עלול שלא להכיר בכך שמסמך מכיל שתי עמודות, ועשוי לנסות לחבר טקסט על פני עמודות.
- סריקות באיכות ירודה עשויות לייצר OCR באיכות ירודה.
- זה לא חושף מידע על איזה טקסט של משפחת גופנים שייכים.
יש כמובן דרך טובה יותר, הרבה יותר פשוטה ואינטואיטיבית לביצוע משימות OCR.
OCR עם Nanonets
השמיים ממשק ה- 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
שלב 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% עבור הארגון.
התכונות כוללות
- עקוב אחר תחזיות נכונות
- עקוב אחר אלו שגויים
- בצע תיקונים לא מדויקים
- מחק את אלה שגויים
- מלא את התחזיות החסרות
- סנן תמונות עם טווחי תאריכים
- קבל ספירות של תמונות מנוהלות לעומת תמונות שלא הונחו
כל השדות מובנים כ- GUI קל לשימוש המאפשר למשתמש לנצל את הטכנולוגיה של ה- OCR ולסייע בשיפורו ככל שיהיה, מבלי שיצטרך להקליד קוד כלשהו או להבין כיצד הטכנולוגיה עובדת.
יש לכם בראש בעיית OCR? רוצה להפחית את עלויות הזנת הנתונים של הארגון שלך? פנה אל ננונטים ולבנות מודלים של OCR לחלץ טקסט מתמונות or לחלץ נתונים מקובצי PDF!
סיכום
בדיוק כפי שלמידה עמוקה השפיעה על כמעט כל היבט של ראיית מחשב, הדבר נכון גם לגבי זיהוי תווים וזיהוי כתב יד. מודלים מבוססי למידה עמוקה הצליחו להשיג דיוק חסר תקדים בזיהוי טקסט, הרבה מעבר למסורתי מיצוי מידע ו עיבוד תמונה למידת מכונה גישות.
טסראקט מציגה ביצועים טובים כאשר תמונות המסמכים פועלות לפי ההנחיות הבאות:
- נקה פילוח של טקסט חזית מהרקע
- מיושרים אופקית וקבוצתיים בהתאם
- תמונה באיכות גבוהה ללא טשטוש ורעש
המהדורה האחרונה של Tesseract 4.0 תומכת ב- OCR מבוסס למידה מעמיקה המדויקת באופן משמעותי. מנוע ה- OCR עצמו בנוי על רשת זיכרון ארוך טווח (LSTM), מעין רשת עצבית חוזרת (RNN).
Tesseract מושלם לסריקת מסמכים נקיים ומגיע עם די די גבוה ושונות גופנים מכיוון שההכשרה שלו הייתה מקיפה. הייתי אומר שטסרקט הוא כלי עבודה אם המשימה שלך היא סריקת ספרים, מסמכים וטקסט מודפס על רקע לבן ונקי.
לקריאה נוספת
- הדגם המאומן ביותר עבור LSTM Tesseract 4.0
- גישת Dropbox ל-OCR 4.2017
- סקירה כללית של Tesseract OCR Engine Legacy
- פורום למפתחי Tesseract
- פורום למשתמשי Tesseract
- השוואה של דיוק OCR בספרים מודפסים מוקדמים באמצעות ה
מנועי קוד פתוח Calamari ו-OCRopus - OCR יעיל, ללא לקסיקון באמצעות Deep Learning
- התאמת מנועי OCR במערכות מיצוי מידע - הערכה השוואתית
- DeepText Benchmark
- רשימת פרויקטים של OCR
- הגרסה האחרונה של Tesseract Github
- CVPR 2019 - מודעות לאזור תווים לזיהוי טקסט (CRAFT)
- כרטיס אשראי OCR עם OpenCV ו-Python
- עיבוד מקדים של תמונה
- עיבוד מקדים של תמונה ב-OpenCV
- OCR באמצעות Tesseract על Raspberry Pi
- Tesseract OCR לשפות שאינן אנגלית
- כיצד לבצע OCR משורת הפקודה של לינוקס באמצעות Tesseract
- סקירה כללית של מנוע ה- Tesseract OCR
עדכון:
הרבה אנשים שאלו אותנו איך הם יכולים לקבל תאריך בצורה של טקסט או שימוש כאשר הוא מזהה תאריך או כל מידע ספציפי אחר כדי שיוכלו לצרף לרשימה.
הנה התשובה:
בקוד לצייר תיבה תוחמת מסביב לתיבת התאריך, תבחין בקו התואם לתבנית הביטוי הרגולרי עםd['text']
. זה מצייר תיבה רק אם התבנית תואמת. אתה יכול פשוט לחלץ מהם את הערכיםd['text']
ברגע שהתבנית תואמת וצרף אותם לרשימה.
עדכון 2:
כדי להתייחס לשאלות בנושא OCR שאינו אנגלי, עדכנו רשימות קריאה נוספות.
- 100
- 2019
- 7
- 9
- אודות
- פי
- מדויק
- הושג
- לרכוש
- לרוחב
- נוסף
- כתובת
- יתרון
- AI
- איידס
- אלגוריתמים
- תעשיות
- מאפשר
- בין
- אנליזה
- אחר
- API
- גישה
- אפליקציות
- AREA
- טיעונים
- סביב
- אמנות
- מאמר
- אוטומטי
- זמין
- מודעות
- להיות
- הטוב ביותר
- קצת
- בלוג
- ספרים
- גבול
- אריזה מקורית
- דפדפן
- לִבנוֹת
- מובנה
- יכול לקבל
- CD
- שינוי
- מעגל
- טענות
- ניקוי
- CNN
- קוד
- אוסף
- טור
- שילוב
- מסחרי
- חברות
- מורכב
- אמון
- תְצוּרָה
- בלבול
- מכיל
- המרה
- תיקונים
- עלויות
- יכול
- זוג
- נתונים
- עסקה
- זוהה
- איתור
- קביעה
- מפותח
- מפתחים
- צעצועי התפתחות
- DID
- נבדלים
- אחר
- דיגיטלי
- דיגיטציה
- ספרות
- מסמכים
- מטה
- ירידה
- Dropbox
- מוקדם
- אדג '
- אמייל
- נקודת קצה
- אנרגיה
- אנגלית
- סביבה
- הכל
- דוגמה
- צפוי
- מצפה
- משפחה
- מהר
- מאפיין
- תכונות
- שדות
- ראשון
- תזרים
- לעקוב
- הבא
- מזלג
- טופס
- פוּרמָט
- צורות
- מצא
- חופשי
- פונקציה
- מקבל
- Git
- GitHub
- נתינה
- מטרה
- טוב
- אפור
- גוונים אפורים
- גדול
- מדריך
- הנחיות
- פריצות
- יש
- ראש
- כאן
- גָבוֹהַ
- מחזיק
- איך
- איך
- HTTPS
- עצום
- בני אדם
- לזהות
- תמונה
- פְּגִיעָה
- ליישם
- חשוב
- לשפר
- באחר
- כלול
- כולל
- להגדיל
- מידע
- מידע
- תשתית
- לשלב
- אינטואיטיבי
- IT
- להצטרף
- מפתח
- מפתחות
- ידע
- ידוע
- מעבדות
- שפה
- שפות
- גָדוֹל
- האחרון
- לִלמוֹד
- למידה
- סִפְרִיָה
- רישיון
- ברק
- קו
- לינוקס
- רשימה
- רשימות
- ארוך
- מק
- מכונה
- למידת מכונה
- גדול
- עשייה
- מדריך ל
- שוק
- להתאים
- זכרון
- אכפת לי
- מודל
- מודלים
- רוב
- רשת
- מבוסס רשת
- רשתות
- רעש
- לפתוח
- קוד פתוח
- פתיחה
- אפשרות
- אפשרויות
- להזמין
- ארגון
- אחר
- אַחֶרֶת
- תבנית
- אֲנָשִׁים
- ביצועים
- פרספקטיבה
- עני
- פופולרי
- אפשרי
- חזק
- נבואה
- התחזיות
- ללחוץ
- יפה
- יְסוֹדִי
- בעיה
- תהליך
- תהליכים
- לייצר
- מתכנתים
- תכנות
- שפות תכנות
- תוכניות
- פּרוֹיֶקט
- לספק
- מספק
- איכות
- תעריפים
- חי
- RE
- קריאה
- סיבות
- להפחית
- רגיל
- נשאר
- לדווח
- מאגר
- לדרוש
- נדרש
- מחקר
- משאב
- REST
- תוצאות
- הפעלה
- ריצה
- סריקה
- מסך
- פילוח
- שירותים
- סט
- קצר
- דומה
- פָּשׁוּט
- מידה
- קטן
- So
- תוכנה
- פתרונות
- ספרדי
- מפרט
- מְהִירוּת
- מדינה
- הברית
- חזק
- בהצלחה
- נתמך
- תומך
- SWIFT
- מערכת
- מערכות
- משימות
- טכנולוגיה
- מסוף
- מבחן
- דרך
- זמן
- כלים
- חלק עליון
- מסורתי
- הדרכה
- לשנות
- טיפול
- מגמות
- אובונטו
- ui
- להבין
- ייחודי
- us
- להשתמש
- מקרים לשימוש
- משתמשים
- ערך
- חזון
- W
- לחכות
- הליכה
- מה
- מה
- רשימה לבנה
- ויקיפדיה
- חלונות
- בתוך
- לְלֹא
- מילים
- תיק עבודות
- עובד
- עובד
- כתיבה
- X