| import hashlib |
| import json |
| import os |
|
|
| from src.detection import ProductDetector |
| from src.grouping import ProductGrouper |
| from src.visualize import visualize |
|
|
| BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| MODEL_PATH = os.path.join(BASE_DIR, "models", "best.pt") |
| DATA_DIR = os.getenv("APP_DATA_DIR", BASE_DIR) |
|
|
| detector = ProductDetector(MODEL_PATH) |
| grouper = ProductGrouper() |
|
|
| OUTPUT_FOLDER = os.path.join(DATA_DIR, "outputs") |
| RESULT_FOLDER = os.path.join(DATA_DIR, "results") |
|
|
| os.makedirs(OUTPUT_FOLDER, exist_ok=True) |
| os.makedirs(RESULT_FOLDER, exist_ok=True) |
|
|
|
|
| def _sha256(path): |
| if not os.path.exists(path): |
| return None |
| h = hashlib.sha256() |
| with open(path, "rb") as f: |
| for chunk in iter(lambda: f.read(1024 * 1024), b""): |
| h.update(chunk) |
| return h.hexdigest() |
|
|
|
|
| RUNTIME_META = { |
| "model_path": MODEL_PATH, |
| "model_sha256": _sha256(MODEL_PATH), |
| "yolo_device": str(detector.device), |
| "clip_device": str(grouper.device), |
| "inference_seed": int(grouper.seed), |
| "detector_conf": float(detector.conf_threshold), |
| "detector_iou": float(detector.iou_threshold), |
| "detector_imgsz": int(detector.imgsz), |
| "similarity_threshold": float(grouper.similarity_threshold), |
| "similarity_margin": float(grouper.similarity_margin), |
| "similarity_round_decimals": int(grouper.similarity_round_decimals), |
| "row_vertical_threshold": int(grouper.row_vertical_threshold), |
| "padding": int(grouper.padding), |
| } |
|
|
| def process_image(image_path, image_id): |
|
|
| detections = detector.detect(image_path) |
|
|
| grouped = grouper.group_products(image_path, detections) |
|
|
| output_path = os.path.join(OUTPUT_FOLDER, f"{image_id}.jpg") |
|
|
| visualize(image_path, grouped, output_path) |
|
|
| result = { |
| "image_id": image_id, |
| "total_products": len(grouped), |
| "detections": grouped, |
| "visualization": output_path, |
| "meta": RUNTIME_META, |
| } |
|
|
| with open(os.path.join(RESULT_FOLDER, f"{image_id}.json"), "w") as f: |
| json.dump(result, f) |
|
|
| return result |
|
|