Instructions to use groxaxo/TeleOCR-oQ5-MLX with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use groxaxo/TeleOCR-oQ5-MLX with MLX:
# Make sure mlx-vlm is installed # pip install --upgrade mlx-vlm from mlx_vlm import load, generate from mlx_vlm.prompt_utils import apply_chat_template from mlx_vlm.utils import load_config # Load the model model, processor = load("groxaxo/TeleOCR-oQ5-MLX") config = load_config("groxaxo/TeleOCR-oQ5-MLX") # Prepare input image = ["http://images.cocodataset.org/val2017/000000039769.jpg"] prompt = "Describe this image." # Apply chat template formatted_prompt = apply_chat_template( processor, config, prompt, num_images=1 ) # Generate output output = generate(model, processor, formatted_prompt, image) print(output) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Atomic Chat
TeleOCR oMLX oQ5
Text-and-vision OCR checkpoint quantized on this Mac from the official TeleOCR BF16 weights. The base model is XingChen-AGI/TeleOCR revision e92585356c0d0b7b7a65938f3da035c6593cc9a6 (StarDoc-AI/TeleOCR redirects there). Upstream license is Apache-2.0. Project page: caipeng328/TeleOCR.
What this file is
model.safetensors is 1,843,848,908 bytes. Its SHA-256 is 5db10532a4dc51459a4736eb0cdf7f84e831072b79f6acbde0e7b326036f0d83. The config records affine quantization, 5 bits, group size 64.
The quantizer was oMLX quantize_oq_streaming from checkout jundot/omlx commit 70f44cfd652d2013dc0f9776dca7518e32101b00, with oq_level=5, group_size=64, BF16 residuals, text_only=False, enhanced=False, and measured layer sensitivity. Calibration used the built-in code_multilingual corpus, 128 samples of 256 tokens. It finished in 10.1 seconds and peaked at 3.339 GB of MLX memory.
An audit of this artifact found 198 language modules at 5 bits, including decoder projections, token embeddings, and the output head. 390 vision tensors remain BF16 under oMLX's native oQ policy. The whole network is not uniformly 5-bit. teleocr_mlx.py is the local adapter: TeleOCR uses 128-wide heads, bias-free projections, and per-head query/key RMSNorm, which a stock Qwen2.5-VL loader does not implement. model_file in config.json points at that adapter. modeling_naviocr.py is the upstream remote-code file shipped beside it.
The untouched BF16 source SHA-256 is 9817b18041bd96403f75e38a33b28ed0cd5fb2641f67eead673afabd3c408109.
Measured on 2 October 2026
One paired run on this 24 GB Mac, against the BF16 checkpoint, using temperature 0. These figures are that run, not a general benchmark.
| Measure | BF16 | oQ5 |
|---|---|---|
| Text/code character error (28 samples, 1,394 reference characters) | 2.80% (39 edits) | 2.80% (39 edits) |
| Text/code word error | 14.76% | 14.76% |
| Exact normalized text/code samples | 13/28 | 13/28 |
| FUNSD scanned-field character error (20 samples) | 3.50% | 3.50% |
| Structured table and formula controls | 3/3 | 3/3 |
| Full-page layout samples | 2/2 exact | 2/2 exact |
| Mean image-to-output time, 31 samples, one pass | 0.356 s | 0.191 s |
| Maximum MLX allocated memory during those requests | 3.312 GB | 2.326 GB |
30 of 31 raw outputs matched. The one difference was a comma in a scanned form (ATT, GEN, ADMIN OFFICE versus ATT, GEN, ADMIN, OFFICE) and did not change the aggregate error counts. Two scanned samples were repeated for each variant and reproduced their own outputs (4/4).
The evaluation runtime was oMLX 0.7.0.dev4, MLX 0.32.2, mlx-vlm 0.7.1, and Transformers 5.17.0.
Use
Serve the parent directory with an oMLX build that can load the bundled teleocr_mlx.py adapter. The directory name is the model id.
omlx serve --model-dir /path/to/parent --host 127.0.0.1 --port 8000
Request model TeleOCR-oQ5. The October evaluation used the pinned oMLX checkout named above rather than a stock Qwen2.5-VL loader.
- Downloads last month
- 41
5-bit
Model tree for groxaxo/TeleOCR-oQ5-MLX
Base model
XingChen-AGI/TeleOCR