import gradio as gr from paddleocr import PaddleOCR from PIL import Image import numpy as np import cv2 import re from datetime import datetime from pytz import timezone ocr = PaddleOCR(use_angle_cls=False, lang='en') # cls removed def detect_weight(image): try: if image is None: return "No image uploaded", "N/A", None image = image.convert("RGB") image_np = np.array(image) gray = cv2.cvtColor(image_np, cv2.COLOR_RGB2GRAY) enhanced = cv2.equalizeHist(gray) rgb_image = cv2.cvtColor(enhanced, cv2.COLOR_GRAY2RGB) result = ocr.ocr(rgb_image) best_match = None best_conf = 0 for line in result: for box in line: if len(box) > 1 and isinstance(box[1], tuple): 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_ist = datetime.now(timezone('Asia/Kolkata')).strftime("%Y-%m-%d %H:%M:%S IST") return f"Weight: {best_match} kg (Confidence: {round(best_conf * 100, 2)}%)", now_ist, image else: return "No weight detected kg (Confidence: 0.0%)", "N/A", image except Exception as e: return f"Error: {str(e)}", "Error", None with gr.Blocks() as demo: gr.Markdown("## Auto Weight Logger\nUpload or capture a digital scale image. This app detects the weight automatically using AI.") with gr.Row(): image_input = gr.Image(type="pil", label="Upload or Capture Weight Image", sources=["upload", "camera"]) with gr.Column(): output_text = gr.Textbox(label="Detected Weight") output_time = gr.Textbox(label="Captured At (IST)") snapshot_output = gr.Image(label="📷 Snapshot") image_input.change(fn=detect_weight, inputs=image_input, outputs=[output_text, output_time, snapshot_output]) demo.launch()