|
|
@@ -0,0 +1,161 @@
|
|
|
+正在收集工作区信息正在筛选到最相关的信息根据 demo.py 的代码分析,我来生成 MinerU 的处理流程图:
|
|
|
+
|
|
|
+## MinerU 处理流程图
|
|
|
+
|
|
|
+```mermaid
|
|
|
+graph TB
|
|
|
+ Start([开始: 输入PDF/图片文件]) --> ReadFile[read_fn: 读取文件字节]
|
|
|
+ ReadFile --> CheckBackend{选择后端?}
|
|
|
+
|
|
|
+ %% Pipeline 后端流程
|
|
|
+ CheckBackend -->|backend=pipeline| ConvertPDF1[convert_pdf_bytes_to_bytes_by_pypdfium2<br/>转换PDF字节流]
|
|
|
+ ConvertPDF1 --> PipelineAnalyze[pipeline_doc_analyze<br/>批量分析文档]
|
|
|
+
|
|
|
+ PipelineAnalyze --> CheckMethod{检查解析方法}
|
|
|
+ CheckMethod -->|parse_method=auto| Classify[classify模型<br/>PDF分类: txt/ocr]
|
|
|
+ CheckMethod -->|parse_method=txt| SetTxt[设置txt模式]
|
|
|
+ CheckMethod -->|parse_method=ocr| SetOcr[设置ocr模式]
|
|
|
+
|
|
|
+ Classify --> PDFType{PDF类型?}
|
|
|
+ SetTxt --> LoadImages1
|
|
|
+ SetOcr --> LoadImages1
|
|
|
+
|
|
|
+ PDFType -->|文字PDF txt模式| LoadImages1[load_images_from_pdf<br/>加载PDF页面图像<br/>data: images_list, pdf_doc]
|
|
|
+ PDFType -->|图片PDF ocr模式| LoadImages1
|
|
|
+
|
|
|
+ LoadImages1 --> BatchInfer[batch_image_analyze<br/>批量推理]
|
|
|
+
|
|
|
+ BatchInfer --> LayoutModel[布局检测模型<br/>MinerU Layout Detection]
|
|
|
+ LayoutModel --> LayoutResult[layout_det结果<br/>检测文本/表格/图片区域]
|
|
|
+
|
|
|
+ LayoutResult --> OCRBranch{需要OCR?}
|
|
|
+ OCRBranch -->|txt模式: 文字PDF| ExtractText[提取嵌入文本<br/>直接读取PDF文本层]
|
|
|
+ OCRBranch -->|ocr模式: 图片PDF| OCRModel[OCR识别模型<br/>PaddleOCR/Surya]
|
|
|
+
|
|
|
+ ExtractText --> MergeText[文本合并]
|
|
|
+ OCRModel --> OCRResult[OCR识别结果<br/>文本块坐标+内容]
|
|
|
+ OCRResult --> MergeText
|
|
|
+
|
|
|
+ MergeText --> FormulaCheck{公式识别?}
|
|
|
+ FormulaCheck -->|formula_enable=True| FormulaModel[公式识别模型<br/>UniMERNet]
|
|
|
+ FormulaCheck -->|formula_enable=False| TableCheck
|
|
|
+ FormulaModel --> FormulaResult[公式LaTeX结果]
|
|
|
+ FormulaResult --> TableCheck
|
|
|
+
|
|
|
+ TableCheck{表格识别?}
|
|
|
+ TableCheck -->|table_enable=True| TableModel[表格识别模型<br/>StructEqTable]
|
|
|
+ TableCheck -->|table_enable=False| ModelList
|
|
|
+ TableModel --> TableResult[表格HTML结果]
|
|
|
+ TableResult --> ModelList
|
|
|
+
|
|
|
+ ModelList[生成model_list<br/>原始模型输出JSON] --> ToMiddleJson[pipeline_result_to_middle_json<br/>转换为中间JSON格式]
|
|
|
+
|
|
|
+ ToMiddleJson --> MiddleJson[middle_json<br/>包含pdf_info数组]
|
|
|
+ MiddleJson --> ProcessOutput1[_process_output<br/>处理输出]
|
|
|
+
|
|
|
+ %% VLM 后端流程
|
|
|
+ CheckBackend -->|backend=vlm-xxx| ConvertPDF2[convert_pdf_bytes_to_bytes_by_pypdfium2<br/>转换PDF字节流]
|
|
|
+ ConvertPDF2 --> VLMAnalyze[vlm_doc_analyze<br/>VLM端到端分析]
|
|
|
+
|
|
|
+ VLMAnalyze --> CheckVLMBackend{VLM后端类型?}
|
|
|
+ CheckVLMBackend -->|transformers| VLMTransformers[加载本地VLM模型<br/>MinerU-VLM/MinerU2.5-2509-1.2B]
|
|
|
+ CheckVLMBackend -->|vllm-engine| VLMEngine[vLLM引擎<br/>本地GPU推理]
|
|
|
+ CheckVLMBackend -->|http-client| VLMClient[HTTP客户端<br/>连接远程vLLM服务器]
|
|
|
+
|
|
|
+ VLMTransformers --> VLMInfer[VLM模型推理<br/>输入: PDF图像<br/>输出: 结构化JSON]
|
|
|
+ VLMEngine --> VLMInfer
|
|
|
+ VLMClient --> HTTPRequest[发送HTTP请求<br/>server_url]
|
|
|
+ HTTPRequest --> VLMInfer
|
|
|
+
|
|
|
+ VLMInfer --> VLMResult[VLM输出结果<br/>直接生成结构化内容]
|
|
|
+ VLMResult --> VLMMiddleJson[result_to_middle_json<br/>转换为middle_json格式]
|
|
|
+ VLMMiddleJson --> ProcessOutput2[_process_output<br/>处理输出]
|
|
|
+
|
|
|
+ %% 输出处理流程
|
|
|
+ ProcessOutput1 --> DrawLayout{绘制布局框?}
|
|
|
+ ProcessOutput2 --> DrawLayout
|
|
|
+
|
|
|
+ DrawLayout -->|f_draw_layout_bbox=True| DrawLayoutPDF[draw_layout_bbox<br/>生成layout.pdf]
|
|
|
+ DrawLayout -->|False| DrawSpan
|
|
|
+ DrawLayoutPDF --> DrawSpan
|
|
|
+
|
|
|
+ DrawSpan{绘制span框?}
|
|
|
+ DrawSpan -->|f_draw_span_bbox=True| DrawSpanPDF[draw_span_bbox<br/>生成span.pdf]
|
|
|
+ DrawSpan -->|False| MakeMarkdown
|
|
|
+ DrawSpanPDF --> MakeMarkdown
|
|
|
+
|
|
|
+ MakeMarkdown{生成Markdown?}
|
|
|
+ MakeMarkdown -->|f_dump_md=True| UnionMake1[pipeline_union_make 或<br/>vlm_union_make]
|
|
|
+ MakeMarkdown -->|False| ContentList
|
|
|
+
|
|
|
+ UnionMake1 --> MarkdownFile[输出: xxx.md<br/>包含文本/公式/表格/图片]
|
|
|
+ MarkdownFile --> ContentList
|
|
|
+
|
|
|
+ ContentList{生成内容列表?}
|
|
|
+ ContentList -->|f_dump_content_list=True| UnionMake2[union_make<br/>MakeMode.CONTENT_LIST]
|
|
|
+ ContentList -->|False| MiddleJsonOut
|
|
|
+ UnionMake2 --> ContentListFile[输出: xxx_content_list.json<br/>结构化内容列表]
|
|
|
+ ContentListFile --> MiddleJsonOut
|
|
|
+
|
|
|
+ MiddleJsonOut{保存中间JSON?}
|
|
|
+ MiddleJsonOut -->|f_dump_middle_json=True| MiddleJsonFile[输出: xxx_middle.json<br/>中间处理结果]
|
|
|
+ MiddleJsonOut -->|False| ModelOut
|
|
|
+ MiddleJsonFile --> ModelOut
|
|
|
+
|
|
|
+ ModelOut{保存模型输出?}
|
|
|
+ ModelOut -->|f_dump_model_output=True| ModelFile[输出: xxx_model.json<br/>原始模型输出]
|
|
|
+ ModelOut -->|False| End
|
|
|
+ ModelFile --> End([结束: 所有文件保存到output_dir])
|
|
|
+
|
|
|
+ %% 样式定义
|
|
|
+ classDef modelClass fill:#e1f5ff,stroke:#01579b,stroke-width:2px
|
|
|
+ classDef dataClass fill:#fff3e0,stroke:#e65100,stroke-width:2px
|
|
|
+ classDef processClass fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
|
|
|
+
|
|
|
+ class LayoutModel,OCRModel,FormulaModel,TableModel,VLMTransformers,VLMEngine,Classify modelClass
|
|
|
+ class LayoutResult,OCRResult,FormulaResult,TableResult,ModelList,MiddleJson,VLMResult dataClass
|
|
|
+ class PipelineAnalyze,VLMAnalyze,ToMiddleJson,VLMMiddleJson,ProcessOutput1,ProcessOutput2 processClass
|
|
|
+```
|
|
|
+
|
|
|
+## 关键差异说明
|
|
|
+
|
|
|
+### 1. **文字PDF (txt模式) vs 图片PDF (ocr模式)**
|
|
|
+
|
|
|
+| 维度 | 文字PDF (txt模式) | 图片PDF (ocr模式) |
|
|
|
+|------|------------------|------------------|
|
|
|
+| **检测方式** | `classify` 模型自动判断 | 手动指定或分类识别 |
|
|
|
+| **文本提取** | 直接读取PDF嵌入的文本层 | 使用OCR模型识别图像中的文字 |
|
|
|
+| **处理速度** | 快速(无需OCR) | 较慢(需要OCR推理) |
|
|
|
+| **准确性** | 高(原生文本) | 取决于OCR模型质量 |
|
|
|
+| **典型场景** | Word转PDF、电子书 | 扫描件、截图PDF |
|
|
|
+
|
|
|
+### 2. **Pipeline vs VLM 后端差异**
|
|
|
+
|
|
|
+| 特性 | Pipeline后端 | VLM后端 |
|
|
|
+|------|-------------|---------|
|
|
|
+| **模型架构** | 多个专用模型(Layout+OCR+公式+表格) | 单一端到端VLM模型 |
|
|
|
+| **处理流程** | 分步骤处理,每步调用不同模型 | 一次性输出结构化结果 |
|
|
|
+| **优势** | 可控性强,每步可优化 | 简化流程,理解能力强 |
|
|
|
+| **劣势** | 流程复杂,错误累积 | 需要大模型支持 |
|
|
|
+| **适用场景** | 通用文档解析 | 复杂布局/多语言混排 |
|
|
|
+
|
|
|
+### 3. **关键数据流**
|
|
|
+
|
|
|
+```python
|
|
|
+# Pipeline模式数据流
|
|
|
+PDF字节流 → 图像列表(images_list) → 模型推理(model_list) → 中间JSON(middle_json) → Markdown
|
|
|
+
|
|
|
+# VLM模式数据流
|
|
|
+PDF字节流 → 图像列表 → VLM推理(infer_result) → 中间JSON(middle_json) → Markdown
|
|
|
+```
|
|
|
+
|
|
|
+### 4. **输出文件说明**
|
|
|
+
|
|
|
+- **xxx.md**: 最终Markdown文档
|
|
|
+- **xxx_content_list.json**: 结构化内容列表(用于程序化处理)
|
|
|
+- **xxx_middle.json**: 中间处理结果(包含完整的`pdf_info`数组)
|
|
|
+- **xxx_model.json**: 原始模型输出(用于调试)
|
|
|
+- **xxx_layout.pdf**: 布局可视化(标注文本/表格/图片区域)
|
|
|
+- **xxx_span.pdf**: span级别可视化(标注每个文本块)
|
|
|
+
|
|
|
+这个流程图清晰展示了 MinerU 如何根据不同的 PDF 类型和后端选择,采用不同的处理路径最终生成 Markdown 输出。
|