Spaces:
Sleeping
Sleeping
| 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 = 'Image To Text OCR Converter' | |
| subtitle = 'Extract Hindi/English or both or any Text From Image' | |
| description = 'This application is being built on the request of IIT R Internship Assignment. It allows users to upload a single image, processes the image to extract text using OCR, and provides a basic search feature.' | |
| note = 'Please keep patience while processing the OCR, as it may take a few seconds to complete' | |
| alternative_link = "[Alternative: Ready-to-use OCR using Vercel](https://iitr-haq-nawaz-maliks-projects.vercel.app/)" | |
| 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() |