Spaces:
Running
Running
File size: 3,863 Bytes
0590b95 a8e065f d5ceb6c f50878a d5ceb6c 0590b95 d55b56b d5ceb6c f50878a d5ceb6c 7ebef67 f50878a d5ceb6c 7ebef67 f50878a 7ebef67 d5ceb6c 7ebef67 d5ceb6c f50878a 7ebef67 d5ceb6c 7ebef67 d5ceb6c 7ebef67 d5ceb6c f50878a d5ceb6c 3a4eb5d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
import gradio as gr
from PIL import Image
from datetime import datetime
import pytz
from ocr_engine import extract_weight
from simple_salesforce import Salesforce
import base64
import os
import re
# Salesforce credentials
SF_USERNAME = "[email protected]"
SF_PASSWORD = "autoweight@32"
SF_TOKEN = "UgiHKWT0aoZRX9gvTYDjAiRY"
# Connect to Salesforce
sf = Salesforce(username=SF_USERNAME, password=SF_PASSWORD, security_token=SF_TOKEN)
def process_image(image):
if image is None:
return "β No image provided", "", None, gr.update(visible=True)
try:
weight = extract_weight(image)
print("π§ Final OCR Result:", weight)
ist = pytz.timezone('Asia/Kolkata')
timestamp = datetime.now(ist).strftime("%Y-%m-%d %H:%M:%S IST")
# Check for valid weight
if not weight or ("No valid" in weight and "OCR:" not in weight):
return "β Unable to detect. Try again with a clearer image.", "", image, gr.update(visible=True)
# Extract numeric part and unit
numeric_match = re.search(r'\d{1,5}(?:\.\d{1,3})?', weight)
if not numeric_match:
return "β Could not extract number", "", image, gr.update(visible=True)
numeric_value = float(numeric_match.group())
unit = "kg" if "kg" in weight.lower() else "g"
# Save image
image_path = "snapshot.jpg"
image.save(image_path)
# Create Salesforce record
record = sf.Weight_Log__c.create({
"Captured_Weight__c": numeric_value,
"Captured_Unit__c": unit, # β
make sure this exists in Salesforce
"Captured_At__c": datetime.now(ist).isoformat(),
"Device_ID__c": "DEVICE-001",
"Status__c": "Confirmed"
})
# Upload image to Salesforce
with open(image_path, "rb") as f:
encoded_image = base64.b64encode(f.read()).decode("utf-8")
content = sf.ContentVersion.create({
"Title": f"Snapshot_{timestamp}",
"PathOnClient": "snapshot.jpg",
"VersionData": encoded_image
})
content_id = sf.query(
f"SELECT ContentDocumentId FROM ContentVersion WHERE Id = '{content['id']}'"
)['records'][0]['ContentDocumentId']
sf.ContentDocumentLink.create({
"ContentDocumentId": content_id,
"LinkedEntityId": record['id'],
"ShareType": "V",
"Visibility": "AllUsers"
})
return weight, timestamp, image, gr.update(visible=False)
except Exception as e:
return f"Error: {str(e)}", "", None, gr.update(visible=True)
with gr.Blocks(css=".gr-button {background-color: #2e7d32 !important; color: white !important;}") as demo:
gr.Markdown("""
<h1 style='text-align: center; color: #2e7d32;'>π· Auto Weight Logger</h1>
<p style='text-align: center;'>Upload or capture a digital weight image. Detects weight using AI OCR and logs it into Salesforce.</p>
<hr style='border: 1px solid #ddd;'/>
""")
with gr.Row():
image_input = gr.Image(type="pil", label="π Upload or Capture Image")
detect_btn = gr.Button("π Detect Weight")
with gr.Row():
weight_out = gr.Textbox(label="π¦ Detected Weight", placeholder="e.g., 75.5 kg", show_copy_button=True)
time_out = gr.Textbox(label="π Captured At (IST)", placeholder="e.g., 2025-07-01 12:00:00")
snapshot = gr.Image(label="πΈ Snapshot Preview")
retake_btn = gr.Button("π Retake / Try Again", visible=False)
detect_btn.click(fn=process_image, inputs=image_input, outputs=[weight_out, time_out, snapshot, retake_btn])
retake_btn.click(fn=lambda: ("", "", None, gr.update(visible=False)),
inputs=[], outputs=[weight_out, time_out, snapshot, retake_btn])
demo.launch()
|