Document layout
PP-DocLayoutV3
Parse a document page into 25 region types: titles, paragraphs, tables, figures.
About this model
PP-DocLayoutV3 is a DETR-style detector from PaddlePaddle. It tags every region of a document page with one of 25 classes including text, doc_title, paragraph_title, table, image, chart, formula, header, footer, and reference.
The build is a 132 MB ONNX from the Kreuzberg community mirror, since the official PaddlePaddle release ships pdiparams only. Use it as the first stage of a document pipeline that feeds OCR into the right regions.
What you can build
- Find the title and table on a scanned page before OCR.
- Skip headers and footers when indexing the body of a report.
- Route table regions to a table recognizer and text to OCR.
- Build a layout-aware archive of mixed-format PDFs.
Variants & downloads
Choose the build for your appModel files are being prepared.
Explore the model’s examples, source links, and integration notes while download variants are added.
Example inference
Performance
Results depend on the device, runtime, and test conditions. Each measurement keeps its own context.
M1 Max, macOS 15, ONNX Runtime 1.17
See original catalog hardware notes · CPU
669.5 ms
Warm inference
Reference result from the existing catalog; conversion variant and measurement date were not recorded.
M1 Max, macOS 15, ONNX Runtime 1.17
See original catalog hardware notes · CoreML
635.1 ms
Warm inference
Reference result from the existing catalog; conversion variant and measurement date were not recorded.
RTX 2060, Ubuntu 24.04, ONNX Runtime 1.24.3
See original catalog hardware notes · CUDA
106.1 ms
Warm inference
Reference result from the existing catalog; conversion variant and measurement date were not recorded.
Integration examples
Vision SDK integration
cpp
#include "imaged/sdk.hpp"
#include "imaged/families/pp_structure/pp_structure_family.hpp"
imaged::SDK::AI ai;
auto& config = ai.getOptions();
config.set("pp_structure.model", "weights/pp_doclayoutv3.onnx");
config.set("pp_structure.confidenceThreshold", 0.5);
imaged::SDK::PpStructureFamily family;
family.load(config);
imaged::SDK::Image image;
image.load("page.png");
auto result = std::get<imaged::SDK::DetectionResult>(family.run({&image}));
for (const auto& region : result.detections) {
std::cout << region.label << " " << region.score << "\n";
}