Download text_ocr.py from zitariumx/Tl: direct link, hf CLI and curl.
- Browser
- Download file 4.86 kB
-
https://huggingface.co/zitariumx/Tl/resolve/main/text_ocr.py
- Command line
-
hf download hf://zitariumx/Tl/text_ocr.py
-
curl -L -o text_ocr.py https://huggingface.co/zitariumx/Tl/resolve/main/text_ocr.py
4.86 kB
| from googleapiclient.discovery import build | |
| from google_auth_oauthlib.flow import InstalledAppFlow | |
| from google.auth.transport.requests import Request | |
| import io | |
| from googleapiclient.http import MediaFileUpload, MediaIoBaseDownload | |
| import os | |
| import pickle | |
| from tqdm import tqdm | |
| import cv2 | |
| import re | |
| import subprocess | |
| class TextOcr(): | |
| def __init__(self, ocrType): | |
| self.service=None | |
| self.ocrType=ocrType | |
| def getGoogleCred(self,): | |
| SCOPES = ['https://www.googleapis.com/auth/drive'] | |
| creds = None | |
| # The file token.pickle stores the user's access and refresh tokens, and is | |
| # created automatically when the authorization flow completes for the first | |
| # time. | |
| if os.path.exists('token.pickle'): | |
| with open('token.pickle', 'rb') as token: | |
| creds = pickle.load(token) | |
| # If there are no (valid) credentials available, let the user log in. | |
| if not creds or not creds.valid: | |
| if creds and creds.expired and creds.refresh_token: | |
| creds.refresh(Request()) | |
| else: | |
| flow = InstalledAppFlow.from_client_secrets_file( | |
| 'credentials.json', SCOPES) | |
| creds = flow.run_local_server(port=0) | |
| # Save the credentials for the next run | |
| with open('token.pickle', 'wb') as token: | |
| pickle.dump(creds, token) | |
| service = build('drive', 'v3', credentials=creds) | |
| return service | |
| def filterText(self,inputText): | |
| inputText = re.sub('[\\\\+/§◎*)@<>#%(&=$_\-^01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz:;«¢~「」〃ゝゞヽヾ一●▲・ヽ÷①↓®▽■◆『£〆∴∞▼™↑←]', '', inputText) #remove special char | |
| inputText = ''.join(inputText.split()) #remove whitespace | |
| return inputText | |
| def getTextGoogleOcr(self,img): | |
| if self.service is None: | |
| self.service=self.getGoogleCred() | |
| exceptionCount=0 | |
| while exceptionCount<5: | |
| try: | |
| #https://tanaikech.github.io/2017/05/02/ocr-using-google-drive-api/ | |
| txtPath = 'googleocr.txt' # Text file outputted by OCR | |
| imgPath="googleocr.jpg" | |
| cv2.imwrite(imgPath, img) | |
| mime = 'application/vnd.google-apps.document' | |
| res = self.service.files().create( | |
| body={'name': imgPath, | |
| 'mimeType': mime }, | |
| media_body=MediaFileUpload(imgPath, mimetype=mime, resumable=True) ).execute() | |
| downloader = MediaIoBaseDownload( | |
| io.FileIO(txtPath, 'wb'), | |
| self.service.files().export_media(fileId=res['id'], mimeType="text/plain")) | |
| done = False | |
| while done is False: | |
| status, done = downloader.next_chunk() | |
| self.service.files().delete(fileId=res['id']).execute() | |
| with open(txtPath, "r", encoding="utf-8" ) as f: text_google = f.read() #txt to str | |
| text_google=text_google.replace('\ufeff', '') | |
| text_google=self.filterText(text_google) | |
| except: | |
| exceptionCount+=1 | |
| continue | |
| break | |
| return text_google | |
| def getTextWindowOcr(self,img): | |
| inputFile="lib_/input.jpg" | |
| outputFile='lib_/output.txt' | |
| cv2.imwrite(inputFile, img) | |
| p = subprocess.Popen(('./lib_/winocr/winocr.exe')) | |
| p.wait() | |
| with open(outputFile, "r", encoding="utf-8" ) as f: text = f.read() #txt to str | |
| if os.path.exists(inputFile): os.remove(inputFile) | |
| if os.path.exists(outputFile): os.remove(outputFile) | |
| text=self.filterText(text) | |
| return text | |
| def checkWindowOcr(self,): | |
| p = subprocess.Popen(('./lib_/winocr/winocr.exe')) | |
| p.wait() | |
| if os.path.exists("./lib_/loadResult.txt"): | |
| with open("./lib_/loadResult.txt", "r", encoding="utf-8" ) as f: text = f.read() #txt to str | |
| if text=="True": | |
| return True | |
| return False | |
| def getTextFromImg(self,imgPath,rectList,textOnlyFolder): | |
| fileName=os.path.basename(imgPath) | |
| img = cv2.imread(textOnlyFolder+fileName) | |
| textList=[] | |
| rectP,rect=rectList | |
| for x1,y1,x2,y2 in rectP: | |
| # Cropping the text block for giving input to OCR | |
| cropped = img[y1: y2, x1: x2] | |
| if self.ocrType=="googleocr": | |
| text=self.getTextGoogleOcr(cropped) | |
| elif self.ocrType=="windowocr": | |
| text=self.getTextWindowOcr(cropped) | |
| textList+=[text] | |
| return textList | |