Spaces:
Running
on
Zero
Running
on
Zero
File size: 5,991 Bytes
cef4f97 22c7b5b cef4f97 d1d0907 1a87a19 bbed54b 22c7b5b bbed54b 22c7b5b bbed54b 22c7b5b bbed54b ed456c1 22c7b5b cef4f97 bbed54b cef4f97 00ee90b cef4f97 bbed54b 1a87a19 cef4f97 bbed54b 40d5755 bbed54b cef4f97 1c8b27f 71a766f bbed54b cef4f97 bbed54b cef4f97 d1d0907 cef4f97 bbed54b cef4f97 bbed54b cef4f97 bbed54b cef4f97 f34dca6 bbed54b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
import gradio as gr
import torch
from transformers import AutoModel, AutoTokenizer, AutoConfig
import os
import base64
import spaces
import io
from PIL import Image
import numpy as np
import yaml
import markdown
from pathlib import Path
# Function to extract title and description from the markdown file
def extract_title_description(md_file_path):
with open(md_file_path, 'r') as f:
lines = f.readlines()
# Extract frontmatter (YAML) for title
frontmatter = []
content_start = 0
if lines[0].strip() == '---':
for idx, line in enumerate(lines[1:], 1):
if line.strip() == '---':
content_start = idx + 1
break
frontmatter.append(line)
frontmatter_yaml = yaml.safe_load(''.join(frontmatter))
title = frontmatter_yaml.get('title', 'Title Not Found')
# Extract content (description)
description_md = ''.join(lines[content_start:])
description = markdown.markdown(description_md)
return title, description
# Path to the markdown file
md_file_path = 'content/index.md'
# Extract title and description from the markdown file
title, description = extract_title_description(md_file_path)
# Rest of the script continues as before
model_name = 'ucaslcl/GOT-OCR2_0'
tokenizer = AutoTokenizer.from_pretrained('ucaslcl/GOT-OCR2_0', trust_remote_code=True)
config = AutoConfig.from_pretrained(model_name, trust_remote_code=True)
model = AutoModel.from_pretrained('ucaslcl/GOT-OCR2_0', trust_remote_code=True, low_cpu_mem_usage=True, device_map='cuda', use_safetensors=True, pad_token_id=tokenizer.eos_token_id)
model = model.eval().cuda()
model.config.pad_token_id = tokenizer.eos_token_id
def image_to_base64(image):
buffered = io.BytesIO()
image.save(buffered, format="PNG")
return base64.b64encode(buffered.getvalue()).decode()
@spaces.GPU
def process_image(image, task, ocr_type=None, ocr_box=None, ocr_color=None, render=False):
if task == "Plain Text OCR":
res = model.chat(tokenizer, image, ocr_type='ocr')
elif task == "Format Text OCR":
res = model.chat(tokenizer, image, ocr_type='format')
elif task == "Fine-grained OCR (Box)":
res = model.chat(tokenizer, image, ocr_type=ocr_type, ocr_box=ocr_box)
elif task == "Fine-grained OCR (Color)":
res = model.chat(tokenizer, image, ocr_type=ocr_type, ocr_color=ocr_color)
elif task == "Multi-crop OCR":
res = model.chat_crop(tokenizer, image_file=image)
elif task == "Render Formatted OCR":
res = model.chat(tokenizer, image, ocr_type='format', render=True, save_render_file='./demo.html')
with open('./demo.html', 'r') as f:
html_content = f.read()
return res, html_content
return res, None
def update_inputs(task):
if task == "Plain Text OCR" or task == "Format Text OCR" or task == "Multi-crop OCR":
return [gr.update(visible=False)] * 4
elif task == "Fine-grained OCR (Box)":
return [
gr.update(visible=True, choices=["ocr", "format"]),
gr.update(visible=True),
gr.update(visible=False),
gr.update(visible=False)
]
elif task == "Fine-grained OCR (Color)":
return [
gr.update(visible=True, choices=["ocr", "format"]),
gr.update(visible=False),
gr.update(visible=True, choices=["red", "green", "blue"]),
gr.update(visible=False)
]
elif task == "Render Formatted OCR":
return [gr.update(visible=False)] * 3 + [gr.update(visible=True)]
def ocr_demo(image, task, ocr_type, ocr_box, ocr_color):
res, html_content = process_image(image, task, ocr_type, ocr_box, ocr_color)
if html_content:
return res, html_content
return res, None
import gradio as gr
with gr.Blocks() as demo:
with gr.Row():
# Left Column: Description
with gr.Column(scale=1):
gr.Markdown(f"# {title}")
gr.Markdown(description)
# Right Column: App Inputs and Outputs
with gr.Column(scale=3):
image_input = gr.Image(type="filepath", label="Input Image")
task_dropdown = gr.Dropdown(
choices=[
"Plain Text OCR",
"Format Text OCR",
"Fine-grained OCR (Box)",
"Fine-grained OCR (Color)",
"Multi-crop OCR",
"Render Formatted OCR"
],
label="Select Task",
value="Plain Text OCR"
)
ocr_type_dropdown = gr.Dropdown(
choices=["ocr", "format"],
label="OCR Type",
visible=False
)
ocr_box_input = gr.Textbox(
label="OCR Box (x1,y1,x2,y2)",
placeholder="e.g., 100,100,200,200",
visible=False
)
ocr_color_dropdown = gr.Dropdown(
choices=["red", "green", "blue"],
label="OCR Color",
visible=False
)
render_checkbox = gr.Checkbox(
label="Render Result",
visible=False
)
submit_button = gr.Button("Process")
# OCR Result below the Submit button
output_text = gr.Textbox(label="OCR Result")
output_html = gr.HTML(label="Rendered HTML Output")
# Update inputs dynamically based on task selection
task_dropdown.change(
update_inputs,
inputs=[task_dropdown],
outputs=[ocr_type_dropdown, ocr_box_input, ocr_color_dropdown, render_checkbox]
)
# Process OCR on button click
submit_button.click(
ocr_demo,
inputs=[image_input, task_dropdown, ocr_type_dropdown, ocr_box_input, ocr_color_dropdown],
outputs=[output_text, output_html]
)
if __name__ == "__main__":
demo.launch()
|