Spaces:
Runtime error
Runtime error
| import os | |
| import gradio as gr | |
| import cv2 | |
| import pytesseract | |
| from fastapi import FastAPI | |
| import numpy as np | |
| #pytesseract.pytesseract.tesseract_cmd = r'./Tesseract-OCR/tesseract.exe' | |
| print(os.popen(f'cat /etc/debian_version').read()) | |
| print(os.popen(f'cat /etc/issue').read()) | |
| print(os.popen(f'apt search tesseract').read()) | |
| def PreprocessIMG(image): | |
| # Convert to grayscale | |
| image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
| # Apply Canny edge detection | |
| image = cv2.GaussianBlur(image,(3,3),0) | |
| edges = cv2.Canny(image, 90, 120, apertureSize=3) | |
| # Apply Hough line transform to detect lines | |
| lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=300) | |
| # Remove lines from the image | |
| for rho, theta in lines[:, 0]: | |
| a = np.cos(theta) | |
| b = np.sin(theta) | |
| x0 = a * rho | |
| y0 = b * rho | |
| x1 = int(x0 + 1000 * (-b)) | |
| y1 = int(y0 + 1000 * (a)) | |
| x2 = int(x0 - 1000 * (-b)) | |
| y2 = int(y0 - 1000 * (a)) | |
| cv2.line(image, (x1, y1), (x2, y2), (255, 255, 255), 3) | |
| return image | |
| def TextLineBox(img, engine): | |
| class Lines: | |
| def __init__(self,x,y,w,h,text): | |
| self.x = x | |
| self.y = y | |
| self.w = w | |
| self.h = h | |
| self.text = text | |
| lineboxes = [] | |
| #read image | |
| img = PreprocessIMG(img) | |
| ### Cofig | |
| configname = r' --oem 3 --psm ' + str(engine) + ' -l eng' | |
| #### Text for testing | |
| texttest = pytesseract.image_to_string(img ,config=configname) | |
| ### Box of words | |
| boxes = pytesseract.image_to_data(img, config=configname) | |
| # print(boxes) | |
| #slit box and concatenate into line | |
| skip = 0 | |
| for b in boxes.splitlines(): | |
| ## skip header | |
| if (skip == 0): | |
| skip = 1 | |
| continue | |
| ## get box of word in 1 object | |
| b = b.split() | |
| if (len(b) < 12): ## it is a space not a word | |
| continue | |
| #print(b) | |
| x,y,w,h,text = int(b[6]),int(b[7]),int(b[8]),int(b[9]), b[11] | |
| ### Begin New line if the word having num_word is 1 | |
| if (int(b[5]) == 1): | |
| lineboxes.append( Lines(x,y,w,h,text) ) | |
| ### Next word inline | |
| else: | |
| lineboxes[-1].text += ' ' + text | |
| if (x > lineboxes[-1].x): | |
| lineboxes[-1].w = x - lineboxes[-1].x + w | |
| if (y < lineboxes[-1].y): | |
| lineboxes[-1].y = y | |
| if (y+h > lineboxes[-1].y + lineboxes[-1].h): | |
| lineboxes[-1].h = y+h - lineboxes[-1].y | |
| #draw the box of WORD | |
| cv2.rectangle(img, (x,y) , (w+x,y+h), (255,0,0), 2 ) | |
| return texttest,img | |
| def Download(text): | |
| with open("test.txt", "w") as file: | |
| file.write(text) | |
| return "test.txt" | |
| with gr.Blocks (theme="ParityError/Anime" , css="#SUBMIT {background-color: #cdb4db} #DOWNLOAD {background-color: #a2d2ff}") as demo: | |
| with gr.Row(): | |
| with gr.Column(): | |
| input = gr.Image() | |
| engine_input = gr.Text(label="Engine Mode Number") | |
| text_output = gr.Text(label="Result Text") | |
| file_output = gr.File() | |
| with gr.Row(): | |
| submit_btn = gr.Button("SUBMIT" , elem_id="SUBMIT") | |
| download_btn = gr.Button("DOWNLOAD", elem_id="DOWNLOAD") | |
| clear_btn = gr.Button("CLEAR") | |
| with gr.Column(): | |
| image_output = gr.Image() | |
| submit_btn.click(TextLineBox, inputs=[input,engine_input,], outputs= [text_output, image_output, ] ) | |
| download_btn.click(Download, text_output, outputs= file_output ) | |
| clear_btn.click(lambda: [None,None,None], inputs=None, outputs= [text_output, file_output, image_output]) | |
| demo.load( | |
| None, | |
| None, | |
| _js=""" | |
| () => { | |
| const params = new URLSearchParams(window.location.search); | |
| if (!params.has('__theme')) { | |
| params.set('__theme', 'dark'); | |
| window.location.search = params.toString(); | |
| } | |
| }""", | |
| ) | |
| demo.queue().launch() | |
| # Cach 1 dung app Gradio (share = True) | |
| # Cach 2 dung Mount_Gradio_app trong FASTAPI app | |
| # Cach 3 | |
| # app = FastAPI() | |
| # app = gr.mount_gradio_app(app, demo, path="/OCR" ) | |
| #bt.click(fn=None, _js="window.open('https://google.com', '_blank')") |