Spaces:
Runtime error
Runtime error
File size: 2,097 Bytes
42886cd da9f292 5d670ae da9f292 a29f826 da9f292 42886cd da9f292 363a646 65ed4c1 a29f826 da9f292 42886cd 3ca006e ddf8948 ee1d691 ddf8948 42886cd ddf8948 61b752b ddf8948 477d4fe ddf8948 61b752b ddf8948 acddb2f 103f82b ddf8948 61b752b ddf8948 103f82b ddf8948 8fe1b94 65ed4c1 2132698 |
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 |
from mmocr.utils.ocr import MMOCR
import numpy as np
import cv2
import re
from PIL import Image
# Load MMOCR (det + recog)
ocr = MMOCR(det='DBPANet', recog='SAR', device='cpu') # CPU mode for Hugging Face
def extract_weight_from_image(pil_img):
try:
img = np.array(pil_img.convert("RGB"))[:, :, ::-1]
result = ocr.readtext(img, print_result=False, output=None)[0]['result']
raw_texts = []
weight_candidates = []
fallback_weight = None
fallback_conf = 0.0
for text, conf in result:
original = text
cleaned = text.lower().strip()
cleaned = cleaned.replace(",", ".")
cleaned = cleaned.replace("o", "0").replace("O", "0")
cleaned = cleaned.replace("s", "5").replace("S", "5")
cleaned = cleaned.replace("g", "9").replace("G", "6")
cleaned = cleaned.replace("kg", "").replace("kgs", "")
cleaned = re.sub(r"[^0-9\.]", "", cleaned)
raw_texts.append(f"{original} → {cleaned} (conf: {round(conf, 2)})")
if cleaned and cleaned.replace(".", "").isdigit() and not fallback_weight:
fallback_weight = cleaned
fallback_conf = conf
if cleaned.count(".") <= 1 and re.fullmatch(r"\d{2,4}(\.\d{1,3})?", cleaned):
weight_candidates.append((cleaned, conf))
if weight_candidates:
best_weight, best_conf = sorted(weight_candidates, key=lambda x: -x[1])[0]
elif fallback_weight:
best_weight, best_conf = fallback_weight, fallback_conf
else:
return "Not detected", 0.0, "\n".join(raw_texts)
if "." in best_weight:
int_part, dec_part = best_weight.split(".")
int_part = int_part.lstrip("0") or "0"
best_weight = f"{int_part}.{dec_part}"
else:
best_weight = best_weight.lstrip("0") or "0"
return best_weight, round(best_conf * 100, 2), "\n".join(raw_texts)
except Exception as e:
return f"Error: {str(e)}", 0.0, "OCR failed"
|