Shaik Ahamad
Cheque Dates Predictor using LeNet5 Arch application
717af72 unverified
Raw
History Blame Contribute Delete
3.33 kB
import gradio as gr
import os
from core.predict import ImageClassifier
from PIL import Image
import cv2
# Set up model path
cwd = os.getcwd()
model_path = os.path.join(cwd, "model", "lenet5_digit_classifier.pth")
# Initialize classifier
classifier = ImageClassifier(model_path=model_path)
# Function to extract and save date digits from cheque image
def save_dates_digits(image_path):
cheque_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if cheque_image is None:
raise ValueError("Image could not be read. Check the path or format.")
inverted_image = 255 - cheque_image
cv2.imwrite("inverted_cheque.jpg", inverted_image)
# Coordinates for cropping date region
x, y, w, h = 1790, 100, 460, 80
cropped_date = inverted_image[y:y+h, x:x+w]
# Digit cropping parameters
start_x = 5
start_y = 0
digit_width = 60
digit_height = 70
digit_labels = ['D1', 'D2', 'M1', 'M2', 'Y1', 'Y2', 'Y3', 'Y4']
os.makedirs("./Dates_New", exist_ok=True)
for i, label in enumerate(digit_labels):
digit_img = cropped_date[start_y:start_y + digit_height, start_x + i * digit_width : start_x + (i + 1) * digit_width]
save_path = os.path.join("./Dates_New", f"{label}.jpg")
cv2.imwrite(save_path, digit_img)
# Gradio interface function
def classify_image(image):
image_path = "uploaded_image.jpg"
image.save(image_path)
# Step 1: Extract digit images
save_dates_digits(image_path)
# Step 2: Predict each digit
digit_labels = ['D1', 'D2', 'M1', 'M2', 'Y1', 'Y2', 'Y3', 'Y4']
digit_folder = "./Dates_New"
predicted_digits = []
digit_images = []
for label in digit_labels:
digit_path = os.path.join(digit_folder, f"{label}.jpg")
if os.path.exists(digit_path):
digit_label, _ = classifier.predict(digit_path)
predicted_digits.append(str(digit_label))
digit_images.append((Image.open(digit_path), f"{label}: {digit_label}"))
else:
predicted_digits.append("?")
digit_images.append((None, f"{label}: ?"))
# Step 3: Reconstruct date
day = "".join(predicted_digits[0:2])
month = "".join(predicted_digits[2:4])
year = "".join(predicted_digits[4:8])
reconstructed_date = f"{day}/{month}/{year}"
# Step 4: Load inverted cheque image
inverted_cheque_path = "inverted_cheque.jpg"
inverted_cheque = Image.open(inverted_cheque_path) if os.path.exists(inverted_cheque_path) else None
# Step 5: Return all outputs
return reconstructed_date, image, inverted_cheque, digit_images
# Gradio UI setup
demo = gr.Interface(
fn=classify_image,
inputs=gr.Image(type="pil", label="Upload Cheque Image"),
outputs=[
gr.Textbox(label="Predicted Date (DD/MM/YYYY)"),
gr.Image(label="Original Image"),
gr.Image(label="Inverted Cheque Image"),
gr.Gallery(label="Digit Predictions", columns=8, height=100)
],
title="Cheque Date Prediction using LeNet-5 CNN",
description="Upload a cheque image to extract and predict handwritten date using a CNN model. Each digit is shown below with its prediction."
)
# Launch the app
if __name__ == "__main__":
demo.launch()