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()