--- license: other license_name: apache-2.0-and-agpl-3.0 license_link: https://www.apache.org/licenses/LICENSE-2.0 tags: - onnx - document-parsing - layout-analysis - ocr - table-structure-recognition - formula-recognition --- # docparser-models Every model file [DocParser](https://github.com/docparser-rs) (a Rust document-parsing engine: Triton serving + an in-process ONNX Runtime backend) loads, flat, one commit per deployment. The checkout's `models/MANIFEST.toml` pins a commit and maps each file to its place in the Triton model repository; `scripts/fetch-models.sh` downloads and verifies them against `MANIFEST.txt` here (sha256 per file). Nothing is trained here: the files are PaddlePaddle's own ONNX exports and scripted derivations of them, all Apache-2.0. Each file is named `_`, so the name says which published checkpoint it came from. | File | What | Provenance | Licence | | --- | --- | --- | --- | | `PP-DocLayoutV3_fp32.onnx` | PP-DocLayoutV3 (RT-DETR-L, 25 classes + reading order), FP32 | bit-identical copy of [`PaddlePaddle/PP-DocLayoutV3_onnx`](https://huggingface.co/PaddlePaddle/PP-DocLayoutV3_onnx) `inference.onnx` @ `46bbdf18` (sha256 `45bf7175…`) | Apache-2.0 | | `PP-DocLayoutV3_fp16_batchable.onnx` | the same, output reshaped to `[B,300,7]` and converted to FP16 (GridSample / NMS kept FP32) for Triton batching on TensorRT | `scripts/models/batchable_layout.py` + `convert_fp16.py` over the file above (onnx 1.21, onnxconverter-common 1.16) | Apache-2.0 | | `PP-OCRv6_medium_det.onnx` | PP-OCRv6 text detection, medium tier (`OCR_DET_MODEL=medium`) | bit-identical copy of [`PaddlePaddle/PP-OCRv6_medium_det_onnx`](https://huggingface.co/PaddlePaddle/PP-OCRv6_medium_det_onnx) `inference.onnx` @ `61323801` (`eb13b44b…`) | Apache-2.0 | | `PP-OCRv6_small_det.onnx` | PP-OCRv6 text detection, small tier — **the tier served by default** (`OCR_DET_MODEL`) | bit-identical copy of [`PaddlePaddle/PP-OCRv6_small_det_onnx`](https://huggingface.co/PaddlePaddle/PP-OCRv6_small_det_onnx) `inference.onnx` @ `28fe5895` (`d73e0058…`) | Apache-2.0 | | `PP-OCRv6_tiny_det.onnx` | PP-OCRv6 text detection, tiny tier (0.43 M parameters) | bit-identical copy of [`PaddlePaddle/PP-OCRv6_tiny_det_onnx`](https://huggingface.co/PaddlePaddle/PP-OCRv6_tiny_det_onnx) `inference.onnx` @ `2ba1506c` (`193bab7a…`) | Apache-2.0 | | `PP-OCRv6_tiny_rec_fp32.onnx` | PP-OCRv6 text recognition, tiny tier (6906-way CTC) | bit-identical copy of [`PaddlePaddle/PP-OCRv6_tiny_rec_onnx`](https://huggingface.co/PaddlePaddle/PP-OCRv6_tiny_rec_onnx) `inference.onnx` @ `2612ab37` (`9ef676d6…`) | Apache-2.0 | | `PP-OCRv6_tiny_rec_fp16.onnx` | the same in FP16 | `convert_fp16.py` over the file above | Apache-2.0 | | `PP-OCRv6_small_rec_fp32.onnx` | PP-OCRv6 text recognition, small tier (18710-way CTC) — **the tier served by default** (`OCR_REC_MODEL`) | bit-identical copy of [`PaddlePaddle/PP-OCRv6_small_rec_onnx`](https://huggingface.co/PaddlePaddle/PP-OCRv6_small_rec_onnx) `inference.onnx` @ `b8f84f0b` (`5435fd74…`) | Apache-2.0 | | `PP-OCRv6_small_rec_fp16.onnx` | the same in FP16 | `convert_fp16.py` over the file above | Apache-2.0 | | `PP-OCRv6_medium_rec_fp32.onnx` | PP-OCRv6 text recognition, medium tier (18710-way CTC, the same dictionary as small) | bit-identical copy of [`PaddlePaddle/PP-OCRv6_medium_rec_onnx`](https://huggingface.co/PaddlePaddle/PP-OCRv6_medium_rec_onnx) `inference.onnx` @ `50c7eaca` (`9c09abf0…`) | Apache-2.0 | | `PP-OCRv6_medium_rec_fp16.onnx` | the same in FP16 | `convert_fp16.py` over the file above | Apache-2.0 | | `SLANet_plus_encoder.onnx` | SLANet-Plus encoder (PP-LCNet), the official graph up to the GRU loop's feature input | `onnx.utils.extract_model` over [`PaddlePaddle/SLANet_plus_onnx`](https://huggingface.co/PaddlePaddle/SLANet_plus_onnx) `inference.onnx` @ `7dbe640e` (`7790c0c1…`) — `scripts/models/export_slanet_plus.py::extract_encoder` | Apache-2.0 | | `SLANet_plus_decoder.bin` | the GRU decoder's 16 parameter tensors as float32 (DocParser's host decoder) | `export_slanet_plus.py::dump_decoder` over the same file; byte-identical to TurboOCR's `slanet_plus_decoder.bin` (`f4b9f9b2…`), and 16 of 16 tensors bit-equal to the named `head.` subtree of `SLANet_plus_pretrained.pdparams` (`--verify-decoder`) | Apache-2.0 | | `PP-FormulaNet_plus-M_encoder.onnx`, `_prep.onnx`, `_decoder_step.onnx`, `_tokenizer.json` | PP-FormulaNet_plus-M split for a host decode loop: vision encoder, the cross-attention K/V computed once per crop, and one greedy step against a static KV cache | `scripts/models/export_ppformulanet.py --model plus_m` over [`PaddlePaddle/PP-FormulaNet_plus-M`](https://huggingface.co/PaddlePaddle/PP-FormulaNet_plus-M) — the encoder cut from the paddle2onnx graph, the decoder's 165 tensors read by name from the official training checkpoint (`PP-FormulaNet_plus-M_pretrained.pdparams`, 165 of 165 bit-equal to the conversion's own numbering); gated at 12/12 identical tokens against PaddleX's own runtime | Apache-2.0 | | `PP-FormulaNet_plus-S_encoder.onnx`, `_prep.onnx`, `_decoder_step.onnx`, `_tokenizer.json` | the same split for plus-S, which decodes **three tokens per step** (`parallel_step: 3`) — the throughput tier | `scripts/models/export_ppformulanet.py --model plus_s`; decoder weights by name likewise (61 of 61); same gate, 12/12 | Apache-2.0 | Contracts (inputs, normalisation, post-processing) follow each source's `inference.yml`; the pre/post-processing code is in the DocParser checkout (`crates/docparser-inference/src/preprocess/`, `deploy/triton_model_repository/`). The CTC dictionary of the recogniser is a text file in that checkout, not here. Why these models and not their siblings is measured in `docparser-bench/docs/BENCH-2026-09.md` (OmniDocBench v1.6 §8, the per-slot ablations §1–7). Redistribution: all files are Apache-2.0, under that licence with this attribution. (Texo, an AGPL-3.0 checkpoint, served the formula slot's throughput tier until Stage 14 and was replaced by PP-FormulaNet_plus-S; nothing here is copyleft any more.)