Skip to main content

Fast CPU OCR — PaddleOCR PP-OCRv6 tiny (lightweight), reimplemented in Rust + ONNX Runtime. ~7x faster than PaddlePaddle, self-contained wheels with models bundled.

Project description

faster-paddle

Fast, CPU-only OCR in Rust with Python bindings — a self-contained reimplementation of PaddleOCR's lightweight pipeline (PP-OCRv6 tiny detection + recognition) powered by ONNX Runtime.

  • ~7× faster than paddleocr on CPU for the same models and output.
  • 📦 Self-contained — the ONNX models (~6 MB) are bundled inside the wheel. No paddlepaddle, no model downloads, no network at runtime.
  • 🦀 Pure-Rust pre/post-processing (detection DB decode, minAreaRect, perspective crop, CTC decode, reading-order text reconstruction). No OpenCV.
  • 🖥️ Prebuilt wheels for Linux, Windows, macOS (x86-64 + arm64).
paddleocr (PaddlePaddle, CPU)        22.7 s / image
faster-paddle (Rust + ONNXRuntime)    3.0 s / image     →  ~7.7× faster

(test image 3157×4464, AMD Ryzen 7 5800X3D; both after warm-up, same weights.)


Install

pip install faster-paddle

Usage

import faster_paddle

# One-shot, using a shared default engine (lazily initialized):
with open("document.jpg", "rb") as f:
    result = faster_paddle.ocr(f.read())

print(result["text"])              # reading-order reconstructed text
for idx, b in result["bounds"].items():
    print(idx, b["text"], b["confidence"], b["topLeftCoord"], b["bottomRightCoord"])

Reuse an explicit engine (recommended for servers — load the models once):

from faster_paddle import OcrEngine

engine = OcrEngine(threads=None, rec_batch=6)   # threads default = physical cores

result = engine.ocr(image_bytes)                 # raw jpeg/png/webp/bmp/tiff/gif bytes
result = engine.ocr_base64(b64_string)           # base64-encoded image

Result shape

{
  "text": "full reconstructed text...",
  "structured_text": "layout-preserving text (see below)",
  "bounds": {
     0: {
        "topLeftCoord":     (x1, y1),
        "bottomRightCoord": (x2, y2),
        "text":             "line text",
        "confidence":       0.97,
     },
     1: { ... },
  }
}

text and bounds match the JSON contract of the original paddle-ocr-api service, so it is a drop-in replacement.

structured_text

A spatial reconstruction that reads left-to-right, top-to-bottom while preserving the visual layout: vertical whitespace gaps split the page into columns/panes (each read fully before the next), and within each one the rows are laid out as a monospace grid, so indentation (tree nesting) and aligned sub-columns (key/value tables) are kept. Single-glyph UI icon noise is dropped. Great for screenshots, forms, table/tree UIs, and code. For dense multi-column prose, prefer the text field. Example output for a two-pane database UI:

PNS
 Collections (11)
   System
   CAGED
   IPCMAPS_MUNICIPIO
 Functions
 Users

Key                                                Value
        OUTRAS_DESPESAS_POTENCIAL_DE_CONSUMO_EM... 7332964
        TOTAL_DO_CONSUMO_URBANO_E_RURAL            613855113
        CD_MUNI_IBGE                               1100015

API

faster_paddle.ocr(image: bytes) -> dict OCR encoded image bytes (shared default engine).
faster_paddle.ocr_base64(image_base64: str) -> dict OCR a base64 image string.
OcrEngine(threads=None, rec_batch=None) Construct a reusable engine.
OcrEngine.ocr(image: bytes) -> dict OCR encoded image bytes.
OcrEngine.ocr_base64(image_base64: str) -> dict OCR a base64 image string.
  • threads: ONNX Runtime intra-op threads. Defaults to the number of physical CPU cores (SMT/logical threads tend to slow compute-bound inference down).
  • rec_batch: recognition batch size (default 6).

Calls are thread-safe (serialized internally) and release the GIL during inference.


How it works

