import gradio as gr import spaces from transformers import AutoModel, AutoTokenizer import os import base64 import io import uuid import time import shutil from pathlib import Path import re import easyocr tokenizer = AutoTokenizer.from_pretrained('RufusRubin777/GOT-OCR2_0_CPU', trust_remote_code=True, device_map='cpu') model = AutoModel.from_pretrained('RufusRubin777/GOT-OCR2_0_CPU', trust_remote_code=True, low_cpu_mem_usage=True, device_map='cpu', use_safetensors=True) model = model.eval().cpu() reader = easyocr.Reader(['hi']) UPLOAD_FOLDER = "./uploads" RESULTS_FOLDER = "./results" for folder in [UPLOAD_FOLDER, RESULTS_FOLDER]: if not os.path.exists(folder): os.makedirs(folder) def image_to_base64(image): buffered = io.BytesIO() image.save(buffered, format="PNG") return base64.b64encode(buffered.getvalue()).decode() def run_GOT(image, language): unique_id = str(uuid.uuid4()) image_path = os.path.join(UPLOAD_FOLDER, f"{unique_id}.png") shutil.copy(image, image_path) try: english_extraction = model.chat(tokenizer, image_path, ocr_type='ocr') hindi_extraction = reader.readtext(image) hindi_extract = '' for x in hindi_extraction: hindi_extract += x[1] + '\n' return english_extraction + '\n' + hindi_extract except Exception as e: return f"Error: {str(e)}", None finally: if os.path.exists(image_path): os.remove(image_path) def search_keyword(text, keyword): if not keyword: return "

Please enter a keyword to search.

" # Convert text and keyword to lowercase for case-insensitive search text_lower = text.lower() keyword_lower = keyword.lower() # Find all occurrences of the keyword matches = list(re.finditer(re.escape(keyword_lower), text_lower)) if not matches: return f"

Keyword '{keyword}' not found in the text.

" # Highlight all occurrences of the keyword result = [] last_end = 0 for match in matches: start, end = match.span() result.append(text[last_end:start]) result.append(f'{text[start:end]}') last_end = end result.append(text[last_end:]) highlighted_text = ''.join(result) # Wrap the result in a scrollable div with some basic styling return f"""

{highlighted_text}

Found {len(matches)} occurrence(s) of '{keyword}'

""" def cleanup_old_files(): current_time = time.time() for folder in [UPLOAD_FOLDER, RESULTS_FOLDER]: for file_path in Path(folder).glob('*'): if current_time - file_path.stat().st_mtime > 3600: # 1 hour file_path.unlink() title_html = """

IIT Roorkee (GOT ASSIGNMENT)

""" with gr.Blocks() as scan_master_web_app: gr.HTML(title_html) with gr.Row(): with gr.Column(): image_input = gr.Image(type="filepath", label="Upload your image") submit_button = gr.Button("Extract Text") ocr_result = gr.Textbox(label="Extracted Text") with gr.Column(): keyword = gr.Textbox(label="Search a keyword in the extracted text") search_button = gr.Button("Search Keyword") search_result = gr.HTML(label="Search result") submit_button.click( run_GOT, inputs=[image_input], outputs=[ocr_result] ) search_button.click( search_keyword, inputs=[ocr_result, keyword], outputs=[search_result] ) if __name__ == "__main__": cleanup_old_files() scan_master_web_app.launch()