本项目致力于开发一个利用计算机视觉技术的文档表格和图形理解系统,该系统可应用于商业环境,以自动从文档中提取和处理信息。将使用由Roboflow构建的表格和图形识别API来检测和提取文档页面图像中的表格和图形。一旦这些元素被识别,它们将通过视觉语言模型(VLM)进行处理和分析,以生成详细的解释。
以下是构建本项目的步骤:
对于此项目,将使用来自Roboflow Universe中huyifei工作区的TF-ID计算机视觉数据集。该数据集包含超过4,000张文档页面的图像。可以下载数据集并将其上传到自己的工作区。数据集包含用两个类别标记的图像,'figure'和'table',以识别文档中的所有表格和图形,如下所示。
在Roboflow中使用Roboflow 3.0对象检测(快速)模型类型和COCOn检查点训练此数据集的模型。下图显示了模型的指标。
接下来,将在Roboflow中创建一个工作流,以构建一个能够识别文档中的表格和图形并提供描述的应用。Roboflow工作流是一个强大的开源工具,用于快速构建计算机视觉应用。可以了解更多关于工作流的信息,以及如何开始和探索其他博客。对于本博客文章中的项目,将创建以下工作流。
工作流包含以下模块:
运行工作流将生成以下输出,包括边界框描述、裁剪图像和GPT-4响应。
在这一步中,将构建一个Gradio应用,允许用户输入文档页面的图像,以帮助他们理解图像中的任何图形或表格。Gradio应用利用在前一步开发的Roboflow工作流来执行此操作。
以下是Gradio应用的输出界面代码示例:
import gradio as gr
from inference_sdk import InferenceHTTPClient
from google.colab import userdata
from PIL import Image, ImageDraw
from io import BytesIO
import base64
# 获取Colab密钥
API_KEY = userdata.get('ROBOFLOW_API_KEY')
# 初始化Roboflow客户端
client = InferenceHTTPClient(
api_url="https://detect.roboflow.com",
api_key=API_KEY
)
# 运行推理并绘制边界框的函数
def process_image(image):
# 保存图像到本地
image_path = "uploaded_image.jpg"
image.save(image_path)
# 运行推理工作流
result = client.run_workflow(
workspace_name="tim-4ijf0",
workflow_id="document-understanding-api",
images={
"image": image_path
}
)
# 初始化绘制对象以修改图像
draw = ImageDraw.Draw(image)
# 提取边界框信息并在图像上绘制
bounding_boxes = result[0]['bounding_box']['predictions']['predictions']
for box in bounding_boxes:
x = box['x']
y = box['y']
width = box['width']
height = box['height']
left = x - width / 2
top = y - height / 2
right = x + width / 2
bottom = y + height / 2
# 绘制边界框
draw.rectangle([left, top, right, bottom], outline="red", width=3)
# 将所有GPT-4输出合并为一个字符串
gpt4o_outputs = result[0]['GPT4o_output']
raw_output = "\n\n".join([output['raw_output'] for output in gpt4o_outputs])
return image, raw_output
# 创建Gradio界面
interface = gr.Interface(
fn=process_image,
inputs=gr.Image(type="pil", label="上传或捕获图像", mirror_webcam=False), # 输入标签
outputs=[
gr.Image(type="pil", format="png", label="带有边界框的输出图像"), # 输出图像标签
gr.Textbox(label="详细解释(GPT-4o响应)") # 输出文本标签
],
title="文档理解中的表格和图形识别",
description="上传或捕获包含表格和/或图形的文档页面图像以理解它。"
)
# 启动Gradio应用
interface.launch(share=True)