Знакът на КАГАМИ КАГАМИ
kagami.bg/academy · lesson · machine-readable viewVERIFIED 2026-10-01 · UPDATED 2026-10-01
IDENTITY
module
GX10-04-213 · Tesseract as a CPU OCR fallback
series
GX10 (local AI server class: NVIDIA GB10, e.g. ASUS Ascent GX10 / DGX Spark)
level
Beginner
duration
about 1 h
prerequisites
A Linux shell (Ubuntu 24.04 / DGX OS or any machine), Python 3.8+, a few sample images
trust_label
VERIFIED 2026-10-01 (release, packages, traineddata sets and CLI options checked against the Tesseract repository and documentation, Ubuntu package pages and PyPI) · UPDATED 2026-10-01 · NOT TESTED on a GB10-class machine; CLI and pytesseract were run once in a generic Linux sandbox with Tesseract 4.1.1 on one synthetic Cyrillic image (see lesson, not an accuracy measurement)
versions
Tesseract 5.5.3 is the latest GitHub release (2026-07-24) · Ubuntu 24.04 apt: tesseract-ocr 5.3.4, tesseract-ocr-bul 4.1.0 (arch: all) · pytesseract 0.3.13 (Python 3.8+) · license Apache-2.0
language
human view: bg · english edition: /en/academy/gx10/ (same file name)
previous / next
04-212 HunyuanOCR / 04-214 EasyOCR
PURPOSE

Use Tesseract, a classic CPU-only OCR engine, as the cheap first pass of an OCR chain on a GPU server: it reads clean printed text (Bulgarian via the bul language data), reports per-word confidence, and hands anything doubtful to a heavier model. It is a traditional OCR engine, not a vision-language model: weak on handwriting, tables and complex layouts. Page segmentation mode (--psm) is the main tuning knob.

KEY CONCEPTS
COMMANDS / PATHS
CHECKLIST
NEXT MODULE

04-214 EasyOCR (04-214_EasyOCR.html) · GX10 series index · offer: Quick experiment (kagami.bg/stalbata/)

SOURCES
TAGS
gx10nvidia-gb10ocrtesseractpytesseractbulgariancyrilliccpu-fallback
ПРОВЕРЕНО · 01.10.2026 ОБНОВЕНО · 01.10.2026

Tesseract: OCR на кирилица без видеокарта

Tesseract е класическият безплатен OCR двигател с отворен код. Работи само на процесора, разпознава над 100 езика и чете български с езиковия пакет bul и е най-евтината първа стъпка на верига за разпознаване на текст: чист печатен текст минава тук, а видеокартата на локалния AI сървър остава за по-тежките задачи.

⏱ около 1 ч Начално GX10 Tesseract 5 · pytesseract · Pillow Само процесор · офлайн
Tesseract (двигателят)🔒 локално pytesseract · Pillow🔒 локално
🔄
ОБНОВЕНО · 01.10.2026 — какво
Версиите са сверени наново. Последното издание на Tesseract в GitHub е 5.5.3 (24.07.2026); старият текст сочеше 5.5.1. Пакетът за Ubuntu 24.04 (а DGX OS е на нея) е по-стар — 5.3.4 — и за този урок е напълно достатъчен. pytesseract е 0.3.13 (август 2024) и все още е последната. Поправихме грешки: твърдението, че --psm прилага праг на Оцу, не е вярно — Tesseract бинаризира сам, а от 5.0 има и два допълнителни метода (Adaptive Otsu и Sauvola); редът „изглаждане“ при SHARPEN всъщност е изостряне; липсваше pandas в инсталацията за image_to_data. Добавихме: пълния списък на режимите --psm и --oem, разликата между данните fast, best и tessdata (с измерени размери на bul), предупреждение за латински думи и валутни кодове в български текст, избор на данни и безопасно отваряне на резервна верига. Махнахме вътрешния пример на екосистемата, времето „сек/стр.“ без измерване и фразата „значително по-точен“ — нямаме числа за точност и не даваме измислени.
⚠️
Какво не сме пускали сами
Урокът не е тестван на машина от класа GB10 — затова няма етикет „ТЕСТВАНО“. Веднъж пуснахме командите в обща Linux среда с Tesseract 4.1.1 (не 5.x) върху една измислена картинка с кирилица; резултатите от нея са в стъпка 4 и не са измерване на точност. Не сме проверявали работата на 5.x върху ARM64 процесора, нито скоростта. Инсталаторът за Windows не сме пускали.

01Какво ще научиш

02Преди да започнеш

💡
Защо процесорът, а не видеокартата
Видеокартата на локалния сървър е заета с езикови и визуални модели. Tesseract е традиционен OCR: намира редове, сегментира знаците и ги класифицира. Не разбира смисъл и не „гледа“ картинката като визуален модел — и точно затова е евтин, предвидим и върви паралелно на процесора.

