Sanjayraju30 commited on
Commit
d754b04
·
verified ·
1 Parent(s): b61209f

Update ocr_engine.py

Browse files
Files changed (1) hide show
  1. ocr_engine.py +9 -12
ocr_engine.py CHANGED
@@ -1,24 +1,21 @@
1
- from transformers import DonutProcessor, VisionEncoderDecoderModel
2
  from PIL import Image
3
  import re
4
 
5
- # Load OCR processor and model (pretrained on receipts, good for 7-segment)
6
- processor = DonutProcessor.from_pretrained("naver-clova-ix/donut-base-finetuned-cord-v2")
7
- model = VisionEncoderDecoderModel.from_pretrained("naver-clova-ix/donut-base-finetuned-cord-v2")
8
 
9
  def extract_weight(image: Image.Image) -> str:
10
  image = image.convert("RGB")
11
- pixel_values = processor(image, return_tensors="pt").pixel_values
 
 
12
 
13
- outputs = model.generate(pixel_values, max_length=512)
14
- decoded = processor.batch_decode(outputs, skip_special_tokens=True)[0]
15
-
16
- # Extract weight number
17
- cleaned = decoded.lower().replace(" ", "")
18
  match = re.search(r"(\d+(\.\d+)?)", cleaned)
19
  weight = match.group(1) if match else None
20
 
21
- # Smart unit detection
22
  if any(u in cleaned for u in ["kg", "kgs", "kilogram", "kilo"]):
23
  unit = "kg"
24
  elif any(u in cleaned for u in ["g", "gram", "grams"]):
@@ -26,4 +23,4 @@ def extract_weight(image: Image.Image) -> str:
26
  else:
27
  unit = "kg" if weight and float(weight) >= 5 else "grams"
28
 
29
- return f"{weight} {unit}" if weight else "No valid weight detected"
 
1
+ from transformers import TrOCRProcessor, VisionEncoderDecoderModel
2
  from PIL import Image
3
  import re
4
 
5
+ # Load smaller/faster model
6
+ processor = TrOCRProcessor.from_pretrained("microsoft/trocr-small-printed")
7
+ model = VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-small-printed")
8
 
9
  def extract_weight(image: Image.Image) -> str:
10
  image = image.convert("RGB")
11
+ pixel_values = processor(images=image, return_tensors="pt").pixel_values
12
+ generated_ids = model.generate(pixel_values, max_length=32)
13
+ full_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
14
 
15
+ cleaned = full_text.lower().replace(" ", "")
 
 
 
 
16
  match = re.search(r"(\d+(\.\d+)?)", cleaned)
17
  weight = match.group(1) if match else None
18
 
 
19
  if any(u in cleaned for u in ["kg", "kgs", "kilogram", "kilo"]):
20
  unit = "kg"
21
  elif any(u in cleaned for u in ["g", "gram", "grams"]):
 
23
  else:
24
  unit = "kg" if weight and float(weight) >= 5 else "grams"
25
 
26
+ return f"{weight} {unit}" if weight else ""