The pipeline faithfully mirrors PaddleOCR's lightweight path:

  1. Detection — resize (min-side 736, clamp max-side 4000, round to ×32), normalize (BGR mean/std), run the DB detector.
  2. DB post-process — threshold 0.2, connected components, minAreaRect, box score ≥ 0.4, unclip ratio 1.4, rescale to source coordinates.
  3. Sort boxes top-to-bottom / left-to-right; crop each via perspective warp.
  4. Recognition — resize each crop to H=48, normalize, batch, run the CTC recognizer ([N, T, 6906]), greedy CTC decode.
  5. Reconstruct reading-order text with dynamic column/line detection.

Detection matches PaddlePaddle at 96 % IoU>0.5 with 0.93 character-level similarity on the recognized text; the residual difference is ONNX-Runtime vs PaddlePaddle floating-point numerics, not the algorithm.

The bundled models are PP-OCRv6_tiny_det and PP-OCRv6_tiny_rec exported with paddle2onnx.

Building from source

pip install maturin
maturin develop --release      # build + install into the current environment
# or
maturin build --release        # produce a wheel in target/wheels/

Requires a Rust toolchain. ONNX Runtime is fetched automatically by the ort crate at build time and linked into the extension.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

faster_paddle-0.0.2.tar.gz (5.8 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

faster_paddle-0.0.2-cp38-abi3-win_amd64.whl (18.8 MB view details)

Uploaded CPython 3.8+Windows x86-64

faster_paddle-0.0.2-cp38-abi3-manylinux_2_28_x86_64.whl (19.7 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.28+ x86-64

faster_paddle-0.0.2-cp38-abi3-manylinux_2_28_aarch64.whl (20.6 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.28+ ARM64

faster_paddle-0.0.2-cp38-abi3-macosx_11_0_arm64.whl (18.6 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

File details

Details for the file faster_paddle-0.0.2.tar.gz.

File metadata

  • Download URL: faster_paddle-0.0.2.tar.gz
  • Upload date:
  • Size: 5.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for faster_paddle-0.0.2.tar.gz
Algorithm Hash digest
SHA256 53172b946005e863cc45541afa0e721451ba14233950b5c2229fe138c55795bf
MD5 367f29dfa401baf025191fc2e3648c47
BLAKE2b-256 d02d0d33bee1c0d1df9c5486e231c37ff9c747ce29fa8eb3c54bc9db93f3b825

See more details on using hashes here.

File details

Details for the file faster_paddle-0.0.2-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for faster_paddle-0.0.2-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 7524425871a4151917cdaf5f3801389de97eb99eeca0f88f1f0e4ca81bbc6da8
MD5 ea2ba15b68b555396260ab01d875ed6c
BLAKE2b-256 d93aa2111ad8d66fe9256ee290fb6a9d3c76a52b66b2dc5fd0a51e96a8482d4d

See more details on using hashes here.

File details

Details for the file faster_paddle-0.0.2-cp38-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for faster_paddle-0.0.2-cp38-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b3be2a8074d45e761aaf8d884908002329cfae9fc5bd856e00ffb48cca919679
MD5 07bfbf6e806932079788fdb58d31df01
BLAKE2b-256 23ab0d0170b27866e3c2d0dddb3204137bf663f22bde75653c804730c63b3e02

See more details on using hashes here.

File details

Details for the file faster_paddle-0.0.2-cp38-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for faster_paddle-0.0.2-cp38-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 64d2f8050f28603b2c011131e76b9cc9ac1df61e1ccb67af274fff8461e5b0f2
MD5 b316e1ef743262274a6751958184348a
BLAKE2b-256 428c7b871a1cc768170acdb08aaa2e37dcd5eebd80000f05d7e048c204538236

See more details on using hashes here.

File details

Details for the file faster_paddle-0.0.2-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for faster_paddle-0.0.2-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d824f16f9c573ae82c92916d91e62936363f68cf725aaa7d26274c741db86854
MD5 305a2a96470305c89ae660f53fac14a8
BLAKE2b-256 db02d6fc77de0ed4c110fb2d1b4d82d947a263257669b8404b5f4fe53c72bcb2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page