diff --git a/recognization/code/tags.py b/recognization/code/tags.py index 1d013b4..f4f2efd 100644 --- a/recognization/code/tags.py +++ b/recognization/code/tags.py @@ -142,6 +142,8 @@ class TagRecord: "discount": self.discount, "unit_price": self.unit_price, "name": self.name, + "jan": self.jan, + "price_source": self.price_source, "flags": list(self.flags), "confidence": round(float(self.confidence), 3), "observations": len(self.observations), @@ -510,7 +512,9 @@ class TagService: aspect = width / float(height) if not (TAG_MIN_ASPECT <= aspect <= TAG_MAX_ASPECT): continue - pooled = read_card_lines(self.engine, image, box, scales=(1.0, 2.0 * max(1.0, scale_bias))) + pooled = read_card_lines( + self.engine, image, box, scales=(1.0, 2.0, 3.0 * max(1.0, scale_bias)) + ) card = card_from_lines(pooled) if pooled else seed card.box = box if not card.fields.is_readable() and card.fields.price is None: @@ -588,6 +592,8 @@ class TagService: names: Dict[str, float] = {} units: Dict[float, float] = {} discounts: Dict[float, float] = {} + jans: Dict[str, float] = {} + sources: Dict[str, float] = {} flags: set = set() confidences: List[float] = [] for observation in record.observations: @@ -603,6 +609,11 @@ class TagService: units[fields.unit_price] = units.get(fields.unit_price, 0.0) + weight if fields.discount is not None: discounts[fields.discount] = discounts.get(fields.discount, 0.0) + weight + if getattr(fields, "jan", None): + jans[fields.jan] = jans.get(fields.jan, 0.0) + weight + sources[getattr(fields, "price_source", "none")] = ( + sources.get(getattr(fields, "price_source", "none"), 0.0) + weight + ) flags.update(fields.flags) confidences.append(observation.confidence) @@ -620,6 +631,13 @@ class TagService: record.name = top(names) record.unit_price = top(units) record.discount = top(discounts) + record.jan = top(jans) + # "measured" beats "derived" when both appear: a read is better evidence + # than an inference, even though the inference is usually right. + if sources.get("measured") and sources.get("derived"): + record.price_source = "measured" if sources["measured"] >= sources["derived"] else "derived" + else: + record.price_source = top(sources) or "none" record.flags = sorted(flags) record.confidence = sum(confidences) / len(confidences) if confidences else 0.0