|
|
@@ -1,6 +1,6 @@
|
|
|
正在收集工作区信息正在筛选到最相关的信息根据 demo.py 的代码分析,我来生成 MinerU 的处理流程图:
|
|
|
|
|
|
-## MinerU 处理流程图
|
|
|
+## 1. MinerU 处理流程图
|
|
|
|
|
|
```mermaid
|
|
|
graph TB
|
|
|
@@ -158,4 +158,240 @@ PDF字节流 → 图像列表 → VLM推理(infer_result) → 中间JSON(middle_
|
|
|
- **xxx_layout.pdf**: 布局可视化(标注文本/表格/图片区域)
|
|
|
- **xxx_span.pdf**: span级别可视化(标注每个文本块)
|
|
|
|
|
|
-这个流程图清晰展示了 MinerU 如何根据不同的 PDF 类型和后端选择,采用不同的处理路径最终生成 Markdown 输出。
|
|
|
+-----------
|
|
|
+## 2. PaddleOCR 模型架构分析
|
|
|
+```bash
|
|
|
+[10.192.72.11:~/models/modelscope_cache/models/OpenDataLab/PDF-Extract-Kit-1___0/models]$ find .
|
|
|
+.
|
|
|
+./MFR
|
|
|
+./MFR/unimernet_hf_small_2503
|
|
|
+./MFR/unimernet_hf_small_2503/config.json
|
|
|
+./MFR/unimernet_hf_small_2503/model.safetensors
|
|
|
+./MFR/unimernet_hf_small_2503/README.md
|
|
|
+./MFR/unimernet_hf_small_2503/tokenizer_config.json
|
|
|
+./MFR/unimernet_hf_small_2503/tokenizer.json
|
|
|
+./MFR/unimernet_hf_small_2503/special_tokens_map.json
|
|
|
+./MFR/unimernet_hf_small_2503/generation_config.json
|
|
|
+./TabRec
|
|
|
+./TabRec/UnetStructure
|
|
|
+./TabRec/UnetStructure/unet.onnx
|
|
|
+./TabRec/SlanetPlus
|
|
|
+./TabRec/SlanetPlus/slanet-plus.onnx
|
|
|
+./ReadingOrder
|
|
|
+./ReadingOrder/layout_reader
|
|
|
+./ReadingOrder/layout_reader/config.json
|
|
|
+./ReadingOrder/layout_reader/model.safetensors
|
|
|
+./OCR
|
|
|
+./OCR/paddleocr_torch
|
|
|
+./OCR/paddleocr_torch/latin_PP-OCRv5_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/ch_PP-OCRv3_det_infer.pth
|
|
|
+./OCR/paddleocr_torch/en_PP-OCRv3_det_infer.pth
|
|
|
+./OCR/paddleocr_torch/te_PP-OCRv3_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/ch_PP-OCRv4_det_infer.pth
|
|
|
+./OCR/paddleocr_torch/ch_PP-OCRv5_rec_server_infer.pth
|
|
|
+./OCR/paddleocr_torch/en_PP-OCRv4_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/ch_PP-OCRv4_rec_server_infer.pth
|
|
|
+./OCR/paddleocr_torch/ch_PP-OCRv5_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/korean_PP-OCRv3_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/korean_PP-OCRv5_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/ch_PP-OCRv4_rec_server_doc_infer.pth
|
|
|
+./OCR/paddleocr_torch/en_PP-OCRv5_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/ch_ptocr_mobile_v2.0_cls_infer.pth
|
|
|
+./OCR/paddleocr_torch/th_PP-OCRv5_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/latin_PP-OCRv3_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/el_PP-OCRv5_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/Multilingual_PP-OCRv3_det_infer.pth
|
|
|
+./OCR/paddleocr_torch/arabic_PP-OCRv3_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/ch_PP-OCRv4_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/ch_PP-OCRv5_det_infer.pth
|
|
|
+./OCR/paddleocr_torch/devanagari_PP-OCRv3_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/eslav_PP-OCRv5_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/ta_PP-OCRv3_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/cyrillic_PP-OCRv3_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/ka_PP-OCRv3_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/chinese_cht_PP-OCRv3_rec_infer.pth
|
|
|
+./OCR/paddleocr_torch/japan_PP-OCRv3_rec_infer.pth
|
|
|
+./TabCls
|
|
|
+./TabCls/paddle_table_cls
|
|
|
+./TabCls/paddle_table_cls/PP-LCNet_x1_0_table_cls.onnx
|
|
|
+./Layout
|
|
|
+./Layout/YOLO
|
|
|
+./Layout/YOLO/doclayout_yolo_docstructbench_imgsz1280_2501.pt
|
|
|
+./OriCls
|
|
|
+./OriCls/paddle_orientation_classification
|
|
|
+./OriCls/paddle_orientation_classification/PP-LCNet_x1_0_doc_ori.onnx
|
|
|
+./MFD
|
|
|
+./MFD/YOLO
|
|
|
+./MFD/YOLO/yolo_v8_ft.pt
|
|
|
+
|
|
|
+# mineru调用的paddle模型是已经什么架构?是pytouch还是paddle自有文件格式,转换了吗?
|
|
|
+```
|
|
|
+
|
|
|
+### 1. **模型文件格式**
|
|
|
+
|
|
|
+从文件列表可以看到:
|
|
|
+
|
|
|
+```bash
|
|
|
+./OCR/paddleocr_torch/ch_PP-OCRv4_det_infer.pth
|
|
|
+./OCR/paddleocr_torch/ch_PP-OCRv5_rec_infer.pth
|
|
|
+# ... 等等
|
|
|
+```
|
|
|
+
|
|
|
+**关键发现**:
|
|
|
+- ✅ 文件扩展名是 `.pth` (PyTorch 格式)
|
|
|
+- ✅ 目录名是 `paddleocr_torch`(明确标注了 torch)
|
|
|
+- ✅ 这些是**已经转换**为 PyTorch 格式的模型
|
|
|
+
|
|
|
+### 2. **原始 Paddle 模型转换**
|
|
|
+
|
|
|
+查看 MinerU 的模型加载代码:
|
|
|
+
|
|
|
+```python
|
|
|
+# mineru/model/ocr_rec/paddleocr_rec/paddleocr_rec.py
|
|
|
+class RecPaddleOCRX:
|
|
|
+ def __init__(self, rec_model_path, lang=None):
|
|
|
+ # 加载 PyTorch 模型
|
|
|
+ self.model = torch.jit.load(rec_model_path) # 或者直接 torch.load
|
|
|
+```
|
|
|
+
|
|
|
+### 3. **转换流程说明**
|
|
|
+
|
|
|
+MinerU 使用的是 **Paddle2ONNX → PyTorch** 或 **直接转换到 PyTorch** 的模型:
|
|
|
+
|
|
|
+```mermaid
|
|
|
+graph LR
|
|
|
+ A[原始 PaddlePaddle 模型<br/>.pdparams + .pdmodel] --> B{转换方式}
|
|
|
+
|
|
|
+ B -->|方式1| C[Paddle2ONNX<br/>转换为 .onnx]
|
|
|
+ B -->|方式2| D[paddle2torch<br/>直接转 PyTorch]
|
|
|
+
|
|
|
+ C --> E[ONNX Runtime<br/>推理]
|
|
|
+ C --> F[ONNX → PyTorch<br/>转换为 .pth]
|
|
|
+
|
|
|
+ D --> G[PyTorch 模型<br/>.pth 文件]
|
|
|
+ F --> G
|
|
|
+
|
|
|
+ G --> H[MinerU 使用<br/>torch.load/jit.load]
|
|
|
+ E --> I[MinerU 使用<br/>onnxruntime]
|
|
|
+
|
|
|
+ style A fill:#ffe0b2
|
|
|
+ style G fill:#c8e6c9
|
|
|
+ style H fill:#bbdefb
|
|
|
+```
|
|
|
+
|
|
|
+### 4. **实际使用的模型格式对比**
|
|
|
+
|
|
|
+| 模型类型 | 原始格式 | MinerU 使用格式 | 推理引擎 |
|
|
|
+|---------|---------|----------------|---------|
|
|
|
+| **OCR** | `.pdparams` | `.pth` (PyTorch) | PyTorch |
|
|
|
+| **表格分类** | `.pdparams` | `.onnx` | ONNX Runtime |
|
|
|
+| **方向分类** | `.pdparams` | `.onnx` | ONNX Runtime |
|
|
|
+| **Layout检测** | - | `.pt` (YOLO原生) | PyTorch |
|
|
|
+| **公式识别** | - | `.safetensors` | PyTorch |
|
|
|
+
|
|
|
+### 5. **代码验证**
|
|
|
+
|
|
|
+查看 [`paddleocr_rec.py`](mineru/model/ocr_rec/paddleocr_rec/paddleocr_rec.py ):
|
|
|
+
|
|
|
+```python
|
|
|
+class RecPaddleOCRX:
|
|
|
+ def __init__(self, rec_model_path, ...):
|
|
|
+ # 加载 PyTorch 格式的模型
|
|
|
+ if rec_model_path.endswith('.pth'):
|
|
|
+ # PyTorch JIT 格式
|
|
|
+ self.model = torch.jit.load(rec_model_path, map_location=self.device)
|
|
|
+ else:
|
|
|
+ # 标准 PyTorch 格式
|
|
|
+ checkpoint = torch.load(rec_model_path, map_location=self.device)
|
|
|
+ self.model.load_state_dict(checkpoint)
|
|
|
+```
|
|
|
+
|
|
|
+查看 [`paddleocr_det.py`](mineru/model/ocr_det/paddleocr_det/paddleocr_det.py ):
|
|
|
+
|
|
|
+```python
|
|
|
+class DetPaddleOCRX:
|
|
|
+ def __init__(self, det_model_path, ...):
|
|
|
+ # 同样加载 PyTorch 格式
|
|
|
+ self.model = torch.jit.load(det_model_path, map_location=self.device)
|
|
|
+```
|
|
|
+
|
|
|
+### 6. **ONNX 格式的模型**
|
|
|
+
|
|
|
+从文件列表还可以看到部分使用 ONNX:
|
|
|
+
|
|
|
+```bash
|
|
|
+./TabCls/paddle_table_cls/PP-LCNet_x1_0_table_cls.onnx
|
|
|
+./OriCls/paddle_orientation_classification/PP-LCNet_x1_0_doc_ori.onnx
|
|
|
+./TabRec/UnetStructure/unet.onnx
|
|
|
+./TabRec/SlanetPlus/slanet-plus.onnx
|
|
|
+```
|
|
|
+
|
|
|
+这些使用 ONNX Runtime 推理:
|
|
|
+
|
|
|
+```python
|
|
|
+# mineru/model/table/rec/slanet_plus/main.py
|
|
|
+class RapidTableModel:
|
|
|
+ def __init__(self, model_path):
|
|
|
+ import onnxruntime as ort
|
|
|
+ self.session = ort.InferenceSession(
|
|
|
+ model_path,
|
|
|
+ providers=['CUDAExecutionProvider', 'CPUExecutionProvider']
|
|
|
+ )
|
|
|
+```
|
|
|
+
|
|
|
+### 7. **转换工具**
|
|
|
+
|
|
|
+MinerU 团队使用的转换工具可能包括:
|
|
|
+
|
|
|
+1. **Paddle2ONNX** - 官方转换工具
|
|
|
+ ```bash
|
|
|
+ paddle2onnx --model_dir paddle_model \
|
|
|
+ --model_filename model.pdmodel \
|
|
|
+ --params_filename model.pdiparams \
|
|
|
+ --save_file model.onnx
|
|
|
+ ```
|
|
|
+
|
|
|
+2. **X2Paddle** - Paddle 到其他框架的转换
|
|
|
+ ```bash
|
|
|
+ x2paddle --framework=paddle \
|
|
|
+ --model=model.pdmodel \
|
|
|
+ --params=model.pdiparams \
|
|
|
+ --save_dir=pytorch_model \
|
|
|
+ --to_framework=pytorch
|
|
|
+ ```
|
|
|
+
|
|
|
+3. **自定义转换脚本** - 直接映射权重
|
|
|
+ ```python
|
|
|
+ import paddle
|
|
|
+ import torch
|
|
|
+
|
|
|
+ # 加载 Paddle 模型
|
|
|
+ paddle_state_dict = paddle.load('model.pdparams')
|
|
|
+
|
|
|
+ # 转换为 PyTorch 格式
|
|
|
+ torch_state_dict = convert_paddle_to_torch(paddle_state_dict)
|
|
|
+
|
|
|
+ # 保存为 .pth
|
|
|
+ torch.save(torch_state_dict, 'model.pth')
|
|
|
+ ```
|
|
|
+
|
|
|
+## 总结
|
|
|
+
|
|
|
+### **MinerU 中 PaddleOCR 模型的实际情况**:
|
|
|
+
|
|
|
+| 特性 | 说明 |
|
|
|
+|------|------|
|
|
|
+| **原始格式** | PaddlePaddle (`.pdparams` + `.pdmodel`) |
|
|
|
+| **转换后格式** | PyTorch (`.pth`) 或 ONNX (`.onnx`) |
|
|
|
+| **推理引擎** | PyTorch / ONNX Runtime |
|
|
|
+| **是否转换** | ✅ **已转换**,不是原生 Paddle 格式 |
|
|
|
+| **优势** | 统一推理引擎,无需安装 PaddlePaddle |
|
|
|
+
|
|
|
+### **为什么要转换**:
|
|
|
+
|
|
|
+1. ✅ **依赖简化**:无需安装 PaddlePaddle 框架
|
|
|
+2. ✅ **性能优化**:PyTorch/ONNX 推理可能更快
|
|
|
+3. ✅ **部署方便**:PyTorch 生态更成熟
|
|
|
+4. ✅ **统一架构**:其他模型都是 PyTorch,统一管理
|
|
|
+
|
|
|
+所以答案是:**MinerU 使用的是已经转换为 PyTorch (`.pth`) 或 ONNX (`.onnx`) 格式的 PaddleOCR 模型,不是原生 Paddle 格式**。
|