03Стъпки

  1. Инсталирай двигателя и българския пакет

    Първият ред слага Tesseract и данните за български; вторият — Python библиотеките. pandas трябва само за image_to_data във вид на таблица. Използваме виртуална среда, за да не пипаме системния Python.

    bash
    sudo 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 или tessdata
    Tesseract има три официални набора файлове 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.
  2. Първо четене с командния ред

    Най-бързият тест няма нужда от Python: подай картинка, изходът - значи „на екрана“, -l bul избира български.

    bash
    tesseract doc.png - -l bul --oem 1 --psm 6

    Ако картинката няма записана резолюция, Tesseract може да каже „Invalid resolution 0 dpi. Using 70 instead“. Предупреждението е безвредно за този опит, но е сигнал: за реални сканове провери резолюцията (виж стъпка 6).

  3. Четене от Python с pytesseract

    pytesseract е тънка обвивка: вика програмата tesseract и връща резултата. Затова двигателят трябва да е инсталиран и да е в PATH.

    python
    import 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).

  4. Режимите --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.
  5. Доверие по думи с image_to_data

    image_to_data връща за всяка дума място, размер и conf — доверие от 0 до 100 (при редовете за блокове и абзаци стойността е -1 и текстът е празен — това не са думи). С нея филтрираш съмнителното.

    python
    import 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 от стария текст беше пример. Няма „правилно“ число за всички документи — избери го върху своя ръчно проверен примерен набор.

  6. Подготви картинката и сравни данните

    Tesseract е чувствителен към качеството на входа. По неговата документация помагат: резолюция от поне 300 dpi, равномерно осветление, махнат шум, изправен наклон и без черни рамки по краищата. Сам бинаризира картинката; от 5.0 има и два допълнителни метода (Adaptive Otsu и Sauvola). Пример за прост опит:

    python
    import 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 по числа, които са твои, а не по чужди твърдения.

  7. Резервна верига: Tesseract първи, тежкият модел — по нужда

    Идеята: евтина проба на процесора, а по-тежкият OCR — само за страниците, на които Tesseract не е сигурен.

    1. Tesseract чете страницата и връща текст и доверие по думи.
    2. Ако средното доверие е под твоя праг или страницата е сложна (таблици, ръкопис) — предай я на OCR модел с видеокарта (следващия урок е EasyOCR).
    3. Само ако ти трябва разбиране на документа, а не само текст — визуален модел.
    python
    PRAG = 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“ се чете уверено като кирилица. За суми, номера и дати човек проверява, преди числото да влезе в системата.
  8. Какво Tesseract не прави добре

    ПодхождаНе подхожда
    ТекстЧист печатенРъкопис, декоративни шрифтове
    КачествоДобър контраст, 300 dpi или повечеЗамъглени снимки, силен шум
    ОформлениеЕдна колона, прости абзациМного колони, таблици
    ХардуерВсеки процесор, без видеокартаУскорение на видеокарта
    ЦенаБезплатен, Apache-2.0—

    Двигателят върви на процесора, затова при хиляди страници ще е бавен колкото ти позволява процесорът — мери на свой набор, не вярвай на обща цифра „секунди на страница“.

  9. PDF с текст, в който се търси

    bash
    tesseract doc.png out -l bul --oem 1 --psm 6 pdf

    Получаваш out.pdf с вграден текстов слой: изглежда като скана, но в него се търси и се копира.

    💡
    Windows
    Tesseract за Windows се слага с инсталатор (документацията на Tesseract сочи инсталаторите на UB Mannheim — 32- и 64-битови, за версии 3.05, 4 и 5). Папката по подразбиране е C:\Program Files\Tesseract-OCR\ — добави я в PATH или задай tesseract_cmd както в стъпка 3. Езиците се избират при инсталацията или bul.traineddata се копира в папката tessdata.

04Проверка

Тест

1. Кой режим е по подразбиране при --psm?

2. Имаш изрязан от формуляр един ред текст. Кой режим е най-подходящ?

3. Защо --oem 0 не работи с bul.traineddata от tessdata_best?

4. В български документ има „120 EUR“. Какво е най-разумно?

05Какво следва

06Източници

  1. Tesseract: издания в GitHub — последно 5.5.3 (24.07.2026) · хранилището — лиценз Apache-2.0, описание на --psm и --oem 🔒 локално.
  2. Tesseract: файлове с данни — fast, best, tessdata; кой поддържа legacy.
  3. tessdata_fast · tessdata_best · tessdata — bul.traineddata.
  4. Tesseract: подобряване на качеството — 300 dpi, бинаризация, шум, наклон, рамки · инсталация — вкл. Windows (UB Mannheim).
  5. pytesseract в PyPI — 0.3.13, Python 3.8+ · хранилище.
  6. Ubuntu 24.04: tesseract-ocr (5.3.4) · tesseract-ocr-bul.