monkeyocr-demo / app.py
Jackxy11's picture
Create app.py
acef6d0 verified
import gradio as gr
import torch
import os
from PIL import Image
import tempfile
import subprocess
import sys
# 安装MonkeyOCR
def install_monkeyocr():
"""安装MonkeyOCR依赖"""
try:
subprocess.check_call([
sys.executable, "-m", "pip", "install",
"git+https://github.com/Yuliang-Liu/MonkeyOCR.git"
])
return True
except:
return False
# 在启动时安装
if not install_monkeyocr():
print("Failed to install MonkeyOCR")
try:
from monkeyocr import MonkeyOCR
except ImportError:
print("MonkeyOCR not available, using placeholder")
class MonkeyOCRDemo:
def __init__(self):
self.model = None
self.load_model()
def load_model(self):
"""加载MonkeyOCR模型"""
try:
# 这里需要根据实际的MonkeyOCR API调整
self.model = MonkeyOCR.from_pretrained("echo840/MonkeyOCR")
print("MonkeyOCR模型加载成功")
except Exception as e:
print(f"模型加载失败: {e}")
self.model = None
def parse_document(self, file_input, prompt="解析这个文档"):
"""解析文档"""
if self.model is None:
return "模型未加载,请稍后再试", "模型加载失败"
try:
# 处理上传的文件
if file_input is None:
return "请上传一个文件", "错误:没有文件"
# 根据文件类型处理
file_path = file_input.name if hasattr(file_input, 'name') else file_input
# 调用MonkeyOCR进行解析
# 这里需要根据实际的API调整
result = self.model.parse(file_path)
# 返回解析结果
markdown_result = result.get('markdown', '解析失败')
status = "解析成功"
return markdown_result, status
except Exception as e:
error_msg = f"解析过程中出现错误: {str(e)}"
return error_msg, "错误"
# 创建Demo实例
demo_instance = MonkeyOCRDemo()
def parse_with_monkeyocr(file_input, prompt="解析文档内容"):
"""Gradio包装函数"""
return demo_instance.parse_document(file_input, prompt)
# 创建Gradio界面
def create_interface():
with gr.Blocks(title="MonkeyOCR Document Parser", theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# 🐵 MonkeyOCR 文档解析器
MonkeyOCR采用Structure-Recognition-Relation (SRR)三元组范式,能够高效解析中英文文档。
**支持格式**: PDF, PNG, JPG, JPEG
**功能**: 文本识别、公式解析、表格提取、结构化输出
""")
with gr.Row():
with gr.Column(scale=1):
file_input = gr.File(
label="上传文档",
file_types=[".pdf", ".png", ".jpg", ".jpeg"],
type="filepath"
)
prompt_input = gr.Textbox(
label="提示词(可选)",
placeholder="请描述您希望如何解析这个文档...",
value="解析这个文档的所有内容,包括文本、表格和公式",
lines=2
)
parse_btn = gr.Button("🚀 开始解析", variant="primary", size="lg")
gr.Markdown("""
### 使用说明
1. 上传PDF文档或图片
2. 输入解析提示词(可选)
3. 点击"开始解析"按钮
4. 等待解析完成,查看结果
""")
with gr.Column(scale=2):
status_output = gr.Textbox(
label="解析状态",
value="等待上传文件...",
interactive=False
)
result_output = gr.Textbox(
label="解析结果(Markdown格式)",
lines=20,
max_lines=30,
show_copy_button=True
)
# 示例文件
gr.Examples(
examples=[
["./examples/sample.pdf", "解析这个学术论文"],
["./examples/table.png", "提取表格数据"],
["./examples/formula.jpg", "识别数学公式"],
],
inputs=[file_input, prompt_input],
outputs=[result_output, status_output],
fn=parse_with_monkeyocr,
cache_examples=False
)
# 绑定事件
parse_btn.click(
fn=parse_with_monkeyocr,
inputs=[file_input, prompt_input],
outputs=[result_output, status_output]
)
# 文件上传时的处理
file_input.change(
fn=lambda x: "文件已上传,请点击解析按钮" if x else "等待上传文件...",
inputs=[file_input],
outputs=[status_output]
)
return demo
# 启动应用
if __name__ == "__main__":
demo = create_interface()
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False
)