import gradio as gr import cv2 import numpy as np from paddleocr import PaddleOCR from datetime import datetime import re from PIL import Image # Initialize PaddleOCR (only once) ocr = PaddleOCR(use_angle_cls=True, lang='en') # Use English OCR model def detect_weight(image): if image is None: return "No image uploaded", "N/A", None # Convert PIL Image to OpenCV format (NumPy array) image = image.convert("RGB") image_np = np.array(image) # Preprocess: Grayscale + contrast enhancement (optional) gray = cv2.cvtColor(image_np, cv2.COLOR_RGB2GRAY) gray_eq = cv2.equalizeHist(gray) processed_image = cv2.cvtColor(gray_eq, cv2.COLOR_GRAY2RGB) # convert back to RGB for PaddleOCR # Run OCR result = ocr.ocr(processed_image, cls=True) best_match = None best_conf = 0 # Search for a decimal number like 25.52 for line in result: for box in line: text, conf = box[1] match = re.search(r"\d+\.\d+", text) if match and conf > best_conf: best_match = match.group() best_conf = conf if best_match: now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") return f"Weight: {best_match} kg (Confidence: {round(best_conf * 100, 2)}%)", now, image else: return "No weight detected kg (Confidence: 0.0%)", "N/A", image # Gradio UI gr.Interface( fn=detect_weight, inputs=gr.Image(type="pil", label="Upload or Capture Weight Image"), outputs=[ gr.Text(label="Detected Weight"), gr.Text(label="Captured At (IST)"), gr.Image(label="Snapshot") ], title="Auto Weight Logger", description="Upload or capture a digital scale image. This app detects the weight automatically using AI." ).launch()