paddleocr_wrapper.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/usr/bin/env python3
  2. """PaddleOCR VL Python API 包装脚本
  3. 用于独立进程调用 PaddleOCR,避免与主进程共享显存
  4. """
  5. import os
  6. import sys
  7. import argparse
  8. from pathlib import Path
  9. def main():
  10. parser = argparse.ArgumentParser(description='PaddleOCR VL Python API 包装脚本')
  11. parser.add_argument('-i', '--input', required=True, help='输入图片路径')
  12. parser.add_argument('-o', '--output', required=True, help='输出目录路径')
  13. parser.add_argument('--mode', choices=['ocr', 'doc_parser'], default='doc_parser',
  14. help='处理模式: ocr(纯文本) 或 doc_parser(图表识别)')
  15. parser.add_argument('--device', default='gpu:0', help='设备类型,如 gpu:0 或 cpu')
  16. parser.add_argument('--use-chart', action='store_true', help='启用图表识别')
  17. parser.add_argument('--use-layout', action='store_true', help='启用版面检测')
  18. args = parser.parse_args()
  19. # 检查输入文件
  20. if not os.path.exists(args.input):
  21. print(f"错误: 输入文件不存在: {args.input}", file=sys.stderr)
  22. sys.exit(1)
  23. # 创建输出目录
  24. output_dir = Path(args.output)
  25. output_dir.mkdir(parents=True, exist_ok=True)
  26. try:
  27. from paddleocr import PaddleOCRVL
  28. # 根据模式设置参数
  29. if args.mode == 'ocr':
  30. # 纯文本识别模式
  31. use_chart = False
  32. use_layout = False
  33. else:
  34. # 图表识别模式
  35. use_chart = args.use_chart
  36. use_layout = args.use_layout
  37. print(f"初始化 PaddleOCR VL (mode={args.mode}, chart={use_chart}, layout={use_layout})...", file=sys.stderr)
  38. # 初始化 pipeline
  39. # use_doc_unwarping: 文档矫正(关闭以提升速度)
  40. # use_doc_orientation_classify: 文档方向分类(关闭以提升速度)
  41. # use_chart_recognition: 图表识别(根据参数动态配置)
  42. # use_layout_detection: 版面检测(根据参数动态配置)
  43. pipeline = PaddleOCRVL(
  44. device=args.device,
  45. use_doc_unwarping=False,
  46. use_doc_orientation_classify=False,
  47. use_chart_recognition=use_chart,
  48. use_layout_detection=use_layout,
  49. )
  50. print(f"开始处理: {args.input}", file=sys.stderr)
  51. # 执行识别
  52. result = pipeline.predict(input=args.input)
  53. print(f"识别完成,结果类型: {type(result)}", file=sys.stderr)
  54. print(f"结果数量: {len(result) if hasattr(result, '__len__') else 'N/A'}", file=sys.stderr)
  55. # 保存结果
  56. image_basename = os.path.splitext(os.path.basename(args.input))[0]
  57. for idx, item in enumerate(result):
  58. print(f"处理结果项 {idx}: {type(item)}", file=sys.stderr)
  59. print(f" - 有 save_to_markdown 方法: {hasattr(item, 'save_to_markdown')}", file=sys.stderr)
  60. if hasattr(item, 'save_to_markdown'):
  61. print(f" - 保存到: {output_dir}", file=sys.stderr)
  62. # 使用官方 API 保存 markdown
  63. item.save_to_markdown(save_path=str(output_dir))
  64. # 列出保存后的文件
  65. if output_dir.exists():
  66. files = list(output_dir.iterdir())
  67. print(f" - 保存后的文件列表: {[f.name for f in files]}", file=sys.stderr)
  68. # 递归查找所有 .md 文件
  69. print(f" - 递归查找 .md 文件...", file=sys.stderr)
  70. md_files = list(output_dir.rglob("*.md"))
  71. print(f" - 找到 {len(md_files)} 个 .md 文件: {[f.name for f in md_files]}", file=sys.stderr)
  72. if md_files:
  73. print(f"SUCCESS: {md_files[0]}")
  74. sys.exit(0)
  75. print("错误: 未找到 markdown 输出文件", file=sys.stderr)
  76. print(f"输出目录: {output_dir}", file=sys.stderr)
  77. print(f"保存路径: {item_save_path if 'item_save_path' in locals() else 'N/A'}", file=sys.stderr)
  78. sys.exit(1)
  79. except ImportError as e:
  80. print(f"错误: 无法导入 PaddleOCR 模块: {e}", file=sys.stderr)
  81. sys.exit(1)
  82. except Exception as e:
  83. print(f"错误: {type(e).__name__}: {e}", file=sys.stderr)
  84. import traceback
  85. traceback.print_exc(file=sys.stderr)
  86. sys.exit(1)
  87. if __name__ == '__main__':
  88. main()