Tesseract: OCR на кирилица без видеокарта
Tesseract е класическият безплатен OCR двигател с отворен код. Работи само на процесора, разпознава над 100 езика и чете български с езиковия пакет bul и е най-евтината първа стъпка на верига за разпознаване на текст: чист печатен текст минава тук, а видеокартата на локалния AI сървър остава за по-тежките задачи.
pytesseract е 0.3.13 (август 2024) и все още е последната. Поправихме грешки: твърдението, че --psm прилага праг на Оцу, не е вярно — Tesseract бинаризира сам, а от 5.0 има и два допълнителни метода (Adaptive Otsu и Sauvola); редът „изглаждане“ при SHARPEN всъщност е изостряне; липсваше pandas в инсталацията за image_to_data. Добавихме: пълния списък на режимите --psm и --oem, разликата между данните fast, best и tessdata (с измерени размери на bul), предупреждение за латински думи и валутни кодове в български текст, избор на данни и безопасно отваряне на резервна верига. Махнахме вътрешния пример на екосистемата, времето „сек/стр.“ без измерване и фразата „значително по-точен“ — нямаме числа за точност и не даваме измислени.
01Какво ще научиш
- Къде е мястото на Tesseract във верига за OCR и кога да минеш към по-тежък модел.
- Как да го инсталираш заедно с български (
bul) и да избереш между даннитеfastиbest. - Как да четеш текст с
pytesseractи с командния ред. - Какво правят режимите
--psmи--oemи как да избереш правилния. - Как да четеш оценката за доверие по думи и да я ползваш като граница.
- Какво не умее: ръкопис, таблици, сложни оформления.
02Преди да започнеш
- Терминал на Linux — на DGX OS (Ubuntu 24.04) или на всяка друга машина; Tesseract не изисква видеокарта, CUDA или Arm-специфични настройки, затова върви и на стари машини, в контейнери без достъп до видеокарта, в WSL и в автоматични проверки (CI). Пакетът
tesseract-ocrе наличен за arm64 в Ubuntu 24.04. - Python 3.8 или по-нов (изискването на
pytesseract). - Няколко тестови картинки с печатен български текст. Използвай измислени документи — реални лични данни не пускай, докато не си сигурен къде отиват (тук всичко е локално).
- Резолюция: Tesseract работи най-добре при поне 300 dpi (по документацията му). Снимка от телефон, направена отдалече, често е под това.
03Стъпки
-
Инсталирай двигателя и българския пакет
Първият ред слага Tesseract и данните за български; вторият — Python библиотеките.
pandasтрябва само заimage_to_dataвъв вид на таблица. Използваме виртуална среда, за да не пипаме системния Python.bashsudo apt install tesseract-ocr tesseract-ocr-bul python3 -m venv .venv && . .venv/bin/activate pip install pytesseract pillow pandas tesseract --version tesseract --list-langsВ списъка трябва да видиш
bul(иeng,osd). Ако Ubuntu не намира пакета, виж дали е включено хранилищетоuniverse.💡Кои данни получаваш: fast, best или tessdataTesseract има три официални набора файловеbul.traineddata. tessdata_fast — най-малък и най-бърз (цел „цена/качество“; дистрибуциите обикновено пакетират него — пакетътtesseract-ocr-bulв Ubuntu 24.04 заема около 1,65 MB след инсталация, колкотоfast); tessdata_best — най-бавен и по документацията най-точен; tessdata — единственият, който поддържа и стария (legacy) двигател. Измерихме размерите наbul: fast ≈ 1,7 MB, best ≈ 8,8 MB, tessdata ≈ 8,4 MB. Файловетеfastиbestсъдържат само LSTM — режимите--oem 0и--oem 2с тях не работят. Как да ги подмениш: свали файла от tessdata_best в своя папка и подай--tessdata-dir <папка>(вpytesseract— презconfig). Кое е по-добро за твоите документи — виж стъпка 6. -
Първо четене с командния ред
Най-бързият тест няма нужда от Python: подай картинка, изходът
-значи „на екрана“,-l bulизбира български.bashtesseract doc.png - -l bul --oem 1 --psm 6Ако картинката няма записана резолюция, Tesseract може да каже „Invalid resolution 0 dpi. Using 70 instead“. Предупреждението е безвредно за този опит, но е сигнал: за реални сканове провери резолюцията (виж стъпка 6).
-
Четене от Python с pytesseract
pytesseractе тънка обвивка: вика програматаtesseractи връща резултата. Затова двигателят трябва да е инсталиран и да е вPATH.pythonimport pytesseract from PIL import Image # На Windows, ако tesseract.exe не е в PATH: # pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" img = Image.open("doc.png") text = pytesseract.image_to_string(img, lang="bul", config="--oem 1 --psm 6") print(text)Другите функции:
image_to_data(дума по дума, с координати и доверие),image_to_boxes(по знаци) иimage_to_pdf_or_hocr(PDF с вграден текст или hOCR). -
Режимите --psm: как Tesseract дели страницата
--psmказва на двигателя каква е страницата. Грешният избор е най-честата причина за „празен“ или объркан изход: ред, подаден като страница, или страница, подадена като ред. По документацията (man страницата на Tesseract) режимите са:--psm 0— Само откриване на ориентация и писменост (OSD). Кога: Да разбереш дали страницата е завъртяна.--psm 1— Автоматично, с OSD. Кога: Страници с неясна ориентация.--psm 3— Напълно автоматично, без OSD (по подразбиране). Кога: Общ случай, цяла страница.--psm 4— Една колона текст с различни размери. Кога: Писма, колона със заглавия.--psm 6— Един равномерен блок текст. Кога: Чисти параграфи.--psm 7— Един ред. Кога: Изрязан ред, поле във формуляр.--psm 8— Една дума. Кога: Изрязана дума.--psm 10— Един знак. Кога: Отделна буква или цифра.--psm 11— Разпръснат текст — намери колкото се може, без ред. Кога: Формуляри, бланки, билети.--psm 12— Разпръснат текст с OSD. Кога: Същото, но със завъртени страници.--psm 13— Суров ред — без специфичните за Tesseract поправки. Кога: Специални случаи на един ред.
Режимите 2 („не е реализиран“), 5 (вертикален блок) и 9 (дума в кръг) са по-рядко нужни. Режимът
--oemизбира двигателя:0само стария,1само LSTM,2двата,3по подразбиране — според наличното. С данниfastиbestизбирай--oem 1(или3).✅Какво видяхме на измислената картинкаПодадохме на Tesseract 4.1.1 (не 5.x) една картинка с три реда кирилица, написани с един шрифт. Целите български думи бяха прочетени вярно с--psm 3и--psm 6и с даннитеfast, и сbest; изрязаният първи ред мина с--psm 7. Но редът със сума в евро излезе грешен при-l bul: „120 EUR“ беше прочетено като „120 ЕЦК“ (fast) и „120 ЕПНВ“ (best) — латинските букви се четат като кирилица. С-l bul+eng„EUR“ излезе вярно, но „Номер“ стана „Homep“ — смесването измести други подобни на вид букви. Единична картинка и един шрифт не доказват нищо за точността; поуката е друга: латински думи, цифри с валутни кодове и смесени документи проверявай винаги сbulи сbul+eng. -
Доверие по думи с image_to_data
image_to_dataвръща за всяка дума място, размер иconf— доверие от 0 до 100 (при редовете за блокове и абзаци стойността е-1и текстът е празен — това не са думи). С нея филтрираш съмнителното.pythonimport pytesseract from PIL import Image img = Image.open("doc.png") data = pytesseract.image_to_data( img, lang="bul", config="--oem 1 --psm 6", output_type=pytesseract.Output.DATAFRAME, ) # само истински думи: непразен текст и conf >= 0 words = data[(data["conf"] >= 0) & data["text"].notna() & (data["text"].astype(str).str.strip() != "")] print(words[["left", "top", "width", "height", "text", "conf"]].to_string(index=False)) print("средно доверие:", round(words["conf"].mean(), 1))Прагът 60 от стария текст беше пример. Няма „правилно“ число за всички документи — избери го върху своя ръчно проверен примерен набор.
-
Подготви картинката и сравни данните
Tesseract е чувствителен към качеството на входа. По неговата документация помагат: резолюция от поне 300 dpi, равномерно осветление, махнат шум, изправен наклон и без черни рамки по краищата. Сам бинаризира картинката; от 5.0 има и два допълнителни метода (Adaptive Otsu и Sauvola). Пример за прост опит:
pythonimport pytesseract from PIL import Image, ImageOps img = Image.open("doc.png").convert("L") # сиви тонове img = ImageOps.autocontrast(img) # по-добър контраст w, h = img.size if w < 1600: # груба проба за малки картинки img = img.resize((w * 2, h * 2), Image.LANCZOS) # сравни данните: подай папка с bul.traineddata от tessdata_best cfg_fast = "--oem 1 --psm 6" cfg_best = "--oem 1 --psm 6 --tessdata-dir ./tessdata_best" for name, cfg in (("fast", cfg_fast), ("best", cfg_best)): print("==", name) print(pytesseract.image_to_string(img, lang="bul", config=cfg))Мери върху свои документи: колко думи са грешни и колко време отнема. Така избираш между
fastиbestпо числа, които са твои, а не по чужди твърдения. -
Резервна верига: Tesseract първи, тежкият модел — по нужда
Идеята: евтина проба на процесора, а по-тежкият OCR — само за страниците, на които Tesseract не е сигурен.
- Tesseract чете страницата и връща текст и доверие по думи.
- Ако средното доверие е под твоя праг или страницата е сложна (таблици, ръкопис) — предай я на OCR модел с видеокарта (следващия урок е EasyOCR).
- Само ако ти трябва разбиране на документа, а не само текст — визуален модел.
pythonPRAG = 70 # пример: нагласи го върху своя ръчно проверен набор def tesseract_pass(img): d = pytesseract.image_to_data( img, lang="bul", config="--oem 1 --psm 6", output_type=pytesseract.Output.DATAFRAME, ) w = d[(d["conf"] >= 0) & d["text"].notna() & (d["text"].astype(str).str.strip() != "")] text = " ".join(w["text"].astype(str)) return text, (w["conf"].mean() if len(w) else 0.0) text, conf = tesseract_pass(img) if conf < PRAG: pass # тук предай страницата на по-тежкия OCR (напр. следващия урок)⚠️Доверието не е истинаВисоко доверие не гарантира правилен текст — видяхме как „EUR“ се чете уверено като кирилица. За суми, номера и дати човек проверява, преди числото да влезе в системата. -
Какво Tesseract не прави добре
Подхожда Не подхожда Текст Чист печатен Ръкопис, декоративни шрифтове Качество Добър контраст, 300 dpi или повече Замъглени снимки, силен шум Оформление Една колона, прости абзаци Много колони, таблици Хардуер Всеки процесор, без видеокарта Ускорение на видеокарта Цена Безплатен, Apache-2.0 — Двигателят върви на процесора, затова при хиляди страници ще е бавен колкото ти позволява процесорът — мери на свой набор, не вярвай на обща цифра „секунди на страница“.
-
PDF с текст, в който се търси
bashtesseract doc.png out -l bul --oem 1 --psm 6 pdfПолучаваш
out.pdfс вграден текстов слой: изглежда като скана, но в него се търси и се копира.💡WindowsTesseract за Windows се слага с инсталатор (документацията на Tesseract сочи инсталаторите на UB Mannheim — 32- и 64-битови, за версии 3.05, 4 и 5). Папката по подразбиране еC:\Program Files\Tesseract-OCR\— добави я вPATHили задайtesseract_cmdкакто в стъпка 3. Езиците се избират при инсталацията илиbul.traineddataсе копира в папкатаtessdata.
04Проверка
tesseract --versionдава версия, а--list-langsпоказваbul.image_to_stringсlang="bul"чете кирилска тестова страница.- Сравнил си
--psm 3,6,7и11върху различни по вид входове. - Знаеш кои редове с числа, латински думи и валути трябва да минат през човек.
- Сравнил си
bulиbul+engи даннитеfastиbestвърху свои документи. - Имаш записано правило кога страница отива към по-тежък модел и с какъв праг.
Тест
1. Кой режим е по подразбиране при --psm?
2. Имаш изрязан от формуляр един ред текст. Кой режим е най-подходящ?
3. Защо --oem 0 не работи с bul.traineddata от tessdata_best?
4. В български документ има „120 EUR“. Какво е най-разумно?
05Какво следва
06Източници
- Tesseract: издания в GitHub — последно 5.5.3 (24.07.2026) · хранилището — лиценз Apache-2.0, описание на
--psmи--oem🔒 локално. - Tesseract: файлове с данни — fast, best, tessdata; кой поддържа legacy.
- tessdata_fast · tessdata_best · tessdata —
bul.traineddata. - Tesseract: подобряване на качеството — 300 dpi, бинаризация, шум, наклон, рамки · инсталация — вкл. Windows (UB Mannheim).
- pytesseract в PyPI — 0.3.13, Python 3.8+ · хранилище.
- Ubuntu 24.04: tesseract-ocr (5.3.4) · tesseract-ocr-bul.