OCR / app.py
pragnakalp's picture
Update app.py
6576c4b
raw
history blame
8.77 kB
import gradio as gr
import requests
import tensorflow as tf
import keras_ocr
import cv2
import os
import csv
import numpy as np
import pandas as pd
import huggingface_hub
from huggingface_hub import Repository
from datetime import datetime
import scipy.ndimage.interpolation as inter
import easyocr
import datasets
from datasets import load_dataset, Image, Features, Array3D
from PIL import Image
from paddleocr import PaddleOCR
import socket
# from send_email_user import send_user_email
from huggingface_hub import HfApi
import smtplib
HF_TOKEN = os.environ.get("HF_TOKEN")
# mydataset_name = "pragnakalp/OCR-img-to-text"
# print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$",type(mydataset_name))
# hf_writer = gr.HuggingFaceDatasetSaver(HF_TOKEN,mydataset_name)
DATASET_REPO_URL = "https://huggingface.co/datasets/pragnakalp/OCR-img-to-text"
DATA_FILENAME = "ocr_data.csv"
DATA_FILE = os.path.join("ocr_data", DATA_FILENAME)
# DATA_FILENAME2 = "image"
# DATA_FILE2 = os.path.join("ocr_data",DATA_FILENAME2)
HF_TOKEN = os.environ.get("HF_TOKEN")
DATASET_REPO_ID = "pragnakalp/OCR-img-to-text"
print("is none?", HF_TOKEN is None)
try:
hf_hub_download(
repo_id=DATASET_REPO_ID,
filename=DATA_FILENAME,
cache_dir=DATA_DIRNAME,
force_filename=DATA_FILENAME
)
except:
print("file not found")
repo = Repository(
local_dir="ocr_data", clone_from=DATASET_REPO_URL, use_auth_token=HF_TOKEN
)
def get_device_ip_address():
if os.name == "nt":
result = "Running on Windows"
hostname = socket.gethostname()
result += "\nHostname: " + hostname
host = socket.gethostbyname(hostname)
result += "\nHost-IP-Address:" + host
return result
elif os.name == "posix":
gw = os.popen("ip -4 route show default").read().split()
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((gw[2], 0))
ipaddr = s.getsockname()[0]
gateway = gw[2]
host = socket.gethostname()
result = "\nIP address:\t\t" + ipaddr + "\r\nHost:\t\t" + host
return result
else:
result = os.name + " not supported yet."
return result
"""
Paddle OCR
"""
def ocr_with_paddle(img):
finaltext = ''
ocr = PaddleOCR(lang='en', use_angle_cls=True)
# img_path = 'exp.jpeg'
result = ocr.ocr(img)
for i in range(len(result[0])):
text = result[0][i][1][0]
finaltext += ' '+ text
return finaltext
"""
Keras OCR
"""
def ocr_with_keras(img):
output_text = ''
pipeline=keras_ocr.pipeline.Pipeline()
images=[keras_ocr.tools.read(img)]
predictions=pipeline.recognize(images)
first=predictions[0]
for text,box in first:
output_text += ' '+ text
return output_text
"""
easy OCR
"""
# gray scale image
def get_grayscale(image):
return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Thresholding or Binarization
def thresholding(src):
return cv2.threshold(src,127,255, cv2.THRESH_TOZERO)[1]
def ocr_with_easy(img):
gray_scale_image=get_grayscale(img)
thresholding(gray_scale_image)
cv2.imwrite('image.png',gray_scale_image)
reader = easyocr.Reader(['th','en'])
bounds = reader.readtext('image.png',paragraph="False",detail = 0)
bounds = ''.join(bounds)
return bounds
# def store_single_disk(image, image_id, label):
# """ Stores a single image as a .png file on disk.
# Parameters:
# ---------------
# image image array, (32, 32, 3) to be stored
# image_id integer unique ID for image
# label image label
# """
# Image.fromarray(image).save(disk_dir / f"{image_id}.png")
# with open(disk_dir / f"{image_id}.csv", "wt") as csvfile:
# writer = csv.writer(
# csvfile, delimiter=" ", quotechar="|", quoting=csv.QUOTE_MINIMAL
# )
# writer.writerow([label])
"""
Generate OCR
"""
def generate_ocr(Method,img):
try:
text_output = ''
add_csv = []
image_id = 1
print("Method___________________",Method)
if Method == 'EasyOCR':
text_output = ocr_with_easy(img)
if Method == 'KerasOCR':
text_output = ocr_with_keras(img)
if Method == 'PaddleOCR':
text_output = ocr_with_paddle(img)
new_data=img.reshape(img.shape)
imge = Image.fromarray(new_data.astype(np.uint8),'RGB')
feature = datasets.Image(decode=False)
add_csv = [Method,img,text_output]
# new_image = {'image': feature.encode_example(imge)}
# print("newimage: ",new_image)
with open(DATA_FILE, "a") as f:
writer = csv.writer(f)
# write the data
writer.writerow(add_csv)
commit_url = repo.push_to_hub()
print(commit_url)
# print("^^%%",Image.fromarray(img).save(DATA_FILE2 +"/"+ f"{image_id}.png"))
# with open(DATA_FILE2, "wt") as csvfile:
# writer = csv.writer(
# csvfile, delimiter=" ", quotechar="|", quoting=csv.QUOTE_MINIMAL
# )
# writer.writerow(['0'])
# try:
# dataset = load_dataset("pragnakalp/OCR-img-to-text", streaming=True)
# print(dataset.features)
# except Exception as e:
# print("error in loading data",e)
# with open(DATA_FILE, "a") as csvfile:
# writer = csv.Writer(csvfile)
# writer.writerow(add_csv)
# commit_url = repo.push_to_hub()
# print(commit_url)
# save_details(Method,text_output,img)
# sender="pragnakalp.dev33@gmail.com"
# password="httscgatatbbxxur"
# reciever="pragnakalp.dev35@gmail.com"
# s = smtplib.SMTP('smtp.gmail.com', 587)
# s.starttls()
# s.ehlo()
# s.login(sender,password)
# message = """Subject : Appointment Booking\n\n
# Hello,
# Your OCR generated successfully"""
# s.sendmail(sender, reciever, message)
# s.quit()
# mailsend=1
# print("Send mail successfully")
return text_output
except Exception as e:
print("Error in ocr generation ==>",e)
text_output = "Something went wrong"
return text_output
"""
Save generated details
"""
def save_details(Method,text_output,img):
# print("//////////")
hostname = get_device_ip_address()
# url = 'https://pragnakalpdev33.pythonanywhere.com/HF_space_image_to_text'
# url = 'http://pragnakalpdev35.pythonanywhere.com/HF_space_image_to_text'
# myobj = {'Method': Method,'text_output':text_output,'img':img.tolist(),'hostname':hostname}
# x = requests.post(url, json = myobj)
# method = []
# img_path = []
# text = []
# input_img = ''
# hostname = ''
# picture_path = "image.jpg"
# curr_datetime = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
# if text_output:
# splitted_path = os.path.splitext(picture_path)
# modified_picture_path = splitted_path[0] + curr_datetime + splitted_path[1]
# cv2.imwrite("myimage.jpg", img)
# with open('savedata.txt', 'w') as f:
# print("write test")
# f.write("testdata")
# print("write Successfully")
# # img = Image.open(r"/home/user/app/")
# # img.save(modified_picture_path)
# input_img = modified_picture_path
# try:
# df = pd.read_csv("AllDetails.csv")
# df2 = {'method': Method, 'input_img': input_img, 'generated_text': text_output}
# df = df.append(df2, ignore_index = True)
# df.to_csv("AllDetails.csv", index=False)
# except:
# method.append(Method)
# img_path.append(input_img)
# text.append(text_output)
# dict = {'method': method, 'input_img': img_path, 'generated_text': text}
# df = pd.DataFrame(dict,index=None)
# df.to_csv("AllDetails.csv")
return send_user_email()
# return x
"""
Create user interface for OCR demo
"""
image = gr.Image(shape=(224, 224),elem_id="img_div")
method = gr.Radio(["EasyOCR", "KerasOCR", "PaddleOCR"],value="PaddleOCR",elem_id="radio_div")
output = gr.Textbox(label="Output")
demo = gr.Interface(
generate_ocr,
[method,image],
output,
title="Optical Character Recognition",
description="Try OCR with different methods",
css=".gradio-container {background-color: lightgray} #radio_div {background-color: #FFD8B4; font-size: 40px;}",
allow_flagging = "manual"
# flagging_dir = "flagged",
# flagging_callback=hf_writer
)
demo.launch(enable_queue = False)