File size: 4,994 Bytes
913b0ce
b896977
913b0ce
 
6ec889f
913b0ce
 
300310b
913b0ce
 
 
 
 
 
 
 
 
b896977
913b0ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b896977
913b0ce
b896977
913b0ce
b896977
913b0ce
 
b896977
913b0ce
 
 
 
 
 
 
 
 
b896977
913b0ce
300310b
f17394c
b896977
f17394c
913b0ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b896977
913b0ce
 
 
 
b896977
913b0ce
 
 
 
 
 
b896977
913b0ce
 
b896977
913b0ce
 
 
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
import PIL
from PIL import Image
from PIL import ImageDraw
import gradio as gr
import torch
import easyocr
import re

# Download example images (same as before)
# Download example images
torch.hub.download_url_to_file('https://github.com/JaidedAI/EasyOCR/raw/master/examples/english.png', 'english.png')
torch.hub.download_url_to_file('https://i.imgur.com/mwQFd7G.jpeg', 'Hindi.jpeg')
torch.hub.download_url_to_file('https://github.com/JaidedAI/EasyOCR/raw/master/examples/thai.jpg', 'thai.jpg')
torch.hub.download_url_to_file('https://github.com/JaidedAI/EasyOCR/raw/master/examples/french.jpg', 'french.jpg')
torch.hub.download_url_to_file('https://github.com/JaidedAI/EasyOCR/raw/master/examples/chinese.jpg', 'chinese.jpg')
torch.hub.download_url_to_file('https://github.com/JaidedAI/EasyOCR/raw/master/examples/japanese.jpg', 'japanese.jpg')
torch.hub.download_url_to_file('https://github.com/JaidedAI/EasyOCR/raw/master/examples/korean.png', 'korean.png')

def draw_boxes(image, bounds, color='yellow', width=2):
    draw = ImageDraw.Draw(image)
    for bound in bounds:
        p0, p1, p2, p3 = bound[0]
        draw.line([*p0, *p1, *p2, *p3, *p0], fill=color, width=width)
    return image

def format_extracted_text(bounds):
    return " ".join([text for _, text, _ in bounds])

def highlight_search_results(text, search_query):
    if not search_query:
        return text, []
    pattern = re.compile(re.escape(search_query), re.IGNORECASE)
    matches = list(pattern.finditer(text))
    highlighted_text = pattern.sub(lambda m: f"**{m.group()}**", text)
    return highlighted_text, matches

def inference(img, lang):
    reader = easyocr.Reader(lang)
    bounds = reader.readtext(img)
    im = PIL.Image.open(img)
    draw_boxes(im, bounds)
    im.save('result.jpg')
    
    extracted_text = format_extracted_text(bounds)
    
    return ['result.jpg', extracted_text]

def search_text(text, search_query):
    highlighted_text, matches = highlight_search_results(text, search_query)
    
    if matches:
        result = f"Found {len(matches)} occurrence(s) of \"{search_query}\":\n"
        for i, match in enumerate(matches, 1):
            context_start = max(0, match.start() - 20)
            context_end = min(len(text), match.end() + 20)
            context = text[context_start:context_end]
            result += f"{i}. ...{context}...\n"
    else:
        result = f"No occurrences of \"{search_query}\" found."
    
    return highlighted_text, result

title = 'TransformoDocs'

note = 'Please keep patience, as it may take a few seconds to complete'


examples = [
    ['english.png', ['en']],
    ['Hindi.jpeg', ['hi', 'en']],
    ['thai.jpg', ['th', 'en']],
    ['french.jpg', ['fr', 'en']],
    ['chinese.jpg', ['ch_sim', 'en']],
    ['japanese.jpg', ['ja', 'en' ]],
    ['korean.png', ['ko', 'en' ]]
]

css = """
.output_image, .input_image {height: 40rem !important; width: 100% !important;}
.search_results {margin-top: 1rem; padding: 1rem; background-color: #f0f0f0; border-radius: 4px;}
.centered-title {text-align: center; font-size: 2.5em; font-weight: bold; margin-bottom: 0.5em;}
.centered-subtitle {text-align: center; font-size: 1.5em; margin-bottom: 1em;}
.alternative-link {text-align: center; margin-top: 1em; font-style: italic;}
"""


choices = [
    "abq", "ady", "af", "ang", "ar", "as", "ava", "az", "be", "bg", "bh", "bho", "bn", "bs", "ch_sim", "ch_tra", 
    "che", "cs", "cy", "da", "dar", "de", "en", "es", "et", "fa", "fr", "ga", "gom", "hi", "hr", "hu", "id", 
    "inh", "is", "it", "ja", "kbd", "kn", "ko", "ku", "la", "lbe", "lez", "lt", "lv", "mah", "mai", "mi", "mn", 
    "mr", "ms", "mt", "ne", "new", "nl", "no", "oc", "pi", "pl", "pt", "ro", "ru", "rs_cyrillic", "rs_latin", 
    "sck", "sk", "sl", "sq", "sv", "sw", "ta", "tab", "te", "th", "tjk", "tl", "tr", "ug", "uk", "ur", "uz", "vi"
]

with gr.Blocks(css=css) as iface:
    gr.Markdown(f"# {title}")
    gr.Markdown(f"## {subtitle}")
    gr.Markdown(description)
    gr.Markdown(note)
    gr.Markdown(alternative_link)
    with gr.Row():
        with gr.Column(scale=2):
            input_image = gr.Image(type="filepath", label="Upload Image")
            lang_select = gr.CheckboxGroup(choices=choices, label="Select Languages", value=['hi', 'en'])
            ocr_button = gr.Button("Perform OCR")
        
        with gr.Column(scale=3):
            output_image = gr.Image(type="filepath", label="OCR Result")
            extracted_text = gr.Markdown(label="Extracted Text")
            search_box = gr.Textbox(label="Search in extracted text")
            search_button = gr.Button("Search")
            search_results = gr.Markdown(label="Search Results")
    
    ocr_button.click(inference, inputs=[input_image, lang_select], outputs=[output_image, extracted_text])
    search_button.click(search_text, inputs=[extracted_text, search_box], outputs=[extracted_text, search_results])
    
    gr.Examples(examples, inputs=[input_image, lang_select])

iface.launch()