EasyOCR on GX10: Simple Cyrillic OCR
EasyOCR reads text from images with two lines of Python and understands Bulgarian. We run it locally on a server of the NVIDIA GB10 class: your images never leave the machine, and by the end you also know when to choose another tool.
bg, the licence is Apache-2.0, and official PyTorch wheels for ARM64 with CUDA exist (cu130). We removed: the claim that the GPU works "automatically with no configuration" on GX10 (not verified — we now show an explicit install and a check), the ratings "strong", "weak" and "significant speed-up" without measurements, internal examples from our own work, the note about other OCR models (it belongs to other lessons) and the example with a photo of a document you cannot reproduce. We added: a virtual environment, installing PyTorch for aarch64, an example with a synthetic image you can run without anyone else's files, an explanation of the result, working offline and an honest list of limits.
cu130 wheels support the GB10 GPU without a warning, and speed and accuracy on Bulgarian text. That is why we give no numbers.01What you will learn
- How EasyOCR works: one model finds where the text is, another reads it.
- How to put PyTorch for ARM64 with CUDA into a virtual environment and install EasyOCR.
- How to create a
Readerfor Bulgarian and English and reuse it. - How to read the result: a box, the text and a confidence score.
- How to switch to the CPU or work without internet.
- When EasyOCR is not the right choice.
02Before you start
- A machine of the NVIDIA GB10 class (for example ASUS Ascent GX10 or DGX Spark) with DGX OS (Ubuntu 24.04 for Arm64).
- Access to the machine's terminal — directly or over SSH.
- Python 3 with the
venvmodule. Ubuntu 24.04 ships Python 3.12 by default — check withpython3 --version, because the PyTorch wheels below are for 3.12. - Internet on the first run: PyTorch (more than a gigabyte), the libraries and the model weights are downloaded.
- Free disk space — check with
df -h.
aarch64 and — if you want the GPU — with CUDA. We checked the official PyTorch index: for CPython 3.12 and CUDA 13.0 there are aarch64 wheels (torch 2.9 to 2.14, torchvision 0.25 to 0.27).03Steps
-
What EasyOCR does
According to the project, recognition runs in two stages. First the CRAFT model (Character Region Awareness For Text) finds the regions that contain text — according to its paper it is designed to detect rotated and curved text as well. Then the recognition model (CRNN) reads each region character by character. Everything runs on PyTorch. Over 80 languages are supported; Bulgarian has the code
bg, Englishen. The library's licence is Apache-2.0.💡Which languages work togetherbgis in the project's Cyrillic group together with Russian (ru), Ukrainian (uk), Belarusian (be), Serbian in Cyrillic (rs_cyrillic) and others. According to the project's documentation, English is compatible with every language and languages with similar characters usually work together — but not every pair is allowed. Start with['bg','en']. -
Check the machine
bash · on the machineuname -m python3 --version nvidia-smiYou expect
aarch64, Python 3.12 and a table with the GPU. The memory row may say "Memory-Usage: Not Supported" — on GB10 that is normal: the GPU uses the machine's shared memory (confirmed by NVIDIA). -
A virtual environment and PyTorch for aarch64
Why a virtual environment? PyTorch and the EasyOCR dependencies are heavy, and you should not mix their versions with system packages. The environment is deleted with one command without touching the system.
Why an explicit index? This way you choose the CUDA build for ARM64 yourself instead of hoping
pippicks a suitable one. Ifpython3 -m venvcomplains that the module is missing, installpython3-venvwithsudo apt install python3-venv.bash · on the machinepython3 -m venv ~/ocr-env source ~/ocr-env/bin/activate pip install --upgrade pip pip install torch torchvision --index-url https://download.pytorch.org/whl/cu130 python -c "import torch; print(torch.__version__, torch.cuda.is_available())"The last line should print the version and
True. If it printsFalseor a warning about the GPU's compute capability, stop: PyTorch will not use the GPU. Then either look for a newer build in the index or carry on with the CPU (see step 7).⚠️We have not run this on GB10The existence of an aarch64 wheel with CUDA 13.0 is checked in the index, but whether it supports the GB10 GPU without a warning we have not tested. That is why the check above is mandatory. -
Install EasyOCR
PyTorch is already in place, so
pipwill not replace it. It brings the rest: OpenCV, SciPy, NumPy, Pillow, scikit-image and others.bash · inside the virtual environmentpip install easyocr python -c "import easyocr; print('easyocr: OK')"You will get version 1.7.2 — the latest to date.
-
A first read of a synthetic image
So that you need no one else's files, we create an image with Bulgarian text ourselves. We use the DejaVu Sans font, which has Cyrillic glyphs; check that it exists with
fc-list | grep -i dejavuand fix the path on the first line if it differs.python · ocr_test.pyfrom PIL import Image, ImageDraw, ImageFont import easyocr FONT = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf" # 1) a synthetic image with Cyrillic text img = Image.new("RGB", (900, 220), "white") draw = ImageDraw.Draw(img) font = ImageFont.truetype(FONT, 56) draw.text((30, 20), "Добър ден, Варна", fill="black", font=font) draw.text((30, 110), "Фактура № 2026-0417", fill="black", font=font) img.save("test.png") # 2) a Reader for Bulgarian and English — created ONCE reader = easyocr.Reader(["bg", "en"]) # 3) read result = reader.readtext("test.png") for bbox, text, conf in result: print(f"{text!r} confidence={conf:.2f} box={bbox}")Run it with
python ocr_test.py. On the first run EasyOCR downloads the model weights into~/.EasyOCR/model— you need internet and a little patience. Later runs start from the cache.The result is a list in which every row is a triple
(box, text, confidence). We give no sample output because we have not run the code — you will see what was recognised and how sure the model is. -
How to read the result
- Box (
bbox) — four corner points of the region, in pixels. Good for cropping, outlining or ordering. - Text — the recognised string.
- Confidence (
confidence) — a number between 0 and 1: how sure the model is. This is a model score, not a measured accuracy; compare it with your own samples before you trust it.
The source can be a file path, an OpenCV (numpy) array, bytes or the URL of a raw image. If you only need the strings, without boxes:
pythontexts = reader.readtext("test.png", detail=0) print(" ".join(texts)) # only the more confident results good = [t for (b, t, c) in reader.readtext("test.png") if c > 0.5]✅One Reader per processThe lineeasyocr.Reader([...])loads the models into memory and takes time. Do it once and use the samereaderfor all images; do not create it inside a loop. - Box (
-
CPU instead of the GPU, working without internet
By default
gpu=True. If the GPU is not enough or PyTorch cannot see it, you switch to the CPU:pythonreader = easyocr.Reader(["bg", "en"], gpu=False)We have not measured the speed of the two modes on your machine — run the same image in both modes and compare yourself. The library also has a command line (per the project's documentation):
easyocr -l bg en -f test.png --detail=1 --gpu=True.Without internet: the weights can be downloaded beforehand from the project's model hub and placed by hand in
~/.EasyOCR/model. That way a second machine without network access can use them. The data you read stays with you either way — only the one-time download goes out.⚠️The licence of the weightsThe library's licence is Apache-2.0. We have not checked the licence of the downloaded model weights separately — read the project's terms if you will use them in a product. -
Strengths and limits
The project describes EasyOCR as a general OCR that reads both text in scenes (signs, photos) and dense text in documents. What we know, and what we do not:
Topic What is known Interface Two lines of Python; also a command line and a Dockerfile in the project's repository. Languages Over 80, including Bulgarian ( bg); languages combine only in allowed groups.Result A box, text and confidence for every region. Handwriting Not supported — it is on the project's roadmap as future work. Tables and page layout The library returns regions with text; it does not reconstruct table structure. For complex documents you will need another tool. Maintenance The latest release, 1.7.2, is from 24.09.2024; the repository automatically closes issues older than six months. Check compatibility with your PyTorch version. Accuracy and speed on Bulgarian ⚠️ Not measured by us. Collect 10–20 samples of your own and compare. If the text is on a clean, well-lit scan, the classic Tesseract on the CPU may be enough; for tables and complex pages look for a solution with structure — for example PP-StructureV3 from the PaddleOCR lesson.
-
Personal data — the minimum
- Read documents with personal data only locally; do not upload them to cloud OCR services without a reason.
- The results (text and boxes) may contain the same data — protect them like the originals.
- Do not put real documents into public repositories or examples. Test with synthetic images, as in step 5.
04Check
uname -mgivesaarch64andtorch.cuda.is_available()givesTrue(or you know why you are on the CPU).import easyocrworks inside the virtual environment.ocr_test.pyreturns triples(box, text, confidence)and what was recognised resembles what was written.- With
detail=0you get only the strings. - The
gpu=Falsemode works too. - You know what EasyOCR is not for (handwriting, tables).
Quiz
1. What is the language code for Bulgarian in EasyOCR?
2. How do you correctly use a Reader with many images?
3. What does readtext() return by default?
4. How do you force EasyOCR to run on the CPU?
05What's next
06Sources
- EasyOCR — repository and README 🌐 global — usage,
readtext,detail=0,gpu=False, CRAFT and CRNN, handwriting as future work. - easyocr on PyPI — version 1.7.2 of 24.09.2024, Apache 2.0 licence.
- Jaided AI: EasyOCR — table of supported languages (Bulgarian —
bg). - EasyOCR: config.py — the Cyrillic language group, the model cache location.
- EasyOCR: requirements.txt — dependencies.
- PyTorch: CUDA 13.0 wheels · torchvision — aarch64 availability for CPython 3.12.
- NVIDIA DGX Spark: hardware · ASUS Ascent GX10: tech specs — GB10 class, Arm, shared memory · known issues — "Memory-Usage: Not Supported" in
nvidia-smi.