diff --git a/.env b/.env new file mode 100644 index 0000000..fcb96cb --- /dev/null +++ b/.env @@ -0,0 +1 @@ +HF_TOKEN=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 \ No newline at end of file diff --git a/.~lock.test_results.csv# b/.~lock.test_results.csv# new file mode 100644 index 0000000..f956884 --- /dev/null +++ b/.~lock.test_results.csv# @@ -0,0 +1 @@ +,suman,sumanhc,31.07.2026 13:03,file:///home/suman/.config/libreoffice/4; \ No newline at end of file diff --git a/Rules.txt b/Rules.txt new file mode 100644 index 0000000..5bc8076 --- /dev/null +++ b/Rules.txt @@ -0,0 +1,27 @@ +The folder to edit: /media/suman/Backup_of_extra_/Sasi/Flowers_images/Templates +(this is config.TEMPLATE_IMAGES_DIR — currently template1.png, template2.png, template4.png, template5.png, template6.png) + +Add a new template +Copy the new photo into that folder (.png, .jpg, .jpeg, .bmp, or .webp all work). Give it a clean name — that filename (without extension) becomes its display name in the gallery and in match results, e.g. template7.png → shown as "Template7". +Restart the server (see below). +Remove a template +Delete its file from that folder. +Also delete its matching cached file at /media/suman/Backup_of_extra_/Sasi/featureTransform/cache/templates_nobg/.png (harmless if you skip it — it's just an orphaned cache file wasting a little disk space — but tidy to remove). +Restart the server. +Replace a template's photo but keep the same filename +This is the one case that needs an extra step: the background-removal cache is keyed by filename only, not the image content. If you overwrite template4.png with a different photo but don't touch the cache, the app will keep using the old cutout and old matching features. + +Overwrite the file in the Templates folder. +Delete the stale cache file: rm /media/suman/Backup_of_extra_/Sasi/featureTransform/cache/templates_nobg/template4.png +Restart the server. +(Simplest blanket rule if you're changing several templates at once: just wipe the whole cache folder — rm -f /media/suman/Backup_of_extra_/Sasi/featureTransform/cache/templates_nobg/* — and let it rebuild on next startup.) + +Why a restart is required +The homepage gallery re-scans the folder on every page load, so it'd show new files immediately — but the actual matching pipeline (SIFT/ORB keypoints, SuperPoint features, LoFTR tensors, per-template masks) is precomputed once at server startup and held in memory for speed. Adding/removing files on disk doesn't touch that in-memory set until the process restarts and reruns bootstrap(). + +To restart: + + +pkill -f "python3 app.py" # or: kill from `ps aux | grep app.py` +cd /media/suman/Backup_of_extra_/Sasi/featureTransform +python3 app.py \ No newline at end of file diff --git a/__pycache__/app.cpython-310.pyc b/__pycache__/app.cpython-310.pyc new file mode 100644 index 0000000..304d380 Binary files /dev/null and b/__pycache__/app.cpython-310.pyc differ diff --git a/__pycache__/config.cpython-310.pyc b/__pycache__/config.cpython-310.pyc new file mode 100644 index 0000000..2e17181 Binary files /dev/null and b/__pycache__/config.cpython-310.pyc differ diff --git a/__pycache__/config.cpython-311.pyc b/__pycache__/config.cpython-311.pyc new file mode 100644 index 0000000..e59e81e Binary files /dev/null and b/__pycache__/config.cpython-311.pyc differ diff --git a/__pycache__/config.cpython-38.pyc b/__pycache__/config.cpython-38.pyc new file mode 100644 index 0000000..598f316 Binary files /dev/null and b/__pycache__/config.cpython-38.pyc differ diff --git a/__pycache__/testVaseMatcher.cpython-310.pyc b/__pycache__/testVaseMatcher.cpython-310.pyc new file mode 100644 index 0000000..5ce1fba Binary files /dev/null and b/__pycache__/testVaseMatcher.cpython-310.pyc differ diff --git a/app.py b/app.py new file mode 100644 index 0000000..698d02d --- /dev/null +++ b/app.py @@ -0,0 +1,227 @@ +""" +Vase Matcher -- Flask backend. + +Upload a photo of a vase; it's matched against the fixed template set using +four methods (SIFT, ORB, SuperPoint+LightGlue, LoFTR), each scored +independently and timed. Template-side data is precomputed once at startup +so a request only ever processes the single uploaded image. +""" + +import logging +import os +from logging.handlers import RotatingFileHandler + +import config # noqa: F401 (must be imported first -- caps thread envs) + + +def _configure_logging(): + """All app + pipeline.* + werkzeug loggers propagate to the root logger, + so attaching handlers here is enough to capture everything in one file -- + useful for correlating the last thing that happened before a crash (e.g. + an OOM kill, which the process itself never gets to log) against + `dmesg`/`journalctl -k` timestamps.""" + os.makedirs(config.LOG_DIR, exist_ok=True) + fmt = logging.Formatter("%(asctime)s %(levelname)-7s [%(name)s] %(message)s") + + root = logging.getLogger() + if root.handlers: + return # already configured (e.g. module imported twice) + root.setLevel(logging.INFO) + + file_handler = RotatingFileHandler(config.LOG_FILE, maxBytes=5 * 1024 * 1024, + backupCount=5) + file_handler.setFormatter(fmt) + root.addHandler(file_handler) + + console_handler = logging.StreamHandler() + console_handler.setFormatter(fmt) + root.addHandler(console_handler) + + +_configure_logging() + +import requests +from flask import Flask, jsonify, render_template, request, send_from_directory +from werkzeug.utils import secure_filename + +from pipeline import engine, utils, verify + +logger = logging.getLogger(__name__) + +app = Flask(__name__) +app.config["MAX_CONTENT_LENGTH"] = config.MAX_CONTENT_LENGTH_BYTES + + +@app.route("/") +def index(): + templates = [] + for fname in utils.list_template_files(): + name = utils.template_name(fname) + templates.append({"name": name, "filename": fname}) + return render_template("index.html", templates=templates, + methods=list(config.METHOD_LABELS.items())) + + +@app.route("/template_image/") +def template_image(filename): + safe = secure_filename(filename) + return send_from_directory(config.TEMPLATE_IMAGES_DIR, safe) + + +@app.route("/uploads//") +def uploaded_file(request_id, filename): + safe_id = secure_filename(request_id) + safe_name = secure_filename(filename) + request_dir = os.path.join(config.UPLOADS_DIR, safe_id) + return send_from_directory(request_dir, safe_name) + + +@app.errorhandler(413) +def too_large(_e): + logger.warning("Upload rejected: exceeds %d byte limit", config.MAX_CONTENT_LENGTH_BYTES) + return jsonify({"error": "Image too large (15 MB limit)."}), 413 + + +@app.route("/api/match", methods=["POST"]) +def api_match(): + file = request.files.get("image") + if file is None or file.filename == "": + logger.warning("Match request rejected: no image uploaded") + return jsonify({"error": "No image uploaded."}), 400 + + ext = os.path.splitext(file.filename)[1].lower() + if ext not in config.VALID_EXTS: + logger.warning("Match request rejected: unsupported file type %r", ext) + return jsonify({"error": f"Unsupported file type: {ext or 'unknown'}"}), 400 + + image_bytes = file.read() + if not image_bytes: + logger.warning("Match request rejected: empty file") + return jsonify({"error": "Uploaded file is empty."}), 400 + + filename = file.filename + try: + image_bytes, was_compressed = utils.compress_image_bytes( + image_bytes, config.COMPRESS_ABOVE_BYTES, config.MAX_IMAGE_DIM + ) + except Exception: + logger.exception("Compression failed for %r, using original bytes", filename) + was_compressed = False + + if was_compressed: + # Re-encoded as JPEG regardless of the original format, so the + # filename extension needs to match -- otherwise the saved + # "original.*" file gets served with the wrong Content-Type later. + filename = os.path.splitext(filename)[0] + ".jpg" + + try: + result = engine.process_upload(image_bytes, filename) + except Exception as e: + logger.exception("Match pipeline failed") + return jsonify({"error": f"Processing failed: {e}"}), 500 + + return jsonify(result) + + +@app.route("/api/count_flowers", methods=["POST"]) +def api_count_flowers(): + """Opt-in, heavyweight: runs SAM instance segmentation over an + already-processed upload to count individual flowers and cluster them + by color as a rough proxy for distinct "kinds". Kept as its own request + (rather than folded into /api/match) since it unloads the matching + pipeline's GPU-resident models first -- it's meant to be triggered + explicitly, not on every upload.""" + data = request.get_json(silent=True) or {} + request_id = data.get("request_id") + template = data.get("template") + if not request_id: + return jsonify({"error": "Missing request_id."}), 400 + + safe_id = secure_filename(request_id) + try: + result = engine.count_flowers(safe_id, template=template) + except FileNotFoundError: + return jsonify({"error": "Upload not found (it may have expired)."}), 404 + except Exception as e: + logger.exception("[%s] flower count request failed", safe_id) + return jsonify({"error": f"Flower counting failed: {e}"}), 500 + + result["request_id"] = safe_id + return jsonify(result) + + +@app.route("/api/flower_summary", methods=["POST"]) +def api_flower_summary(): + """Lightweight, auto-triggered (not opt-in) companion to the weighted + verdict: flower count comparison + CLIP-only flower similarity. Fired + automatically right after a confident match, shown beside the weighted + card while /api/count_flowers stays behind its own button for the + heavier SAM+YOLO-World+DINOv2/vase comparison.""" + data = request.get_json(silent=True) or {} + request_id = data.get("request_id") + template = data.get("template") + if not request_id or not template: + return jsonify({"error": "Missing request_id or template."}), 400 + + safe_id = secure_filename(request_id) + try: + result = engine.flower_summary(safe_id, template) + except FileNotFoundError: + return jsonify({"error": "Upload not found (it may have expired)."}), 404 + except ValueError as e: + return jsonify({"error": str(e)}), 400 + except Exception as e: + logger.exception("[%s] flower summary request failed", safe_id) + return jsonify({"error": f"Flower summary failed: {e}"}), 500 + + return jsonify(result) + + +@app.route("/api/verify", methods=["POST"]) +def api_verify(): + """Optional follow-up step: cross-checks the winning template against + the user's original upload via an external vision-LLM endpoint. Kept + separate from /api/match so a slow or unreachable verification service + never affects the core (fast, local) matching result.""" + data = request.get_json(silent=True) or {} + request_id = data.get("request_id") + template = data.get("template") + + if not request_id or not template: + return jsonify({"error": "Missing request_id or template."}), 400 + + safe_id = secure_filename(request_id) + request_dir = os.path.join(config.UPLOADS_DIR, safe_id) + if not os.path.isdir(request_dir): + return jsonify({"error": "Upload not found (it may have expired)."}), 404 + + originals = [f for f in os.listdir(request_dir) if f.startswith("original.")] + if not originals: + return jsonify({"error": "Original upload not found."}), 404 + upload_path = os.path.join(request_dir, originals[0]) + + templates = engine.templates_meta() + if template not in templates: + return jsonify({"error": f"Unknown template: {template}"}), 400 + template_path = os.path.join(config.TEMPLATE_IMAGES_DIR, + templates[template]["original_filename"]) + + logger.info("[%s] verifying against %s via external endpoint", safe_id, template) + try: + result = verify.verify_images(template_path, upload_path) + except requests.exceptions.RequestException as e: + logger.warning("[%s] verification endpoint unreachable: %s", safe_id, e) + return jsonify({"error": f"Verification service unavailable: {e}"}), 502 + except Exception as e: + logger.exception("[%s] verification failed", safe_id) + return jsonify({"error": f"Verification failed: {e}"}), 500 + + return jsonify(result) + + +if __name__ == "__main__": + logger.info("Starting Vase Matcher on %s:%d (logs: %s)", + config.HOST, config.PORT, config.LOG_FILE) + engine.bootstrap() + app.run(host=config.HOST, port=config.PORT, debug=False, threaded=True, + use_reloader=False) diff --git a/cache/templates_nobg/SKU_1.png b/cache/templates_nobg/SKU_1.png new file mode 100644 index 0000000..fc0df4e Binary files /dev/null and b/cache/templates_nobg/SKU_1.png differ diff --git a/cache/templates_nobg/SKU_1_COLORED.png b/cache/templates_nobg/SKU_1_COLORED.png new file mode 100644 index 0000000..ffebbb9 Binary files /dev/null and b/cache/templates_nobg/SKU_1_COLORED.png differ diff --git a/cache/templates_nobg/SKU_2.png b/cache/templates_nobg/SKU_2.png new file mode 100644 index 0000000..61749c8 Binary files /dev/null and b/cache/templates_nobg/SKU_2.png differ diff --git a/cache/templates_nobg/SKU_3.png b/cache/templates_nobg/SKU_3.png new file mode 100644 index 0000000..59d7769 Binary files /dev/null and b/cache/templates_nobg/SKU_3.png differ diff --git a/cache/templates_nobg/SKU_4.png b/cache/templates_nobg/SKU_4.png new file mode 100644 index 0000000..921e443 Binary files /dev/null and b/cache/templates_nobg/SKU_4.png differ diff --git a/cache/templates_nobg/SKU_5.png b/cache/templates_nobg/SKU_5.png new file mode 100644 index 0000000..da8b4f8 Binary files /dev/null and b/cache/templates_nobg/SKU_5.png differ diff --git a/cache/templates_nobg/SKU_ULTRA_6.png b/cache/templates_nobg/SKU_ULTRA_6.png new file mode 100644 index 0000000..1adf87d Binary files /dev/null and b/cache/templates_nobg/SKU_ULTRA_6.png differ diff --git a/cache/uploads_nobg/004d589769942b548689.png b/cache/uploads_nobg/004d589769942b548689.png new file mode 100644 index 0000000..27ed62a Binary files /dev/null and b/cache/uploads_nobg/004d589769942b548689.png differ diff --git a/cache/uploads_nobg/01f615081418be7de3f7.png b/cache/uploads_nobg/01f615081418be7de3f7.png new file mode 100644 index 0000000..ee5df84 Binary files /dev/null and b/cache/uploads_nobg/01f615081418be7de3f7.png differ diff --git a/cache/uploads_nobg/042bfeaadf8c323dbacf.png b/cache/uploads_nobg/042bfeaadf8c323dbacf.png new file mode 100644 index 0000000..0c0be91 Binary files /dev/null and b/cache/uploads_nobg/042bfeaadf8c323dbacf.png differ diff --git a/cache/uploads_nobg/042c226f30d3d700f7f5.png b/cache/uploads_nobg/042c226f30d3d700f7f5.png new file mode 100644 index 0000000..5b8b274 Binary files /dev/null and b/cache/uploads_nobg/042c226f30d3d700f7f5.png differ diff --git a/cache/uploads_nobg/0575d8159a35e2f65588.png b/cache/uploads_nobg/0575d8159a35e2f65588.png new file mode 100644 index 0000000..459229b Binary files /dev/null and b/cache/uploads_nobg/0575d8159a35e2f65588.png differ diff --git a/cache/uploads_nobg/057f6857b92759b08165.png b/cache/uploads_nobg/057f6857b92759b08165.png new file mode 100644 index 0000000..2a9cfe7 Binary files /dev/null and b/cache/uploads_nobg/057f6857b92759b08165.png differ diff --git a/cache/uploads_nobg/060e3bfb6b97813821e7.png b/cache/uploads_nobg/060e3bfb6b97813821e7.png new file mode 100644 index 0000000..f21943e Binary files /dev/null and b/cache/uploads_nobg/060e3bfb6b97813821e7.png differ diff --git a/cache/uploads_nobg/067af25a344f3868ccb3.png b/cache/uploads_nobg/067af25a344f3868ccb3.png new file mode 100644 index 0000000..5a33aaf Binary files /dev/null and b/cache/uploads_nobg/067af25a344f3868ccb3.png differ diff --git a/cache/uploads_nobg/06c1e18d4ce8065988ab.png b/cache/uploads_nobg/06c1e18d4ce8065988ab.png new file mode 100644 index 0000000..4ec096b Binary files /dev/null and b/cache/uploads_nobg/06c1e18d4ce8065988ab.png differ diff --git a/cache/uploads_nobg/08e202994840b58241c7.png b/cache/uploads_nobg/08e202994840b58241c7.png new file mode 100644 index 0000000..0c21ed8 Binary files /dev/null and b/cache/uploads_nobg/08e202994840b58241c7.png differ diff --git a/cache/uploads_nobg/0a74f1ad1f0f03b75f2b.png b/cache/uploads_nobg/0a74f1ad1f0f03b75f2b.png new file mode 100644 index 0000000..062ef18 Binary files /dev/null and b/cache/uploads_nobg/0a74f1ad1f0f03b75f2b.png differ diff --git a/cache/uploads_nobg/0bdd04230588bfdf6666.png b/cache/uploads_nobg/0bdd04230588bfdf6666.png new file mode 100644 index 0000000..61749c8 Binary files /dev/null and b/cache/uploads_nobg/0bdd04230588bfdf6666.png differ diff --git a/cache/uploads_nobg/0dd51a2101d3cae26ebb.png b/cache/uploads_nobg/0dd51a2101d3cae26ebb.png new file mode 100644 index 0000000..db8e5e2 Binary files /dev/null and b/cache/uploads_nobg/0dd51a2101d3cae26ebb.png differ diff --git a/cache/uploads_nobg/0febb74515604c6b8672.png b/cache/uploads_nobg/0febb74515604c6b8672.png new file mode 100644 index 0000000..5830082 Binary files /dev/null and b/cache/uploads_nobg/0febb74515604c6b8672.png differ diff --git a/cache/uploads_nobg/102d7801cfb45dfb4b2a.png b/cache/uploads_nobg/102d7801cfb45dfb4b2a.png new file mode 100644 index 0000000..f30c3e9 Binary files /dev/null and b/cache/uploads_nobg/102d7801cfb45dfb4b2a.png differ diff --git a/cache/uploads_nobg/11b3ebd78f6ff600db69.png b/cache/uploads_nobg/11b3ebd78f6ff600db69.png new file mode 100644 index 0000000..ee80c96 Binary files /dev/null and b/cache/uploads_nobg/11b3ebd78f6ff600db69.png differ diff --git a/cache/uploads_nobg/11de87b41cccba587fb4.png b/cache/uploads_nobg/11de87b41cccba587fb4.png new file mode 100644 index 0000000..2b40d6f Binary files /dev/null and b/cache/uploads_nobg/11de87b41cccba587fb4.png differ diff --git a/cache/uploads_nobg/1255b61f5d3b77446baf.png b/cache/uploads_nobg/1255b61f5d3b77446baf.png new file mode 100644 index 0000000..51191cf Binary files /dev/null and b/cache/uploads_nobg/1255b61f5d3b77446baf.png differ diff --git a/cache/uploads_nobg/1292d2fcfc02180f2c97.png b/cache/uploads_nobg/1292d2fcfc02180f2c97.png new file mode 100644 index 0000000..953ba40 Binary files /dev/null and b/cache/uploads_nobg/1292d2fcfc02180f2c97.png differ diff --git a/cache/uploads_nobg/1316216c7f970f89b191.png b/cache/uploads_nobg/1316216c7f970f89b191.png new file mode 100644 index 0000000..d2f84f1 Binary files /dev/null and b/cache/uploads_nobg/1316216c7f970f89b191.png differ diff --git a/cache/uploads_nobg/13af9e3bf59129893e74.png b/cache/uploads_nobg/13af9e3bf59129893e74.png new file mode 100644 index 0000000..f848e42 Binary files /dev/null and b/cache/uploads_nobg/13af9e3bf59129893e74.png differ diff --git a/cache/uploads_nobg/15cb6672a1cbb6a46a16.png b/cache/uploads_nobg/15cb6672a1cbb6a46a16.png new file mode 100644 index 0000000..adff1e7 Binary files /dev/null and b/cache/uploads_nobg/15cb6672a1cbb6a46a16.png differ diff --git a/cache/uploads_nobg/15e520d0ff352501f0e6.png b/cache/uploads_nobg/15e520d0ff352501f0e6.png new file mode 100644 index 0000000..fdc313f Binary files /dev/null and b/cache/uploads_nobg/15e520d0ff352501f0e6.png differ diff --git a/cache/uploads_nobg/16ee3d841987bb6bfa7c.png b/cache/uploads_nobg/16ee3d841987bb6bfa7c.png new file mode 100644 index 0000000..df5f26c Binary files /dev/null and b/cache/uploads_nobg/16ee3d841987bb6bfa7c.png differ diff --git a/cache/uploads_nobg/17b53e219bb6dd9d9e3d.png b/cache/uploads_nobg/17b53e219bb6dd9d9e3d.png new file mode 100644 index 0000000..f11a44c Binary files /dev/null and b/cache/uploads_nobg/17b53e219bb6dd9d9e3d.png differ diff --git a/cache/uploads_nobg/182b780cd358ac96f355.png b/cache/uploads_nobg/182b780cd358ac96f355.png new file mode 100644 index 0000000..b9fd24e Binary files /dev/null and b/cache/uploads_nobg/182b780cd358ac96f355.png differ diff --git a/cache/uploads_nobg/183bb82185732e35513f.png b/cache/uploads_nobg/183bb82185732e35513f.png new file mode 100644 index 0000000..77bebe3 Binary files /dev/null and b/cache/uploads_nobg/183bb82185732e35513f.png differ diff --git a/cache/uploads_nobg/196dbe1d4491a776c86b.png b/cache/uploads_nobg/196dbe1d4491a776c86b.png new file mode 100644 index 0000000..b7a0415 Binary files /dev/null and b/cache/uploads_nobg/196dbe1d4491a776c86b.png differ diff --git a/cache/uploads_nobg/19fbb4e63afc5319966f.png b/cache/uploads_nobg/19fbb4e63afc5319966f.png new file mode 100644 index 0000000..d1498f1 Binary files /dev/null and b/cache/uploads_nobg/19fbb4e63afc5319966f.png differ diff --git a/cache/uploads_nobg/1c21fe406ba5beda6933.png b/cache/uploads_nobg/1c21fe406ba5beda6933.png new file mode 100644 index 0000000..9c6bdf0 Binary files /dev/null and b/cache/uploads_nobg/1c21fe406ba5beda6933.png differ diff --git a/cache/uploads_nobg/1ef15b7853b272b47636.png b/cache/uploads_nobg/1ef15b7853b272b47636.png new file mode 100644 index 0000000..a8a585a Binary files /dev/null and b/cache/uploads_nobg/1ef15b7853b272b47636.png differ diff --git a/cache/uploads_nobg/202d77695c53ef6644dd.png b/cache/uploads_nobg/202d77695c53ef6644dd.png new file mode 100644 index 0000000..ae96874 Binary files /dev/null and b/cache/uploads_nobg/202d77695c53ef6644dd.png differ diff --git a/cache/uploads_nobg/222b3d4a4f56360470ef.png b/cache/uploads_nobg/222b3d4a4f56360470ef.png new file mode 100644 index 0000000..06425f5 Binary files /dev/null and b/cache/uploads_nobg/222b3d4a4f56360470ef.png differ diff --git a/cache/uploads_nobg/236176143df82340ff08.png b/cache/uploads_nobg/236176143df82340ff08.png new file mode 100644 index 0000000..6401ddd Binary files /dev/null and b/cache/uploads_nobg/236176143df82340ff08.png differ diff --git a/cache/uploads_nobg/26d6a03cf4075ff59b0d.png b/cache/uploads_nobg/26d6a03cf4075ff59b0d.png new file mode 100644 index 0000000..a325ac6 Binary files /dev/null and b/cache/uploads_nobg/26d6a03cf4075ff59b0d.png differ diff --git a/cache/uploads_nobg/28d6fc0164d715c6f3f8.png b/cache/uploads_nobg/28d6fc0164d715c6f3f8.png new file mode 100644 index 0000000..82e84df Binary files /dev/null and b/cache/uploads_nobg/28d6fc0164d715c6f3f8.png differ diff --git a/cache/uploads_nobg/2b1d6a924ec7c17cdb94.png b/cache/uploads_nobg/2b1d6a924ec7c17cdb94.png new file mode 100644 index 0000000..6b50530 Binary files /dev/null and b/cache/uploads_nobg/2b1d6a924ec7c17cdb94.png differ diff --git a/cache/uploads_nobg/2ce6253683e48f0a6667.png b/cache/uploads_nobg/2ce6253683e48f0a6667.png new file mode 100644 index 0000000..95a37e9 Binary files /dev/null and b/cache/uploads_nobg/2ce6253683e48f0a6667.png differ diff --git a/cache/uploads_nobg/2d13e77c87468c76df81.png b/cache/uploads_nobg/2d13e77c87468c76df81.png new file mode 100644 index 0000000..95044f3 Binary files /dev/null and b/cache/uploads_nobg/2d13e77c87468c76df81.png differ diff --git a/cache/uploads_nobg/2e2ac9eea3e7937fcfc3.png b/cache/uploads_nobg/2e2ac9eea3e7937fcfc3.png new file mode 100644 index 0000000..691e3d5 Binary files /dev/null and b/cache/uploads_nobg/2e2ac9eea3e7937fcfc3.png differ diff --git a/cache/uploads_nobg/2e37e8c11ba48b1e7e74.png b/cache/uploads_nobg/2e37e8c11ba48b1e7e74.png new file mode 100644 index 0000000..7e935f9 Binary files /dev/null and b/cache/uploads_nobg/2e37e8c11ba48b1e7e74.png differ diff --git a/cache/uploads_nobg/2e4f6037bf031eaa79ee.png b/cache/uploads_nobg/2e4f6037bf031eaa79ee.png new file mode 100644 index 0000000..8b1206a Binary files /dev/null and b/cache/uploads_nobg/2e4f6037bf031eaa79ee.png differ diff --git a/cache/uploads_nobg/2ff05f7daeba65e3b27a.png b/cache/uploads_nobg/2ff05f7daeba65e3b27a.png new file mode 100644 index 0000000..1367107 Binary files /dev/null and b/cache/uploads_nobg/2ff05f7daeba65e3b27a.png differ diff --git a/cache/uploads_nobg/3016295b946a8c8e6bdd.png b/cache/uploads_nobg/3016295b946a8c8e6bdd.png new file mode 100644 index 0000000..bc9a8ae Binary files /dev/null and b/cache/uploads_nobg/3016295b946a8c8e6bdd.png differ diff --git a/cache/uploads_nobg/317a417631fd6634b6fc.png b/cache/uploads_nobg/317a417631fd6634b6fc.png new file mode 100644 index 0000000..797a95c Binary files /dev/null and b/cache/uploads_nobg/317a417631fd6634b6fc.png differ diff --git a/cache/uploads_nobg/31ceb46fd7ed29fbba3f.png b/cache/uploads_nobg/31ceb46fd7ed29fbba3f.png new file mode 100644 index 0000000..1e80c5f Binary files /dev/null and b/cache/uploads_nobg/31ceb46fd7ed29fbba3f.png differ diff --git a/cache/uploads_nobg/33011577cd17a05b3ae3.png b/cache/uploads_nobg/33011577cd17a05b3ae3.png new file mode 100644 index 0000000..7c7c818 Binary files /dev/null and b/cache/uploads_nobg/33011577cd17a05b3ae3.png differ diff --git a/cache/uploads_nobg/33f3dbeb46194a62b636.png b/cache/uploads_nobg/33f3dbeb46194a62b636.png new file mode 100644 index 0000000..1f96665 Binary files /dev/null and b/cache/uploads_nobg/33f3dbeb46194a62b636.png differ diff --git a/cache/uploads_nobg/346a83b613316d9658aa.png b/cache/uploads_nobg/346a83b613316d9658aa.png new file mode 100644 index 0000000..1b6e291 Binary files /dev/null and b/cache/uploads_nobg/346a83b613316d9658aa.png differ diff --git a/cache/uploads_nobg/368adc00a60a82926597.png b/cache/uploads_nobg/368adc00a60a82926597.png new file mode 100644 index 0000000..77b1757 Binary files /dev/null and b/cache/uploads_nobg/368adc00a60a82926597.png differ diff --git a/cache/uploads_nobg/385ba3ca327c7e7a370a.png b/cache/uploads_nobg/385ba3ca327c7e7a370a.png new file mode 100644 index 0000000..24bbce5 Binary files /dev/null and b/cache/uploads_nobg/385ba3ca327c7e7a370a.png differ diff --git a/cache/uploads_nobg/38d78c5205b9117ce0bb.png b/cache/uploads_nobg/38d78c5205b9117ce0bb.png new file mode 100644 index 0000000..ce34215 Binary files /dev/null and b/cache/uploads_nobg/38d78c5205b9117ce0bb.png differ diff --git a/cache/uploads_nobg/39fab6b578abba699555.png b/cache/uploads_nobg/39fab6b578abba699555.png new file mode 100644 index 0000000..e2d3fe9 Binary files /dev/null and b/cache/uploads_nobg/39fab6b578abba699555.png differ diff --git a/cache/uploads_nobg/3a712643ea1467254b4a.png b/cache/uploads_nobg/3a712643ea1467254b4a.png new file mode 100644 index 0000000..aeab957 Binary files /dev/null and b/cache/uploads_nobg/3a712643ea1467254b4a.png differ diff --git a/cache/uploads_nobg/3ad8e508741e4c1365a9.png b/cache/uploads_nobg/3ad8e508741e4c1365a9.png new file mode 100644 index 0000000..c26c56e Binary files /dev/null and b/cache/uploads_nobg/3ad8e508741e4c1365a9.png differ diff --git a/cache/uploads_nobg/3aed7f462e86f3e22052.png b/cache/uploads_nobg/3aed7f462e86f3e22052.png new file mode 100644 index 0000000..d537e48 Binary files /dev/null and b/cache/uploads_nobg/3aed7f462e86f3e22052.png differ diff --git a/cache/uploads_nobg/3bae8d1aef008939b165.png b/cache/uploads_nobg/3bae8d1aef008939b165.png new file mode 100644 index 0000000..96d565e Binary files /dev/null and b/cache/uploads_nobg/3bae8d1aef008939b165.png differ diff --git a/cache/uploads_nobg/3d048d2b04762f00ab1d.png b/cache/uploads_nobg/3d048d2b04762f00ab1d.png new file mode 100644 index 0000000..2943f58 Binary files /dev/null and b/cache/uploads_nobg/3d048d2b04762f00ab1d.png differ diff --git a/cache/uploads_nobg/3da7bf16addd6e00a85d.png b/cache/uploads_nobg/3da7bf16addd6e00a85d.png new file mode 100644 index 0000000..57aff7b Binary files /dev/null and b/cache/uploads_nobg/3da7bf16addd6e00a85d.png differ diff --git a/cache/uploads_nobg/3ddee75eb52ccb150b0c.png b/cache/uploads_nobg/3ddee75eb52ccb150b0c.png new file mode 100644 index 0000000..c4eeb51 Binary files /dev/null and b/cache/uploads_nobg/3ddee75eb52ccb150b0c.png differ diff --git a/cache/uploads_nobg/3e4da253dcb6efaacbc8.png b/cache/uploads_nobg/3e4da253dcb6efaacbc8.png new file mode 100644 index 0000000..c24ba4f Binary files /dev/null and b/cache/uploads_nobg/3e4da253dcb6efaacbc8.png differ diff --git a/cache/uploads_nobg/40aadda3a6ffa0ed45a1.png b/cache/uploads_nobg/40aadda3a6ffa0ed45a1.png new file mode 100644 index 0000000..4f4f467 Binary files /dev/null and b/cache/uploads_nobg/40aadda3a6ffa0ed45a1.png differ diff --git a/cache/uploads_nobg/4305fd4599c0bdf66f91.png b/cache/uploads_nobg/4305fd4599c0bdf66f91.png new file mode 100644 index 0000000..d854c93 Binary files /dev/null and b/cache/uploads_nobg/4305fd4599c0bdf66f91.png differ diff --git a/cache/uploads_nobg/4337b186ece0d1cfa0a0.png b/cache/uploads_nobg/4337b186ece0d1cfa0a0.png new file mode 100644 index 0000000..056c5ad Binary files /dev/null and b/cache/uploads_nobg/4337b186ece0d1cfa0a0.png differ diff --git a/cache/uploads_nobg/4396d45abb94176d4074.png b/cache/uploads_nobg/4396d45abb94176d4074.png new file mode 100644 index 0000000..5ba6b7c Binary files /dev/null and b/cache/uploads_nobg/4396d45abb94176d4074.png differ diff --git a/cache/uploads_nobg/45632c3282f7641e0a78.png b/cache/uploads_nobg/45632c3282f7641e0a78.png new file mode 100644 index 0000000..1d3fbb4 Binary files /dev/null and b/cache/uploads_nobg/45632c3282f7641e0a78.png differ diff --git a/cache/uploads_nobg/461bab408fc9f4b60eec.png b/cache/uploads_nobg/461bab408fc9f4b60eec.png new file mode 100644 index 0000000..f0e9884 Binary files /dev/null and b/cache/uploads_nobg/461bab408fc9f4b60eec.png differ diff --git a/cache/uploads_nobg/46e17fab52c0e32f46ce.png b/cache/uploads_nobg/46e17fab52c0e32f46ce.png new file mode 100644 index 0000000..ec3f6ae Binary files /dev/null and b/cache/uploads_nobg/46e17fab52c0e32f46ce.png differ diff --git a/cache/uploads_nobg/4710266a3e14ee993bc4.png b/cache/uploads_nobg/4710266a3e14ee993bc4.png new file mode 100644 index 0000000..94dcf66 Binary files /dev/null and b/cache/uploads_nobg/4710266a3e14ee993bc4.png differ diff --git a/cache/uploads_nobg/477715d22b81401b3d15.png b/cache/uploads_nobg/477715d22b81401b3d15.png new file mode 100644 index 0000000..6bfd46b Binary files /dev/null and b/cache/uploads_nobg/477715d22b81401b3d15.png differ diff --git a/cache/uploads_nobg/47c80cc3b60d668d6692.png b/cache/uploads_nobg/47c80cc3b60d668d6692.png new file mode 100644 index 0000000..3005e74 Binary files /dev/null and b/cache/uploads_nobg/47c80cc3b60d668d6692.png differ diff --git a/cache/uploads_nobg/47ee0ae28a16b0ad5f05.png b/cache/uploads_nobg/47ee0ae28a16b0ad5f05.png new file mode 100644 index 0000000..0613f57 Binary files /dev/null and b/cache/uploads_nobg/47ee0ae28a16b0ad5f05.png differ diff --git a/cache/uploads_nobg/483a339e7fd21894b1d4.png b/cache/uploads_nobg/483a339e7fd21894b1d4.png new file mode 100644 index 0000000..72525ba Binary files /dev/null and b/cache/uploads_nobg/483a339e7fd21894b1d4.png differ diff --git a/cache/uploads_nobg/489f3238c89082851d8f.png b/cache/uploads_nobg/489f3238c89082851d8f.png new file mode 100644 index 0000000..e379033 Binary files /dev/null and b/cache/uploads_nobg/489f3238c89082851d8f.png differ diff --git a/cache/uploads_nobg/4907487d0e1f6426ecd3.png b/cache/uploads_nobg/4907487d0e1f6426ecd3.png new file mode 100644 index 0000000..2bcafbf Binary files /dev/null and b/cache/uploads_nobg/4907487d0e1f6426ecd3.png differ diff --git a/cache/uploads_nobg/4935b94032ea4daf77a9.png b/cache/uploads_nobg/4935b94032ea4daf77a9.png new file mode 100644 index 0000000..19ce9c1 Binary files /dev/null and b/cache/uploads_nobg/4935b94032ea4daf77a9.png differ diff --git a/cache/uploads_nobg/4b697b41ced4ad2164f9.png b/cache/uploads_nobg/4b697b41ced4ad2164f9.png new file mode 100644 index 0000000..d79a699 Binary files /dev/null and b/cache/uploads_nobg/4b697b41ced4ad2164f9.png differ diff --git a/cache/uploads_nobg/4c51513cce6f63172343.png b/cache/uploads_nobg/4c51513cce6f63172343.png new file mode 100644 index 0000000..25a2873 Binary files /dev/null and b/cache/uploads_nobg/4c51513cce6f63172343.png differ diff --git a/cache/uploads_nobg/4e3c560da5af3ae236a7.png b/cache/uploads_nobg/4e3c560da5af3ae236a7.png new file mode 100644 index 0000000..03085f3 Binary files /dev/null and b/cache/uploads_nobg/4e3c560da5af3ae236a7.png differ diff --git a/cache/uploads_nobg/4fb5943663d5fa6a1a65.png b/cache/uploads_nobg/4fb5943663d5fa6a1a65.png new file mode 100644 index 0000000..6b32397 Binary files /dev/null and b/cache/uploads_nobg/4fb5943663d5fa6a1a65.png differ diff --git a/cache/uploads_nobg/5195654cd102cb1d8f1a.png b/cache/uploads_nobg/5195654cd102cb1d8f1a.png new file mode 100644 index 0000000..0ee7f33 Binary files /dev/null and b/cache/uploads_nobg/5195654cd102cb1d8f1a.png differ diff --git a/cache/uploads_nobg/566652ef1b840e84c8b1.png b/cache/uploads_nobg/566652ef1b840e84c8b1.png new file mode 100644 index 0000000..6b0e2c8 Binary files /dev/null and b/cache/uploads_nobg/566652ef1b840e84c8b1.png differ diff --git a/cache/uploads_nobg/5861425de7fffd39eaac.png b/cache/uploads_nobg/5861425de7fffd39eaac.png new file mode 100644 index 0000000..e20ce36 Binary files /dev/null and b/cache/uploads_nobg/5861425de7fffd39eaac.png differ diff --git a/cache/uploads_nobg/5a635eb7e0837b490ece.png b/cache/uploads_nobg/5a635eb7e0837b490ece.png new file mode 100644 index 0000000..6461644 Binary files /dev/null and b/cache/uploads_nobg/5a635eb7e0837b490ece.png differ diff --git a/cache/uploads_nobg/5a7855da562ac597d39b.png b/cache/uploads_nobg/5a7855da562ac597d39b.png new file mode 100644 index 0000000..190fd83 Binary files /dev/null and b/cache/uploads_nobg/5a7855da562ac597d39b.png differ diff --git a/cache/uploads_nobg/5f44b75b1391e1e1a830.png b/cache/uploads_nobg/5f44b75b1391e1e1a830.png new file mode 100644 index 0000000..58e688d Binary files /dev/null and b/cache/uploads_nobg/5f44b75b1391e1e1a830.png differ diff --git a/cache/uploads_nobg/60082c96b6a4da79380e.png b/cache/uploads_nobg/60082c96b6a4da79380e.png new file mode 100644 index 0000000..7e16ba9 Binary files /dev/null and b/cache/uploads_nobg/60082c96b6a4da79380e.png differ diff --git a/cache/uploads_nobg/62b9c221c5daef6abd44.png b/cache/uploads_nobg/62b9c221c5daef6abd44.png new file mode 100644 index 0000000..36910ef Binary files /dev/null and b/cache/uploads_nobg/62b9c221c5daef6abd44.png differ diff --git a/cache/uploads_nobg/67a2de059a79ade17ed1.png b/cache/uploads_nobg/67a2de059a79ade17ed1.png new file mode 100644 index 0000000..9a2dd00 Binary files /dev/null and b/cache/uploads_nobg/67a2de059a79ade17ed1.png differ diff --git a/cache/uploads_nobg/67a736c13aac9946fc8f.png b/cache/uploads_nobg/67a736c13aac9946fc8f.png new file mode 100644 index 0000000..d54bbdd Binary files /dev/null and b/cache/uploads_nobg/67a736c13aac9946fc8f.png differ diff --git a/cache/uploads_nobg/6a5df0184e2abb9b03bf.png b/cache/uploads_nobg/6a5df0184e2abb9b03bf.png new file mode 100644 index 0000000..bfdf810 Binary files /dev/null and b/cache/uploads_nobg/6a5df0184e2abb9b03bf.png differ diff --git a/cache/uploads_nobg/6c52fc3289abe150788d.png b/cache/uploads_nobg/6c52fc3289abe150788d.png new file mode 100644 index 0000000..db9bfe9 Binary files /dev/null and b/cache/uploads_nobg/6c52fc3289abe150788d.png differ diff --git a/cache/uploads_nobg/6dfbd98dc77c6f1cd3b8.png b/cache/uploads_nobg/6dfbd98dc77c6f1cd3b8.png new file mode 100644 index 0000000..8def96f Binary files /dev/null and b/cache/uploads_nobg/6dfbd98dc77c6f1cd3b8.png differ diff --git a/cache/uploads_nobg/6f836bd69c8787e27285.png b/cache/uploads_nobg/6f836bd69c8787e27285.png new file mode 100644 index 0000000..ceec18d Binary files /dev/null and b/cache/uploads_nobg/6f836bd69c8787e27285.png differ diff --git a/cache/uploads_nobg/7076d8670f14ad6b033a.png b/cache/uploads_nobg/7076d8670f14ad6b033a.png new file mode 100644 index 0000000..4b7d589 Binary files /dev/null and b/cache/uploads_nobg/7076d8670f14ad6b033a.png differ diff --git a/cache/uploads_nobg/709d36e8c3568597848c.png b/cache/uploads_nobg/709d36e8c3568597848c.png new file mode 100644 index 0000000..36705d9 Binary files /dev/null and b/cache/uploads_nobg/709d36e8c3568597848c.png differ diff --git a/cache/uploads_nobg/7124af1bbee10908104d.png b/cache/uploads_nobg/7124af1bbee10908104d.png new file mode 100644 index 0000000..785d86d Binary files /dev/null and b/cache/uploads_nobg/7124af1bbee10908104d.png differ diff --git a/cache/uploads_nobg/745563c6dc85ee9c6781.png b/cache/uploads_nobg/745563c6dc85ee9c6781.png new file mode 100644 index 0000000..fa829ca Binary files /dev/null and b/cache/uploads_nobg/745563c6dc85ee9c6781.png differ diff --git a/cache/uploads_nobg/74cb19b18f99d453dee2.png b/cache/uploads_nobg/74cb19b18f99d453dee2.png new file mode 100644 index 0000000..da8b4f8 Binary files /dev/null and b/cache/uploads_nobg/74cb19b18f99d453dee2.png differ diff --git a/cache/uploads_nobg/756752f2d40b47f12643.png b/cache/uploads_nobg/756752f2d40b47f12643.png new file mode 100644 index 0000000..11208de Binary files /dev/null and b/cache/uploads_nobg/756752f2d40b47f12643.png differ diff --git a/cache/uploads_nobg/782df76c3f0a099f5b95.png b/cache/uploads_nobg/782df76c3f0a099f5b95.png new file mode 100644 index 0000000..c9e8258 Binary files /dev/null and b/cache/uploads_nobg/782df76c3f0a099f5b95.png differ diff --git a/cache/uploads_nobg/78e9121ded0958ddc37b.png b/cache/uploads_nobg/78e9121ded0958ddc37b.png new file mode 100644 index 0000000..bcf0e93 Binary files /dev/null and b/cache/uploads_nobg/78e9121ded0958ddc37b.png differ diff --git a/cache/uploads_nobg/796e93ecf3ef13d10d43.png b/cache/uploads_nobg/796e93ecf3ef13d10d43.png new file mode 100644 index 0000000..51b9758 Binary files /dev/null and b/cache/uploads_nobg/796e93ecf3ef13d10d43.png differ diff --git a/cache/uploads_nobg/79c25765d41301b059ec.png b/cache/uploads_nobg/79c25765d41301b059ec.png new file mode 100644 index 0000000..4d475f4 Binary files /dev/null and b/cache/uploads_nobg/79c25765d41301b059ec.png differ diff --git a/cache/uploads_nobg/7aafcb69b294efa45715.png b/cache/uploads_nobg/7aafcb69b294efa45715.png new file mode 100644 index 0000000..b7fe74a Binary files /dev/null and b/cache/uploads_nobg/7aafcb69b294efa45715.png differ diff --git a/cache/uploads_nobg/7b5d17e882dc578428a1.png b/cache/uploads_nobg/7b5d17e882dc578428a1.png new file mode 100644 index 0000000..70c3fa3 Binary files /dev/null and b/cache/uploads_nobg/7b5d17e882dc578428a1.png differ diff --git a/cache/uploads_nobg/7cf621d2bc1f871ea6d8.png b/cache/uploads_nobg/7cf621d2bc1f871ea6d8.png new file mode 100644 index 0000000..c39aa70 Binary files /dev/null and b/cache/uploads_nobg/7cf621d2bc1f871ea6d8.png differ diff --git a/cache/uploads_nobg/7eddc16bd8615d6e5f87.png b/cache/uploads_nobg/7eddc16bd8615d6e5f87.png new file mode 100644 index 0000000..d9c15c5 Binary files /dev/null and b/cache/uploads_nobg/7eddc16bd8615d6e5f87.png differ diff --git a/cache/uploads_nobg/7edfabe39b95aed5b584.png b/cache/uploads_nobg/7edfabe39b95aed5b584.png new file mode 100644 index 0000000..f625b98 Binary files /dev/null and b/cache/uploads_nobg/7edfabe39b95aed5b584.png differ diff --git a/cache/uploads_nobg/7f32508e5629764a8406.png b/cache/uploads_nobg/7f32508e5629764a8406.png new file mode 100644 index 0000000..c987030 Binary files /dev/null and b/cache/uploads_nobg/7f32508e5629764a8406.png differ diff --git a/cache/uploads_nobg/7fe4716bded4a0b7e48c.png b/cache/uploads_nobg/7fe4716bded4a0b7e48c.png new file mode 100644 index 0000000..e57c078 Binary files /dev/null and b/cache/uploads_nobg/7fe4716bded4a0b7e48c.png differ diff --git a/cache/uploads_nobg/80c97f1e7547b06b88d6.png b/cache/uploads_nobg/80c97f1e7547b06b88d6.png new file mode 100644 index 0000000..1801f16 Binary files /dev/null and b/cache/uploads_nobg/80c97f1e7547b06b88d6.png differ diff --git a/cache/uploads_nobg/8176b7f19541f14b797f.png b/cache/uploads_nobg/8176b7f19541f14b797f.png new file mode 100644 index 0000000..aa1e534 Binary files /dev/null and b/cache/uploads_nobg/8176b7f19541f14b797f.png differ diff --git a/cache/uploads_nobg/8237c9a7c84a35df6380.png b/cache/uploads_nobg/8237c9a7c84a35df6380.png new file mode 100644 index 0000000..8056ad7 Binary files /dev/null and b/cache/uploads_nobg/8237c9a7c84a35df6380.png differ diff --git a/cache/uploads_nobg/824d501ca9d934c5702a.png b/cache/uploads_nobg/824d501ca9d934c5702a.png new file mode 100644 index 0000000..65fe8c4 Binary files /dev/null and b/cache/uploads_nobg/824d501ca9d934c5702a.png differ diff --git a/cache/uploads_nobg/83926e4b3a31271cc7f7.png b/cache/uploads_nobg/83926e4b3a31271cc7f7.png new file mode 100644 index 0000000..2a3f2e8 Binary files /dev/null and b/cache/uploads_nobg/83926e4b3a31271cc7f7.png differ diff --git a/cache/uploads_nobg/84d553bf34d9c0b0ef69.png b/cache/uploads_nobg/84d553bf34d9c0b0ef69.png new file mode 100644 index 0000000..e7e9bf4 Binary files /dev/null and b/cache/uploads_nobg/84d553bf34d9c0b0ef69.png differ diff --git a/cache/uploads_nobg/85148aa40126281ae45f.png b/cache/uploads_nobg/85148aa40126281ae45f.png new file mode 100644 index 0000000..7551eb4 Binary files /dev/null and b/cache/uploads_nobg/85148aa40126281ae45f.png differ diff --git a/cache/uploads_nobg/856b72d4ad2f2df3fd02.png b/cache/uploads_nobg/856b72d4ad2f2df3fd02.png new file mode 100644 index 0000000..12a4b59 Binary files /dev/null and b/cache/uploads_nobg/856b72d4ad2f2df3fd02.png differ diff --git a/cache/uploads_nobg/85c0fc69942c8317cdad.png b/cache/uploads_nobg/85c0fc69942c8317cdad.png new file mode 100644 index 0000000..7c40699 Binary files /dev/null and b/cache/uploads_nobg/85c0fc69942c8317cdad.png differ diff --git a/cache/uploads_nobg/85d157e62d542f5d6aee.png b/cache/uploads_nobg/85d157e62d542f5d6aee.png new file mode 100644 index 0000000..a284acd Binary files /dev/null and b/cache/uploads_nobg/85d157e62d542f5d6aee.png differ diff --git a/cache/uploads_nobg/86339e2fefe05ae39394.png b/cache/uploads_nobg/86339e2fefe05ae39394.png new file mode 100644 index 0000000..52bfbca Binary files /dev/null and b/cache/uploads_nobg/86339e2fefe05ae39394.png differ diff --git a/cache/uploads_nobg/872c48f3057083bd16c7.png b/cache/uploads_nobg/872c48f3057083bd16c7.png new file mode 100644 index 0000000..a242d88 Binary files /dev/null and b/cache/uploads_nobg/872c48f3057083bd16c7.png differ diff --git a/cache/uploads_nobg/878b9ce3a3a38ad6c258.png b/cache/uploads_nobg/878b9ce3a3a38ad6c258.png new file mode 100644 index 0000000..4267986 Binary files /dev/null and b/cache/uploads_nobg/878b9ce3a3a38ad6c258.png differ diff --git a/cache/uploads_nobg/888f1b6fbc122b0f929a.png b/cache/uploads_nobg/888f1b6fbc122b0f929a.png new file mode 100644 index 0000000..386f51a Binary files /dev/null and b/cache/uploads_nobg/888f1b6fbc122b0f929a.png differ diff --git a/cache/uploads_nobg/88cd7e29e188b536b174.png b/cache/uploads_nobg/88cd7e29e188b536b174.png new file mode 100644 index 0000000..cc11fe6 Binary files /dev/null and b/cache/uploads_nobg/88cd7e29e188b536b174.png differ diff --git a/cache/uploads_nobg/89da846511a0bcc59092.png b/cache/uploads_nobg/89da846511a0bcc59092.png new file mode 100644 index 0000000..e481c5a Binary files /dev/null and b/cache/uploads_nobg/89da846511a0bcc59092.png differ diff --git a/cache/uploads_nobg/8a6ac8151a025c420053.png b/cache/uploads_nobg/8a6ac8151a025c420053.png new file mode 100644 index 0000000..8a01725 Binary files /dev/null and b/cache/uploads_nobg/8a6ac8151a025c420053.png differ diff --git a/cache/uploads_nobg/8cd7b7b96c08acb341cb.png b/cache/uploads_nobg/8cd7b7b96c08acb341cb.png new file mode 100644 index 0000000..2441eae Binary files /dev/null and b/cache/uploads_nobg/8cd7b7b96c08acb341cb.png differ diff --git a/cache/uploads_nobg/8d258ae04e60e2ec6b18.png b/cache/uploads_nobg/8d258ae04e60e2ec6b18.png new file mode 100644 index 0000000..4091213 Binary files /dev/null and b/cache/uploads_nobg/8d258ae04e60e2ec6b18.png differ diff --git a/cache/uploads_nobg/900fafbb3a98b0a12a4a.png b/cache/uploads_nobg/900fafbb3a98b0a12a4a.png new file mode 100644 index 0000000..1297428 Binary files /dev/null and b/cache/uploads_nobg/900fafbb3a98b0a12a4a.png differ diff --git a/cache/uploads_nobg/9046b1391d130df83b5b.png b/cache/uploads_nobg/9046b1391d130df83b5b.png new file mode 100644 index 0000000..a9a48e8 Binary files /dev/null and b/cache/uploads_nobg/9046b1391d130df83b5b.png differ diff --git a/cache/uploads_nobg/92b2d60663438090e3f5.png b/cache/uploads_nobg/92b2d60663438090e3f5.png new file mode 100644 index 0000000..55345c5 Binary files /dev/null and b/cache/uploads_nobg/92b2d60663438090e3f5.png differ diff --git a/cache/uploads_nobg/94a7e680da0c52798db6.png b/cache/uploads_nobg/94a7e680da0c52798db6.png new file mode 100644 index 0000000..74a1b22 Binary files /dev/null and b/cache/uploads_nobg/94a7e680da0c52798db6.png differ diff --git a/cache/uploads_nobg/967cc5f15694eb44ff44.png b/cache/uploads_nobg/967cc5f15694eb44ff44.png new file mode 100644 index 0000000..03a7ac5 Binary files /dev/null and b/cache/uploads_nobg/967cc5f15694eb44ff44.png differ diff --git a/cache/uploads_nobg/975b095875db18db874c.png b/cache/uploads_nobg/975b095875db18db874c.png new file mode 100644 index 0000000..82673e2 Binary files /dev/null and b/cache/uploads_nobg/975b095875db18db874c.png differ diff --git a/cache/uploads_nobg/98132e609e04ba01abbb.png b/cache/uploads_nobg/98132e609e04ba01abbb.png new file mode 100644 index 0000000..3f10f27 Binary files /dev/null and b/cache/uploads_nobg/98132e609e04ba01abbb.png differ diff --git a/cache/uploads_nobg/990f5f49381659424860.png b/cache/uploads_nobg/990f5f49381659424860.png new file mode 100644 index 0000000..ab1468d Binary files /dev/null and b/cache/uploads_nobg/990f5f49381659424860.png differ diff --git a/cache/uploads_nobg/a2b1f9db0dd996269280.png b/cache/uploads_nobg/a2b1f9db0dd996269280.png new file mode 100644 index 0000000..e10c37a Binary files /dev/null and b/cache/uploads_nobg/a2b1f9db0dd996269280.png differ diff --git a/cache/uploads_nobg/a4c5178d077f1b8dd609.png b/cache/uploads_nobg/a4c5178d077f1b8dd609.png new file mode 100644 index 0000000..a3af812 Binary files /dev/null and b/cache/uploads_nobg/a4c5178d077f1b8dd609.png differ diff --git a/cache/uploads_nobg/a59169e9dcc870274d62.png b/cache/uploads_nobg/a59169e9dcc870274d62.png new file mode 100644 index 0000000..f62e51a Binary files /dev/null and b/cache/uploads_nobg/a59169e9dcc870274d62.png differ diff --git a/cache/uploads_nobg/a81581bf0f4a44caa80c.png b/cache/uploads_nobg/a81581bf0f4a44caa80c.png new file mode 100644 index 0000000..b008d05 Binary files /dev/null and b/cache/uploads_nobg/a81581bf0f4a44caa80c.png differ diff --git a/cache/uploads_nobg/a82ece8238927d28b5e5.png b/cache/uploads_nobg/a82ece8238927d28b5e5.png new file mode 100644 index 0000000..ba339dc Binary files /dev/null and b/cache/uploads_nobg/a82ece8238927d28b5e5.png differ diff --git a/cache/uploads_nobg/ab893423d66cfcbdca66.png b/cache/uploads_nobg/ab893423d66cfcbdca66.png new file mode 100644 index 0000000..b5fde9f Binary files /dev/null and b/cache/uploads_nobg/ab893423d66cfcbdca66.png differ diff --git a/cache/uploads_nobg/ac9e8fb080ba9fc0b7a5.png b/cache/uploads_nobg/ac9e8fb080ba9fc0b7a5.png new file mode 100644 index 0000000..7f7030a Binary files /dev/null and b/cache/uploads_nobg/ac9e8fb080ba9fc0b7a5.png differ diff --git a/cache/uploads_nobg/ae86353d2ba7eb35804d.png b/cache/uploads_nobg/ae86353d2ba7eb35804d.png new file mode 100644 index 0000000..051ec95 Binary files /dev/null and b/cache/uploads_nobg/ae86353d2ba7eb35804d.png differ diff --git a/cache/uploads_nobg/afbdfb2c5190a07cf338.png b/cache/uploads_nobg/afbdfb2c5190a07cf338.png new file mode 100644 index 0000000..9263986 Binary files /dev/null and b/cache/uploads_nobg/afbdfb2c5190a07cf338.png differ diff --git a/cache/uploads_nobg/b046d07b5be85d70ccd9.png b/cache/uploads_nobg/b046d07b5be85d70ccd9.png new file mode 100644 index 0000000..e27ea85 Binary files /dev/null and b/cache/uploads_nobg/b046d07b5be85d70ccd9.png differ diff --git a/cache/uploads_nobg/b0b64c5bca4a7d50842b.png b/cache/uploads_nobg/b0b64c5bca4a7d50842b.png new file mode 100644 index 0000000..31423b1 Binary files /dev/null and b/cache/uploads_nobg/b0b64c5bca4a7d50842b.png differ diff --git a/cache/uploads_nobg/b152281d3b1df3784c41.png b/cache/uploads_nobg/b152281d3b1df3784c41.png new file mode 100644 index 0000000..f36a7ff Binary files /dev/null and b/cache/uploads_nobg/b152281d3b1df3784c41.png differ diff --git a/cache/uploads_nobg/b5300f8f297ee3d7e837.png b/cache/uploads_nobg/b5300f8f297ee3d7e837.png new file mode 100644 index 0000000..2aca7cf Binary files /dev/null and b/cache/uploads_nobg/b5300f8f297ee3d7e837.png differ diff --git a/cache/uploads_nobg/b74d846dcf23cdb87b55.png b/cache/uploads_nobg/b74d846dcf23cdb87b55.png new file mode 100644 index 0000000..ce97ed4 Binary files /dev/null and b/cache/uploads_nobg/b74d846dcf23cdb87b55.png differ diff --git a/cache/uploads_nobg/bafc615b901e1a1fa50b.png b/cache/uploads_nobg/bafc615b901e1a1fa50b.png new file mode 100644 index 0000000..439b01e Binary files /dev/null and b/cache/uploads_nobg/bafc615b901e1a1fa50b.png differ diff --git a/cache/uploads_nobg/bba5d744ca8090f62838.png b/cache/uploads_nobg/bba5d744ca8090f62838.png new file mode 100644 index 0000000..887988f Binary files /dev/null and b/cache/uploads_nobg/bba5d744ca8090f62838.png differ diff --git a/cache/uploads_nobg/bc8d205d89e9d11df6db.png b/cache/uploads_nobg/bc8d205d89e9d11df6db.png new file mode 100644 index 0000000..fdbb240 Binary files /dev/null and b/cache/uploads_nobg/bc8d205d89e9d11df6db.png differ diff --git a/cache/uploads_nobg/bcbebf5c83d5a068e188.png b/cache/uploads_nobg/bcbebf5c83d5a068e188.png new file mode 100644 index 0000000..bd6645f Binary files /dev/null and b/cache/uploads_nobg/bcbebf5c83d5a068e188.png differ diff --git a/cache/uploads_nobg/bcf41b1de16fcf083f9a.png b/cache/uploads_nobg/bcf41b1de16fcf083f9a.png new file mode 100644 index 0000000..0a0626b Binary files /dev/null and b/cache/uploads_nobg/bcf41b1de16fcf083f9a.png differ diff --git a/cache/uploads_nobg/bdf77adce57d4d314bc7.png b/cache/uploads_nobg/bdf77adce57d4d314bc7.png new file mode 100644 index 0000000..31ea1b3 Binary files /dev/null and b/cache/uploads_nobg/bdf77adce57d4d314bc7.png differ diff --git a/cache/uploads_nobg/bf0e06c89d45c0d00cbe.png b/cache/uploads_nobg/bf0e06c89d45c0d00cbe.png new file mode 100644 index 0000000..977109d Binary files /dev/null and b/cache/uploads_nobg/bf0e06c89d45c0d00cbe.png differ diff --git a/cache/uploads_nobg/bf8316d68324ddd46c8e.png b/cache/uploads_nobg/bf8316d68324ddd46c8e.png new file mode 100644 index 0000000..e723211 Binary files /dev/null and b/cache/uploads_nobg/bf8316d68324ddd46c8e.png differ diff --git a/cache/uploads_nobg/c07754061d1d9adfd29a.png b/cache/uploads_nobg/c07754061d1d9adfd29a.png new file mode 100644 index 0000000..84bf1ab Binary files /dev/null and b/cache/uploads_nobg/c07754061d1d9adfd29a.png differ diff --git a/cache/uploads_nobg/c28af9f9884ef485c21d.png b/cache/uploads_nobg/c28af9f9884ef485c21d.png new file mode 100644 index 0000000..45eaaa1 Binary files /dev/null and b/cache/uploads_nobg/c28af9f9884ef485c21d.png differ diff --git a/cache/uploads_nobg/c3cf02e923b77197340c.png b/cache/uploads_nobg/c3cf02e923b77197340c.png new file mode 100644 index 0000000..c51ca84 Binary files /dev/null and b/cache/uploads_nobg/c3cf02e923b77197340c.png differ diff --git a/cache/uploads_nobg/c533a577a3fdf941ffc5.png b/cache/uploads_nobg/c533a577a3fdf941ffc5.png new file mode 100644 index 0000000..aaa201c Binary files /dev/null and b/cache/uploads_nobg/c533a577a3fdf941ffc5.png differ diff --git a/cache/uploads_nobg/c5f04f0023bd7dbcba77.png b/cache/uploads_nobg/c5f04f0023bd7dbcba77.png new file mode 100644 index 0000000..eb85540 Binary files /dev/null and b/cache/uploads_nobg/c5f04f0023bd7dbcba77.png differ diff --git a/cache/uploads_nobg/c69eb084ea49b06c0fef.png b/cache/uploads_nobg/c69eb084ea49b06c0fef.png new file mode 100644 index 0000000..01c5569 Binary files /dev/null and b/cache/uploads_nobg/c69eb084ea49b06c0fef.png differ diff --git a/cache/uploads_nobg/c6fef8687d07c288f963.png b/cache/uploads_nobg/c6fef8687d07c288f963.png new file mode 100644 index 0000000..7c324b2 Binary files /dev/null and b/cache/uploads_nobg/c6fef8687d07c288f963.png differ diff --git a/cache/uploads_nobg/c957ed34a39e8f902f91.png b/cache/uploads_nobg/c957ed34a39e8f902f91.png new file mode 100644 index 0000000..a06e5f7 Binary files /dev/null and b/cache/uploads_nobg/c957ed34a39e8f902f91.png differ diff --git a/cache/uploads_nobg/cac858668f83f2af6cfb.png b/cache/uploads_nobg/cac858668f83f2af6cfb.png new file mode 100644 index 0000000..9238374 Binary files /dev/null and b/cache/uploads_nobg/cac858668f83f2af6cfb.png differ diff --git a/cache/uploads_nobg/cb69908d276438a99048.png b/cache/uploads_nobg/cb69908d276438a99048.png new file mode 100644 index 0000000..6e35d7e Binary files /dev/null and b/cache/uploads_nobg/cb69908d276438a99048.png differ diff --git a/cache/uploads_nobg/cbc99c9cddc1261cda04.png b/cache/uploads_nobg/cbc99c9cddc1261cda04.png new file mode 100644 index 0000000..176356b Binary files /dev/null and b/cache/uploads_nobg/cbc99c9cddc1261cda04.png differ diff --git a/cache/uploads_nobg/cd3bca9bc612557f073d.png b/cache/uploads_nobg/cd3bca9bc612557f073d.png new file mode 100644 index 0000000..00f6513 Binary files /dev/null and b/cache/uploads_nobg/cd3bca9bc612557f073d.png differ diff --git a/cache/uploads_nobg/cd6ebc4ea906c53a21f8.png b/cache/uploads_nobg/cd6ebc4ea906c53a21f8.png new file mode 100644 index 0000000..e9f816c Binary files /dev/null and b/cache/uploads_nobg/cd6ebc4ea906c53a21f8.png differ diff --git a/cache/uploads_nobg/cd7f1ee64473aa602a16.png b/cache/uploads_nobg/cd7f1ee64473aa602a16.png new file mode 100644 index 0000000..aea1bf3 Binary files /dev/null and b/cache/uploads_nobg/cd7f1ee64473aa602a16.png differ diff --git a/cache/uploads_nobg/ceebca56c8225f49bd48.png b/cache/uploads_nobg/ceebca56c8225f49bd48.png new file mode 100644 index 0000000..a595709 Binary files /dev/null and b/cache/uploads_nobg/ceebca56c8225f49bd48.png differ diff --git a/cache/uploads_nobg/cf742b48567d4bd5a3bf.png b/cache/uploads_nobg/cf742b48567d4bd5a3bf.png new file mode 100644 index 0000000..c97386b Binary files /dev/null and b/cache/uploads_nobg/cf742b48567d4bd5a3bf.png differ diff --git a/cache/uploads_nobg/cf7e0961e0467f8628c6.png b/cache/uploads_nobg/cf7e0961e0467f8628c6.png new file mode 100644 index 0000000..5497eac Binary files /dev/null and b/cache/uploads_nobg/cf7e0961e0467f8628c6.png differ diff --git a/cache/uploads_nobg/d324e9aa6f7854afa9d0.png b/cache/uploads_nobg/d324e9aa6f7854afa9d0.png new file mode 100644 index 0000000..050f9b7 Binary files /dev/null and b/cache/uploads_nobg/d324e9aa6f7854afa9d0.png differ diff --git a/cache/uploads_nobg/d4d5b6e7f1fdb085bc4a.png b/cache/uploads_nobg/d4d5b6e7f1fdb085bc4a.png new file mode 100644 index 0000000..0c648a8 Binary files /dev/null and b/cache/uploads_nobg/d4d5b6e7f1fdb085bc4a.png differ diff --git a/cache/uploads_nobg/d577924efd188a2b9081.png b/cache/uploads_nobg/d577924efd188a2b9081.png new file mode 100644 index 0000000..44b9a12 Binary files /dev/null and b/cache/uploads_nobg/d577924efd188a2b9081.png differ diff --git a/cache/uploads_nobg/d69d426e67322d4feed8.png b/cache/uploads_nobg/d69d426e67322d4feed8.png new file mode 100644 index 0000000..39c1814 Binary files /dev/null and b/cache/uploads_nobg/d69d426e67322d4feed8.png differ diff --git a/cache/uploads_nobg/d80a8457044f0071e5e9.png b/cache/uploads_nobg/d80a8457044f0071e5e9.png new file mode 100644 index 0000000..cdfd172 Binary files /dev/null and b/cache/uploads_nobg/d80a8457044f0071e5e9.png differ diff --git a/cache/uploads_nobg/d8b013365628649e4e33.png b/cache/uploads_nobg/d8b013365628649e4e33.png new file mode 100644 index 0000000..4da216e Binary files /dev/null and b/cache/uploads_nobg/d8b013365628649e4e33.png differ diff --git a/cache/uploads_nobg/d8f44d06f73124e395fc.png b/cache/uploads_nobg/d8f44d06f73124e395fc.png new file mode 100644 index 0000000..b2e6e90 Binary files /dev/null and b/cache/uploads_nobg/d8f44d06f73124e395fc.png differ diff --git a/cache/uploads_nobg/da36a5373bbd2abd6d65.png b/cache/uploads_nobg/da36a5373bbd2abd6d65.png new file mode 100644 index 0000000..819a422 Binary files /dev/null and b/cache/uploads_nobg/da36a5373bbd2abd6d65.png differ diff --git a/cache/uploads_nobg/db18d76410d0bebd0ff6.png b/cache/uploads_nobg/db18d76410d0bebd0ff6.png new file mode 100644 index 0000000..87d6e9a Binary files /dev/null and b/cache/uploads_nobg/db18d76410d0bebd0ff6.png differ diff --git a/cache/uploads_nobg/db25a2fed524550350fa.png b/cache/uploads_nobg/db25a2fed524550350fa.png new file mode 100644 index 0000000..9973648 Binary files /dev/null and b/cache/uploads_nobg/db25a2fed524550350fa.png differ diff --git a/cache/uploads_nobg/db39773bc60af26f38b5.png b/cache/uploads_nobg/db39773bc60af26f38b5.png new file mode 100644 index 0000000..38ee322 Binary files /dev/null and b/cache/uploads_nobg/db39773bc60af26f38b5.png differ diff --git a/cache/uploads_nobg/dc3107bd85e9cdfc1a7c.png b/cache/uploads_nobg/dc3107bd85e9cdfc1a7c.png new file mode 100644 index 0000000..0514264 Binary files /dev/null and b/cache/uploads_nobg/dc3107bd85e9cdfc1a7c.png differ diff --git a/cache/uploads_nobg/de95381242a2c29a659a.png b/cache/uploads_nobg/de95381242a2c29a659a.png new file mode 100644 index 0000000..37adf66 Binary files /dev/null and b/cache/uploads_nobg/de95381242a2c29a659a.png differ diff --git a/cache/uploads_nobg/df14840e9064a74058ed.png b/cache/uploads_nobg/df14840e9064a74058ed.png new file mode 100644 index 0000000..c2f9b13 Binary files /dev/null and b/cache/uploads_nobg/df14840e9064a74058ed.png differ diff --git a/cache/uploads_nobg/dfae7e365240da451c4c.png b/cache/uploads_nobg/dfae7e365240da451c4c.png new file mode 100644 index 0000000..ad12de9 Binary files /dev/null and b/cache/uploads_nobg/dfae7e365240da451c4c.png differ diff --git a/cache/uploads_nobg/e1f93c1310b6e3ff765b.png b/cache/uploads_nobg/e1f93c1310b6e3ff765b.png new file mode 100644 index 0000000..260845a Binary files /dev/null and b/cache/uploads_nobg/e1f93c1310b6e3ff765b.png differ diff --git a/cache/uploads_nobg/e203cb1f6b4915bb26d9.png b/cache/uploads_nobg/e203cb1f6b4915bb26d9.png new file mode 100644 index 0000000..d8a9de9 Binary files /dev/null and b/cache/uploads_nobg/e203cb1f6b4915bb26d9.png differ diff --git a/cache/uploads_nobg/e3a11387378f29254580.png b/cache/uploads_nobg/e3a11387378f29254580.png new file mode 100644 index 0000000..a3bb1f1 Binary files /dev/null and b/cache/uploads_nobg/e3a11387378f29254580.png differ diff --git a/cache/uploads_nobg/e519dc7098c232744edd.png b/cache/uploads_nobg/e519dc7098c232744edd.png new file mode 100644 index 0000000..8312629 Binary files /dev/null and b/cache/uploads_nobg/e519dc7098c232744edd.png differ diff --git a/cache/uploads_nobg/e5edc70aa36daf19542c.png b/cache/uploads_nobg/e5edc70aa36daf19542c.png new file mode 100644 index 0000000..d4b366c Binary files /dev/null and b/cache/uploads_nobg/e5edc70aa36daf19542c.png differ diff --git a/cache/uploads_nobg/e6cd06010eda92bdf422.png b/cache/uploads_nobg/e6cd06010eda92bdf422.png new file mode 100644 index 0000000..1391476 Binary files /dev/null and b/cache/uploads_nobg/e6cd06010eda92bdf422.png differ diff --git a/cache/uploads_nobg/e73297ba3a3a5cbbffa6.png b/cache/uploads_nobg/e73297ba3a3a5cbbffa6.png new file mode 100644 index 0000000..e0ed859 Binary files /dev/null and b/cache/uploads_nobg/e73297ba3a3a5cbbffa6.png differ diff --git a/cache/uploads_nobg/e76bef6158b0317a2d3f.png b/cache/uploads_nobg/e76bef6158b0317a2d3f.png new file mode 100644 index 0000000..2e0725e Binary files /dev/null and b/cache/uploads_nobg/e76bef6158b0317a2d3f.png differ diff --git a/cache/uploads_nobg/e87abd9ad2cf303a9a7c.png b/cache/uploads_nobg/e87abd9ad2cf303a9a7c.png new file mode 100644 index 0000000..39016dd Binary files /dev/null and b/cache/uploads_nobg/e87abd9ad2cf303a9a7c.png differ diff --git a/cache/uploads_nobg/e8c45b90ce121f948295.png b/cache/uploads_nobg/e8c45b90ce121f948295.png new file mode 100644 index 0000000..208284b Binary files /dev/null and b/cache/uploads_nobg/e8c45b90ce121f948295.png differ diff --git a/cache/uploads_nobg/eb60ce2524d686b887d0.png b/cache/uploads_nobg/eb60ce2524d686b887d0.png new file mode 100644 index 0000000..8abb213 Binary files /dev/null and b/cache/uploads_nobg/eb60ce2524d686b887d0.png differ diff --git a/cache/uploads_nobg/ebda67ce3062eed3e7d8.png b/cache/uploads_nobg/ebda67ce3062eed3e7d8.png new file mode 100644 index 0000000..cdea5b3 Binary files /dev/null and b/cache/uploads_nobg/ebda67ce3062eed3e7d8.png differ diff --git a/cache/uploads_nobg/ec6497336d267404619d.png b/cache/uploads_nobg/ec6497336d267404619d.png new file mode 100644 index 0000000..223f52e Binary files /dev/null and b/cache/uploads_nobg/ec6497336d267404619d.png differ diff --git a/cache/uploads_nobg/ece1be528113263ff2bf.png b/cache/uploads_nobg/ece1be528113263ff2bf.png new file mode 100644 index 0000000..69a961a Binary files /dev/null and b/cache/uploads_nobg/ece1be528113263ff2bf.png differ diff --git a/cache/uploads_nobg/ed7a93d1a34ba5d712e6.png b/cache/uploads_nobg/ed7a93d1a34ba5d712e6.png new file mode 100644 index 0000000..0cb4518 Binary files /dev/null and b/cache/uploads_nobg/ed7a93d1a34ba5d712e6.png differ diff --git a/cache/uploads_nobg/f07a054ce14a83cd9c30.png b/cache/uploads_nobg/f07a054ce14a83cd9c30.png new file mode 100644 index 0000000..d383391 Binary files /dev/null and b/cache/uploads_nobg/f07a054ce14a83cd9c30.png differ diff --git a/cache/uploads_nobg/f10d0aea54fe3a020dbf.png b/cache/uploads_nobg/f10d0aea54fe3a020dbf.png new file mode 100644 index 0000000..b693a8d Binary files /dev/null and b/cache/uploads_nobg/f10d0aea54fe3a020dbf.png differ diff --git a/cache/uploads_nobg/f1c0b8af87d29554153c.png b/cache/uploads_nobg/f1c0b8af87d29554153c.png new file mode 100644 index 0000000..b5cfd67 Binary files /dev/null and b/cache/uploads_nobg/f1c0b8af87d29554153c.png differ diff --git a/cache/uploads_nobg/f8b02ae62c8941dabad0.png b/cache/uploads_nobg/f8b02ae62c8941dabad0.png new file mode 100644 index 0000000..2e49daa Binary files /dev/null and b/cache/uploads_nobg/f8b02ae62c8941dabad0.png differ diff --git a/cache/uploads_nobg/fad02b32ca41ed93d32b.png b/cache/uploads_nobg/fad02b32ca41ed93d32b.png new file mode 100644 index 0000000..e0b30f4 Binary files /dev/null and b/cache/uploads_nobg/fad02b32ca41ed93d32b.png differ diff --git a/cache/uploads_nobg/fb0262dcf0c9a05837ed.png b/cache/uploads_nobg/fb0262dcf0c9a05837ed.png new file mode 100644 index 0000000..a5eaf85 Binary files /dev/null and b/cache/uploads_nobg/fb0262dcf0c9a05837ed.png differ diff --git a/cache/uploads_nobg/fbcc17f1528d2d528b13.png b/cache/uploads_nobg/fbcc17f1528d2d528b13.png new file mode 100644 index 0000000..3b75a80 Binary files /dev/null and b/cache/uploads_nobg/fbcc17f1528d2d528b13.png differ diff --git a/cache/uploads_nobg/fc736f115e69873e5dcb.png b/cache/uploads_nobg/fc736f115e69873e5dcb.png new file mode 100644 index 0000000..efbb22e Binary files /dev/null and b/cache/uploads_nobg/fc736f115e69873e5dcb.png differ diff --git a/cache/uploads_nobg/ff7fdcccab70d36a90c1.png b/cache/uploads_nobg/ff7fdcccab70d36a90c1.png new file mode 100644 index 0000000..db2b339 Binary files /dev/null and b/cache/uploads_nobg/ff7fdcccab70d36a90c1.png differ diff --git a/cache/uploads_nobg/ffff5c8b05aa7a913e4b.png b/cache/uploads_nobg/ffff5c8b05aa7a913e4b.png new file mode 100644 index 0000000..7dfb9dc Binary files /dev/null and b/cache/uploads_nobg/ffff5c8b05aa7a913e4b.png differ diff --git a/colourIdentifier.py b/colourIdentifier.py new file mode 100644 index 0000000..dc5e414 --- /dev/null +++ b/colourIdentifier.py @@ -0,0 +1,112 @@ +import cv2 +import numpy as np +import matplotlib.pyplot as plt +from sklearn.cluster import KMeans +import webcolors +from scipy.spatial import KDTree + +import webcolors +from scipy.spatial import KDTree + +def get_closest_color_name(rgb_tuple): + """ + Finds the nearest human-readable color name for any given RGB tuple. + Compatible with both newer and older versions of the 'webcolors' library. + """ + # 1. Fetch color names and RGB mapping based on webcolors version + try: + # Modern webcolors syntax + color_names = webcolors.names("css3") + rgb_values = [webcolors.name_to_rgb(name, spec="css3") for name in color_names] + except AttributeError: + # Legacy webcolors fallback (v1.11 or older) + css3_db = getattr(webcolors, "CSS3_HEX_TO_NAMES", webcolors.css3_hex_to_names) + color_names = list(css3_db.values()) + rgb_values = [webcolors.hex_to_rgb(hex_code) for hex_code in css3_db.keys()] + + # 2. Query nearest neighbor using KDTree + kdt_db = KDTree(rgb_values) + _, index = kdt_db.query(rgb_tuple) + return color_names[index] + +def visualize_named_color_segmentation(image_path, num_colors=5, output_file="named_segmented_result.png"): + """ + Segments an image by dominant colors, identifies human-readable color names, + creates individual region masks, and plots a visual report. + """ + # 1. Load image and convert to RGB + image = cv2.imread(image_path) + if image is None: + raise FileNotFoundError(f"Could not load image at path: {image_path}") + image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + + # 2. Reshape for K-Means + pixels = image_rgb.reshape((-1, 3)) + + # 3. Apply K-Means Clustering + kmeans = KMeans(n_clusters=num_colors, n_init=10, random_state=42) + labels = kmeans.fit_predict(pixels) + colors = kmeans.cluster_centers_.astype(int) + + # Calculate pixel counts and percentages + counts = np.bincount(labels) + total_pixels = len(pixels) + sorted_indices = np.argsort(counts)[::-1] # Sort by area size (largest first) + + # 4. Create the full segmented image (Quantized Image) + segmented_pixels = colors[labels] + segmented_image = segmented_pixels.reshape(image_rgb.shape) + + # 5. Build Subplot Grid for Visualization + cols = 3 + rows = int(np.ceil((num_colors + 2) / cols)) + plt.figure(figsize=(16, 4.5 * rows)) + + # Display Original Image + plt.subplot(rows, cols, 1) + plt.imshow(image_rgb) + plt.title("Original Image", fontsize=12, fontweight='bold') + plt.axis("off") + + # Display Full Color-Segmented Image + plt.subplot(rows, cols, 2) + plt.imshow(segmented_image) + plt.title(f"Segmented Image ({num_colors} Colors)", fontsize=12, fontweight='bold') + plt.axis("off") + + # Display Individual Color Region Masks with Color Names + labels_2d = labels.reshape(image_rgb.shape[:2]) + + for i, idx in enumerate(sorted_indices): + cluster_color = tuple(colors[idx]) + percentage = (counts[idx] / total_pixels) * 100 + hex_code = f"#{cluster_color[0]:02x}{cluster_color[1]:02x}{cluster_color[2]:02x}" + + # Get human-readable color name + color_name = get_closest_color_name(cluster_color).capitalize() + + # Create an isolated view for this specific color region + region_mask = (labels_2d == idx) + isolated_region = np.zeros_like(image_rgb) + isolated_region[region_mask] = image_rgb[region_mask] + + # Plot individual segmented mask + plt.subplot(rows, cols, i + 3) + plt.imshow(isolated_region) + plt.title( + f"Region {i+1}: {color_name} ({percentage:.2f}%)\nRGB: {cluster_color} | HEX: {hex_code}", + fontsize=11, fontweight='bold' + ) + plt.axis("off") + + plt.tight_layout() + plt.savefig(output_file, dpi=300, bbox_inches='tight') + print(f"Segmented output successfully saved to '{output_file}'") + plt.show() + +# --- Example Usage --- +if __name__ == "__main__": + IMAGE_FILE = "/media/suman/Backup_of_extra_/Sasi/Flowers_images/imgR_nobg.png" # Replace with your image file path + + # Run segmentation with color name detection + visualize_named_color_segmentation(IMAGE_FILE, num_colors=4, output_file="named_segmented_regions.png") \ No newline at end of file diff --git a/config.py b/config.py new file mode 100644 index 0000000..a503f3f --- /dev/null +++ b/config.py @@ -0,0 +1,280 @@ +""" +Central config for Vase Matcher. +""" + +import os + +# ASSUMPTION: cap thread pools BEFORE cv2/onnxruntime/torch are imported +# anywhere in the process. Left uncapped, each of these libraries grabs one +# thread per core for every op, which on a shared dev machine starves +# everything else (editor, window manager, etc.) even for a single request. +NUM_WORKER_THREADS = min(4, os.cpu_count() or 4) +for _env_var in ("OMP_NUM_THREADS", "OPENBLAS_NUM_THREADS", "MKL_NUM_THREADS", + "NUMEXPR_NUM_THREADS", "ORT_NUM_THREADS"): + os.environ.setdefault(_env_var, str(NUM_WORKER_THREADS)) + +# The 7.91 GiB card is small enough that PyTorch's caching allocator can hit +# CUDA OOM from fragmentation alone even when the aggregate free memory +# would be enough -- this is what the OOM error itself recommends. +os.environ.setdefault("PYTORCH_CUDA_ALLOC_CONF", "expandable_segments:True") + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + +# Reuse the existing template photos rather than duplicating them. +TEMPLATE_IMAGES_DIR = "/media/suman/Backup_of_extra_/Sasi/Flowers_images/Templates" + +CACHE_DIR = os.path.join(BASE_DIR, "cache") +TEMPLATES_NOBG_CACHE = os.path.join(CACHE_DIR, "templates_nobg") +UPLOADS_NOBG_CACHE = os.path.join(CACHE_DIR, "uploads_nobg") + +UPLOADS_DIR = os.path.join(BASE_DIR, "uploads") +MAX_UPLOAD_AGE_SECONDS = 60 * 60 * 6 # janitor sweeps uploads older than this + +VALID_EXTS = (".png", ".jpg", ".jpeg", ".bmp", ".webp") + +REMBG_MODEL_NAME = "birefnet-general-lite" + +# ASSUMPTION: uploads (phone photos especially) can be arbitrarily large -- +# multi-thousand-pixel images fed uncapped into bg removal + SuperPoint were +# the source of multi-GB memory spikes that got the process OOM-killed. +# Every image is downscaled to this before touching any model; templates are +# capped too for consistency even though they're already small. +MAX_IMAGE_DIM = 1600 + +ALPHA_THRESHOLD = 200 +ERODE_ITER = 1 +LOWE_RATIO = 0.75 +MIN_RAW_MATCHES = 4 + +ORB_N_FEATURES = 5000 +SUPERPOINT_MAX_KEYPOINTS = 1024 + +LOFTR_MAX_DIM = 480 +LOFTR_CONFIDENCE_THRESHOLD = 0.5 + +# Score thresholds only affect the "confident match" badge -- the full +# ranked list of templates + scores is always returned per method. +SCORE_THRESHOLD = { + "SIFT": 10, + "ORB": 10, + "SuperGlue": 15, + "LoFTR": 15, + # match_pct is already a 0-100 histogram-overlap percentage (see + # pipeline/color.py), not a raw inlier count -- 50 is a reasonable + # "more than half your photo's color distribution is covered" bar. + "Color": 50, +} + +METHOD_LABELS = { + "SIFT": "SIFT (classical)", + "ORB": "ORB (classical)", + "SuperGlue": "SuperPoint + LightGlue", + "LoFTR": "LoFTR (dense)", + "Color": "Color space", +} + +# Weighted final verdict: weighted_score(template) = sum_m WEIGHT[m] * +# raw_score(m, template). Separate from the Borda-count "overall_best" +# above (which aggregates ranks, not raw scores) -- this is a literal +# weighted sum, so a method with naturally larger raw-score magnitudes +# (e.g. SuperGlue's inlier counts run much higher than SIFT/ORB's) pulls +# harder on the total even at a lower weight. That's expected given the +# formula as specified, not a bug. +# +# "Color" folds the color-space match_pct (0-100) into this same weighted +# sum. It does NOT appear as a 5th card in the method grid (that section is +# unchanged) and does NOT feed into the Borda-count "overall_best" -- it +# only contributes to the weighted verdict, per request. +METHOD_WEIGHTS = { + "LoFTR": 0.75, + "SuperGlue": 0.15, + "SIFT": 0.10, + "ORB": 0.1, + "Color": 0.7, +} + +# Optional third-party AI verification step, run after the weighted best +# template is known: sends {matched template photo, user's original upload} +# to an external vision-LLM endpoint for a detailed QC-style comparison. This +# is a Cloudflare tunnel URL -- it can go stale if that tunnel is restarted, +# so failures here are handled as a soft/optional error, never a hard one. +VERIFY_ENDPOINT_URL = "https://marshall-toys-ridge-showing.trycloudflare.com/verify" +VERIFY_TIMEOUT_SECONDS = 90 + +# Color family grid (dynamic K-means color-region clustering, LAB space -- +# see pipeline/color_grid.py): visual side-by-side of "which parts of your +# photo and the matched template are the same color region" plus a per-family +# area-match %. Purely informational, like AI verification -- never feeds +# into any score. +FAMILY_GRID_K = 5 +FAMILY_GRID_LIGHTNESS_WEIGHT = 0.6 # down-weight L* so shadows of the same + # hue cluster together, same as lightness + # damping in dynamic color-family tools +FAMILY_GRID_LINE_WIDTH = 4 +# Each tile is downscaled to this before being placed in the grid (not the +# other way around) -- keeps the assembled canvas small by construction +# instead of building one at full (up to 1600px) resolution per tile and +# shrinking after. +FAMILY_GRID_TILE_MAX_DIM = 260 + +# Hard ceiling Werkzeug enforces at the request layer -- anything bigger is +# rejected with 413 before our view function ever runs. Kept well above +# COMPRESS_ABOVE_BYTES so large-but-legitimate phone photos (modern phone +# JPEGs can run 15-25 MB at high megapixel counts) get a chance to be +# compressed instead of outright rejected; this is just the outer guard +# against something absurd (a mislabeled video, etc.). +MAX_CONTENT_LENGTH_BYTES = 50 * 1024 * 1024 # 50 MB hard reject ceiling + +# Soft threshold: uploads bigger than this are downscaled + re-encoded as +# JPEG (not rejected) before entering the pipeline. Reuses MAX_IMAGE_DIM -- +# the matching pipeline downsamples to that anyway, so capping the *stored* +# original to the same size loses no detail the app would ever have used. +COMPRESS_ABOVE_BYTES = 15 * 1024 * 1024 # 15 MB +COMPRESS_JPEG_QUALITY_START = 92 +COMPRESS_JPEG_QUALITY_MIN = 60 +COMPRESS_JPEG_QUALITY_STEP = 8 + +LOG_DIR = os.path.join(BASE_DIR, "logs") +LOG_FILE = os.path.join(LOG_DIR, "app.log") + +HOST = "0.0.0.0" +PORT = 5053 + +# ========================================================== +# Shape matching (pipeline/shape_match.py) -- purely informational, its own +# section, does NOT feed into any score. +# ========================================================== + +# Both silhouettes are cropped to their own bounding box and resized/centered +# into this square canvas before comparison -- makes them directly +# comparable (and visually comparable) regardless of the original photo's +# scale, crop, or resolution. +SHAPE_CANONICAL_SIZE = 256 + +# cv2.matchShapes (CONTOURS_MATCH_I1, built on Hu moments) returns an +# unbounded distance -- 0 for identical contours, empirically usually well +# under 1.0 for genuinely similar silhouettes and several times that for +# clearly different ones. This is the divisor used to turn that distance +# into a 0-100% similarity; tune if it reads as over/under-sensitive on +# your actual photos. +SHAPE_HU_DISTANCE_SCALE = 1.5 + +# ========================================================== +# Texture matching (pipeline/texture_match.py) -- Local Binary Patterns +# (fine local micro-pattern) + GLCM/Haralick features (coarser statistical +# texture: contrast, homogeneity, energy, correlation). Purely +# informational, its own section, does NOT feed into any score. +# ========================================================== + +TEXTURE_LBP_RADIUS = 2 +TEXTURE_LBP_POINTS = 8 * TEXTURE_LBP_RADIUS +TEXTURE_GLCM_LEVELS = 32 +TEXTURE_GLCM_DISTANCES = (1, 2) +TEXTURE_GLCM_PROPS = ("contrast", "homogeneity", "energy", "correlation") + +# ========================================================== +# Flower-instance counting (pipeline/flower_count.py) -- opt-in, run only +# when the user explicitly clicks "Count flowers", never as part of the +# normal match pipeline. Uses SAM3 (see the SAM3 section further below), +# prompted with the concept "flower", to get per-instance masks directly -- +# then color-clusters the survivors as a rough proxy for distinct flower +# "kinds" (no trained flower species classifier is available). Purely a +# separate, on-demand diagnostic -- never feeds into any score. +# ========================================================== + +# Upper bound on how many distinct "kinds" (color clusters) to look for among +# the counted instances -- capped since color is only a rough species proxy, +# not a real classifier, and too many clusters just fragments noise. +SAM_MAX_KIND_CLUSTERS = 6 + +# ========================================================== +# YOLO-World (pipeline/yolo_world.py) -- open-vocabulary detection, run +# alongside SAM3 for the same opt-in flower-count feature as an independent +# second opinion. Its "flower" boxes are shown to the user as a second, +# separate count -- it tends to draw one box per contiguous flower region +# rather than per bloom, so it's a coarser, corroborating signal, not a +# replacement for SAM3's per-instance count. +# ========================================================== +YOLO_WORLD_CHECKPOINT = "/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt" +YOLO_WORLD_CLASSES = ["flower", "vase", "ribbon", "bow"] +YOLO_WORLD_CONF = 0.08 +YOLO_WORLD_IOU = 0.4 + +# ========================================================== +# Vase-identity comparison (pipeline/vase_compare.py) -- run alongside the +# same opt-in flower-count feature: crops the vase out of both the upload +# and the matched template (via SAM3's "vase" concept mask, already fetched +# in the same batched SAM3 call as the flower count above) and compares them +# with two complementary embedding models: +# - DINOv2: self-supervised patch-level features, good at fine-grained +# shape/texture/material detail. +# - CLIP: contrastive image embedding, a coarser/more holistic second +# opinion. +# Purely informational -- never feeds into matching/scoring. +# ========================================================== +DINO_MODEL_NAME = "facebook/dinov2-base" +CLIP_MODEL_NAME = "openai/clip-vit-base-patch32" + +# Padding added around the raw YOLO box before cropping, as a fraction of +# the box's own width/height -- avoids cutting off the vase's rim/base right +# at the detector's (imprecise) box edge. +VASE_CROP_PAD_FRAC = 0.06 + +# DINO is weighted higher since fine detail (the "every minute detail" ask) +# is specifically its strength; CLIP is the corroborating, coarser signal. +VASE_DINO_WEIGHT = 0.6 +VASE_CLIP_WEIGHT = 0.4 + +# Combined-similarity (0-100%) cutoffs for the same/uncertain/different +# verdict. Untuned/no ground-truth calibration set exists yet for vase +# identity specifically -- adjust if these read as over/under-confident on +# real photos. +VASE_SAME_THRESHOLD = 75 +VASE_UNCERTAIN_THRESHOLD = 60 + +# ========================================================== +# SAM3 (facebook/sam3, via transformers) -- concept-prompted segmentation: +# instead of SAM1's "segment everything, then guess what's a flower from +# size/position heuristics", SAM3 is directly prompted with a plain-English +# concept ("flower", "vase") and returns instance masks for exactly that +# concept. Empirically this alone (no exclude-box filtering needed) never +# segments the vase/ribbon when prompted for "flower", and gives a tight +# per-instance mask for "vase" that's more precise than YOLO-World's box. +# +# transformers>=5.5.0 (needed for Sam3Model/Sam3Processor) requires +# Python>=3.10, incompatible with this app's own env (torch17_new, Python +# 3.8) -- so SAM3 runs in a SEPARATE conda env (sam2_env, Python 3.10, +# already had transformers 5.5.0 + bitsandbytes installed) via a one-shot +# subprocess per request (see sam3_worker.py / pipeline/sam3_client.py), +# not an in-process import. Loaded 4-bit (NF4) there: ~700MB resident, +# ~1.9GB peak during inference -- comfortably fits this 8GB card even +# without unloading anything else first. +# ========================================================== +SAM3_PYTHON_BIN = "/media/suman/Backup_of_extra_/miniconda3/envs/sam2_env/bin/python3" +SAM3_WORKER_SCRIPT = os.path.join(BASE_DIR, "sam3_worker.py") +SAM3_TIMEOUT_SECONDS = 180 + +SAM3_FLOWER_PROMPT = "flower" +SAM3_FLOWER_THRESHOLD = 0.5 +SAM3_VASE_PROMPT = "vase" +SAM3_VASE_THRESHOLD = 0.3 + +# Read once here (not sourced by the shell that starts app.py) so the +# subprocess can be handed HF_TOKEN explicitly without relying on it being +# globally exported -- avoids adding a python-dotenv dependency for what's +# a single KEY=VALUE line. +def _read_dotenv_value(path, key): + try: + with open(path) as f: + for line in f: + line = line.strip() + if line.startswith(f"{key}="): + return line.split("=", 1)[1].strip().strip('"').strip("'") + except FileNotFoundError: + pass + return None + + +HF_TOKEN = os.environ.get("HF_TOKEN") or _read_dotenv_value( + os.path.join(BASE_DIR, ".env"), "HF_TOKEN" +) diff --git a/dynamic_families_grid.png b/dynamic_families_grid.png new file mode 100644 index 0000000..5578007 Binary files /dev/null and b/dynamic_families_grid.png differ diff --git a/logs/app.log b/logs/app.log new file mode 100644 index 0000000..8af3df0 --- /dev/null +++ b/logs/app.log @@ -0,0 +1,5044 @@ +2026-07-29 18:09:41,369 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5052 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-29 18:09:41,369 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-29 18:09:41,619 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-29 18:09:43,771 INFO [pipeline.engine] template ready: template1 +2026-07-29 18:09:43,813 INFO [pipeline.engine] template ready: template2 +2026-07-29 18:09:43,852 INFO [pipeline.engine] template ready: template4 +2026-07-29 18:09:43,891 INFO [pipeline.engine] template ready: template5 +2026-07-29 18:09:43,961 INFO [pipeline.engine] template ready: template6 +2026-07-29 18:09:43,961 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-29 18:09:43,980 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5052 + * Running on http://192.168.2.109:5052 +2026-07-29 18:09:43,980 INFO [werkzeug] Press CTRL+C to quit +2026-07-29 18:10:12,631 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:10:12] "GET / HTTP/1.1" 200 - +2026-07-29 18:10:12,705 INFO [pipeline.engine] [7469d3572dc8] new upload: 'image102.jpeg' (113.8 KB) +2026-07-29 18:10:15,198 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CUDAExecutionProvider', 'CPUExecutionProvider'] +2026-07-29 18:10:16,144 INFO [pipeline.engine] [7469d3572dc8] background removal: 3.44s +2026-07-29 18:10:16,176 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-29 18:10:16,361 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-29 18:10:16,424 INFO [pipeline.engine] [7469d3572dc8] SIFT: 0.26s +2026-07-29 18:10:16,492 INFO [pipeline.engine] [7469d3572dc8] ORB: 0.33s +2026-07-29 18:10:17,591 INFO [pipeline.engine] [7469d3572dc8] SuperGlue: 1.43s +2026-07-29 18:10:17,591 INFO [pipeline.engine] [7469d3572dc8] LoFTR: 1.00s +2026-07-29 18:10:17,621 INFO [pipeline.engine] [7469d3572dc8] total: 4.92s +2026-07-29 18:10:17,713 INFO [pipeline.engine] [7469d3572dc8] done, peak RSS so far: 2478 MB +2026-07-29 18:10:17,713 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:10:17] "POST /api/match HTTP/1.1" 200 - +2026-07-29 18:10:39,464 INFO [pipeline.engine] [553d1277881f] new upload: 'image103.jpeg' (115.1 KB) +2026-07-29 18:10:40,297 INFO [pipeline.engine] [553d1277881f] background removal: 0.83s +2026-07-29 18:10:40,540 INFO [pipeline.engine] [553d1277881f] SIFT: 0.23s +2026-07-29 18:10:40,610 INFO [pipeline.engine] [553d1277881f] ORB: 0.30s +2026-07-29 18:10:41,345 INFO [pipeline.engine] [553d1277881f] SuperGlue: 1.03s +2026-07-29 18:10:41,345 INFO [pipeline.engine] [553d1277881f] LoFTR: 0.63s +2026-07-29 18:10:41,372 INFO [pipeline.engine] [553d1277881f] total: 1.91s +2026-07-29 18:10:41,459 INFO [pipeline.engine] [553d1277881f] done, peak RSS so far: 2505 MB +2026-07-29 18:10:41,460 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:10:41] "POST /api/match HTTP/1.1" 200 - +2026-07-29 18:12:22,177 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5052 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-29 18:12:22,177 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-29 18:12:23,076 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-29 18:12:31,360 INFO [pipeline.engine] template ready: template1 +2026-07-29 18:12:31,401 INFO [pipeline.engine] template ready: template2 +2026-07-29 18:12:31,440 INFO [pipeline.engine] template ready: template4 +2026-07-29 18:12:31,480 INFO [pipeline.engine] template ready: template5 +2026-07-29 18:12:31,548 INFO [pipeline.engine] template ready: template6 +2026-07-29 18:12:31,548 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-29 18:12:48,395 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-29 18:12:48,395 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-29 18:12:48,555 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-29 18:12:49,496 INFO [pipeline.engine] template ready: template1 +2026-07-29 18:12:49,538 INFO [pipeline.engine] template ready: template2 +2026-07-29 18:12:49,576 INFO [pipeline.engine] template ready: template4 +2026-07-29 18:12:49,616 INFO [pipeline.engine] template ready: template5 +2026-07-29 18:12:49,685 INFO [pipeline.engine] template ready: template6 +2026-07-29 18:12:49,685 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-29 18:12:49,698 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-29 18:12:49,698 INFO [werkzeug] Press CTRL+C to quit +2026-07-29 18:13:35,164 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:13:35] "GET / HTTP/1.1" 200 - +2026-07-29 18:13:35,200 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:13:35] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-29 18:13:35,201 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:13:35] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-29 18:13:35,490 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:13:35] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-29 18:13:35,491 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:13:35] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-29 18:13:35,495 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:13:35] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-29 18:13:35,513 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:13:35] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-29 18:13:35,518 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:13:35] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-29 18:13:35,626 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:13:35] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-29 18:14:03,978 INFO [pipeline.engine] [d030e1244bc3] new upload: 'image155.jpeg' (95.4 KB) +2026-07-29 18:14:06,585 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-29 18:14:06,585 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-29 18:14:16,948 INFO [pipeline.engine] [d030e1244bc3] background removal: 12.97s +2026-07-29 18:14:16,999 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-29 18:14:17,538 INFO [pipeline.engine] [d030e1244bc3] SIFT: 0.56s +2026-07-29 18:14:17,680 INFO [pipeline.engine] [d030e1244bc3] ORB: 0.70s +2026-07-29 18:14:18,794 ERROR [pipeline.engine] Method SuperGlue failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 122, in _timed + result = fn(*args) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 100, in _run_superglue + return deep.superglue_match_against_templates(bgr, mask) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 141, in superglue_match_against_templates + feats_q, mask_q = superpoint_extract(bgr, mask) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 99, in superpoint_extract + feats = get_superpoint().extract(tensor) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/utils/_contextlib.py", line 116, in decorate_context + return func(*args, **kwargs) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/lightglue/utils.py", line 144, in extract + feats = self.forward({"image": img}) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/lightglue/superpoint.py", line 159, in forward + x = self.relu(self.conv1a(image)) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1553, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1562, in _call_impl + return forward_call(*args, **kwargs) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/conv.py", line 458, in forward + return self._conv_forward(input, self.weight, self.bias) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/conv.py", line 454, in _conv_forward + return F.conv2d(input, weight, bias, self.stride, +torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 118.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 103.94 MiB is free. Process 2491440 has 6.55 GiB memory in use. Including non-PyTorch memory, this process has 480.00 MiB memory in use. Of the allocated memory 188.58 MiB is allocated by PyTorch, and 105.42 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables) +2026-07-29 18:14:18,960 INFO [pipeline.engine] [d030e1244bc3] SuperGlue: 1.98s (FAILED: CUDA out of memory. Tried to allocate 118.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 103.94 MiB is free. Process 2491440 has 6.55 GiB memory in use. Including non-PyTorch memory, this process has 480.00 MiB memory in use. Of the allocated memory 188.58 MiB is allocated by PyTorch, and 105.42 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)) +2026-07-29 18:14:19,710 ERROR [pipeline.engine] Method LoFTR failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 122, in _timed + result = fn(*args) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 104, in _run_loftr + return deep.loftr_match_against_templates(bgr, mask) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 197, in loftr_match_against_templates + inlier_count, confidence_pct = _loftr_pair( + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 167, in _loftr_pair + out = get_loftr()({"image0": tensor_q, "image1": tensor_t}) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1553, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1562, in _call_impl + return forward_call(*args, **kwargs) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/kornia/feature/loftr/loftr.py", line 132, in forward + (feat_c0, feat_f0), (feat_c1, feat_f1) = self.backbone(data["image0"]), self.backbone(data["image1"]) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1553, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1562, in _call_impl + return forward_call(*args, **kwargs) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/kornia/feature/loftr/backbone/resnet_fpn.py", line 117, in forward + x1_out = self.layer1_outconv2(x1_out + x2_out_2x) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1553, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1562, in _call_impl + return forward_call(*args, **kwargs) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/container.py", line 219, in forward + input = module(input) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1553, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1562, in _call_impl + return forward_call(*args, **kwargs) + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/modules/batchnorm.py", line 176, in forward + return F.batch_norm( + File "/media/suman/Backup_of_extra_/miniconda3/envs/torch17_new/lib/python3.8/site-packages/torch/nn/functional.py", line 2512, in batch_norm + return torch.batch_norm( +torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 20.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 73.94 MiB is free. Process 2491440 has 6.55 GiB memory in use. Including non-PyTorch memory, this process has 510.00 MiB memory in use. Of the allocated memory 266.00 MiB is allocated by PyTorch, and 48.00 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables) +2026-07-29 18:14:19,764 INFO [pipeline.engine] [d030e1244bc3] LoFTR: 2.79s (FAILED: CUDA out of memory. Tried to allocate 20.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 73.94 MiB is free. Process 2491440 has 6.55 GiB memory in use. Including non-PyTorch memory, this process has 510.00 MiB memory in use. Of the allocated memory 266.00 MiB is allocated by PyTorch, and 48.00 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)) +2026-07-29 18:14:19,849 INFO [pipeline.engine] [d030e1244bc3] total: 15.87s +2026-07-29 18:14:19,922 INFO [pipeline.engine] [d030e1244bc3] done, peak RSS so far: 8009 MB +2026-07-29 18:14:19,922 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:14:19] "POST /api/match HTTP/1.1" 200 - +2026-07-29 18:14:19,944 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:14:19] "GET /uploads/d030e1244bc3/nobg.png HTTP/1.1" 200 - +2026-07-29 18:14:19,945 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:14:19] "GET /uploads/d030e1244bc3/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 18:14:19,947 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:14:19] "GET /uploads/d030e1244bc3/original.jpeg HTTP/1.1" 200 - +2026-07-29 18:14:19,948 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:14:19] "GET /uploads/d030e1244bc3/ORB_best.png HTTP/1.1" 200 - +2026-07-29 18:18:02,598 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-29 18:18:02,598 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-29 18:18:02,761 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-29 18:18:03,860 INFO [pipeline.engine] template ready: template1 +2026-07-29 18:18:03,901 INFO [pipeline.engine] template ready: template2 +2026-07-29 18:18:03,939 INFO [pipeline.engine] template ready: template4 +2026-07-29 18:18:03,978 INFO [pipeline.engine] template ready: template5 +2026-07-29 18:18:04,048 INFO [pipeline.engine] template ready: template6 +2026-07-29 18:18:04,048 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-29 18:18:04,058 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-29 18:18:04,058 INFO [werkzeug] Press CTRL+C to quit +2026-07-29 18:18:16,733 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:18:16] "GET / HTTP/1.1" 200 - +2026-07-29 18:18:26,008 INFO [pipeline.engine] [b70787b0d763] new upload: 'image155.jpeg' (95.4 KB) +2026-07-29 18:18:26,021 INFO [pipeline.engine] [b70787b0d763] background removal: 0.01s +2026-07-29 18:18:26,223 INFO [pipeline.engine] [b70787b0d763] SIFT: 0.18s +2026-07-29 18:18:26,479 INFO [pipeline.engine] [b70787b0d763] ORB: 0.25s +2026-07-29 18:18:26,532 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-29 18:18:27,397 INFO [pipeline.engine] [b70787b0d763] SuperGlue: 0.92s +2026-07-29 18:18:27,410 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-29 18:18:27,888 INFO [pipeline.engine] [b70787b0d763] LoFTR: 0.49s +2026-07-29 18:18:27,937 INFO [pipeline.engine] [b70787b0d763] total: 1.93s +2026-07-29 18:18:28,017 INFO [pipeline.engine] [b70787b0d763] done, peak RSS so far: 1740 MB +2026-07-29 18:18:28,017 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:18:28] "POST /api/match HTTP/1.1" 200 - +2026-07-29 18:18:50,640 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:18:50] "GET / HTTP/1.1" 200 - +2026-07-29 18:18:50,672 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:18:50] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-29 18:18:50,673 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:18:50] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-29 18:18:50,675 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:18:50] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-29 18:18:50,676 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:18:50] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 18:18:50,677 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:18:50] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 18:18:50,677 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:18:50] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-29 18:18:50,678 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:18:50] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-29 18:19:23,196 INFO [pipeline.engine] [8dcefc2d48fb] new upload: 'image21.jpeg' (195.6 KB) +2026-07-29 18:19:23,242 INFO [pipeline.bg_removal] Resized upload (1015, 2200) -> (738, 1600) before processing +2026-07-29 18:19:25,512 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CUDAExecutionProvider', 'CPUExecutionProvider'] +2026-07-29 18:19:26,368 INFO [pipeline.engine] [8dcefc2d48fb] background removal: 3.17s +2026-07-29 18:19:26,569 INFO [pipeline.engine] [8dcefc2d48fb] SIFT: 0.18s +2026-07-29 18:19:26,816 INFO [pipeline.engine] [8dcefc2d48fb] ORB: 0.25s +2026-07-29 18:19:27,516 INFO [pipeline.engine] [8dcefc2d48fb] SuperGlue: 0.70s +2026-07-29 18:19:27,792 INFO [pipeline.engine] [8dcefc2d48fb] LoFTR: 0.27s +2026-07-29 18:19:27,840 INFO [pipeline.engine] [8dcefc2d48fb] total: 4.64s +2026-07-29 18:19:27,921 INFO [pipeline.engine] [8dcefc2d48fb] done, peak RSS so far: 2456 MB +2026-07-29 18:19:27,921 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:19:27] "POST /api/match HTTP/1.1" 200 - +2026-07-29 18:19:27,939 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:19:27] "GET /uploads/8dcefc2d48fb/original.jpeg HTTP/1.1" 200 - +2026-07-29 18:19:27,941 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:19:27] "GET /uploads/8dcefc2d48fb/ORB_best.png HTTP/1.1" 200 - +2026-07-29 18:19:27,941 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:19:27] "GET /uploads/8dcefc2d48fb/nobg.png HTTP/1.1" 200 - +2026-07-29 18:19:27,942 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:19:27] "GET /uploads/8dcefc2d48fb/LoFTR_best.png HTTP/1.1" 200 - +2026-07-29 18:19:27,944 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:19:27] "GET /uploads/8dcefc2d48fb/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 18:19:27,945 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:19:27] "GET /uploads/8dcefc2d48fb/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-29 18:21:26,542 INFO [pipeline.engine] [4e7cffbea22e] new upload: 'image216.jpeg' (135.7 KB) +2026-07-29 18:21:27,405 INFO [pipeline.engine] [4e7cffbea22e] background removal: 0.86s +2026-07-29 18:21:27,718 INFO [pipeline.engine] [4e7cffbea22e] SIFT: 0.29s +2026-07-29 18:21:27,953 INFO [pipeline.engine] [4e7cffbea22e] ORB: 0.23s +2026-07-29 18:21:28,630 INFO [pipeline.engine] [4e7cffbea22e] SuperGlue: 0.68s +2026-07-29 18:21:28,914 INFO [pipeline.engine] [4e7cffbea22e] LoFTR: 0.28s +2026-07-29 18:21:28,953 INFO [pipeline.engine] [4e7cffbea22e] total: 2.41s +2026-07-29 18:21:29,033 INFO [pipeline.engine] [4e7cffbea22e] done, peak RSS so far: 2491 MB +2026-07-29 18:21:29,033 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:21:29] "POST /api/match HTTP/1.1" 200 - +2026-07-29 18:21:29,043 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:21:29] "GET /uploads/4e7cffbea22e/original.jpeg HTTP/1.1" 200 - +2026-07-29 18:21:29,044 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:21:29] "GET /uploads/4e7cffbea22e/nobg.png HTTP/1.1" 200 - +2026-07-29 18:21:29,046 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:21:29] "GET /uploads/4e7cffbea22e/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 18:21:29,047 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:21:29] "GET /uploads/4e7cffbea22e/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-29 18:21:29,048 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:21:29] "GET /uploads/4e7cffbea22e/ORB_best.png HTTP/1.1" 200 - +2026-07-29 18:21:29,048 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:21:29] "GET /uploads/4e7cffbea22e/LoFTR_best.png HTTP/1.1" 200 - +2026-07-29 18:24:06,560 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-29 18:24:06,560 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-29 18:24:06,715 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-29 18:24:07,633 INFO [pipeline.engine] template ready: template1 +2026-07-29 18:24:07,674 INFO [pipeline.engine] template ready: template2 +2026-07-29 18:24:07,714 INFO [pipeline.engine] template ready: template4 +2026-07-29 18:24:07,753 INFO [pipeline.engine] template ready: template5 +2026-07-29 18:24:07,821 INFO [pipeline.engine] template ready: template6 +2026-07-29 18:24:07,821 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-29 18:24:07,822 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-29 18:24:07,822 INFO [werkzeug] Press CTRL+C to quit +2026-07-29 18:25:26,269 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET / HTTP/1.1" 200 - +2026-07-29 18:25:26,299 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-29 18:25:26,301 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-29 18:25:26,302 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-29 18:25:26,303 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-29 18:25:26,305 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 18:25:26,306 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 18:25:26,307 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-29 18:25:26,869 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET / HTTP/1.1" 200 - +2026-07-29 18:25:26,891 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-29 18:25:26,892 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-29 18:25:26,895 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-29 18:25:26,896 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-29 18:25:26,897 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 18:25:26,899 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-29 18:25:26,900 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:26] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 18:25:27,085 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET / HTTP/1.1" 200 - +2026-07-29 18:25:27,110 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-29 18:25:27,111 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-29 18:25:27,113 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-29 18:25:27,114 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 18:25:27,116 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 18:25:27,117 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-29 18:25:27,118 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-29 18:25:27,287 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET / HTTP/1.1" 200 - +2026-07-29 18:25:27,313 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-29 18:25:27,314 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-29 18:25:27,316 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-29 18:25:27,317 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 18:25:27,318 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-29 18:25:27,320 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-29 18:25:27,321 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 18:25:27,501 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET / HTTP/1.1" 200 - +2026-07-29 18:25:27,526 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-29 18:25:27,529 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-29 18:25:27,530 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-29 18:25:27,530 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-29 18:25:27,531 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 18:25:27,532 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 18:25:27,533 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-29 18:25:27,720 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET / HTTP/1.1" 200 - +2026-07-29 18:25:27,746 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-29 18:25:27,746 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-29 18:25:27,748 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 18:25:27,749 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 18:25:27,750 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-29 18:25:27,752 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-29 18:25:27,752 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:25:27] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-29 18:28:27,807 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:28:27] "GET / HTTP/1.1" 200 - +2026-07-29 18:28:28,075 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:28:28] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-29 18:28:28,114 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:28:28] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-29 18:28:28,397 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:28:28] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-29 18:28:28,399 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:28:28] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-29 18:28:28,400 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:28:28] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-29 18:28:28,628 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:28:28] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-29 18:28:28,631 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:28:28] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-29 18:28:28,640 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:28:28] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-29 18:29:17,625 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:29:17] "GET / HTTP/1.1" 200 - +2026-07-29 18:29:17,742 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:29:17] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-29 18:29:17,742 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:29:17] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-29 18:29:17,924 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:29:17] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-29 18:29:17,925 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:29:17] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-29 18:29:17,927 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:29:17] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-29 18:29:17,929 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:29:17] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-29 18:29:17,930 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:29:17] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-29 18:29:18,001 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:29:18] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-29 18:30:23,967 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:23] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-29 18:30:23,968 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:23] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 18:30:23,968 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:23] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 18:30:23,969 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:23] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-29 18:30:23,970 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:23] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-29 18:30:37,479 INFO [pipeline.engine] [19f73e0d98ba] new upload: 'IMG_3133.jpeg' (4312.6 KB) +2026-07-29 18:30:37,725 INFO [pipeline.bg_removal] Resized upload (4032, 3024) -> (1600, 1200) before processing +2026-07-29 18:30:39,885 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-29 18:30:39,885 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-29 18:30:49,568 INFO [pipeline.engine] [19f73e0d98ba] background removal: 12.09s +2026-07-29 18:30:50,472 INFO [pipeline.engine] [19f73e0d98ba] SIFT: 0.87s +2026-07-29 18:30:50,746 INFO [pipeline.engine] [19f73e0d98ba] ORB: 0.26s +2026-07-29 18:30:51,039 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-29 18:30:52,289 INFO [pipeline.engine] [19f73e0d98ba] SuperGlue: 1.54s +2026-07-29 18:30:52,313 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-29 18:30:52,968 INFO [pipeline.engine] [19f73e0d98ba] LoFTR: 0.67s +2026-07-29 18:30:53,001 INFO [pipeline.engine] [19f73e0d98ba] total: 15.52s +2026-07-29 18:30:53,070 INFO [pipeline.engine] [19f73e0d98ba] done, peak RSS so far: 7986 MB +2026-07-29 18:30:53,071 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:53] "POST /api/match HTTP/1.1" 200 - +2026-07-29 18:30:53,229 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:53] "GET /uploads/19f73e0d98ba/ORB_best.png HTTP/1.1" 200 - +2026-07-29 18:30:53,230 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:53] "GET /uploads/19f73e0d98ba/original.jpeg HTTP/1.1" 200 - +2026-07-29 18:30:53,233 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:53] "GET /uploads/19f73e0d98ba/nobg.png HTTP/1.1" 200 - +2026-07-29 18:30:53,234 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:53] "GET /uploads/19f73e0d98ba/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 18:30:53,236 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:53] "GET /uploads/19f73e0d98ba/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-29 18:30:53,261 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 18:30:53] "GET /uploads/19f73e0d98ba/LoFTR_best.png HTTP/1.1" 200 - +2026-07-29 22:29:17,369 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:29:17] "GET / HTTP/1.1" 200 - +2026-07-29 22:29:17,709 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:29:17] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-29 22:29:17,715 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:29:17] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-29 22:29:18,054 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:29:18] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-29 22:29:18,055 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:29:18] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 22:29:18,060 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:29:18] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 22:29:18,062 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:29:18] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-29 22:29:18,063 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:29:18] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-29 22:30:01,474 INFO [pipeline.engine] [49296b819ddc] new upload: 'IMG_2921.jpeg' (1216.3 KB) +2026-07-29 22:30:01,584 INFO [pipeline.bg_removal] Resized upload (3520, 1980) -> (1600, 900) before processing +2026-07-29 22:30:10,859 INFO [pipeline.engine] [49296b819ddc] background removal: 9.38s +2026-07-29 22:30:10,976 INFO [pipeline.engine] [49296b819ddc] SIFT: 0.10s +2026-07-29 22:30:10,996 INFO [pipeline.engine] [49296b819ddc] ORB: 0.02s +2026-07-29 22:30:11,188 INFO [pipeline.engine] [49296b819ddc] SuperGlue: 0.19s +2026-07-29 22:30:11,493 INFO [pipeline.engine] [49296b819ddc] LoFTR: 0.30s +2026-07-29 22:30:11,551 INFO [pipeline.engine] [49296b819ddc] total: 10.08s +2026-07-29 22:30:11,622 INFO [pipeline.engine] [49296b819ddc] done, peak RSS so far: 12789 MB +2026-07-29 22:30:11,623 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:11] "POST /api/match HTTP/1.1" 200 - +2026-07-29 22:30:11,727 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:11] "GET /uploads/49296b819ddc/LoFTR_best.png HTTP/1.1" 200 - +2026-07-29 22:30:11,730 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:11] "GET /uploads/49296b819ddc/ORB_best.png HTTP/1.1" 200 - +2026-07-29 22:30:11,732 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:11] "GET /uploads/49296b819ddc/original.jpeg HTTP/1.1" 200 - +2026-07-29 22:30:11,732 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:11] "GET /uploads/49296b819ddc/nobg.png HTTP/1.1" 200 - +2026-07-29 22:30:11,734 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:11] "GET /uploads/49296b819ddc/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 22:30:11,738 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:11] "GET /uploads/49296b819ddc/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-29 22:30:34,431 INFO [pipeline.engine] [1ae5fd45f9bb] new upload: 'IMG_3133.jpeg' (4312.6 KB) +2026-07-29 22:30:34,466 INFO [pipeline.engine] [1ae5fd45f9bb] background removal: 0.03s +2026-07-29 22:30:35,346 INFO [pipeline.engine] [1ae5fd45f9bb] SIFT: 0.84s +2026-07-29 22:30:35,586 INFO [pipeline.engine] [1ae5fd45f9bb] ORB: 0.24s +2026-07-29 22:30:36,424 INFO [pipeline.engine] [1ae5fd45f9bb] SuperGlue: 0.84s +2026-07-29 22:30:36,777 INFO [pipeline.engine] [1ae5fd45f9bb] LoFTR: 0.34s +2026-07-29 22:30:36,809 INFO [pipeline.engine] [1ae5fd45f9bb] total: 2.38s +2026-07-29 22:30:36,876 INFO [pipeline.engine] [1ae5fd45f9bb] done, peak RSS so far: 12976 MB +2026-07-29 22:30:36,877 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:36] "POST /api/match HTTP/1.1" 200 - +2026-07-29 22:30:37,183 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:37] "GET /uploads/1ae5fd45f9bb/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 22:30:37,184 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:37] "GET /uploads/1ae5fd45f9bb/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-29 22:30:37,185 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:37] "GET /uploads/1ae5fd45f9bb/LoFTR_best.png HTTP/1.1" 200 - +2026-07-29 22:30:37,187 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:37] "GET /uploads/1ae5fd45f9bb/ORB_best.png HTTP/1.1" 200 - +2026-07-29 22:30:37,213 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:37] "GET /uploads/1ae5fd45f9bb/original.jpeg HTTP/1.1" 200 - +2026-07-29 22:30:37,215 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:30:37] "GET /uploads/1ae5fd45f9bb/nobg.png HTTP/1.1" 200 - +2026-07-29 22:31:16,760 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:31:16] "GET / HTTP/1.1" 200 - +2026-07-29 22:31:17,051 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:31:17] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-29 22:31:17,082 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:31:17] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-29 22:31:17,372 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:31:17] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-29 22:31:17,396 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:31:17] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-29 22:31:17,433 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:31:17] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-29 22:31:17,434 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:31:17] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-29 22:31:17,440 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:31:17] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-29 22:31:17,446 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:31:17] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-29 22:31:44,159 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:31:44] "HEAD / HTTP/1.1" 200 - +2026-07-29 22:31:58,469 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:31:58] "HEAD / HTTP/1.1" 200 - +2026-07-29 22:35:41,111 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:35:41] "HEAD / HTTP/1.1" 200 - +2026-07-29 22:35:48,323 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:35:48] "GET / HTTP/1.1" 200 - +2026-07-29 22:35:48,682 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:35:48] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-29 22:35:48,752 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:35:48] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-29 22:35:48,984 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:35:48] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-29 22:35:48,988 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:35:48] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-29 22:35:49,021 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:35:49] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 22:35:49,022 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:35:49] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 22:35:49,028 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:35:49] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-29 22:38:37,422 INFO [pipeline.engine] [928fc60bee94] new upload: 'WhatsApp Image 2026-07-13 at 6.15.15 PM (2).jpeg' (178.2 KB) +2026-07-29 22:38:46,476 INFO [pipeline.engine] [928fc60bee94] background removal: 9.05s +2026-07-29 22:38:46,708 INFO [pipeline.engine] [928fc60bee94] SIFT: 0.21s +2026-07-29 22:38:46,925 INFO [pipeline.engine] [928fc60bee94] ORB: 0.22s +2026-07-29 22:38:47,827 INFO [pipeline.engine] [928fc60bee94] SuperGlue: 0.90s +2026-07-29 22:38:48,175 INFO [pipeline.engine] [928fc60bee94] LoFTR: 0.34s +2026-07-29 22:38:48,209 INFO [pipeline.engine] [928fc60bee94] total: 10.79s +2026-07-29 22:38:48,277 INFO [pipeline.engine] [928fc60bee94] done, peak RSS so far: 12976 MB +2026-07-29 22:38:48,277 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:38:48] "POST /api/match HTTP/1.1" 200 - +2026-07-29 22:38:48,364 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:38:48] "GET /uploads/928fc60bee94/nobg.png HTTP/1.1" 200 - +2026-07-29 22:38:48,398 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:38:48] "GET /uploads/928fc60bee94/LoFTR_best.png HTTP/1.1" 200 - +2026-07-29 22:38:48,399 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:38:48] "GET /uploads/928fc60bee94/ORB_best.png HTTP/1.1" 200 - +2026-07-29 22:38:48,406 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:38:48] "GET /uploads/928fc60bee94/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 22:38:48,411 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:38:48] "GET /uploads/928fc60bee94/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-29 22:38:48,413 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:38:48] "GET /uploads/928fc60bee94/original.jpeg HTTP/1.1" 200 - +2026-07-29 22:40:35,683 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:40:35] "GET / HTTP/1.1" 200 - +2026-07-29 22:40:37,344 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:40:37] "GET / HTTP/1.1" 200 - +2026-07-29 22:40:37,602 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:40:37] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-29 22:40:37,635 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:40:37] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-29 22:40:37,888 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:40:37] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-29 22:40:37,889 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:40:37] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-29 22:40:37,927 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:40:37] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-29 22:40:37,934 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:40:37] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 22:40:37,935 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:40:37] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 22:41:34,974 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:41:34] "GET / HTTP/1.1" 200 - +2026-07-29 22:41:35,098 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:41:35] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-29 22:41:35,099 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:41:35] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-29 22:41:35,333 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:41:35] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-29 22:41:35,335 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:41:35] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-29 22:41:35,336 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:41:35] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-29 22:41:35,337 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:41:35] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-29 22:41:35,339 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:41:35] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-29 22:41:35,464 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:41:35] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-29 22:44:48,254 INFO [pipeline.engine] [f33ccf86d934] new upload: '20260727_193643.jpg' (10403.8 KB) +2026-07-29 22:44:49,723 INFO [pipeline.bg_removal] Resized upload (16320, 7532) -> (1600, 738) before processing +2026-07-29 22:44:58,780 INFO [pipeline.engine] [f33ccf86d934] background removal: 10.52s +2026-07-29 22:44:58,973 INFO [pipeline.engine] [f33ccf86d934] SIFT: 0.18s +2026-07-29 22:44:59,212 INFO [pipeline.engine] [f33ccf86d934] ORB: 0.24s +2026-07-29 22:45:00,003 INFO [pipeline.engine] [f33ccf86d934] SuperGlue: 0.79s +2026-07-29 22:45:00,267 INFO [pipeline.engine] [f33ccf86d934] LoFTR: 0.26s +2026-07-29 22:45:00,301 INFO [pipeline.engine] [f33ccf86d934] total: 12.05s +2026-07-29 22:45:00,368 INFO [pipeline.engine] [f33ccf86d934] done, peak RSS so far: 13840 MB +2026-07-29 22:45:00,369 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:00] "POST /api/match HTTP/1.1" 200 - +2026-07-29 22:45:00,488 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:00] "GET /uploads/f33ccf86d934/original.jpg HTTP/1.1" 200 - +2026-07-29 22:45:00,493 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:00] "GET /uploads/f33ccf86d934/nobg.png HTTP/1.1" 200 - +2026-07-29 22:45:00,531 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:00] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-29 22:45:00,823 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:00] "GET /uploads/f33ccf86d934/LoFTR_best.png HTTP/1.1" 200 - +2026-07-29 22:45:00,865 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:00] "GET /uploads/f33ccf86d934/ORB_best.png HTTP/1.1" 200 - +2026-07-29 22:45:01,211 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:01] "GET /uploads/f33ccf86d934/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-29 22:45:01,225 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:01] "GET /uploads/f33ccf86d934/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 22:45:10,443 INFO [pipeline.engine] [a39a60dd6c29] new upload: 'WhatsApp Image 2026-07-13 at 6.15.15 PM (1).jpeg' (171.1 KB) +2026-07-29 22:45:19,555 INFO [pipeline.engine] [a39a60dd6c29] background removal: 9.11s +2026-07-29 22:45:19,830 INFO [pipeline.engine] [a39a60dd6c29] SIFT: 0.25s +2026-07-29 22:45:20,067 INFO [pipeline.engine] [a39a60dd6c29] ORB: 0.24s +2026-07-29 22:45:20,849 INFO [pipeline.engine] [a39a60dd6c29] SuperGlue: 0.78s +2026-07-29 22:45:21,203 INFO [pipeline.engine] [a39a60dd6c29] LoFTR: 0.34s +2026-07-29 22:45:21,236 INFO [pipeline.engine] [a39a60dd6c29] total: 10.79s +2026-07-29 22:45:21,307 INFO [pipeline.engine] [a39a60dd6c29] done, peak RSS so far: 13840 MB +2026-07-29 22:45:21,308 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:21] "POST /api/match HTTP/1.1" 200 - +2026-07-29 22:45:21,400 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:21] "GET /uploads/a39a60dd6c29/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 22:45:21,401 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:21] "GET /uploads/a39a60dd6c29/original.jpeg HTTP/1.1" 200 - +2026-07-29 22:45:21,403 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:21] "GET /uploads/a39a60dd6c29/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-29 22:45:21,404 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:21] "GET /uploads/a39a60dd6c29/nobg.png HTTP/1.1" 200 - +2026-07-29 22:45:21,406 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:21] "GET /uploads/a39a60dd6c29/LoFTR_best.png HTTP/1.1" 200 - +2026-07-29 22:45:21,407 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:45:21] "GET /uploads/a39a60dd6c29/ORB_best.png HTTP/1.1" 200 - +2026-07-29 22:46:24,546 INFO [pipeline.engine] [a51657314fe2] new upload: 'WhatsApp Image 2026-07-13 at 6.15.15 PM (2).jpeg' (178.2 KB) +2026-07-29 22:46:24,563 INFO [pipeline.engine] [a51657314fe2] background removal: 0.02s +2026-07-29 22:46:24,831 INFO [pipeline.engine] [a51657314fe2] SIFT: 0.25s +2026-07-29 22:46:25,047 INFO [pipeline.engine] [a51657314fe2] ORB: 0.22s +2026-07-29 22:46:25,944 INFO [pipeline.engine] [a51657314fe2] SuperGlue: 0.90s +2026-07-29 22:46:26,292 INFO [pipeline.engine] [a51657314fe2] LoFTR: 0.34s +2026-07-29 22:46:26,325 INFO [pipeline.engine] [a51657314fe2] total: 1.78s +2026-07-29 22:46:26,396 INFO [pipeline.engine] [a51657314fe2] done, peak RSS so far: 13840 MB +2026-07-29 22:46:26,396 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:46:26] "POST /api/match HTTP/1.1" 200 - +2026-07-29 22:46:26,501 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:46:26] "GET /uploads/a51657314fe2/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-29 22:46:26,504 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:46:26] "GET /uploads/a51657314fe2/original.jpeg HTTP/1.1" 200 - +2026-07-29 22:46:26,506 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:46:26] "GET /uploads/a51657314fe2/ORB_best.png HTTP/1.1" 200 - +2026-07-29 22:46:26,506 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:46:26] "GET /uploads/a51657314fe2/nobg.png HTTP/1.1" 200 - +2026-07-29 22:46:26,507 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:46:26] "GET /uploads/a51657314fe2/LoFTR_best.png HTTP/1.1" 200 - +2026-07-29 22:46:26,508 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:46:26] "GET /uploads/a51657314fe2/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 22:48:56,517 INFO [pipeline.engine] [d70b7cd86c09] new upload: 'WhatsApp Image 2026-07-13 at 5.44.09 PM (23).jpeg' (191.5 KB) +2026-07-29 22:49:05,631 INFO [pipeline.engine] [d70b7cd86c09] background removal: 9.11s +2026-07-29 22:49:05,930 INFO [pipeline.engine] [d70b7cd86c09] SIFT: 0.28s +2026-07-29 22:49:06,164 INFO [pipeline.engine] [d70b7cd86c09] ORB: 0.23s +2026-07-29 22:49:06,960 INFO [pipeline.engine] [d70b7cd86c09] SuperGlue: 0.80s +2026-07-29 22:49:07,309 INFO [pipeline.engine] [d70b7cd86c09] LoFTR: 0.34s +2026-07-29 22:49:07,348 INFO [pipeline.engine] [d70b7cd86c09] total: 10.83s +2026-07-29 22:49:07,419 INFO [pipeline.engine] [d70b7cd86c09] done, peak RSS so far: 13840 MB +2026-07-29 22:49:07,420 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:49:07] "POST /api/match HTTP/1.1" 200 - +2026-07-29 22:49:07,549 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:49:07] "GET /uploads/d70b7cd86c09/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-29 22:49:07,555 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:49:07] "GET /uploads/d70b7cd86c09/LoFTR_best.png HTTP/1.1" 200 - +2026-07-29 22:49:07,557 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:49:07] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-29 22:49:07,558 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:49:07] "GET /uploads/d70b7cd86c09/nobg.png HTTP/1.1" 200 - +2026-07-29 22:49:07,559 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:49:07] "GET /uploads/d70b7cd86c09/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 22:49:07,585 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:49:07] "GET /uploads/d70b7cd86c09/ORB_best.png HTTP/1.1" 200 - +2026-07-29 22:49:07,592 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 22:49:07] "GET /uploads/d70b7cd86c09/original.jpeg HTTP/1.1" 200 - +2026-07-29 23:31:22,912 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:31:22] "HEAD / HTTP/1.1" 200 - +2026-07-29 23:40:08,015 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:40:08] "HEAD / HTTP/1.1" 200 - +2026-07-29 23:56:40,668 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:56:40] "GET / HTTP/1.1" 200 - +2026-07-29 23:56:40,978 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:56:40] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-29 23:56:40,980 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:56:40] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-29 23:56:41,364 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:56:41] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-29 23:56:41,364 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:56:41] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-29 23:56:41,366 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:56:41] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-29 23:56:41,367 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:56:41] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-29 23:56:41,368 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:56:41] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-29 23:57:11,116 INFO [pipeline.engine] [4cbd3d973a1b] new upload: '2026-07-2923.56.463240581244658108591.jpg' (315.1 KB) +2026-07-29 23:57:11,165 INFO [pipeline.bg_removal] Resized upload (1440, 1920) -> (1200, 1600) before processing +2026-07-29 23:57:20,238 INFO [pipeline.engine] [4cbd3d973a1b] background removal: 9.12s +2026-07-29 23:57:20,421 INFO [pipeline.engine] [4cbd3d973a1b] SIFT: 0.16s +2026-07-29 23:57:20,445 INFO [pipeline.engine] [4cbd3d973a1b] ORB: 0.02s +2026-07-29 23:57:20,708 INFO [pipeline.engine] [4cbd3d973a1b] SuperGlue: 0.26s +2026-07-29 23:57:21,068 INFO [pipeline.engine] [4cbd3d973a1b] LoFTR: 0.35s +2026-07-29 23:57:21,122 INFO [pipeline.engine] [4cbd3d973a1b] total: 10.01s +2026-07-29 23:57:21,189 INFO [pipeline.engine] [4cbd3d973a1b] done, peak RSS so far: 13840 MB +2026-07-29 23:57:21,189 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:57:21] "POST /api/match HTTP/1.1" 200 - +2026-07-29 23:57:21,328 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:57:21] "GET /uploads/4cbd3d973a1b/original.jpg HTTP/1.1" 200 - +2026-07-29 23:57:21,330 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:57:21] "GET /uploads/4cbd3d973a1b/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-29 23:57:21,330 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:57:21] "GET /uploads/4cbd3d973a1b/ORB_best.png HTTP/1.1" 200 - +2026-07-29 23:57:21,333 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:57:21] "GET /uploads/4cbd3d973a1b/SIFT_best.png HTTP/1.1" 200 - +2026-07-29 23:57:21,333 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:57:21] "GET /uploads/4cbd3d973a1b/LoFTR_best.png HTTP/1.1" 200 - +2026-07-29 23:57:21,334 INFO [werkzeug] 127.0.0.1 - - [29/Jul/2026 23:57:21] "GET /uploads/4cbd3d973a1b/nobg.png HTTP/1.1" 200 - +2026-07-30 00:59:09,141 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 00:59:09] "GET / HTTP/1.1" 200 - +2026-07-30 00:59:09,450 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 00:59:09] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-30 00:59:09,496 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 00:59:09] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-30 00:59:09,769 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 00:59:09] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-30 00:59:09,770 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 00:59:09] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-30 00:59:09,771 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 00:59:09] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-30 00:59:09,773 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 00:59:09] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-30 00:59:09,774 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 00:59:09] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-30 10:21:46,996 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 10:21:46] "GET / HTTP/1.1" 200 - +2026-07-30 10:21:47,024 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 10:21:47] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-30 10:21:47,026 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 10:21:47] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-30 10:21:47,050 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 10:21:47] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-30 10:21:47,051 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 10:21:47] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-30 10:21:47,053 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 10:21:47] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-30 10:21:47,054 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 10:21:47] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-30 10:21:47,055 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 10:21:47] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-30 10:53:26,495 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 10:53:26] "GET / HTTP/1.1" 200 - +2026-07-30 11:17:20,399 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:20] "GET / HTTP/1.1" 200 - +2026-07-30 11:17:20,487 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:20] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-30 11:17:20,489 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:20] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-30 11:17:20,505 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:20] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-30 11:17:20,507 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:20] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-30 11:17:20,507 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:20] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-30 11:17:20,508 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:20] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-30 11:17:20,509 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:20] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-30 11:17:37,388 INFO [pipeline.engine] [87907de84215] new upload: 'Roses.jpeg' (39.9 KB) +2026-07-30 11:17:47,084 INFO [pipeline.engine] [87907de84215] background removal: 9.69s +2026-07-30 11:17:47,207 INFO [pipeline.engine] [87907de84215] SIFT: 0.11s +2026-07-30 11:17:47,393 INFO [pipeline.engine] [87907de84215] ORB: 0.19s +2026-07-30 11:17:48,308 INFO [pipeline.engine] [87907de84215] SuperGlue: 0.92s +2026-07-30 11:17:48,668 INFO [pipeline.engine] [87907de84215] LoFTR: 0.35s +2026-07-30 11:17:48,716 INFO [pipeline.engine] [87907de84215] total: 11.33s +2026-07-30 11:17:48,793 INFO [pipeline.engine] [87907de84215] done, peak RSS so far: 13840 MB +2026-07-30 11:17:48,794 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:48] "POST /api/match HTTP/1.1" 200 - +2026-07-30 11:17:48,812 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:48] "GET /uploads/87907de84215/original.jpeg HTTP/1.1" 200 - +2026-07-30 11:17:48,814 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:48] "GET /uploads/87907de84215/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 11:17:48,814 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:48] "GET /uploads/87907de84215/nobg.png HTTP/1.1" 200 - +2026-07-30 11:17:48,817 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:48] "GET /uploads/87907de84215/ORB_best.png HTTP/1.1" 200 - +2026-07-30 11:17:48,818 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:48] "GET /uploads/87907de84215/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 11:17:48,819 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 11:17:48] "GET /uploads/87907de84215/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 12:54:05,928 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 12:54:05,928 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 12:54:06,081 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 12:54:07,535 INFO [pipeline.engine] template ready: template1 +2026-07-30 12:54:07,576 INFO [pipeline.engine] template ready: template2 +2026-07-30 12:54:07,615 INFO [pipeline.engine] template ready: template4 +2026-07-30 12:54:07,655 INFO [pipeline.engine] template ready: template5 +2026-07-30 12:54:07,722 INFO [pipeline.engine] template ready: template6 +2026-07-30 12:54:07,722 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-30 12:54:07,734 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 12:54:07,734 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 12:54:16,610 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:54:16] "GET / HTTP/1.1" 200 - +2026-07-30 12:54:24,034 INFO [pipeline.engine] [d11407be38cf] new upload: 'image103.jpeg' (115.1 KB) +2026-07-30 12:54:24,063 INFO [pipeline.engine] [d11407be38cf] background removal: 0.03s +2026-07-30 12:54:24,294 INFO [pipeline.engine] [d11407be38cf] SIFT: 0.21s +2026-07-30 12:54:24,553 INFO [pipeline.engine] [d11407be38cf] ORB: 0.25s +2026-07-30 12:54:24,607 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-30 12:54:25,608 INFO [pipeline.engine] [d11407be38cf] SuperGlue: 1.05s +2026-07-30 12:54:25,621 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 12:54:26,142 INFO [pipeline.engine] [d11407be38cf] LoFTR: 0.53s +2026-07-30 12:54:26,180 INFO [pipeline.engine] [d11407be38cf] total: 2.15s, weighted best: template4 +2026-07-30 12:54:26,262 INFO [pipeline.engine] [d11407be38cf] done, peak RSS so far: 1757 MB +2026-07-30 12:54:26,263 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:54:26] "POST /api/match HTTP/1.1" 200 - +2026-07-30 12:55:41,206 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:41] "GET / HTTP/1.1" 200 - +2026-07-30 12:55:41,220 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:41] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 12:55:41,221 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:41] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 12:55:41,454 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:41] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-30 12:55:41,455 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:41] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-30 12:55:41,461 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:41] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-30 12:55:41,466 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:41] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-30 12:55:41,473 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:41] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-30 12:55:41,502 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:41] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-30 12:55:44,521 INFO [pipeline.engine] [1502ad852b81] new upload: 'image100.jpeg' (102.5 KB) +2026-07-30 12:55:44,536 INFO [pipeline.engine] [1502ad852b81] background removal: 0.01s +2026-07-30 12:55:44,835 INFO [pipeline.engine] [1502ad852b81] SIFT: 0.28s +2026-07-30 12:55:45,111 INFO [pipeline.engine] [1502ad852b81] ORB: 0.28s +2026-07-30 12:55:45,971 INFO [pipeline.engine] [1502ad852b81] SuperGlue: 0.86s +2026-07-30 12:55:46,257 INFO [pipeline.engine] [1502ad852b81] LoFTR: 0.28s +2026-07-30 12:55:46,293 INFO [pipeline.engine] [1502ad852b81] total: 1.77s, weighted best: template4 +2026-07-30 12:55:46,378 INFO [pipeline.engine] [1502ad852b81] done, peak RSS so far: 1866 MB +2026-07-30 12:55:46,378 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:46] "POST /api/match HTTP/1.1" 200 - +2026-07-30 12:55:46,408 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:46] "GET /uploads/1502ad852b81/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 12:55:46,410 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:46] "GET /uploads/1502ad852b81/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 12:55:46,411 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:46] "GET /uploads/1502ad852b81/original.jpeg HTTP/1.1" 200 - +2026-07-30 12:55:46,412 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:46] "GET /uploads/1502ad852b81/ORB_best.png HTTP/1.1" 200 - +2026-07-30 12:55:46,412 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:46] "GET /uploads/1502ad852b81/nobg.png HTTP/1.1" 200 - +2026-07-30 12:55:46,412 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:55:46] "GET /uploads/1502ad852b81/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 12:56:24,565 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:56:24] "GET / HTTP/1.1" 200 - +2026-07-30 12:59:16,783 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 12:59:16,783 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 12:59:16,946 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 12:59:20,398 INFO [pipeline.engine] template ready: template1 +2026-07-30 12:59:20,441 INFO [pipeline.engine] template ready: template2 +2026-07-30 12:59:20,479 INFO [pipeline.engine] template ready: template4 +2026-07-30 12:59:20,520 INFO [pipeline.engine] template ready: template5 +2026-07-30 12:59:20,591 INFO [pipeline.engine] template ready: template6 +2026-07-30 12:59:20,591 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-30 12:59:20,603 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 12:59:20,603 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 12:59:27,645 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:27] "GET / HTTP/1.1" 200 - +2026-07-30 12:59:27,716 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:27] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 12:59:27,717 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:27] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 12:59:27,913 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:27] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-30 12:59:27,914 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:27] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-30 12:59:27,915 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:27] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-30 12:59:27,917 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:27] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-30 12:59:27,917 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:27] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-30 12:59:41,627 INFO [pipeline.engine] [13176e47e7af] new upload: '011_score61_image99.jpeg' (100.7 KB) +2026-07-30 12:59:44,146 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-30 12:59:44,146 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-30 12:59:54,735 INFO [pipeline.engine] [13176e47e7af] background removal: 13.11s +2026-07-30 12:59:54,987 INFO [pipeline.engine] [13176e47e7af] SIFT: 0.23s +2026-07-30 12:59:55,277 INFO [pipeline.engine] [13176e47e7af] ORB: 0.28s +2026-07-30 12:59:55,335 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-30 12:59:56,443 INFO [pipeline.engine] [13176e47e7af] SuperGlue: 1.17s +2026-07-30 12:59:56,460 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 12:59:56,967 INFO [pipeline.engine] [13176e47e7af] LoFTR: 0.52s +2026-07-30 12:59:57,005 INFO [pipeline.engine] [13176e47e7af] total: 15.38s, weighted best: template4 +2026-07-30 12:59:57,078 INFO [pipeline.engine] [13176e47e7af] done, peak RSS so far: 7879 MB +2026-07-30 12:59:57,078 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:57] "POST /api/match HTTP/1.1" 200 - +2026-07-30 12:59:57,107 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:57] "GET /uploads/13176e47e7af/original.jpeg HTTP/1.1" 200 - +2026-07-30 12:59:57,109 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:57] "GET /uploads/13176e47e7af/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 12:59:57,110 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:57] "GET /uploads/13176e47e7af/nobg.png HTTP/1.1" 200 - +2026-07-30 12:59:57,112 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:57] "GET /uploads/13176e47e7af/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 12:59:57,113 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:57] "GET /uploads/13176e47e7af/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 12:59:57,113 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 12:59:57] "GET /uploads/13176e47e7af/ORB_best.png HTTP/1.1" 200 - +2026-07-30 14:41:35,599 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:41:35] "GET / HTTP/1.1" 200 - +2026-07-30 14:41:35,902 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:41:35] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 14:41:35,938 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:41:35] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 14:41:37,657 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:41:37] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-30 14:41:38,034 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:41:38] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-30 14:41:38,037 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:41:38] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-30 14:41:38,074 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:41:38] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-30 14:41:38,076 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:41:38] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-30 14:41:38,076 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:41:38] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-30 14:41:48,081 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:41:48] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-30 14:49:14,134 INFO [pipeline.engine] [e7bc0e9b95c7] new upload: 'image128.jpeg' (107.6 KB) +2026-07-30 14:49:24,255 INFO [pipeline.engine] [e7bc0e9b95c7] background removal: 10.12s +2026-07-30 14:49:24,590 INFO [pipeline.engine] [e7bc0e9b95c7] SIFT: 0.31s +2026-07-30 14:49:24,838 INFO [pipeline.engine] [e7bc0e9b95c7] ORB: 0.25s +2026-07-30 14:49:25,676 INFO [pipeline.engine] [e7bc0e9b95c7] SuperGlue: 0.84s +2026-07-30 14:49:25,968 INFO [pipeline.engine] [e7bc0e9b95c7] LoFTR: 0.28s +2026-07-30 14:49:26,011 INFO [pipeline.engine] [e7bc0e9b95c7] total: 11.88s, weighted best: template4 +2026-07-30 14:49:26,083 INFO [pipeline.engine] [e7bc0e9b95c7] done, peak RSS so far: 12575 MB +2026-07-30 14:49:26,084 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:49:26] "POST /api/match HTTP/1.1" 200 - +2026-07-30 14:49:26,099 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:49:26] "GET /uploads/e7bc0e9b95c7/original.jpeg HTTP/1.1" 200 - +2026-07-30 14:49:26,101 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:49:26] "GET /uploads/e7bc0e9b95c7/nobg.png HTTP/1.1" 200 - +2026-07-30 14:49:26,102 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:49:26] "GET /uploads/e7bc0e9b95c7/ORB_best.png HTTP/1.1" 200 - +2026-07-30 14:49:26,103 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:49:26] "GET /uploads/e7bc0e9b95c7/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 14:49:26,103 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:49:26] "GET /uploads/e7bc0e9b95c7/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 14:49:26,104 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:49:26] "GET /uploads/e7bc0e9b95c7/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 14:49:26,107 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 14:49:26] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-30 15:33:36,479 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:33:36] "GET / HTTP/1.1" 200 - +2026-07-30 15:33:36,513 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:33:36] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-30 15:33:36,514 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:33:36] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-30 15:33:36,542 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:33:36] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-30 15:33:36,543 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:33:36] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-30 15:33:36,544 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:33:36] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-30 15:33:36,545 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:33:36] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-30 15:33:36,546 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:33:36] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-30 15:33:51,470 INFO [pipeline.engine] [fd8f662e3500] new upload: '360_F_375206039_boloHi8YXT0qgpAtFZVJplAyrVAkP32q.jpg' (43.6 KB) +2026-07-30 15:34:01,723 INFO [pipeline.engine] [fd8f662e3500] background removal: 10.25s +2026-07-30 15:34:01,780 INFO [pipeline.engine] [fd8f662e3500] SIFT: 0.05s +2026-07-30 15:34:01,888 INFO [pipeline.engine] [fd8f662e3500] ORB: 0.11s +2026-07-30 15:34:02,261 INFO [pipeline.engine] [fd8f662e3500] SuperGlue: 0.37s +2026-07-30 15:34:02,624 INFO [pipeline.engine] [fd8f662e3500] LoFTR: 0.35s +2026-07-30 15:34:02,659 INFO [pipeline.engine] [fd8f662e3500] total: 11.19s, weighted best: template5 +2026-07-30 15:34:02,736 INFO [pipeline.engine] [fd8f662e3500] done, peak RSS so far: 12620 MB +2026-07-30 15:34:02,736 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:34:02] "POST /api/match HTTP/1.1" 200 - +2026-07-30 15:34:02,751 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:34:02] "GET /uploads/fd8f662e3500/original.jpg HTTP/1.1" 200 - +2026-07-30 15:34:02,752 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:34:02] "GET /uploads/fd8f662e3500/nobg.png HTTP/1.1" 200 - +2026-07-30 15:34:02,753 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:34:02] "GET /uploads/fd8f662e3500/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 15:34:02,754 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:34:02] "GET /uploads/fd8f662e3500/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 15:34:02,757 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:34:02] "GET /uploads/fd8f662e3500/ORB_best.png HTTP/1.1" 200 - +2026-07-30 15:34:02,758 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:34:02] "GET /uploads/fd8f662e3500/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 15:46:07,646 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 15:46:07,646 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 15:46:07,802 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 15:46:08,898 INFO [pipeline.engine] template ready: template1 +2026-07-30 15:46:08,941 INFO [pipeline.engine] template ready: template2 +2026-07-30 15:46:08,980 INFO [pipeline.engine] template ready: template4 +2026-07-30 15:46:09,021 INFO [pipeline.engine] template ready: template5 +2026-07-30 15:46:09,090 INFO [pipeline.engine] template ready: template6 +2026-07-30 15:46:09,090 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-30 15:46:09,099 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 15:46:09,099 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 15:46:18,889 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:46:18] "GET / HTTP/1.1" 200 - +2026-07-30 15:46:54,703 INFO [pipeline.engine] [ff3749938687] new upload: 'image103.jpeg' (115.1 KB) +2026-07-30 15:46:54,717 INFO [pipeline.engine] [ff3749938687] background removal: 0.01s +2026-07-30 15:46:54,964 INFO [pipeline.engine] [ff3749938687] SIFT: 0.23s +2026-07-30 15:46:55,219 INFO [pipeline.engine] [ff3749938687] ORB: 0.25s +2026-07-30 15:46:55,274 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-30 15:46:56,230 INFO [pipeline.engine] [ff3749938687] SuperGlue: 1.01s +2026-07-30 15:46:56,243 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 15:46:56,720 INFO [pipeline.engine] [ff3749938687] LoFTR: 0.48s +2026-07-30 15:46:56,760 INFO [pipeline.engine] [ff3749938687] total: 2.06s, weighted best: template4 +2026-07-30 15:46:56,846 INFO [pipeline.engine] [ff3749938687] done, peak RSS so far: 1748 MB +2026-07-30 15:46:56,847 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:46:56] "POST /api/match HTTP/1.1" 200 - +2026-07-30 15:46:56,889 INFO [__main__] [ff3749938687] verifying against template4 via external endpoint +2026-07-30 15:47:03,281 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:47:03] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 15:47:11,725 INFO [__main__] [ff3749938687] verifying against template4 via external endpoint +2026-07-30 15:47:15,538 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:47:15] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 15:48:02,017 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:02] "GET / HTTP/1.1" 200 - +2026-07-30 15:48:02,032 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:02] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 15:48:02,032 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:02] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 15:48:02,226 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:02] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-30 15:48:02,226 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:02] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-30 15:48:02,227 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:02] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-30 15:48:02,229 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:02] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-30 15:48:02,229 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:02] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-30 15:48:05,293 INFO [pipeline.engine] [d5bff7395208] new upload: 'image100.jpeg' (102.5 KB) +2026-07-30 15:48:05,308 INFO [pipeline.engine] [d5bff7395208] background removal: 0.01s +2026-07-30 15:48:05,611 INFO [pipeline.engine] [d5bff7395208] SIFT: 0.28s +2026-07-30 15:48:05,886 INFO [pipeline.engine] [d5bff7395208] ORB: 0.28s +2026-07-30 15:48:06,353 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:06] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-30 15:48:06,747 INFO [pipeline.engine] [d5bff7395208] SuperGlue: 0.86s +2026-07-30 15:48:07,039 INFO [pipeline.engine] [d5bff7395208] LoFTR: 0.29s +2026-07-30 15:48:07,077 INFO [pipeline.engine] [d5bff7395208] total: 1.78s, weighted best: template4 +2026-07-30 15:48:07,162 INFO [pipeline.engine] [d5bff7395208] done, peak RSS so far: 1854 MB +2026-07-30 15:48:07,163 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:07] "POST /api/match HTTP/1.1" 200 - +2026-07-30 15:48:07,187 INFO [__main__] [d5bff7395208] verifying against template4 via external endpoint +2026-07-30 15:48:07,188 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:07] "GET /uploads/d5bff7395208/ORB_best.png HTTP/1.1" 200 - +2026-07-30 15:48:07,188 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:07] "GET /uploads/d5bff7395208/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 15:48:07,189 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:07] "GET /uploads/d5bff7395208/nobg.png HTTP/1.1" 200 - +2026-07-30 15:48:07,190 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:07] "GET /uploads/d5bff7395208/original.jpeg HTTP/1.1" 200 - +2026-07-30 15:48:07,190 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:07] "GET /uploads/d5bff7395208/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 15:48:07,197 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:07] "GET /uploads/d5bff7395208/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 15:48:11,444 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:48:11] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 15:49:53,878 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:49:53] "GET / HTTP/1.1" 200 - +2026-07-30 15:50:27,361 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:27] "GET / HTTP/1.1" 200 - +2026-07-30 15:50:27,394 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:27] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 15:50:27,395 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:27] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 15:50:27,398 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:27] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-30 15:50:27,399 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:27] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-30 15:50:27,400 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:27] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-30 15:50:27,400 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:27] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-30 15:50:27,401 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:27] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-30 15:50:37,958 INFO [pipeline.engine] [6919031ce599] new upload: '016_score36_image142.jpeg' (125.1 KB) +2026-07-30 15:50:40,275 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CUDAExecutionProvider', 'CPUExecutionProvider'] +2026-07-30 15:50:41,176 INFO [pipeline.engine] [6919031ce599] background removal: 3.22s +2026-07-30 15:50:41,493 INFO [pipeline.engine] [6919031ce599] SIFT: 0.29s +2026-07-30 15:50:41,754 INFO [pipeline.engine] [6919031ce599] ORB: 0.26s +2026-07-30 15:50:42,443 INFO [pipeline.engine] [6919031ce599] SuperGlue: 0.69s +2026-07-30 15:50:42,741 ERROR [pipeline.engine] Method LoFTR failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 119, in _timed + result = fn(*args) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 101, in _run_loftr + return deep.loftr_match_against_templates(bgr, mask) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 197, in loftr_match_against_templates + inlier_count, confidence_pct = _loftr_pair( + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 167, in _loftr_pair + out = get_loftr()({"image0": tensor_q, "image1": tensor_t}) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1747, in _call_impl + return forward_call(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/kornia/feature/loftr/loftr.py", line 148, in forward + feats_c, feats_f = self.backbone(torch.cat([data["image0"], data["image1"]], dim=0)) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1747, in _call_impl + return forward_call(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/kornia/feature/loftr/backbone/resnet_fpn.py", line 134, in forward + x1_out = self.layer1_outconv2(x1_out + x2_out_2x) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1747, in _call_impl + return forward_call(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/container.py", line 250, in forward + input = module(input) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1747, in _call_impl + return forward_call(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/conv.py", line 554, in forward + return self._conv_forward(input, self.weight, self.bias) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/conv.py", line 549, in _conv_forward + return F.conv2d( +torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 40.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 91.75 MiB is free. Process 148439 has 224.52 MiB memory in use. Including non-PyTorch memory, this process has 6.64 GiB memory in use. Of the allocated memory 382.62 MiB is allocated by PyTorch, and 57.38 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables) +2026-07-30 15:50:42,745 INFO [pipeline.engine] [6919031ce599] LoFTR: 0.30s (FAILED: CUDA out of memory. Tried to allocate 40.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 91.75 MiB is free. Process 148439 has 224.52 MiB memory in use. Including non-PyTorch memory, this process has 6.64 GiB memory in use. Of the allocated memory 382.62 MiB is allocated by PyTorch, and 57.38 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)) +2026-07-30 15:50:42,783 INFO [pipeline.engine] [6919031ce599] total: 4.82s, weighted best: template4 +2026-07-30 15:50:42,869 INFO [pipeline.engine] [6919031ce599] done, peak RSS so far: 2435 MB +2026-07-30 15:50:42,870 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:42] "POST /api/match HTTP/1.1" 200 - +2026-07-30 15:50:42,884 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:42] "GET /uploads/6919031ce599/original.jpeg HTTP/1.1" 200 - +2026-07-30 15:50:42,884 INFO [__main__] [6919031ce599] verifying against template4 via external endpoint +2026-07-30 15:50:42,886 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:42] "GET /uploads/6919031ce599/ORB_best.png HTTP/1.1" 200 - +2026-07-30 15:50:42,887 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:42] "GET /uploads/6919031ce599/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 15:50:42,888 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:42] "GET /uploads/6919031ce599/nobg.png HTTP/1.1" 200 - +2026-07-30 15:50:42,888 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:42] "GET /uploads/6919031ce599/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 15:50:47,093 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:50:47] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 15:53:03,927 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 15:53:03,927 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 15:53:04,077 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 15:53:04,982 INFO [pipeline.engine] template ready: template1 +2026-07-30 15:53:05,023 INFO [pipeline.engine] template ready: template2 +2026-07-30 15:53:05,063 INFO [pipeline.engine] template ready: template4 +2026-07-30 15:53:05,103 INFO [pipeline.engine] template ready: template5 +2026-07-30 15:53:05,174 INFO [pipeline.engine] template ready: template6 +2026-07-30 15:53:05,174 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-30 15:53:05,175 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 15:53:05,175 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 15:53:11,210 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:11] "GET / HTTP/1.1" 200 - +2026-07-30 15:53:11,324 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:11] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-30 15:53:11,326 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:11] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-30 15:53:11,472 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:11] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-30 15:53:11,473 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:11] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-30 15:53:11,475 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:11] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-30 15:53:11,475 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:11] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-30 15:53:11,476 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:11] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-30 15:53:21,539 INFO [pipeline.engine] [bccc2913d674] new upload: '011_score29_image53.jpeg' (108.4 KB) +2026-07-30 15:53:24,003 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-30 15:53:24,003 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-30 15:53:34,622 INFO [pipeline.engine] [bccc2913d674] background removal: 13.08s +2026-07-30 15:53:34,927 INFO [pipeline.engine] [bccc2913d674] SIFT: 0.29s +2026-07-30 15:53:35,206 INFO [pipeline.engine] [bccc2913d674] ORB: 0.27s +2026-07-30 15:53:35,281 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-30 15:53:36,263 INFO [pipeline.engine] [bccc2913d674] SuperGlue: 1.06s +2026-07-30 15:53:36,278 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 15:53:36,784 INFO [pipeline.engine] [bccc2913d674] LoFTR: 0.51s +2026-07-30 15:53:36,825 INFO [pipeline.engine] [bccc2913d674] total: 15.29s, weighted best: template2 +2026-07-30 15:53:36,903 INFO [pipeline.engine] [bccc2913d674] done, peak RSS so far: 7908 MB +2026-07-30 15:53:36,903 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:36] "POST /api/match HTTP/1.1" 200 - +2026-07-30 15:53:36,929 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:36] "GET /uploads/bccc2913d674/original.jpeg HTTP/1.1" 200 - +2026-07-30 15:53:36,929 INFO [__main__] [bccc2913d674] verifying against template2 via external endpoint +2026-07-30 15:53:36,931 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:36] "GET /uploads/bccc2913d674/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 15:53:36,932 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:36] "GET /uploads/bccc2913d674/nobg.png HTTP/1.1" 200 - +2026-07-30 15:53:36,933 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:36] "GET /uploads/bccc2913d674/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 15:53:36,935 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:36] "GET /uploads/bccc2913d674/ORB_best.png HTTP/1.1" 200 - +2026-07-30 15:53:36,937 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:36] "GET /uploads/bccc2913d674/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 15:53:43,336 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 15:53:43] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 16:00:08,193 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 16:00:08,193 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 16:00:08,348 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 16:00:09,493 INFO [pipeline.engine] template ready: template1 +2026-07-30 16:00:09,536 INFO [pipeline.engine] template ready: template2 +2026-07-30 16:00:09,578 INFO [pipeline.engine] template ready: template4 +2026-07-30 16:00:09,622 INFO [pipeline.engine] template ready: template5 +2026-07-30 16:00:09,696 INFO [pipeline.engine] template ready: template6 +2026-07-30 16:00:09,696 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-30 16:00:09,710 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 16:00:09,710 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 16:00:24,820 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:24] "GET / HTTP/1.1" 200 - +2026-07-30 16:00:42,728 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:42] "GET / HTTP/1.1" 200 - +2026-07-30 16:00:42,738 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:42] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 16:00:42,740 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:42] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 16:00:42,964 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:42] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-30 16:00:42,965 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:42] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-30 16:00:42,965 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:42] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-30 16:00:42,966 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:42] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-30 16:00:42,967 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:42] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-30 16:00:42,981 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:42] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-30 16:00:46,068 INFO [pipeline.engine] [d5912ac14723] new upload: 'image100.jpeg' (102.5 KB) +2026-07-30 16:00:46,083 INFO [pipeline.engine] [d5912ac14723] background removal: 0.01s +2026-07-30 16:00:46,402 INFO [pipeline.engine] [d5912ac14723] SIFT: 0.30s +2026-07-30 16:00:46,691 INFO [pipeline.engine] [d5912ac14723] ORB: 0.28s +2026-07-30 16:00:46,761 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-30 16:00:47,768 INFO [pipeline.engine] [d5912ac14723] SuperGlue: 1.08s +2026-07-30 16:00:47,783 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 16:00:48,309 INFO [pipeline.engine] [d5912ac14723] LoFTR: 0.53s +2026-07-30 16:00:48,351 INFO [pipeline.engine] [d5912ac14723] total: 2.28s, weighted best: template4 +2026-07-30 16:00:48,439 INFO [pipeline.engine] [d5912ac14723] done, peak RSS so far: 1807 MB +2026-07-30 16:00:48,439 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:48] "POST /api/match HTTP/1.1" 200 - +2026-07-30 16:00:48,467 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:48] "GET /uploads/d5912ac14723/original.jpeg HTTP/1.1" 200 - +2026-07-30 16:00:48,469 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:48] "GET /uploads/d5912ac14723/ORB_best.png HTTP/1.1" 200 - +2026-07-30 16:00:48,470 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:48] "GET /uploads/d5912ac14723/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 16:00:48,470 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:48] "GET /uploads/d5912ac14723/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 16:00:48,470 INFO [__main__] [d5912ac14723] verifying against template4 via external endpoint +2026-07-30 16:00:48,471 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:48] "GET /uploads/d5912ac14723/nobg.png HTTP/1.1" 200 - +2026-07-30 16:00:48,477 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:48] "GET /uploads/d5912ac14723/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 16:00:54,899 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:00:54] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 16:01:25,423 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:01:25] "GET / HTTP/1.1" 200 - +2026-07-30 16:02:05,720 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 16:02:05,720 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 16:02:05,876 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 16:02:06,844 INFO [pipeline.engine] template ready: template1 +2026-07-30 16:02:06,889 INFO [pipeline.engine] template ready: template2 +2026-07-30 16:02:06,931 INFO [pipeline.engine] template ready: template4 +2026-07-30 16:02:06,975 INFO [pipeline.engine] template ready: template5 +2026-07-30 16:02:07,048 INFO [pipeline.engine] template ready: template6 +2026-07-30 16:02:07,048 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-30 16:02:33,885 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 16:02:33,885 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 16:02:34,038 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 16:02:34,980 INFO [pipeline.engine] template ready: template1 +2026-07-30 16:02:35,026 INFO [pipeline.engine] template ready: template2 +2026-07-30 16:02:35,067 INFO [pipeline.engine] template ready: template4 +2026-07-30 16:02:35,111 INFO [pipeline.engine] template ready: template5 +2026-07-30 16:02:35,186 INFO [pipeline.engine] template ready: template6 +2026-07-30 16:02:35,186 INFO [pipeline.engine] 5 templates ready (device: cuda). +2026-07-30 16:02:35,188 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 16:02:35,188 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 16:02:46,311 INFO [pipeline.engine] [7f92d7f15c49] new upload: '011_score29_image53.jpeg' (108.4 KB) +2026-07-30 16:02:46,326 INFO [pipeline.engine] [7f92d7f15c49] background removal: 0.01s +2026-07-30 16:02:46,624 INFO [pipeline.engine] [7f92d7f15c49] SIFT: 0.28s +2026-07-30 16:02:46,883 INFO [pipeline.engine] [7f92d7f15c49] ORB: 0.25s +2026-07-30 16:02:46,943 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-30 16:02:47,883 INFO [pipeline.engine] [7f92d7f15c49] SuperGlue: 1.00s +2026-07-30 16:02:47,896 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 16:02:48,366 INFO [pipeline.engine] [7f92d7f15c49] LoFTR: 0.48s +2026-07-30 16:02:48,401 INFO [pipeline.engine] [7f92d7f15c49] total: 2.09s, weighted best: template2 +2026-07-30 16:02:48,471 INFO [pipeline.engine] [7f92d7f15c49] done, peak RSS so far: 1719 MB +2026-07-30 16:02:48,472 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:02:48] "POST /api/match HTTP/1.1" 200 - +2026-07-30 16:02:48,488 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:02:48] "GET /uploads/7f92d7f15c49/nobg.png HTTP/1.1" 200 - +2026-07-30 16:02:48,488 INFO [__main__] [7f92d7f15c49] verifying against template2 via external endpoint +2026-07-30 16:02:48,490 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:02:48] "GET /uploads/7f92d7f15c49/original.jpeg HTTP/1.1" 200 - +2026-07-30 16:02:48,494 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:02:48] "GET /uploads/7f92d7f15c49/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 16:02:48,495 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:02:48] "GET /uploads/7f92d7f15c49/ORB_best.png HTTP/1.1" 200 - +2026-07-30 16:02:48,495 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:02:48] "GET /uploads/7f92d7f15c49/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 16:02:48,498 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:02:48] "GET /uploads/7f92d7f15c49/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 16:02:52,786 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:02:52] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 16:03:51,339 INFO [pipeline.engine] [60d5fa968c5a] new upload: '011_score29_image53.jpeg' (108.4 KB) +2026-07-30 16:03:51,352 INFO [pipeline.engine] [60d5fa968c5a] background removal: 0.01s +2026-07-30 16:03:51,651 INFO [pipeline.engine] [60d5fa968c5a] SIFT: 0.28s +2026-07-30 16:03:51,904 INFO [pipeline.engine] [60d5fa968c5a] ORB: 0.25s +2026-07-30 16:03:52,781 INFO [pipeline.engine] [60d5fa968c5a] SuperGlue: 0.88s +2026-07-30 16:03:53,067 INFO [pipeline.engine] [60d5fa968c5a] LoFTR: 0.28s +2026-07-30 16:03:53,108 INFO [pipeline.engine] [60d5fa968c5a] total: 1.77s, weighted best: template2 +2026-07-30 16:03:53,180 INFO [pipeline.engine] [60d5fa968c5a] done, peak RSS so far: 1798 MB +2026-07-30 16:03:53,181 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:03:53] "POST /api/match HTTP/1.1" 200 - +2026-07-30 16:03:53,193 INFO [__main__] [60d5fa968c5a] verifying against template2 via external endpoint +2026-07-30 16:03:53,195 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:03:53] "GET /uploads/60d5fa968c5a/original.jpeg HTTP/1.1" 200 - +2026-07-30 16:03:53,195 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:03:53] "GET /uploads/60d5fa968c5a/ORB_best.png HTTP/1.1" 200 - +2026-07-30 16:03:53,196 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:03:53] "GET /uploads/60d5fa968c5a/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 16:03:53,200 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:03:53] "GET /uploads/60d5fa968c5a/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 16:03:53,201 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:03:53] "GET /uploads/60d5fa968c5a/nobg.png HTTP/1.1" 200 - +2026-07-30 16:03:53,202 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:03:53] "GET /uploads/60d5fa968c5a/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 16:03:57,405 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:03:57] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 16:04:10,639 INFO [pipeline.engine] [eea0c14488f4] new upload: '360_F_375206039_boloHi8YXT0qgpAtFZVJplAyrVAkP32q.jpg' (43.6 KB) +2026-07-30 16:04:10,642 INFO [pipeline.engine] [eea0c14488f4] background removal: 0.00s +2026-07-30 16:04:10,702 INFO [pipeline.engine] [eea0c14488f4] SIFT: 0.06s +2026-07-30 16:04:10,806 INFO [pipeline.engine] [eea0c14488f4] ORB: 0.10s +2026-07-30 16:04:11,169 INFO [pipeline.engine] [eea0c14488f4] SuperGlue: 0.36s +2026-07-30 16:04:11,523 INFO [pipeline.engine] [eea0c14488f4] LoFTR: 0.34s +2026-07-30 16:04:11,559 INFO [pipeline.engine] [eea0c14488f4] total: 0.92s, weighted best: template5 +2026-07-30 16:04:11,634 INFO [pipeline.engine] [eea0c14488f4] done, peak RSS so far: 1798 MB +2026-07-30 16:04:11,634 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:04:11] "POST /api/match HTTP/1.1" 200 - +2026-07-30 16:04:11,649 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:04:11] "GET /uploads/eea0c14488f4/original.jpg HTTP/1.1" 200 - +2026-07-30 16:04:11,649 INFO [__main__] [eea0c14488f4] verifying against template5 via external endpoint +2026-07-30 16:04:11,652 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:04:11] "GET /uploads/eea0c14488f4/ORB_best.png HTTP/1.1" 200 - +2026-07-30 16:04:11,654 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:04:11] "GET /uploads/eea0c14488f4/nobg.png HTTP/1.1" 200 - +2026-07-30 16:04:11,655 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:04:11] "GET /uploads/eea0c14488f4/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 16:04:11,656 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:04:11] "GET /uploads/eea0c14488f4/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 16:04:11,658 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:04:11] "GET /uploads/eea0c14488f4/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 16:04:16,679 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:04:16] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 16:06:30,224 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:30] "GET / HTTP/1.1" 200 - +2026-07-30 16:06:30,510 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:30] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 16:06:30,545 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:30] "GET /template_image/template2.png HTTP/1.1" 304 - +2026-07-30 16:06:30,558 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:30] "GET /template_image/template1.png HTTP/1.1" 304 - +2026-07-30 16:06:30,855 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:30] "GET /template_image/template4.png HTTP/1.1" 304 - +2026-07-30 16:06:30,855 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:30] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 16:06:30,867 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:30] "GET /template_image/template5.png HTTP/1.1" 304 - +2026-07-30 16:06:31,106 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:31] "GET /template_image/template6.png HTTP/1.1" 304 - +2026-07-30 16:06:42,244 INFO [pipeline.engine] [72cdb7b7135a] new upload: 'Roses.jpeg' (39.9 KB) +2026-07-30 16:06:42,252 INFO [pipeline.engine] [72cdb7b7135a] background removal: 0.01s +2026-07-30 16:06:42,406 INFO [pipeline.engine] [72cdb7b7135a] SIFT: 0.14s +2026-07-30 16:06:42,603 INFO [pipeline.engine] [72cdb7b7135a] ORB: 0.20s +2026-07-30 16:06:43,569 INFO [pipeline.engine] [72cdb7b7135a] SuperGlue: 0.97s +2026-07-30 16:06:43,964 INFO [pipeline.engine] [72cdb7b7135a] LoFTR: 0.38s +2026-07-30 16:06:44,013 INFO [pipeline.engine] [72cdb7b7135a] total: 1.77s, weighted best: template1 +2026-07-30 16:06:44,087 INFO [pipeline.engine] [72cdb7b7135a] done, peak RSS so far: 1798 MB +2026-07-30 16:06:44,087 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:44] "POST /api/match HTTP/1.1" 200 - +2026-07-30 16:06:44,168 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:44] "GET /uploads/72cdb7b7135a/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 16:06:44,169 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:44] "GET /uploads/72cdb7b7135a/original.jpeg HTTP/1.1" 200 - +2026-07-30 16:06:44,170 INFO [__main__] [72cdb7b7135a] verifying against template1 via external endpoint +2026-07-30 16:06:44,208 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:44] "GET /uploads/72cdb7b7135a/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 16:06:44,209 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:44] "GET /uploads/72cdb7b7135a/nobg.png HTTP/1.1" 200 - +2026-07-30 16:06:44,212 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:44] "GET /uploads/72cdb7b7135a/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 16:06:44,212 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:44] "GET /uploads/72cdb7b7135a/ORB_best.png HTTP/1.1" 200 - +2026-07-30 16:06:51,760 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:06:51] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 16:09:29,862 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:09:29] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 16:10:53,278 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:53] "GET / HTTP/1.1" 200 - +2026-07-30 16:10:53,290 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:53] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 16:10:53,291 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:53] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 16:10:53,492 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:53] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-30 16:10:53,493 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:53] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-30 16:10:53,494 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:53] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-30 16:10:53,494 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:53] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-30 16:10:53,495 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:53] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-30 16:10:53,560 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:53] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-30 16:10:56,586 INFO [pipeline.engine] [b77df67970bf] new upload: 'image100.jpeg' (102.5 KB) +2026-07-30 16:10:56,602 INFO [pipeline.engine] [b77df67970bf] background removal: 0.01s +2026-07-30 16:10:56,906 INFO [pipeline.engine] [b77df67970bf] SIFT: 0.28s +2026-07-30 16:10:57,176 INFO [pipeline.engine] [b77df67970bf] ORB: 0.27s +2026-07-30 16:10:58,090 INFO [pipeline.engine] [b77df67970bf] SuperGlue: 0.91s +2026-07-30 16:10:58,402 INFO [pipeline.engine] [b77df67970bf] LoFTR: 0.30s +2026-07-30 16:10:58,440 INFO [pipeline.engine] [b77df67970bf] total: 1.85s, weighted best: template4 +2026-07-30 16:10:58,515 INFO [pipeline.engine] [b77df67970bf] done, peak RSS so far: 1915 MB +2026-07-30 16:10:58,516 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:58] "POST /api/match HTTP/1.1" 200 - +2026-07-30 16:10:58,546 INFO [__main__] [b77df67970bf] verifying against template4 via external endpoint +2026-07-30 16:10:58,547 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:58] "GET /uploads/b77df67970bf/ORB_best.png HTTP/1.1" 200 - +2026-07-30 16:10:58,548 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:58] "GET /uploads/b77df67970bf/original.jpeg HTTP/1.1" 200 - +2026-07-30 16:10:58,548 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:58] "GET /uploads/b77df67970bf/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 16:10:58,549 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:58] "GET /uploads/b77df67970bf/nobg.png HTTP/1.1" 200 - +2026-07-30 16:10:58,551 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:58] "GET /uploads/b77df67970bf/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 16:10:58,556 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:10:58] "GET /uploads/b77df67970bf/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 16:11:02,918 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:11:02] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 16:11:16,810 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:11:16] "GET / HTTP/1.1" 200 - +2026-07-30 16:15:23,105 INFO [pipeline.engine] [fd7301ea0868] new upload: 'Roses.jpeg' (39.9 KB) +2026-07-30 16:15:23,111 INFO [pipeline.engine] [fd7301ea0868] background removal: 0.01s +2026-07-30 16:15:23,244 INFO [pipeline.engine] [fd7301ea0868] SIFT: 0.12s +2026-07-30 16:15:23,439 INFO [pipeline.engine] [fd7301ea0868] ORB: 0.19s +2026-07-30 16:15:24,349 INFO [pipeline.engine] [fd7301ea0868] SuperGlue: 0.91s +2026-07-30 16:15:24,744 INFO [pipeline.engine] [fd7301ea0868] LoFTR: 0.38s +2026-07-30 16:15:24,795 INFO [pipeline.engine] [fd7301ea0868] total: 1.69s, weighted best: template1 +2026-07-30 16:15:24,873 INFO [pipeline.engine] [fd7301ea0868] done, peak RSS so far: 1917 MB +2026-07-30 16:15:24,874 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:15:24] "POST /api/match HTTP/1.1" 200 - +2026-07-30 16:15:24,953 INFO [__main__] [fd7301ea0868] verifying against template1 via external endpoint +2026-07-30 16:15:24,990 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:15:24] "GET /uploads/fd7301ea0868/original.jpeg HTTP/1.1" 200 - +2026-07-30 16:15:24,994 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:15:24] "GET /uploads/fd7301ea0868/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 16:15:25,003 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:15:25] "GET /uploads/fd7301ea0868/ORB_best.png HTTP/1.1" 200 - +2026-07-30 16:15:25,003 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:15:25] "GET /uploads/fd7301ea0868/nobg.png HTTP/1.1" 200 - +2026-07-30 16:15:25,004 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:15:25] "GET /uploads/fd7301ea0868/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 16:15:25,006 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:15:25] "GET /uploads/fd7301ea0868/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 16:15:32,581 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:15:32] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 16:16:09,320 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:16:09] "GET / HTTP/1.1" 200 - +2026-07-30 16:16:32,938 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:16:32] "GET / HTTP/1.1" 200 - +2026-07-30 16:16:33,056 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:16:33] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 16:16:33,097 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:16:33] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 16:16:33,521 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:16:33] "GET /template_image/template1.png HTTP/1.1" 200 - +2026-07-30 16:16:33,561 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:16:33] "GET /template_image/template2.png HTTP/1.1" 200 - +2026-07-30 16:16:33,564 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:16:33] "GET /template_image/template4.png HTTP/1.1" 200 - +2026-07-30 16:16:33,574 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:16:33] "GET /template_image/template5.png HTTP/1.1" 200 - +2026-07-30 16:16:33,581 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:16:33] "GET /template_image/template6.png HTTP/1.1" 200 - +2026-07-30 16:16:35,183 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:16:35] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-30 16:19:54,052 INFO [pipeline.engine] [3cb15cec185f] new upload: '20260727_194524.jpg' (11666.0 KB) +2026-07-30 16:19:55,564 INFO [pipeline.bg_removal] Resized upload (16256, 7502) -> (1600, 738) before processing +2026-07-30 16:19:57,781 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-30 16:19:57,781 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-30 16:20:07,984 INFO [pipeline.engine] [3cb15cec185f] background removal: 13.93s +2026-07-30 16:20:08,209 INFO [pipeline.engine] [3cb15cec185f] SIFT: 0.20s +2026-07-30 16:20:08,489 INFO [pipeline.engine] [3cb15cec185f] ORB: 0.28s +2026-07-30 16:20:09,330 INFO [pipeline.engine] [3cb15cec185f] SuperGlue: 0.84s +2026-07-30 16:20:09,628 INFO [pipeline.engine] [3cb15cec185f] LoFTR: 0.29s +2026-07-30 16:20:09,664 INFO [pipeline.engine] [3cb15cec185f] total: 15.61s, weighted best: template2 +2026-07-30 16:20:09,740 INFO [pipeline.engine] [3cb15cec185f] done, peak RSS so far: 8417 MB +2026-07-30 16:20:09,741 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:20:09] "POST /api/match HTTP/1.1" 200 - +2026-07-30 16:20:09,847 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:20:09] "GET /uploads/3cb15cec185f/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 16:20:09,886 INFO [__main__] [3cb15cec185f] verifying against template2 via external endpoint +2026-07-30 16:20:09,887 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:20:09] "GET /uploads/3cb15cec185f/original.jpg HTTP/1.1" 200 - +2026-07-30 16:20:09,896 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:20:09] "GET /uploads/3cb15cec185f/ORB_best.png HTTP/1.1" 200 - +2026-07-30 16:20:09,897 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:20:09] "GET /uploads/3cb15cec185f/nobg.png HTTP/1.1" 200 - +2026-07-30 16:20:09,898 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:20:09] "GET /uploads/3cb15cec185f/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 16:20:09,908 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:20:09] "GET /uploads/3cb15cec185f/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 16:20:26,001 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:20:26] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 16:22:01,373 INFO [pipeline.engine] [76a021a31a41] new upload: '20260727_194202.jpg' (11872.1 KB) +2026-07-30 16:22:02,844 INFO [pipeline.bg_removal] Resized upload (16256, 7502) -> (1600, 738) before processing +2026-07-30 16:22:13,053 INFO [pipeline.engine] [76a021a31a41] background removal: 11.68s +2026-07-30 16:22:13,335 INFO [pipeline.engine] [76a021a31a41] SIFT: 0.26s +2026-07-30 16:22:13,594 INFO [pipeline.engine] [76a021a31a41] ORB: 0.26s +2026-07-30 16:22:14,506 INFO [pipeline.engine] [76a021a31a41] SuperGlue: 0.91s +2026-07-30 16:22:14,810 INFO [pipeline.engine] [76a021a31a41] LoFTR: 0.30s +2026-07-30 16:22:14,847 INFO [pipeline.engine] [76a021a31a41] total: 13.47s, weighted best: template2 +2026-07-30 16:22:14,924 INFO [pipeline.engine] [76a021a31a41] done, peak RSS so far: 13037 MB +2026-07-30 16:22:14,926 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:22:14] "POST /api/match HTTP/1.1" 200 - +2026-07-30 16:22:15,026 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:22:15] "GET /uploads/76a021a31a41/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 16:22:15,066 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:22:15] "GET /uploads/76a021a31a41/nobg.png HTTP/1.1" 200 - +2026-07-30 16:22:15,068 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:22:15] "GET /uploads/76a021a31a41/original.jpg HTTP/1.1" 200 - +2026-07-30 16:22:15,068 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:22:15] "GET /uploads/76a021a31a41/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 16:22:15,072 INFO [__main__] [76a021a31a41] verifying against template2 via external endpoint +2026-07-30 16:22:15,078 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:22:15] "GET /uploads/76a021a31a41/ORB_best.png HTTP/1.1" 200 - +2026-07-30 16:22:15,085 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:22:15] "GET /uploads/76a021a31a41/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 16:22:32,205 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 16:22:32] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 17:24:33,026 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 17:24:33,026 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 17:24:35,615 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-30 17:24:35,615 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-30 17:24:46,126 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 17:24:50,247 INFO [pipeline.engine] template ready: SKU_1 +2026-07-30 17:25:00,484 INFO [pipeline.engine] template ready: SKU_2 +2026-07-30 17:25:10,394 INFO [pipeline.engine] template ready: SKU_3 +2026-07-30 17:25:20,277 INFO [pipeline.engine] template ready: SKU_4 +2026-07-30 17:25:29,992 INFO [pipeline.engine] template ready: SKU_5 +2026-07-30 17:25:39,997 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-30 17:25:39,998 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-30 17:25:40,026 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 17:25:40,026 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 17:25:59,404 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:25:59] "GET / HTTP/1.1" 200 - +2026-07-30 17:25:59,456 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:25:59] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 17:25:59,457 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:25:59] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 17:25:59,586 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:25:59] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-30 17:25:59,586 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:25:59] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-30 17:25:59,587 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:25:59] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-30 17:25:59,587 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:25:59] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-30 17:25:59,590 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:25:59] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-30 17:25:59,592 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:25:59] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-30 17:26:10,377 WARNING [__main__] Upload rejected: exceeds 15728640 byte limit +2026-07-30 17:26:10,377 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:26:10] "POST /api/match HTTP/1.1" 413 - +2026-07-30 17:26:31,945 WARNING [__main__] Upload rejected: exceeds 15728640 byte limit +2026-07-30 17:26:31,945 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:26:31] "POST /api/match HTTP/1.1" 413 - +2026-07-30 17:30:29,252 INFO [pipeline.engine] [f17cb1a5a546] new upload: '20260727_193624.jpg' (11142.2 KB) +2026-07-30 17:30:30,826 INFO [pipeline.bg_removal] Resized upload (16320, 7532) -> (1600, 738) before processing +2026-07-30 17:30:40,727 INFO [pipeline.engine] [f17cb1a5a546] background removal: 11.47s +2026-07-30 17:30:40,965 INFO [pipeline.engine] [f17cb1a5a546] SIFT: 0.22s +2026-07-30 17:30:41,306 INFO [pipeline.engine] [f17cb1a5a546] ORB: 0.33s +2026-07-30 17:30:41,361 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-30 17:30:42,815 INFO [pipeline.engine] [f17cb1a5a546] SuperGlue: 1.51s +2026-07-30 17:30:42,830 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 17:30:43,567 INFO [pipeline.engine] [f17cb1a5a546] LoFTR: 0.75s +2026-07-30 17:30:43,629 INFO [pipeline.engine] [f17cb1a5a546] total: 14.38s, weighted best: SKU_ULTRA_6 +2026-07-30 17:30:43,706 INFO [pipeline.engine] [f17cb1a5a546] done, peak RSS so far: 13037 MB +2026-07-30 17:30:43,707 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:30:43] "POST /api/match HTTP/1.1" 200 - +2026-07-30 17:30:43,733 INFO [__main__] [f17cb1a5a546] verifying against SKU_ULTRA_6 via external endpoint +2026-07-30 17:30:43,735 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:30:43] "GET /uploads/f17cb1a5a546/original.jpg HTTP/1.1" 200 - +2026-07-30 17:30:43,736 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:30:43] "GET /uploads/f17cb1a5a546/nobg.png HTTP/1.1" 200 - +2026-07-30 17:30:43,737 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:30:43] "GET /uploads/f17cb1a5a546/ORB_best.png HTTP/1.1" 200 - +2026-07-30 17:30:43,739 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:30:43] "GET /uploads/f17cb1a5a546/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 17:30:43,739 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:30:43] "GET /uploads/f17cb1a5a546/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 17:30:43,741 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:30:43] "GET /uploads/f17cb1a5a546/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 17:30:53,645 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:30:53] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 17:34:13,911 INFO [pipeline.engine] [6117566b73ba] new upload: '20260727_193624.jpg' (11142.2 KB) +2026-07-30 17:34:13,940 INFO [pipeline.engine] [6117566b73ba] background removal: 0.02s +2026-07-30 17:34:14,194 INFO [pipeline.engine] [6117566b73ba] SIFT: 0.23s +2026-07-30 17:34:14,517 INFO [pipeline.engine] [6117566b73ba] ORB: 0.32s +2026-07-30 17:34:15,502 INFO [pipeline.engine] [6117566b73ba] SuperGlue: 0.98s +2026-07-30 17:34:15,844 INFO [pipeline.engine] [6117566b73ba] LoFTR: 0.34s +2026-07-30 17:34:15,912 INFO [pipeline.engine] [6117566b73ba] total: 2.00s, weighted best: SKU_ULTRA_6 +2026-07-30 17:34:15,985 INFO [pipeline.engine] [6117566b73ba] done, peak RSS so far: 13037 MB +2026-07-30 17:34:15,987 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:15] "POST /api/match HTTP/1.1" 200 - +2026-07-30 17:34:16,002 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:16] "GET /uploads/6117566b73ba/original.jpg HTTP/1.1" 200 - +2026-07-30 17:34:16,002 INFO [__main__] [6117566b73ba] verifying against SKU_ULTRA_6 via external endpoint +2026-07-30 17:34:16,004 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:16] "GET /uploads/6117566b73ba/ORB_best.png HTTP/1.1" 200 - +2026-07-30 17:34:16,005 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:16] "GET /uploads/6117566b73ba/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 17:34:16,008 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:16] "GET /uploads/6117566b73ba/nobg.png HTTP/1.1" 200 - +2026-07-30 17:34:16,009 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:16] "GET /uploads/6117566b73ba/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 17:34:16,013 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:16] "GET /uploads/6117566b73ba/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 17:34:34,889 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 17:34:34,889 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 17:34:35,004 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 17:34:36,134 INFO [pipeline.engine] template ready: SKU_1 +2026-07-30 17:34:36,176 INFO [pipeline.engine] template ready: SKU_2 +2026-07-30 17:34:36,267 INFO [pipeline.engine] template ready: SKU_3 +2026-07-30 17:34:36,337 INFO [pipeline.engine] template ready: SKU_4 +2026-07-30 17:34:36,376 INFO [pipeline.engine] template ready: SKU_5 +2026-07-30 17:34:36,442 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-30 17:34:36,442 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-30 17:34:36,443 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 17:34:36,443 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 17:34:49,394 INFO [pipeline.engine] [84b9d3fc9eae] new upload: '20260727_193624.jpg' (11142.2 KB) +2026-07-30 17:34:49,423 INFO [pipeline.engine] [84b9d3fc9eae] background removal: 0.02s +2026-07-30 17:34:49,680 INFO [pipeline.engine] [84b9d3fc9eae] SIFT: 0.23s +2026-07-30 17:34:50,008 INFO [pipeline.engine] [84b9d3fc9eae] ORB: 0.32s +2026-07-30 17:34:50,064 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-30 17:34:51,107 INFO [pipeline.engine] [84b9d3fc9eae] SuperGlue: 1.10s +2026-07-30 17:34:51,122 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 17:34:51,663 INFO [pipeline.engine] [84b9d3fc9eae] LoFTR: 0.55s +2026-07-30 17:34:51,707 INFO [pipeline.engine] [84b9d3fc9eae] total: 2.31s, weighted best: SKU_ULTRA_6 +2026-07-30 17:34:51,781 INFO [pipeline.engine] [84b9d3fc9eae] done, peak RSS so far: 1687 MB +2026-07-30 17:34:51,784 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:51] "POST /api/match HTTP/1.1" 200 - +2026-07-30 17:34:51,799 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:51] "GET /uploads/84b9d3fc9eae/nobg.png HTTP/1.1" 200 - +2026-07-30 17:34:51,800 INFO [__main__] [84b9d3fc9eae] verifying against SKU_ULTRA_6 via external endpoint +2026-07-30 17:34:51,800 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:51] "GET /uploads/84b9d3fc9eae/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 17:34:51,801 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:51] "GET /uploads/84b9d3fc9eae/original.jpg HTTP/1.1" 200 - +2026-07-30 17:34:51,803 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:51] "GET /uploads/84b9d3fc9eae/ORB_best.png HTTP/1.1" 200 - +2026-07-30 17:34:51,804 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:51] "GET /uploads/84b9d3fc9eae/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 17:34:51,807 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:34:51] "GET /uploads/84b9d3fc9eae/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 17:35:05,770 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:35:05] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 17:35:52,541 INFO [pipeline.utils] Compressed upload: 16.4 MB -> 0.3 MB (738x1600, JPEG q92) +2026-07-30 17:35:52,547 INFO [pipeline.engine] [8c282dcebb10] new upload: '20260727_194535.jpg' (287.7 KB) +2026-07-30 17:35:54,834 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-30 17:35:54,834 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-30 17:36:05,071 INFO [pipeline.engine] [8c282dcebb10] background removal: 12.52s +2026-07-30 17:36:05,347 INFO [pipeline.engine] [8c282dcebb10] SIFT: 0.25s +2026-07-30 17:36:05,667 INFO [pipeline.engine] [8c282dcebb10] ORB: 0.32s +2026-07-30 17:36:06,714 INFO [pipeline.engine] [8c282dcebb10] SuperGlue: 1.05s +2026-07-30 17:36:07,065 INFO [pipeline.engine] [8c282dcebb10] LoFTR: 0.34s +2026-07-30 17:36:07,102 INFO [pipeline.engine] [8c282dcebb10] total: 14.55s, weighted best: SKU_1 +2026-07-30 17:36:07,178 INFO [pipeline.engine] [8c282dcebb10] done, peak RSS so far: 8101 MB +2026-07-30 17:36:07,181 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:36:07] "POST /api/match HTTP/1.1" 200 - +2026-07-30 17:36:07,196 INFO [__main__] [8c282dcebb10] verifying against SKU_1 via external endpoint +2026-07-30 17:36:07,197 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:36:07] "GET /uploads/8c282dcebb10/nobg.png HTTP/1.1" 200 - +2026-07-30 17:36:07,200 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:36:07] "GET /uploads/8c282dcebb10/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 17:36:07,200 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:36:07] "GET /uploads/8c282dcebb10/original.jpg HTTP/1.1" 200 - +2026-07-30 17:36:07,203 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:36:07] "GET /uploads/8c282dcebb10/ORB_best.png HTTP/1.1" 200 - +2026-07-30 17:36:07,203 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:36:07] "GET /uploads/8c282dcebb10/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 17:36:07,205 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:36:07] "GET /uploads/8c282dcebb10/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 17:36:18,415 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:36:18] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 17:57:06,189 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 17:57:06,189 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 17:57:06,361 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 17:57:08,506 INFO [pipeline.engine] template ready: SKU_1 +2026-07-30 17:57:08,547 INFO [pipeline.engine] template ready: SKU_2 +2026-07-30 17:57:08,631 INFO [pipeline.engine] template ready: SKU_3 +2026-07-30 17:57:08,700 INFO [pipeline.engine] template ready: SKU_4 +2026-07-30 17:57:08,739 INFO [pipeline.engine] template ready: SKU_5 +2026-07-30 17:57:08,806 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-30 17:57:08,806 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-30 17:57:08,828 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 17:57:08,829 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 17:57:17,167 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:57:17] "GET / HTTP/1.1" 200 - +2026-07-30 17:57:30,575 INFO [pipeline.utils] Compressed upload: 15.2 MB -> 0.2 MB (739x1600, JPEG q92) +2026-07-30 17:57:30,586 INFO [pipeline.engine] [cf3701577b50] new upload: 'big_test.jpg' (236.4 KB) +2026-07-30 17:57:32,926 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CUDAExecutionProvider', 'CPUExecutionProvider'] +2026-07-30 17:57:33,627 ERROR [pipeline.engine] [cf3701577b50] pipeline failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 219, in process_upload + result = _process_upload_locked(request_id, image_bytes, orig_filename) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 242, in _process_upload_locked + rgba, _ = bg_removal.remove_background_bytes(image_bytes, config.UPLOADS_NOBG_CACHE) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/bg_removal.py", line 89, in remove_background_bytes + result = remove(pil_img, session=get_session()) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/bg.py", line 279, in remove + masks = session.predict(img, *args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/sessions/birefnet_general.py", line 32, in predict + ort_outs = self.inner_session.run( + File "/home/suman/.local/lib/python3.10/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 287, in run + return self._sess.run(output_names, input_feed, run_options) +onnxruntime.capi.onnxruntime_pybind11_state.RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Non-zero status code returned while running Mul node. Name:'/decoder/decoder_block1/dec_att/aspp_deforms.2/atrous_conv/Mul_6' Status Message: /onnxruntime_src/onnxruntime/core/framework/bfc_arena.cc:359 void* onnxruntime::BFCArena::AllocateRawInternal(size_t, bool, onnxruntime::Stream*) Failed to allocate memory for requested buffer of size 822083584 + +2026-07-30 17:57:33,719 INFO [pipeline.engine] [cf3701577b50] done, peak RSS so far: 2052 MB +2026-07-30 17:57:33,719 ERROR [__main__] Match pipeline failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/app.py", line 118, in api_match + result = engine.process_upload(image_bytes, filename) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 219, in process_upload + result = _process_upload_locked(request_id, image_bytes, orig_filename) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 242, in _process_upload_locked + rgba, _ = bg_removal.remove_background_bytes(image_bytes, config.UPLOADS_NOBG_CACHE) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/bg_removal.py", line 89, in remove_background_bytes + result = remove(pil_img, session=get_session()) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/bg.py", line 279, in remove + masks = session.predict(img, *args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/sessions/birefnet_general.py", line 32, in predict + ort_outs = self.inner_session.run( + File "/home/suman/.local/lib/python3.10/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 287, in run + return self._sess.run(output_names, input_feed, run_options) +onnxruntime.capi.onnxruntime_pybind11_state.RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Non-zero status code returned while running Mul node. Name:'/decoder/decoder_block1/dec_att/aspp_deforms.2/atrous_conv/Mul_6' Status Message: /onnxruntime_src/onnxruntime/core/framework/bfc_arena.cc:359 void* onnxruntime::BFCArena::AllocateRawInternal(size_t, bool, onnxruntime::Stream*) Failed to allocate memory for requested buffer of size 822083584 + +2026-07-30 17:57:33,721 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:57:33] "POST /api/match HTTP/1.1" 500 - +2026-07-30 17:57:56,189 INFO [pipeline.utils] Compressed upload: 15.2 MB -> 0.2 MB (739x1600, JPEG q92) +2026-07-30 17:57:56,189 INFO [pipeline.engine] [3ec42cd9512d] new upload: 'big_test.jpg' (236.4 KB) +2026-07-30 17:57:57,014 INFO [pipeline.engine] [3ec42cd9512d] background removal: 0.82s +2026-07-30 17:57:57,366 INFO [pipeline.engine] [3ec42cd9512d] SIFT: 0.33s +2026-07-30 17:57:57,704 INFO [pipeline.engine] [3ec42cd9512d] ORB: 0.34s +2026-07-30 17:57:57,844 ERROR [pipeline.engine] Method SuperGlue failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 119, in _timed + result = fn(*args) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 97, in _run_superglue + return deep.superglue_match_against_templates(bgr, mask) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 141, in superglue_match_against_templates + feats_q, mask_q = superpoint_extract(bgr, mask) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 99, in superpoint_extract + feats = get_superpoint().extract(tensor) + File "/home/suman/.local/lib/python3.10/site-packages/torch/utils/_contextlib.py", line 116, in decorate_context + return func(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/lightglue/utils.py", line 144, in extract + feats = self.forward({"image": img}) + File "/home/suman/.local/lib/python3.10/site-packages/lightglue/superpoint.py", line 159, in forward + x = self.relu(self.conv1a(image)) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1747, in _call_impl + return forward_call(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/conv.py", line 554, in forward + return self._conv_forward(input, self.weight, self.bias) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/conv.py", line 549, in _conv_forward + return F.conv2d( +torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 118.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 88.50 MiB is free. Process 148439 has 226.52 MiB memory in use. Including non-PyTorch memory, this process has 6.24 GiB memory in use. Of the allocated memory 15.92 MiB is allocated by PyTorch, and 14.08 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables) +2026-07-30 17:57:57,847 INFO [pipeline.engine] [3ec42cd9512d] SuperGlue: 0.14s (FAILED: CUDA out of memory. Tried to allocate 118.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 88.50 MiB is free. Process 148439 has 226.52 MiB memory in use. Including non-PyTorch memory, this process has 6.24 GiB memory in use. Of the allocated memory 15.92 MiB is allocated by PyTorch, and 14.08 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)) +2026-07-30 17:57:57,856 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 17:57:58,039 ERROR [pipeline.engine] Method LoFTR failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 119, in _timed + result = fn(*args) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 101, in _run_loftr + return deep.loftr_match_against_templates(bgr, mask) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 197, in loftr_match_against_templates + inlier_count, confidence_pct = _loftr_pair( + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 167, in _loftr_pair + out = get_loftr()({"image0": tensor_q, "image1": tensor_t}) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 59, in get_loftr + _loftr = KF.LoFTR(pretrained="outdoor").eval().to(DEVICE) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1340, in to + return self._apply(convert) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 900, in _apply + module._apply(fn) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 988, in _apply + self._buffers[key] = fn(buf) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1326, in convert + return t.to( +torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 64.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 84.50 MiB is free. Process 148439 has 226.52 MiB memory in use. Including non-PyTorch memory, this process has 6.24 GiB memory in use. Of the allocated memory 32.58 MiB is allocated by PyTorch, and 1.42 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables) +2026-07-30 17:57:58,042 INFO [pipeline.engine] [3ec42cd9512d] LoFTR: 0.19s (FAILED: CUDA out of memory. Tried to allocate 64.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 84.50 MiB is free. Process 148439 has 226.52 MiB memory in use. Including non-PyTorch memory, this process has 6.24 GiB memory in use. Of the allocated memory 32.58 MiB is allocated by PyTorch, and 1.42 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)) +2026-07-30 17:57:58,069 INFO [pipeline.engine] [3ec42cd9512d] total: 1.88s, weighted best: SKU_1 +2026-07-30 17:57:58,150 INFO [pipeline.engine] [3ec42cd9512d] done, peak RSS so far: 2593 MB +2026-07-30 17:57:58,153 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:57:58] "POST /api/match HTTP/1.1" 200 - +2026-07-30 17:58:56,239 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 17:58:56,239 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 17:59:41,727 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 17:59:41,727 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 17:59:41,852 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 17:59:42,830 INFO [pipeline.engine] template ready: SKU_1 +2026-07-30 17:59:42,870 INFO [pipeline.engine] template ready: SKU_2 +2026-07-30 17:59:42,955 INFO [pipeline.engine] template ready: SKU_3 +2026-07-30 17:59:43,023 INFO [pipeline.engine] template ready: SKU_4 +2026-07-30 17:59:43,060 INFO [pipeline.engine] template ready: SKU_5 +2026-07-30 17:59:43,126 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-30 17:59:43,126 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-30 17:59:43,127 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 17:59:43,127 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 17:59:47,298 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:59:47] "GET / HTTP/1.1" 200 - +2026-07-30 17:59:47,355 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:59:47] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-30 17:59:47,356 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:59:47] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-30 17:59:47,400 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:59:47] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-30 17:59:47,402 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:59:47] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-30 17:59:47,403 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:59:47] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-30 17:59:47,404 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:59:47] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-30 17:59:47,405 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:59:47] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-30 17:59:47,406 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 17:59:47] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-30 18:00:03,965 INFO [pipeline.engine] [5b27b595d650] new upload: '20260727_160253.jpg' (13526.9 KB) +2026-07-30 18:00:05,580 INFO [pipeline.bg_removal] Resized upload (16320, 7532) -> (1600, 738) before processing +2026-07-30 18:00:07,927 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-30 18:00:07,927 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-30 18:00:18,457 INFO [pipeline.engine] [5b27b595d650] background removal: 14.49s +2026-07-30 18:00:18,762 INFO [pipeline.engine] [5b27b595d650] SIFT: 0.28s +2026-07-30 18:00:19,138 INFO [pipeline.engine] [5b27b595d650] ORB: 0.36s +2026-07-30 18:00:19,218 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-30 18:00:20,356 INFO [pipeline.engine] [5b27b595d650] SuperGlue: 1.22s +2026-07-30 18:00:20,374 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 18:00:20,920 INFO [pipeline.engine] [5b27b595d650] LoFTR: 0.56s +2026-07-30 18:00:20,962 INFO [pipeline.engine] [5b27b595d650] total: 17.00s, weighted best: SKU_5 +2026-07-30 18:00:21,037 INFO [pipeline.engine] [5b27b595d650] done, peak RSS so far: 7976 MB +2026-07-30 18:00:21,039 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:00:21] "POST /api/match HTTP/1.1" 200 - +2026-07-30 18:00:21,061 INFO [__main__] [5b27b595d650] verifying against SKU_5 via external endpoint +2026-07-30 18:00:21,063 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:00:21] "GET /uploads/5b27b595d650/original.jpg HTTP/1.1" 200 - +2026-07-30 18:00:21,066 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:00:21] "GET /uploads/5b27b595d650/ORB_best.png HTTP/1.1" 200 - +2026-07-30 18:00:21,067 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:00:21] "GET /uploads/5b27b595d650/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 18:00:21,067 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:00:21] "GET /uploads/5b27b595d650/nobg.png HTTP/1.1" 200 - +2026-07-30 18:00:21,069 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:00:21] "GET /uploads/5b27b595d650/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 18:00:21,079 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:00:21] "GET /uploads/5b27b595d650/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 18:00:32,909 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:00:32] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 18:01:38,509 INFO [pipeline.engine] [5363d7577174] new upload: '20260727_160253.jpg' (13526.9 KB) +2026-07-30 18:01:38,541 INFO [pipeline.engine] [5363d7577174] background removal: 0.03s +2026-07-30 18:01:38,844 INFO [pipeline.engine] [5363d7577174] SIFT: 0.28s +2026-07-30 18:01:39,179 INFO [pipeline.engine] [5363d7577174] ORB: 0.34s +2026-07-30 18:01:40,205 INFO [pipeline.engine] [5363d7577174] SuperGlue: 1.03s +2026-07-30 18:01:40,557 INFO [pipeline.engine] [5363d7577174] LoFTR: 0.34s +2026-07-30 18:01:40,598 INFO [pipeline.engine] [5363d7577174] total: 2.09s, weighted best: SKU_5 +2026-07-30 18:01:40,675 INFO [pipeline.engine] [5363d7577174] done, peak RSS so far: 8097 MB +2026-07-30 18:01:40,676 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:01:40] "POST /api/match HTTP/1.1" 200 - +2026-07-30 18:01:40,690 INFO [__main__] [5363d7577174] verifying against SKU_5 via external endpoint +2026-07-30 18:01:40,691 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:01:40] "GET /uploads/5363d7577174/nobg.png HTTP/1.1" 200 - +2026-07-30 18:01:40,692 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:01:40] "GET /uploads/5363d7577174/original.jpg HTTP/1.1" 200 - +2026-07-30 18:01:40,694 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:01:40] "GET /uploads/5363d7577174/ORB_best.png HTTP/1.1" 200 - +2026-07-30 18:01:40,695 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:01:40] "GET /uploads/5363d7577174/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 18:01:40,696 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:01:40] "GET /uploads/5363d7577174/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 18:01:40,698 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:01:40] "GET /uploads/5363d7577174/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 18:01:49,587 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:01:49] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 18:01:50,196 INFO [pipeline.engine] [b170179d349e] new upload: '20260727_160728.jpg' (12801.3 KB) +2026-07-30 18:01:51,732 INFO [pipeline.bg_removal] Resized upload (16320, 7532) -> (1600, 738) before processing +2026-07-30 18:02:02,175 INFO [pipeline.engine] [b170179d349e] background removal: 11.97s +2026-07-30 18:02:02,534 INFO [pipeline.engine] [b170179d349e] SIFT: 0.33s +2026-07-30 18:02:02,876 INFO [pipeline.engine] [b170179d349e] ORB: 0.34s +2026-07-30 18:02:03,839 INFO [pipeline.engine] [b170179d349e] SuperGlue: 0.96s +2026-07-30 18:02:04,187 INFO [pipeline.engine] [b170179d349e] LoFTR: 0.34s +2026-07-30 18:02:04,387 INFO [pipeline.engine] [b170179d349e] total: 14.19s, weighted best: SKU_3 +2026-07-30 18:02:04,466 INFO [pipeline.engine] [b170179d349e] done, peak RSS so far: 13069 MB +2026-07-30 18:02:04,468 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:02:04] "POST /api/match HTTP/1.1" 200 - +2026-07-30 18:02:04,513 INFO [__main__] [b170179d349e] verifying against SKU_3 via external endpoint +2026-07-30 18:02:04,514 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:02:04] "GET /uploads/b170179d349e/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 18:02:04,515 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:02:04] "GET /uploads/b170179d349e/nobg.png HTTP/1.1" 200 - +2026-07-30 18:02:04,516 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:02:04] "GET /uploads/b170179d349e/original.jpg HTTP/1.1" 200 - +2026-07-30 18:02:04,517 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:02:04] "GET /uploads/b170179d349e/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 18:02:04,518 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:02:04] "GET /uploads/b170179d349e/ORB_best.png HTTP/1.1" 200 - +2026-07-30 18:02:04,521 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:02:04] "GET /uploads/b170179d349e/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 18:02:13,768 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:02:13] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 18:08:56,992 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:08:56] "GET / HTTP/1.1" 200 - +2026-07-30 18:08:57,299 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:08:57] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-30 18:08:57,334 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:08:57] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-30 18:08:57,619 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:08:57] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-30 18:08:57,629 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:08:57] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-30 18:08:57,638 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:08:57] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-30 18:08:57,640 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:08:57] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-30 18:08:57,645 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:08:57] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-30 18:08:57,652 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:08:57] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-30 18:12:02,960 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 18:12:02,960 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 18:12:03,080 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 18:12:04,638 INFO [pipeline.engine] template ready: SKU_1 +2026-07-30 18:12:04,708 INFO [pipeline.engine] template ready: SKU_2 +2026-07-30 18:12:04,827 INFO [pipeline.engine] template ready: SKU_3 +2026-07-30 18:12:04,925 INFO [pipeline.engine] template ready: SKU_4 +2026-07-30 18:12:04,973 INFO [pipeline.engine] template ready: SKU_5 +2026-07-30 18:12:05,095 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-30 18:12:05,095 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-30 18:12:05,108 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 18:12:05,108 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 18:12:15,604 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:12:15] "GET / HTTP/1.1" 200 - +2026-07-30 18:12:43,515 INFO [pipeline.engine] [1f00b097455d] new upload: 'image103.jpeg' (115.1 KB) +2026-07-30 18:12:43,545 INFO [pipeline.engine] [1f00b097455d] background removal: 0.03s +2026-07-30 18:12:43,805 INFO [pipeline.engine] [1f00b097455d] SIFT: 0.24s +2026-07-30 18:12:44,158 INFO [pipeline.engine] [1f00b097455d] ORB: 0.33s +2026-07-30 18:12:44,226 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-30 18:12:45,452 INFO [pipeline.engine] [1f00b097455d] SuperGlue: 1.29s +2026-07-30 18:12:45,465 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 18:12:46,086 INFO [pipeline.engine] [1f00b097455d] LoFTR: 0.63s +2026-07-30 18:12:46,243 INFO [pipeline.engine] [1f00b097455d] color analysis: 0.12s +2026-07-30 18:12:46,243 INFO [pipeline.engine] [1f00b097455d] total: 2.73s, weighted best: SKU_5 +2026-07-30 18:12:46,328 INFO [pipeline.engine] [1f00b097455d] done, peak RSS so far: 1742 MB +2026-07-30 18:12:46,329 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:12:46] "POST /api/match HTTP/1.1" 200 - +2026-07-30 18:13:41,106 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:41] "GET / HTTP/1.1" 200 - +2026-07-30 18:13:41,124 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:41] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 18:13:41,124 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:41] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 18:13:41,390 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:41] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-30 18:13:41,391 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:41] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-30 18:13:41,392 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:41] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-30 18:13:41,393 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:41] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-30 18:13:41,394 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:41] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-30 18:13:41,395 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:41] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-30 18:13:41,463 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:41] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-30 18:13:44,314 INFO [pipeline.engine] [caeeb00e0c61] new upload: 'image100.jpeg' (102.5 KB) +2026-07-30 18:13:44,352 INFO [pipeline.engine] [caeeb00e0c61] background removal: 0.04s +2026-07-30 18:13:44,689 INFO [pipeline.engine] [caeeb00e0c61] SIFT: 0.32s +2026-07-30 18:13:45,027 INFO [pipeline.engine] [caeeb00e0c61] ORB: 0.34s +2026-07-30 18:13:46,112 INFO [pipeline.engine] [caeeb00e0c61] SuperGlue: 1.08s +2026-07-30 18:13:46,456 INFO [pipeline.engine] [caeeb00e0c61] LoFTR: 0.34s +2026-07-30 18:13:46,532 INFO [pipeline.engine] [caeeb00e0c61] color analysis: 0.04s +2026-07-30 18:13:46,532 INFO [pipeline.engine] [caeeb00e0c61] total: 2.22s, weighted best: SKU_5 +2026-07-30 18:13:46,616 INFO [pipeline.engine] [caeeb00e0c61] done, peak RSS so far: 1856 MB +2026-07-30 18:13:46,617 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:46] "POST /api/match HTTP/1.1" 200 - +2026-07-30 18:13:46,662 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:46] "GET /uploads/caeeb00e0c61/original.jpeg HTTP/1.1" 200 - +2026-07-30 18:13:46,663 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:46] "GET /uploads/caeeb00e0c61/nobg.png HTTP/1.1" 200 - +2026-07-30 18:13:46,664 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:46] "GET /uploads/caeeb00e0c61/ORB_best.png HTTP/1.1" 200 - +2026-07-30 18:13:46,664 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:46] "GET /uploads/caeeb00e0c61/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 18:13:46,664 INFO [__main__] [caeeb00e0c61] verifying against SKU_5 via external endpoint +2026-07-30 18:13:46,665 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:46] "GET /uploads/caeeb00e0c61/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 18:13:46,671 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:46] "GET /uploads/caeeb00e0c61/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 18:13:50,962 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:13:50] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 18:14:14,165 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:14] "GET / HTTP/1.1" 200 - +2026-07-30 18:14:30,917 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:30] "GET / HTTP/1.1" 200 - +2026-07-30 18:14:30,953 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:30] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 18:14:30,954 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:30] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 18:14:30,958 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:30] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-30 18:14:30,959 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:30] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-30 18:14:30,959 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:30] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-30 18:14:30,960 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:30] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-30 18:14:30,961 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:30] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-30 18:14:30,962 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:30] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-30 18:14:42,562 INFO [pipeline.utils] Compressed upload: 15.9 MB -> 0.3 MB (738x1600, JPEG q92) +2026-07-30 18:14:42,562 INFO [pipeline.engine] [9abdb5bfcad2] new upload: '20260727_174822.jpg' (286.9 KB) +2026-07-30 18:14:44,818 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CUDAExecutionProvider', 'CPUExecutionProvider'] +2026-07-30 18:14:45,681 INFO [pipeline.engine] [9abdb5bfcad2] background removal: 3.12s +2026-07-30 18:14:45,978 INFO [pipeline.engine] [9abdb5bfcad2] SIFT: 0.27s +2026-07-30 18:14:46,311 INFO [pipeline.engine] [9abdb5bfcad2] ORB: 0.33s +2026-07-30 18:14:46,327 ERROR [pipeline.engine] Method SuperGlue failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 120, in _timed + result = fn(*args) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 98, in _run_superglue + return deep.superglue_match_against_templates(bgr, mask) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 141, in superglue_match_against_templates + feats_q, mask_q = superpoint_extract(bgr, mask) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 99, in superpoint_extract + feats = get_superpoint().extract(tensor) + File "/home/suman/.local/lib/python3.10/site-packages/torch/utils/_contextlib.py", line 116, in decorate_context + return func(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/lightglue/utils.py", line 144, in extract + feats = self.forward({"image": img}) + File "/home/suman/.local/lib/python3.10/site-packages/lightglue/superpoint.py", line 159, in forward + x = self.relu(self.conv1a(image)) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1747, in _call_impl + return forward_call(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/conv.py", line 554, in forward + return self._conv_forward(input, self.weight, self.bias) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/conv.py", line 549, in _conv_forward + return F.conv2d( +torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 118.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 70.81 MiB is free. Process 148439 has 236.52 MiB memory in use. Including non-PyTorch memory, this process has 6.20 GiB memory in use. Of the allocated memory 177.40 MiB is allocated by PyTorch, and 2.60 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables) +2026-07-30 18:14:46,348 INFO [pipeline.engine] [9abdb5bfcad2] SuperGlue: 0.04s (FAILED: CUDA out of memory. Tried to allocate 118.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 70.81 MiB is free. Process 148439 has 236.52 MiB memory in use. Including non-PyTorch memory, this process has 6.20 GiB memory in use. Of the allocated memory 177.40 MiB is allocated by PyTorch, and 2.60 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)) +2026-07-30 18:14:46,365 ERROR [pipeline.engine] Method LoFTR failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 120, in _timed + result = fn(*args) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 102, in _run_loftr + return deep.loftr_match_against_templates(bgr, mask) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 197, in loftr_match_against_templates + inlier_count, confidence_pct = _loftr_pair( + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/deep.py", line 167, in _loftr_pair + out = get_loftr()({"image0": tensor_q, "image1": tensor_t}) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1747, in _call_impl + return forward_call(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/kornia/feature/loftr/loftr.py", line 151, in forward + (feat_c0, feat_f0), (feat_c1, feat_f1) = self.backbone(data["image0"]), self.backbone(data["image1"]) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1747, in _call_impl + return forward_call(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/kornia/feature/loftr/backbone/resnet_fpn.py", line 121, in forward + x1 = self.layer1(x0) # 1/2 + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1747, in _call_impl + return forward_call(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/container.py", line 250, in forward + input = module(input) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1747, in _call_impl + return forward_call(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/kornia/feature/loftr/backbone/resnet_fpn.py", line 52, in forward + y = self.relu(self.bn1(self.conv1(y))) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl + return self._call_impl(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1747, in _call_impl + return forward_call(*args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/modules/batchnorm.py", line 193, in forward + return F.batch_norm( + File "/home/suman/.local/lib/python3.10/site-packages/torch/nn/functional.py", line 2812, in batch_norm + return torch.batch_norm( +torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 14.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 51.56 MiB is free. Process 148439 has 226.52 MiB memory in use. Including non-PyTorch memory, this process has 6.22 GiB memory in use. Of the allocated memory 197.48 MiB is allocated by PyTorch, and 2.52 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables) +2026-07-30 18:14:46,368 INFO [pipeline.engine] [9abdb5bfcad2] LoFTR: 0.02s (FAILED: CUDA out of memory. Tried to allocate 14.00 MiB. GPU 0 has a total capacity of 7.91 GiB of which 51.56 MiB is free. Process 148439 has 226.52 MiB memory in use. Including non-PyTorch memory, this process has 6.22 GiB memory in use. Of the allocated memory 197.48 MiB is allocated by PyTorch, and 2.52 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)) +2026-07-30 18:14:46,433 INFO [pipeline.engine] [9abdb5bfcad2] color analysis: 0.04s +2026-07-30 18:14:46,433 INFO [pipeline.engine] [9abdb5bfcad2] total: 3.87s, weighted best: SKU_5 +2026-07-30 18:14:46,516 INFO [pipeline.engine] [9abdb5bfcad2] done, peak RSS so far: 2914 MB +2026-07-30 18:14:46,518 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:46] "POST /api/match HTTP/1.1" 200 - +2026-07-30 18:14:46,688 INFO [__main__] [9abdb5bfcad2] verifying against SKU_5 via external endpoint +2026-07-30 18:14:46,689 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:46] "GET /uploads/9abdb5bfcad2/nobg.png HTTP/1.1" 200 - +2026-07-30 18:14:46,690 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:46] "GET /uploads/9abdb5bfcad2/original.jpg HTTP/1.1" 200 - +2026-07-30 18:14:46,691 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:46] "GET /uploads/9abdb5bfcad2/ORB_best.png HTTP/1.1" 200 - +2026-07-30 18:14:46,692 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:46] "GET /uploads/9abdb5bfcad2/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 18:14:50,795 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:14:50] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 18:16:14,238 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 18:16:14,238 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 18:16:14,355 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 18:16:18,738 INFO [pipeline.engine] template ready: SKU_1 +2026-07-30 18:16:18,797 INFO [pipeline.engine] template ready: SKU_2 +2026-07-30 18:16:18,939 INFO [pipeline.engine] template ready: SKU_3 +2026-07-30 18:16:19,034 INFO [pipeline.engine] template ready: SKU_4 +2026-07-30 18:16:19,083 INFO [pipeline.engine] template ready: SKU_5 +2026-07-30 18:16:19,177 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-30 18:16:19,177 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-30 18:16:19,193 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 18:16:19,194 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 18:16:31,736 INFO [pipeline.utils] Compressed upload: 15.9 MB -> 0.3 MB (738x1600, JPEG q92) +2026-07-30 18:16:31,737 INFO [pipeline.engine] [e4adfe19f964] new upload: '20260727_174822.jpg' (286.9 KB) +2026-07-30 18:16:31,751 INFO [pipeline.engine] [e4adfe19f964] background removal: 0.01s +2026-07-30 18:16:32,051 INFO [pipeline.engine] [e4adfe19f964] SIFT: 0.28s +2026-07-30 18:16:32,389 INFO [pipeline.engine] [e4adfe19f964] ORB: 0.33s +2026-07-30 18:16:32,445 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-30 18:16:33,664 INFO [pipeline.engine] [e4adfe19f964] SuperGlue: 1.28s +2026-07-30 18:16:33,680 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-30 18:16:34,207 INFO [pipeline.engine] [e4adfe19f964] LoFTR: 0.54s +2026-07-30 18:16:34,634 INFO [pipeline.engine] [e4adfe19f964] color analysis: 0.38s +2026-07-30 18:16:34,634 INFO [pipeline.engine] [e4adfe19f964] total: 2.90s, weighted best: SKU_3 +2026-07-30 18:16:34,709 INFO [pipeline.engine] [e4adfe19f964] done, peak RSS so far: 2228 MB +2026-07-30 18:16:34,711 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:16:34] "POST /api/match HTTP/1.1" 200 - +2026-07-30 18:16:34,728 INFO [__main__] [e4adfe19f964] verifying against SKU_3 via external endpoint +2026-07-30 18:16:34,730 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:16:34] "GET /uploads/e4adfe19f964/nobg.png HTTP/1.1" 200 - +2026-07-30 18:16:34,731 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:16:34] "GET /uploads/e4adfe19f964/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 18:16:34,732 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:16:34] "GET /uploads/e4adfe19f964/original.jpg HTTP/1.1" 200 - +2026-07-30 18:16:34,734 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:16:34] "GET /uploads/e4adfe19f964/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 18:16:34,737 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:16:34] "GET /uploads/e4adfe19f964/ORB_best.png HTTP/1.1" 200 - +2026-07-30 18:16:34,739 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:16:34] "GET /uploads/e4adfe19f964/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 18:16:40,691 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:16:40] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 18:29:14,238 INFO [pipeline.engine] [d3ac19f5db22] new upload: '20260727_193610.jpg' (10858.6 KB) +2026-07-30 18:29:15,816 INFO [pipeline.bg_removal] Resized upload (16320, 7532) -> (1600, 738) before processing +2026-07-30 18:29:18,249 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-30 18:29:18,249 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-30 18:29:28,799 INFO [pipeline.engine] [d3ac19f5db22] background removal: 14.56s +2026-07-30 18:29:29,030 INFO [pipeline.engine] [d3ac19f5db22] SIFT: 0.21s +2026-07-30 18:29:29,374 INFO [pipeline.engine] [d3ac19f5db22] ORB: 0.34s +2026-07-30 18:29:30,323 INFO [pipeline.engine] [d3ac19f5db22] SuperGlue: 0.95s +2026-07-30 18:29:30,670 INFO [pipeline.engine] [d3ac19f5db22] LoFTR: 0.34s +2026-07-30 18:29:30,752 INFO [pipeline.engine] [d3ac19f5db22] color analysis: 0.04s +2026-07-30 18:29:30,752 INFO [pipeline.engine] [d3ac19f5db22] total: 16.51s, weighted best: SKU_5 +2026-07-30 18:29:30,829 INFO [pipeline.engine] [d3ac19f5db22] done, peak RSS so far: 8088 MB +2026-07-30 18:29:30,831 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:29:30] "POST /api/match HTTP/1.1" 200 - +2026-07-30 18:29:30,850 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:29:30] "GET /uploads/d3ac19f5db22/original.jpg HTTP/1.1" 200 - +2026-07-30 18:29:30,852 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:29:30] "GET /uploads/d3ac19f5db22/nobg.png HTTP/1.1" 200 - +2026-07-30 18:29:30,852 INFO [__main__] [d3ac19f5db22] verifying against SKU_5 via external endpoint +2026-07-30 18:29:30,853 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:29:30] "GET /uploads/d3ac19f5db22/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 18:29:30,856 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:29:30] "GET /uploads/d3ac19f5db22/ORB_best.png HTTP/1.1" 200 - +2026-07-30 18:29:30,856 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:29:30] "GET /uploads/d3ac19f5db22/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 18:29:30,865 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:29:30] "GET /uploads/d3ac19f5db22/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 18:29:51,728 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:29:51] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 18:30:39,217 INFO [pipeline.utils] Compressed upload: 15.5 MB -> 0.3 MB (738x1600, JPEG q92) +2026-07-30 18:30:39,217 INFO [pipeline.engine] [ee09453157b1] new upload: '20260727_194450.jpg' (260.6 KB) +2026-07-30 18:30:49,955 INFO [pipeline.engine] [ee09453157b1] background removal: 10.74s +2026-07-30 18:30:50,718 INFO [pipeline.engine] [ee09453157b1] SIFT: 0.33s +2026-07-30 18:30:51,043 INFO [pipeline.engine] [ee09453157b1] ORB: 0.33s +2026-07-30 18:30:51,987 INFO [pipeline.engine] [ee09453157b1] SuperGlue: 0.94s +2026-07-30 18:30:52,332 INFO [pipeline.engine] [ee09453157b1] LoFTR: 0.34s +2026-07-30 18:30:52,465 INFO [pipeline.engine] [ee09453157b1] color analysis: 0.05s +2026-07-30 18:30:52,465 INFO [pipeline.engine] [ee09453157b1] total: 13.25s, weighted best: SKU_1 +2026-07-30 18:30:52,544 INFO [pipeline.engine] [ee09453157b1] done, peak RSS so far: 12720 MB +2026-07-30 18:30:52,547 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:30:52] "POST /api/match HTTP/1.1" 200 - +2026-07-30 18:30:52,690 INFO [__main__] [ee09453157b1] verifying against SKU_1 via external endpoint +2026-07-30 18:30:52,692 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:30:52] "GET /uploads/ee09453157b1/nobg.png HTTP/1.1" 200 - +2026-07-30 18:30:52,693 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:30:52] "GET /uploads/ee09453157b1/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 18:30:52,694 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:30:52] "GET /uploads/ee09453157b1/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 18:30:52,694 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:30:52] "GET /uploads/ee09453157b1/ORB_best.png HTTP/1.1" 200 - +2026-07-30 18:30:52,698 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:30:52] "GET /uploads/ee09453157b1/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 18:30:52,708 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:30:52] "GET /uploads/ee09453157b1/original.jpg HTTP/1.1" 200 - +2026-07-30 18:30:56,993 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:30:56] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 18:34:26,151 INFO [pipeline.engine] [44cc9c2a1cc4] new upload: '20260727_163614.jpg' (6208.3 KB) +2026-07-30 18:34:26,611 INFO [pipeline.bg_removal] Resized upload (8160, 3768) -> (1600, 738) before processing +2026-07-30 18:34:37,207 INFO [pipeline.engine] [44cc9c2a1cc4] background removal: 11.05s +2026-07-30 18:34:37,613 INFO [pipeline.engine] [44cc9c2a1cc4] SIFT: 0.38s +2026-07-30 18:34:37,969 INFO [pipeline.engine] [44cc9c2a1cc4] ORB: 0.36s +2026-07-30 18:34:38,918 INFO [pipeline.engine] [44cc9c2a1cc4] SuperGlue: 0.95s +2026-07-30 18:34:39,277 INFO [pipeline.engine] [44cc9c2a1cc4] LoFTR: 0.35s +2026-07-30 18:34:39,385 INFO [pipeline.engine] [44cc9c2a1cc4] color analysis: 0.04s +2026-07-30 18:34:39,385 INFO [pipeline.engine] [44cc9c2a1cc4] total: 13.23s, weighted best: SKU_2 +2026-07-30 18:34:39,460 INFO [pipeline.engine] [44cc9c2a1cc4] done, peak RSS so far: 12831 MB +2026-07-30 18:34:39,461 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:34:39] "POST /api/match HTTP/1.1" 200 - +2026-07-30 18:34:39,480 INFO [__main__] [44cc9c2a1cc4] verifying against SKU_2 via external endpoint +2026-07-30 18:34:39,481 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:34:39] "GET /uploads/44cc9c2a1cc4/LoFTR_best.png HTTP/1.1" 200 - +2026-07-30 18:34:39,482 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:34:39] "GET /uploads/44cc9c2a1cc4/nobg.png HTTP/1.1" 200 - +2026-07-30 18:34:39,483 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:34:39] "GET /uploads/44cc9c2a1cc4/original.jpg HTTP/1.1" 200 - +2026-07-30 18:34:39,486 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:34:39] "GET /uploads/44cc9c2a1cc4/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-30 18:34:39,487 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:34:39] "GET /uploads/44cc9c2a1cc4/SIFT_best.png HTTP/1.1" 200 - +2026-07-30 18:34:39,488 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:34:39] "GET /uploads/44cc9c2a1cc4/ORB_best.png HTTP/1.1" 200 - +2026-07-30 18:34:47,815 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:34:47] "POST /api/verify HTTP/1.1" 200 - +2026-07-30 18:53:13,184 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-30 18:53:13,224 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-30 18:53:13,979 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-30 18:53:21,840 INFO [pipeline.engine] template ready: SKU_1 +2026-07-30 18:53:21,894 INFO [pipeline.engine] template ready: SKU_2 +2026-07-30 18:53:22,107 INFO [pipeline.engine] template ready: SKU_3 +2026-07-30 18:53:22,197 INFO [pipeline.engine] template ready: SKU_4 +2026-07-30 18:53:22,271 INFO [pipeline.engine] template ready: SKU_5 +2026-07-30 18:53:22,364 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-30 18:53:22,364 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-30 18:53:22,384 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-30 18:53:22,384 INFO [werkzeug] Press CTRL+C to quit +2026-07-30 18:53:31,891 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:31] "GET / HTTP/1.1" 200 - +2026-07-30 18:53:31,934 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:31] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-30 18:53:31,935 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:31] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-30 18:53:31,995 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:31] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-30 18:53:31,996 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:31] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-30 18:53:31,996 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:31] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-30 18:53:31,997 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:31] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-30 18:53:31,997 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:31] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-30 18:53:31,999 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:31] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-30 18:53:37,866 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:37] "GET / HTTP/1.1" 200 - +2026-07-30 18:53:38,155 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:38] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-30 18:53:38,178 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:38] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-30 18:53:38,186 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:38] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 18:53:38,422 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:38] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-30 18:53:38,429 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:38] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 18:53:38,459 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:38] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-30 18:53:38,674 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:38] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-30 18:53:38,731 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 18:53:38] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-30 23:45:54,610 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 23:45:54] "GET / HTTP/1.1" 200 - +2026-07-30 23:45:54,922 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 23:45:54] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-30 23:45:54,965 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 23:45:54] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-30 23:45:55,270 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 23:45:55] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-30 23:45:55,274 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 23:45:55] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-30 23:45:55,328 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 23:45:55] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-30 23:45:55,329 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 23:45:55] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-30 23:45:55,341 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 23:45:55] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-30 23:45:55,344 INFO [werkzeug] 127.0.0.1 - - [30/Jul/2026 23:45:55] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 00:17:36,245 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 00:17:36] "GET / HTTP/1.1" 200 - +2026-07-31 01:20:05,476 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 01:20:05] "GET / HTTP/1.1" 200 - +2026-07-31 01:20:05,804 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 01:20:05] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 01:20:05,858 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 01:20:05] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 10:26:47,669 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 10:26:47,669 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 10:26:47,786 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 10:26:48,984 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 10:26:49,037 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 10:26:49,149 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 10:26:49,245 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 10:26:49,293 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 10:26:49,388 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 10:26:49,388 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 10:26:49,389 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 10:26:49,389 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 11:25:38,888 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:25:38] "GET / HTTP/1.1" 200 - +2026-07-31 11:25:39,401 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:25:39] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 11:25:39,423 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:25:39] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 11:25:39,724 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:25:39] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 11:25:39,736 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:25:39] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 11:25:40,499 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:25:40] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 11:25:40,515 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:25:40] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 11:25:40,515 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:25:40] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 11:25:40,562 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:25:40] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 11:25:40,622 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:25:40] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-31 11:32:11,558 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:11] "HEAD / HTTP/1.1" 200 - +2026-07-31 11:32:17,303 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:17] "GET / HTTP/1.1" 200 - +2026-07-31 11:32:17,642 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:17] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 11:32:17,652 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:17] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 11:32:18,318 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:18] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 11:32:18,319 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:18] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 11:32:18,375 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:18] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 11:32:18,375 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:18] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 11:32:18,397 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:18] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 11:32:18,398 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:18] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 11:32:49,854 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:49] "GET / HTTP/1.1" 200 - +2026-07-31 11:32:50,280 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:50] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 11:32:50,283 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:50] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 11:32:50,599 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:50] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 11:32:50,601 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:50] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 11:32:50,606 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:50] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 11:32:50,609 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:50] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 11:32:50,624 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:50] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 11:32:50,629 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:50] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 11:32:50,684 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:32:50] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-31 11:33:23,622 INFO [pipeline.engine] [0907ac3fb902] new upload: '20260727_160715.jpg' (13295.0 KB) +2026-07-31 11:33:25,266 INFO [pipeline.bg_removal] Resized upload (16320, 7532) -> (1600, 738) before processing +2026-07-31 11:33:27,694 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-31 11:33:27,694 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-31 11:33:37,847 INFO [pipeline.engine] [0907ac3fb902] background removal: 14.20s +2026-07-31 11:33:38,320 INFO [pipeline.engine] [0907ac3fb902] SIFT: 0.44s +2026-07-31 11:33:38,642 INFO [pipeline.engine] [0907ac3fb902] ORB: 0.31s +2026-07-31 11:33:39,392 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 11:33:41,116 INFO [pipeline.engine] [0907ac3fb902] SuperGlue: 2.47s +2026-07-31 11:33:41,132 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 11:33:42,198 INFO [pipeline.engine] [0907ac3fb902] LoFTR: 1.08s +2026-07-31 11:33:42,439 INFO [pipeline.engine] [0907ac3fb902] color analysis: 0.14s +2026-07-31 11:33:42,439 INFO [pipeline.engine] [0907ac3fb902] total: 18.79s, weighted best: SKU_4 +2026-07-31 11:33:42,507 INFO [pipeline.engine] [0907ac3fb902] done, peak RSS so far: 7948 MB +2026-07-31 11:33:42,509 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "POST /api/match HTTP/1.1" 200 - +2026-07-31 11:33:42,616 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 11:33:42,617 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /uploads/0907ac3fb902/original.jpg HTTP/1.1" 200 - +2026-07-31 11:33:42,618 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 11:33:42,619 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /uploads/0907ac3fb902/nobg.png HTTP/1.1" 200 - +2026-07-31 11:33:42,621 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 11:33:42,621 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /uploads/0907ac3fb902/ORB_best.png HTTP/1.1" 200 - +2026-07-31 11:33:42,648 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /uploads/0907ac3fb902/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 11:33:42,649 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /uploads/0907ac3fb902/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 11:33:42,650 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 11:33:42,651 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 11:33:42,652 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 11:33:42,654 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:33:42] "GET /uploads/0907ac3fb902/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 11:38:09,215 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 11:38:09,215 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 11:38:09,328 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 11:38:10,374 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 11:38:10,427 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 11:38:10,539 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 11:38:10,637 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 11:38:10,683 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 11:38:10,779 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 11:38:10,779 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 11:38:10,793 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 11:38:10,793 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 11:38:24,303 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:38:24] "GET / HTTP/1.1" 200 - +2026-07-31 11:39:05,485 INFO [pipeline.engine] [24bae8eb22c2] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-07-31 11:39:05,535 INFO [pipeline.engine] [24bae8eb22c2] background removal: 0.04s +2026-07-31 11:39:05,881 INFO [pipeline.engine] [24bae8eb22c2] SIFT: 0.32s +2026-07-31 11:39:06,228 INFO [pipeline.engine] [24bae8eb22c2] ORB: 0.34s +2026-07-31 11:39:06,292 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 11:39:07,397 INFO [pipeline.engine] [24bae8eb22c2] SuperGlue: 1.17s +2026-07-31 11:39:07,412 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 11:39:07,984 INFO [pipeline.engine] [24bae8eb22c2] LoFTR: 0.58s +2026-07-31 11:39:08,151 INFO [pipeline.engine] [24bae8eb22c2] color analysis: 0.13s +2026-07-31 11:39:08,272 INFO [pipeline.engine] [24bae8eb22c2] total: 2.79s, weighted best: SKU_1 +2026-07-31 11:39:08,355 INFO [pipeline.engine] [24bae8eb22c2] done, peak RSS so far: 1798 MB +2026-07-31 11:39:08,358 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:39:08] "POST /api/match HTTP/1.1" 200 - +2026-07-31 11:39:55,800 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:39:55] "GET / HTTP/1.1" 200 - +2026-07-31 11:39:55,816 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:39:55] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 11:39:55,816 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:39:55] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 11:39:56,098 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:39:56] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 11:39:56,098 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:39:56] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 11:39:56,099 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:39:56] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 11:39:56,100 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:39:56] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 11:39:56,101 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:39:56] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 11:39:56,101 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:39:56] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 11:39:56,489 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:39:56] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-31 11:39:59,017 INFO [pipeline.engine] [8b754216801b] new upload: 'image100.jpeg' (102.5 KB) +2026-07-31 11:39:59,054 INFO [pipeline.engine] [8b754216801b] background removal: 0.04s +2026-07-31 11:39:59,393 INFO [pipeline.engine] [8b754216801b] SIFT: 0.32s +2026-07-31 11:39:59,725 INFO [pipeline.engine] [8b754216801b] ORB: 0.33s +2026-07-31 11:40:00,762 INFO [pipeline.engine] [8b754216801b] SuperGlue: 1.04s +2026-07-31 11:40:01,146 INFO [pipeline.engine] [8b754216801b] LoFTR: 0.38s +2026-07-31 11:40:01,214 INFO [pipeline.engine] [8b754216801b] color analysis: 0.04s +2026-07-31 11:40:01,310 INFO [pipeline.engine] [8b754216801b] total: 2.29s, weighted best: SKU_5 +2026-07-31 11:40:01,397 INFO [pipeline.engine] [8b754216801b] done, peak RSS so far: 1907 MB +2026-07-31 11:40:01,398 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:40:01] "POST /api/match HTTP/1.1" 200 - +2026-07-31 11:40:01,445 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:40:01] "GET /uploads/8b754216801b/ORB_best.png HTTP/1.1" 200 - +2026-07-31 11:40:01,446 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:40:01] "GET /uploads/8b754216801b/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 11:40:01,447 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:40:01] "GET /uploads/8b754216801b/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 11:40:01,448 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:40:01] "GET /uploads/8b754216801b/nobg.png HTTP/1.1" 200 - +2026-07-31 11:40:01,448 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:40:01] "GET /uploads/8b754216801b/original.jpeg HTTP/1.1" 200 - +2026-07-31 11:40:01,449 INFO [__main__] [8b754216801b] verifying against SKU_5 via external endpoint +2026-07-31 11:40:01,456 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:40:01] "GET /uploads/8b754216801b/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 11:40:01,456 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:40:01] "GET /uploads/8b754216801b/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 11:40:01,457 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:40:01] "GET /uploads/8b754216801b/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 11:40:05,676 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:40:05] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 11:40:52,549 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:40:52] "GET / HTTP/1.1" 200 - +2026-07-31 11:42:03,591 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:03] "GET / HTTP/1.1" 200 - +2026-07-31 11:42:03,883 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:03] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 11:42:03,932 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:03] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 11:42:04,382 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:04] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 11:42:04,385 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:04] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 11:42:04,424 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:04] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 11:42:04,431 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:04] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 11:42:04,433 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:04] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 11:42:04,439 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:04] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 11:42:17,546 INFO [pipeline.engine] [ff615fce91a3] new upload: '20260727_163614.jpg' (6208.3 KB) +2026-07-31 11:42:17,575 INFO [pipeline.engine] [ff615fce91a3] background removal: 0.02s +2026-07-31 11:42:18,041 INFO [pipeline.engine] [ff615fce91a3] SIFT: 0.44s +2026-07-31 11:42:18,399 INFO [pipeline.engine] [ff615fce91a3] ORB: 0.36s +2026-07-31 11:42:19,907 INFO [pipeline.engine] [ff615fce91a3] SuperGlue: 1.51s +2026-07-31 11:42:20,610 INFO [pipeline.engine] [ff615fce91a3] LoFTR: 0.70s +2026-07-31 11:42:20,685 INFO [pipeline.engine] [ff615fce91a3] color analysis: 0.04s +2026-07-31 11:42:20,810 INFO [pipeline.engine] [ff615fce91a3] total: 3.26s, weighted best: SKU_2 +2026-07-31 11:42:20,897 INFO [pipeline.engine] [ff615fce91a3] done, peak RSS so far: 1998 MB +2026-07-31 11:42:20,898 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:20] "POST /api/match HTTP/1.1" 200 - +2026-07-31 11:42:21,010 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:21] "GET /uploads/ff615fce91a3/ORB_best.png HTTP/1.1" 200 - +2026-07-31 11:42:21,011 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:21] "GET /uploads/ff615fce91a3/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 11:42:21,012 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:21] "GET /uploads/ff615fce91a3/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 11:42:21,014 INFO [__main__] [ff615fce91a3] verifying against SKU_2 via external endpoint +2026-07-31 11:42:21,014 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:21] "GET /uploads/ff615fce91a3/original.jpg HTTP/1.1" 200 - +2026-07-31 11:42:21,015 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:21] "GET /uploads/ff615fce91a3/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 11:42:21,047 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:21] "GET /uploads/ff615fce91a3/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 11:42:21,049 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:21] "GET /uploads/ff615fce91a3/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 11:42:21,062 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:21] "GET /uploads/ff615fce91a3/nobg.png HTTP/1.1" 200 - +2026-07-31 11:42:39,640 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:42:39] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 11:49:23,609 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:49:23] "HEAD / HTTP/1.1" 200 - +2026-07-31 11:49:23,611 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:49:23] "HEAD / HTTP/1.1" 200 - +2026-07-31 11:51:44,165 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:51:44] "HEAD / HTTP/1.1" 200 - +2026-07-31 11:53:03,048 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:53:03] "GET / HTTP/1.1" 200 - +2026-07-31 11:53:03,373 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:53:03] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-31 11:53:03,379 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:53:03] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 11:53:03,736 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:53:03] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 11:53:03,746 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:53:03] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 11:53:03,757 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:53:03] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 11:53:03,773 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:53:03] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 11:53:03,774 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:53:03] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 11:53:03,781 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:53:03] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 11:54:36,309 INFO [pipeline.engine] [2d4882cdf164] new upload: '20260727_160715.jpg' (13295.0 KB) +2026-07-31 11:54:36,342 INFO [pipeline.engine] [2d4882cdf164] background removal: 0.03s +2026-07-31 11:54:36,757 INFO [pipeline.engine] [2d4882cdf164] SIFT: 0.39s +2026-07-31 11:54:37,048 INFO [pipeline.engine] [2d4882cdf164] ORB: 0.29s +2026-07-31 11:54:37,980 INFO [pipeline.engine] [2d4882cdf164] SuperGlue: 0.93s +2026-07-31 11:54:38,349 INFO [pipeline.engine] [2d4882cdf164] LoFTR: 0.36s +2026-07-31 11:54:38,429 INFO [pipeline.engine] [2d4882cdf164] color analysis: 0.04s +2026-07-31 11:54:38,580 INFO [pipeline.engine] [2d4882cdf164] total: 2.27s, weighted best: SKU_4 +2026-07-31 11:54:38,659 INFO [pipeline.engine] [2d4882cdf164] done, peak RSS so far: 2105 MB +2026-07-31 11:54:38,663 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:38] "POST /api/match HTTP/1.1" 200 - +2026-07-31 11:54:39,311 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /uploads/2d4882cdf164/original.jpg HTTP/1.1" 200 - +2026-07-31 11:54:39,315 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 11:54:39,363 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 11:54:39,364 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /uploads/2d4882cdf164/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 11:54:39,365 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /uploads/2d4882cdf164/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 11:54:39,418 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /uploads/2d4882cdf164/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 11:54:39,419 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /uploads/2d4882cdf164/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 11:54:39,443 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 11:54:39,444 INFO [__main__] [2d4882cdf164] verifying against SKU_4 via external endpoint +2026-07-31 11:54:39,444 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /uploads/2d4882cdf164/ORB_best.png HTTP/1.1" 200 - +2026-07-31 11:54:39,445 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /uploads/2d4882cdf164/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 11:54:39,446 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 11:54:39,448 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 11:54:39,471 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /uploads/2d4882cdf164/nobg.png HTTP/1.1" 200 - +2026-07-31 11:54:39,472 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:54:39] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 11:55:14,031 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:55:14] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 11:56:14,940 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:56:14] "GET / HTTP/1.1" 200 - +2026-07-31 11:56:15,247 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:56:15] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-31 11:56:15,289 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:56:15] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 11:56:15,561 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:56:15] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 11:56:15,564 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:56:15] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 11:56:15,605 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:56:15] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 11:56:15,611 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:56:15] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 11:56:15,611 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:56:15] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 11:56:15,613 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:56:15] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 11:57:08,409 INFO [pipeline.engine] [226072d9f83e] new upload: 'Clipboard - July 27, 2026 5_25 PM.png' (249.1 KB) +2026-07-31 11:57:10,622 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CUDAExecutionProvider', 'CPUExecutionProvider'] +2026-07-31 11:57:11,239 ERROR [pipeline.engine] [226072d9f83e] pipeline failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 276, in process_upload + result = _process_upload_locked(request_id, image_bytes, orig_filename) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 299, in _process_upload_locked + rgba, _ = bg_removal.remove_background_bytes(image_bytes, config.UPLOADS_NOBG_CACHE) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/bg_removal.py", line 89, in remove_background_bytes + result = remove(pil_img, session=get_session()) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/bg.py", line 279, in remove + masks = session.predict(img, *args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/sessions/birefnet_general.py", line 32, in predict + ort_outs = self.inner_session.run( + File "/home/suman/.local/lib/python3.10/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 287, in run + return self._sess.run(output_names, input_feed, run_options) +onnxruntime.capi.onnxruntime_pybind11_state.RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Non-zero status code returned while running Mul node. Name:'/decoder/decoder_block1/dec_att/aspp_deforms.2/atrous_conv/Mul_6' Status Message: /onnxruntime_src/onnxruntime/core/framework/bfc_arena.cc:359 void* onnxruntime::BFCArena::AllocateRawInternal(size_t, bool, onnxruntime::Stream*) Failed to allocate memory for requested buffer of size 822083584 + +2026-07-31 11:57:11,358 INFO [pipeline.engine] [226072d9f83e] done, peak RSS so far: 2512 MB +2026-07-31 11:57:11,358 ERROR [__main__] Match pipeline failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/app.py", line 118, in api_match + result = engine.process_upload(image_bytes, filename) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 276, in process_upload + result = _process_upload_locked(request_id, image_bytes, orig_filename) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 299, in _process_upload_locked + rgba, _ = bg_removal.remove_background_bytes(image_bytes, config.UPLOADS_NOBG_CACHE) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/bg_removal.py", line 89, in remove_background_bytes + result = remove(pil_img, session=get_session()) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/bg.py", line 279, in remove + masks = session.predict(img, *args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/sessions/birefnet_general.py", line 32, in predict + ort_outs = self.inner_session.run( + File "/home/suman/.local/lib/python3.10/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 287, in run + return self._sess.run(output_names, input_feed, run_options) +onnxruntime.capi.onnxruntime_pybind11_state.RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Non-zero status code returned while running Mul node. Name:'/decoder/decoder_block1/dec_att/aspp_deforms.2/atrous_conv/Mul_6' Status Message: /onnxruntime_src/onnxruntime/core/framework/bfc_arena.cc:359 void* onnxruntime::BFCArena::AllocateRawInternal(size_t, bool, onnxruntime::Stream*) Failed to allocate memory for requested buffer of size 822083584 + +2026-07-31 11:57:11,358 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:57:11] "POST /api/match HTTP/1.1" 500 - +2026-07-31 11:58:21,869 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 11:58:21,869 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 11:58:21,991 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 11:58:25,476 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 11:58:25,529 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 11:58:25,636 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 11:58:25,727 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 11:58:25,774 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 11:58:25,865 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 11:58:25,865 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 11:58:25,874 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 11:58:25,874 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 11:58:32,323 INFO [pipeline.engine] [8d3cd4028ab9] new upload: 'Clipboard - July 27, 2026 5_25 PM.png' (249.1 KB) +2026-07-31 11:58:34,710 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-31 11:58:34,710 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-31 11:58:44,517 INFO [pipeline.engine] [8d3cd4028ab9] background removal: 12.19s +2026-07-31 11:58:44,651 INFO [pipeline.engine] [8d3cd4028ab9] SIFT: 0.13s +2026-07-31 11:58:44,917 INFO [pipeline.engine] [8d3cd4028ab9] ORB: 0.26s +2026-07-31 11:58:44,947 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 11:58:45,536 INFO [pipeline.engine] [8d3cd4028ab9] SuperGlue: 0.62s +2026-07-31 11:58:45,544 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 11:58:46,153 INFO [pipeline.engine] [8d3cd4028ab9] LoFTR: 0.61s +2026-07-31 11:58:46,312 INFO [pipeline.engine] [8d3cd4028ab9] color analysis: 0.11s +2026-07-31 11:58:46,427 INFO [pipeline.engine] [8d3cd4028ab9] total: 14.10s, weighted best: SKU_4 +2026-07-31 11:58:46,500 INFO [pipeline.engine] [8d3cd4028ab9] done, peak RSS so far: 7747 MB +2026-07-31 11:58:46,500 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:58:46] "POST /api/match HTTP/1.1" 200 - +2026-07-31 11:58:46,604 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:58:46] "GET /uploads/8d3cd4028ab9/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 11:58:46,647 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:58:46] "GET /uploads/8d3cd4028ab9/ORB_best.png HTTP/1.1" 200 - +2026-07-31 11:58:46,648 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:58:46] "GET /uploads/8d3cd4028ab9/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 11:58:46,649 INFO [__main__] [8d3cd4028ab9] verifying against SKU_4 via external endpoint +2026-07-31 11:58:46,651 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:58:46] "GET /uploads/8d3cd4028ab9/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 11:58:46,656 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:58:46] "GET /uploads/8d3cd4028ab9/original.png HTTP/1.1" 200 - +2026-07-31 11:58:46,659 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:58:46] "GET /uploads/8d3cd4028ab9/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 11:58:46,668 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:58:46] "GET /uploads/8d3cd4028ab9/nobg.png HTTP/1.1" 200 - +2026-07-31 11:58:46,671 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:58:46] "GET /uploads/8d3cd4028ab9/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 11:58:51,610 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 11:58:51] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 12:01:44,918 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 12:01:44,918 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 12:01:45,031 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 12:01:46,117 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 12:01:46,171 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 12:01:46,282 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 12:01:46,377 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 12:01:46,423 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 12:01:46,518 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 12:01:46,518 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 12:01:46,535 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 12:01:46,535 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 12:01:58,597 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:01:58] "GET / HTTP/1.1" 200 - +2026-07-31 12:02:30,015 INFO [pipeline.engine] [832eb587390d] new upload: 'cuda_check.jpg' (155.6 KB) +2026-07-31 12:02:32,320 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CUDAExecutionProvider', 'CPUExecutionProvider'] +2026-07-31 12:02:32,886 ERROR [pipeline.engine] [832eb587390d] pipeline failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 276, in process_upload + result = _process_upload_locked(request_id, image_bytes, orig_filename) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 299, in _process_upload_locked + rgba, _ = bg_removal.remove_background_bytes(image_bytes, config.UPLOADS_NOBG_CACHE) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/bg_removal.py", line 89, in remove_background_bytes + result = remove(pil_img, session=get_session()) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/bg.py", line 279, in remove + masks = session.predict(img, *args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/sessions/birefnet_general.py", line 32, in predict + ort_outs = self.inner_session.run( + File "/home/suman/.local/lib/python3.10/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 287, in run + return self._sess.run(output_names, input_feed, run_options) +onnxruntime.capi.onnxruntime_pybind11_state.RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Non-zero status code returned while running Mul node. Name:'/decoder/decoder_block1/dec_att/aspp_deforms.2/atrous_conv/Mul_6' Status Message: /onnxruntime_src/onnxruntime/core/framework/bfc_arena.cc:359 void* onnxruntime::BFCArena::AllocateRawInternal(size_t, bool, onnxruntime::Stream*) Failed to allocate memory for requested buffer of size 822083584 + +2026-07-31 12:02:32,978 INFO [pipeline.engine] [832eb587390d] done, peak RSS so far: 1891 MB +2026-07-31 12:02:32,978 ERROR [__main__] Match pipeline failed +Traceback (most recent call last): + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/app.py", line 118, in api_match + result = engine.process_upload(image_bytes, filename) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 276, in process_upload + result = _process_upload_locked(request_id, image_bytes, orig_filename) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/engine.py", line 299, in _process_upload_locked + rgba, _ = bg_removal.remove_background_bytes(image_bytes, config.UPLOADS_NOBG_CACHE) + File "/media/suman/Backup_of_extra_/Sasi/featureTransform/pipeline/bg_removal.py", line 89, in remove_background_bytes + result = remove(pil_img, session=get_session()) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/bg.py", line 279, in remove + masks = session.predict(img, *args, **kwargs) + File "/home/suman/.local/lib/python3.10/site-packages/rembg/sessions/birefnet_general.py", line 32, in predict + ort_outs = self.inner_session.run( + File "/home/suman/.local/lib/python3.10/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 287, in run + return self._sess.run(output_names, input_feed, run_options) +onnxruntime.capi.onnxruntime_pybind11_state.RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Non-zero status code returned while running Mul node. Name:'/decoder/decoder_block1/dec_att/aspp_deforms.2/atrous_conv/Mul_6' Status Message: /onnxruntime_src/onnxruntime/core/framework/bfc_arena.cc:359 void* onnxruntime::BFCArena::AllocateRawInternal(size_t, bool, onnxruntime::Stream*) Failed to allocate memory for requested buffer of size 822083584 + +2026-07-31 12:02:32,978 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:02:32] "POST /api/match HTTP/1.1" 500 - +2026-07-31 12:03:30,369 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 12:03:30,369 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 12:03:30,486 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 12:03:31,399 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 12:03:31,453 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 12:03:31,562 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 12:03:31,656 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 12:03:31,704 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 12:03:31,796 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 12:03:31,797 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 12:03:31,798 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 12:03:31,798 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 12:04:05,181 INFO [pipeline.engine] [f0a2877155d2] new upload: 'WhatsApp Image 2026-07-13 at 3.44.01 PM (5).jpeg' (201.4 KB) +2026-07-31 12:04:07,613 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-31 12:04:07,613 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-31 12:04:17,948 INFO [pipeline.engine] [f0a2877155d2] background removal: 12.77s +2026-07-31 12:04:18,546 INFO [pipeline.engine] [f0a2877155d2] SIFT: 0.56s +2026-07-31 12:04:18,914 INFO [pipeline.engine] [f0a2877155d2] ORB: 0.36s +2026-07-31 12:04:19,001 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 12:04:20,024 INFO [pipeline.engine] [f0a2877155d2] SuperGlue: 1.11s +2026-07-31 12:04:20,043 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 12:04:20,719 INFO [pipeline.engine] [f0a2877155d2] LoFTR: 0.69s +2026-07-31 12:04:20,891 INFO [pipeline.engine] [f0a2877155d2] color analysis: 0.13s +2026-07-31 12:04:21,114 INFO [pipeline.engine] [f0a2877155d2] total: 15.93s, weighted best: SKU_4 +2026-07-31 12:04:21,185 INFO [pipeline.engine] [f0a2877155d2] done, peak RSS so far: 8016 MB +2026-07-31 12:04:21,185 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:04:21] "POST /api/match HTTP/1.1" 200 - +2026-07-31 12:04:21,512 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:04:21] "GET /uploads/f0a2877155d2/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 12:04:21,547 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:04:21] "GET /uploads/f0a2877155d2/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 12:04:21,553 INFO [__main__] [f0a2877155d2] verifying against SKU_4 via external endpoint +2026-07-31 12:04:21,557 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:04:21] "GET /uploads/f0a2877155d2/ORB_best.png HTTP/1.1" 200 - +2026-07-31 12:04:21,559 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:04:21] "GET /uploads/f0a2877155d2/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 12:04:21,573 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:04:21] "GET /uploads/f0a2877155d2/original.jpeg HTTP/1.1" 200 - +2026-07-31 12:04:21,575 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:04:21] "GET /uploads/f0a2877155d2/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 12:04:21,575 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:04:21] "GET /uploads/f0a2877155d2/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 12:04:21,577 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:04:21] "GET /uploads/f0a2877155d2/nobg.png HTTP/1.1" 200 - +2026-07-31 12:04:26,863 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:04:26] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 12:15:07,559 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 12:15:07,577 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 12:15:08,409 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 12:15:15,342 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 12:15:15,412 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 12:15:15,627 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 12:15:15,729 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 12:15:15,799 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 12:15:15,905 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 12:15:15,905 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 12:15:15,919 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 12:15:15,919 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 12:16:55,815 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:16:55] "GET / HTTP/1.1" 200 - +2026-07-31 12:16:56,348 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:16:56] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 12:16:56,365 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:16:56] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 12:16:56,702 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:16:56] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-31 12:16:56,845 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:16:56] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 12:16:56,851 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:16:56] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 12:16:56,856 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:16:56] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 12:16:56,863 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:16:56] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 12:16:56,868 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:16:56] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 12:16:56,874 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:16:56] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 12:17:02,518 INFO [pipeline.engine] [51c9a702633a] new upload: 'WhatsApp Image 2026-07-13 at 6.15.17 PM (2).jpeg' (177.5 KB) +2026-07-31 12:17:05,130 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-31 12:17:05,130 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-31 12:17:15,162 INFO [pipeline.engine] [51c9a702633a] background removal: 12.64s +2026-07-31 12:17:15,611 INFO [pipeline.engine] [51c9a702633a] SIFT: 0.41s +2026-07-31 12:17:15,945 INFO [pipeline.engine] [51c9a702633a] ORB: 0.31s +2026-07-31 12:17:16,822 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 12:17:18,761 INFO [pipeline.engine] [51c9a702633a] SuperGlue: 2.82s +2026-07-31 12:17:18,781 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 12:17:19,970 INFO [pipeline.engine] [51c9a702633a] LoFTR: 1.20s +2026-07-31 12:17:20,259 INFO [pipeline.engine] [51c9a702633a] color analysis: 0.12s +2026-07-31 12:17:20,404 INFO [pipeline.engine] [51c9a702633a] total: 17.89s, weighted best: SKU_1 +2026-07-31 12:17:20,473 INFO [pipeline.engine] [51c9a702633a] done, peak RSS so far: 7921 MB +2026-07-31 12:17:20,474 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:17:20] "POST /api/match HTTP/1.1" 200 - +2026-07-31 12:17:20,567 INFO [__main__] [51c9a702633a] verifying against SKU_1 via external endpoint +2026-07-31 12:17:20,569 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:17:20] "GET /uploads/51c9a702633a/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 12:17:20,569 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:17:20] "GET /uploads/51c9a702633a/original.jpeg HTTP/1.1" 200 - +2026-07-31 12:17:20,570 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:17:20] "GET /uploads/51c9a702633a/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 12:17:20,572 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:17:20] "GET /uploads/51c9a702633a/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 12:17:20,574 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:17:20] "GET /uploads/51c9a702633a/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 12:17:20,577 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:17:20] "GET /uploads/51c9a702633a/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 12:17:20,577 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:17:20] "GET /uploads/51c9a702633a/ORB_best.png HTTP/1.1" 200 - +2026-07-31 12:17:20,578 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:17:20] "GET /uploads/51c9a702633a/nobg.png HTTP/1.1" 200 - +2026-07-31 12:17:31,686 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 12:17:31] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 13:03:54,704 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 13:03:54,704 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 13:03:54,814 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 13:03:55,713 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 13:03:55,764 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 13:03:55,867 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 13:03:55,952 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 13:03:55,995 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 13:03:56,081 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 13:03:56,081 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 13:03:56,083 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 13:03:56,083 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 13:04:08,546 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:08] "GET / HTTP/1.1" 200 - +2026-07-31 13:04:08,819 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:08] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-31 13:04:08,849 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:08] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-31 13:04:09,228 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:09] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 13:04:09,233 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:09] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 13:04:09,235 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:09] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 13:04:09,237 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:09] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 13:04:09,238 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:09] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 13:04:09,254 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:09] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 13:04:20,237 INFO [pipeline.engine] [425cbda9ce29] new upload: 'WhatsApp Image 2026-07-13 at 6.15.17 PM.jpeg' (173.2 KB) +2026-07-31 13:04:20,259 INFO [pipeline.engine] [425cbda9ce29] background removal: 0.02s +2026-07-31 13:04:20,795 INFO [pipeline.engine] [425cbda9ce29] SIFT: 0.51s +2026-07-31 13:04:21,125 INFO [pipeline.engine] [425cbda9ce29] ORB: 0.31s +2026-07-31 13:04:21,209 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 13:04:22,273 INFO [pipeline.engine] [425cbda9ce29] SuperGlue: 1.15s +2026-07-31 13:04:22,292 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 13:04:23,068 INFO [pipeline.engine] [425cbda9ce29] LoFTR: 0.78s +2026-07-31 13:04:23,220 INFO [pipeline.engine] [425cbda9ce29] color analysis: 0.12s +2026-07-31 13:04:23,353 INFO [pipeline.engine] [425cbda9ce29] total: 3.12s, weighted best: SKU_1 +2026-07-31 13:04:23,422 INFO [pipeline.engine] [425cbda9ce29] done, peak RSS so far: 1729 MB +2026-07-31 13:04:23,423 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:23] "POST /api/match HTTP/1.1" 200 - +2026-07-31 13:04:23,489 INFO [__main__] [425cbda9ce29] verifying against SKU_1 via external endpoint +2026-07-31 13:04:23,497 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:23] "GET /uploads/425cbda9ce29/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 13:04:23,498 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:23] "GET /uploads/425cbda9ce29/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 13:04:23,500 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:23] "GET /uploads/425cbda9ce29/original.jpeg HTTP/1.1" 200 - +2026-07-31 13:04:23,501 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:23] "GET /uploads/425cbda9ce29/nobg.png HTTP/1.1" 200 - +2026-07-31 13:04:23,502 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:23] "GET /uploads/425cbda9ce29/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 13:04:23,504 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:23] "GET /uploads/425cbda9ce29/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 13:04:23,511 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:23] "GET /uploads/425cbda9ce29/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 13:04:23,511 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:23] "GET /uploads/425cbda9ce29/ORB_best.png HTTP/1.1" 200 - +2026-07-31 13:04:31,483 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 13:04:31] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 14:56:06,680 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:06] "GET / HTTP/1.1" 200 - +2026-07-31 14:56:06,939 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:06] "GET /static/css/style.css HTTP/1.1" 304 - +2026-07-31 14:56:06,956 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:06] "GET /static/js/main.js HTTP/1.1" 304 - +2026-07-31 14:56:07,189 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:07] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 14:56:07,190 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:07] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 14:56:07,205 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:07] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 14:56:07,207 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:07] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 14:56:07,208 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:07] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 14:56:07,211 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:07] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 14:56:12,646 INFO [pipeline.engine] [709bc9d8d050] new upload: 'WhatsApp Image 2026-07-13 at 6.15.18 PM (1).jpeg' (188.7 KB) +2026-07-31 14:56:12,667 INFO [pipeline.engine] [709bc9d8d050] background removal: 0.02s +2026-07-31 14:56:13,047 INFO [pipeline.engine] [709bc9d8d050] SIFT: 0.35s +2026-07-31 14:56:13,343 INFO [pipeline.engine] [709bc9d8d050] ORB: 0.30s +2026-07-31 14:56:14,334 INFO [pipeline.engine] [709bc9d8d050] SuperGlue: 0.99s +2026-07-31 14:56:14,820 INFO [pipeline.engine] [709bc9d8d050] LoFTR: 0.48s +2026-07-31 14:56:14,885 INFO [pipeline.engine] [709bc9d8d050] color analysis: 0.04s +2026-07-31 14:56:15,002 INFO [pipeline.engine] [709bc9d8d050] total: 2.36s, weighted best: SKU_1 +2026-07-31 14:56:15,071 INFO [pipeline.engine] [709bc9d8d050] done, peak RSS so far: 1907 MB +2026-07-31 14:56:15,072 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:15] "POST /api/match HTTP/1.1" 200 - +2026-07-31 14:56:15,144 INFO [__main__] [709bc9d8d050] verifying against SKU_1 via external endpoint +2026-07-31 14:56:15,145 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:15] "GET /uploads/709bc9d8d050/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 14:56:15,148 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:15] "GET /uploads/709bc9d8d050/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 14:56:15,150 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:15] "GET /uploads/709bc9d8d050/ORB_best.png HTTP/1.1" 200 - +2026-07-31 14:56:15,150 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:15] "GET /uploads/709bc9d8d050/nobg.png HTTP/1.1" 200 - +2026-07-31 14:56:15,154 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:15] "GET /uploads/709bc9d8d050/original.jpeg HTTP/1.1" 200 - +2026-07-31 14:56:15,166 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:15] "GET /uploads/709bc9d8d050/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 14:56:15,167 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:15] "GET /uploads/709bc9d8d050/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 14:56:15,168 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:15] "GET /uploads/709bc9d8d050/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 14:56:20,705 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:56:20] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 14:57:00,943 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:57:00] "GET / HTTP/1.1" 200 - +2026-07-31 14:57:29,162 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:57:29] "GET / HTTP/1.1" 200 - +2026-07-31 14:57:29,236 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:57:29] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 14:57:29,250 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:57:29] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 14:57:29,495 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:57:29] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 14:57:29,496 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:57:29] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 14:57:29,510 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:57:29] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 14:57:29,511 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:57:29] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 14:57:29,512 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:57:29] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 14:57:29,513 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:57:29] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 14:57:29,820 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:57:29] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-31 14:58:20,768 INFO [pipeline.engine] [369ecf018c0a] new upload: '20260727_194202.jpg' (11872.1 KB) +2026-07-31 14:58:20,814 INFO [pipeline.engine] [369ecf018c0a] background removal: 0.04s +2026-07-31 14:58:21,098 INFO [pipeline.engine] [369ecf018c0a] SIFT: 0.26s +2026-07-31 14:58:21,379 INFO [pipeline.engine] [369ecf018c0a] ORB: 0.28s +2026-07-31 14:58:22,405 INFO [pipeline.engine] [369ecf018c0a] SuperGlue: 1.03s +2026-07-31 14:58:22,771 INFO [pipeline.engine] [369ecf018c0a] LoFTR: 0.36s +2026-07-31 14:58:22,838 INFO [pipeline.engine] [369ecf018c0a] color analysis: 0.04s +2026-07-31 14:58:22,933 INFO [pipeline.engine] [369ecf018c0a] total: 2.16s, weighted best: SKU_1 +2026-07-31 14:58:22,999 INFO [pipeline.engine] [369ecf018c0a] done, peak RSS so far: 2048 MB +2026-07-31 14:58:23,001 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:58:23] "POST /api/match HTTP/1.1" 200 - +2026-07-31 14:58:23,061 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:58:23] "GET /uploads/369ecf018c0a/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 14:58:23,062 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:58:23] "GET /uploads/369ecf018c0a/original.jpg HTTP/1.1" 200 - +2026-07-31 14:58:23,063 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:58:23] "GET /uploads/369ecf018c0a/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 14:58:23,064 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:58:23] "GET /uploads/369ecf018c0a/nobg.png HTTP/1.1" 200 - +2026-07-31 14:58:23,066 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:58:23] "GET /uploads/369ecf018c0a/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 14:58:23,067 INFO [__main__] [369ecf018c0a] verifying against SKU_1 via external endpoint +2026-07-31 14:58:23,080 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:58:23] "GET /uploads/369ecf018c0a/ORB_best.png HTTP/1.1" 200 - +2026-07-31 14:58:23,081 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:58:23] "GET /uploads/369ecf018c0a/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 14:58:23,083 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:58:23] "GET /uploads/369ecf018c0a/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 14:58:36,964 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 14:58:36] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 15:10:01,646 INFO [pipeline.engine] [04c37a08beb7] new upload: 'SKU_1.png' (34.4 KB) +2026-07-31 15:10:03,907 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-31 15:10:03,907 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-31 15:10:13,638 INFO [pipeline.engine] [04c37a08beb7] background removal: 11.99s +2026-07-31 15:10:13,674 INFO [pipeline.engine] [04c37a08beb7] SIFT: 0.03s +2026-07-31 15:10:13,713 INFO [pipeline.engine] [04c37a08beb7] ORB: 0.04s +2026-07-31 15:10:14,130 INFO [pipeline.engine] [04c37a08beb7] SuperGlue: 0.42s +2026-07-31 15:10:14,436 INFO [pipeline.engine] [04c37a08beb7] LoFTR: 0.30s +2026-07-31 15:10:14,473 INFO [pipeline.engine] [04c37a08beb7] color analysis: 0.01s +2026-07-31 15:10:14,505 INFO [pipeline.engine] [04c37a08beb7] total: 12.86s, weighted best: SKU_1 +2026-07-31 15:10:14,574 INFO [pipeline.engine] [04c37a08beb7] done, peak RSS so far: 8389 MB +2026-07-31 15:10:14,575 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:10:14] "POST /api/match HTTP/1.1" 200 - +2026-07-31 15:10:14,626 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:10:14] "GET /uploads/04c37a08beb7/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 15:10:14,641 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:10:14] "GET /uploads/04c37a08beb7/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 15:10:14,642 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:10:14] "GET /uploads/04c37a08beb7/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 15:10:14,644 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:10:14] "GET /uploads/04c37a08beb7/nobg.png HTTP/1.1" 200 - +2026-07-31 15:10:14,644 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:10:14] "GET /uploads/04c37a08beb7/ORB_best.png HTTP/1.1" 200 - +2026-07-31 15:10:14,646 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:10:14] "GET /uploads/04c37a08beb7/original.png HTTP/1.1" 200 - +2026-07-31 15:10:14,647 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:10:14] "GET /uploads/04c37a08beb7/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 15:10:14,648 INFO [__main__] [04c37a08beb7] verifying against SKU_1 via external endpoint +2026-07-31 15:10:14,649 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:10:14] "GET /uploads/04c37a08beb7/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 15:10:25,001 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:10:25] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 15:15:28,613 INFO [pipeline.engine] [a97811b9515d] new upload: 'SKU_1_Mod_2.jpeg' (48.5 KB) +2026-07-31 15:15:38,186 INFO [pipeline.engine] [a97811b9515d] background removal: 9.57s +2026-07-31 15:15:38,339 INFO [pipeline.engine] [a97811b9515d] SIFT: 0.14s +2026-07-31 15:15:38,570 INFO [pipeline.engine] [a97811b9515d] ORB: 0.23s +2026-07-31 15:15:39,559 INFO [pipeline.engine] [a97811b9515d] SuperGlue: 0.99s +2026-07-31 15:15:39,934 INFO [pipeline.engine] [a97811b9515d] LoFTR: 0.37s +2026-07-31 15:15:39,989 INFO [pipeline.engine] [a97811b9515d] color analysis: 0.03s +2026-07-31 15:15:40,052 INFO [pipeline.engine] [a97811b9515d] total: 11.44s, weighted best: SKU_1 +2026-07-31 15:15:40,122 INFO [pipeline.engine] [a97811b9515d] done, peak RSS so far: 13010 MB +2026-07-31 15:15:40,123 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:15:40] "POST /api/match HTTP/1.1" 200 - +2026-07-31 15:15:40,172 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:15:40] "GET /uploads/a97811b9515d/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 15:15:40,184 INFO [__main__] [a97811b9515d] verifying against SKU_1 via external endpoint +2026-07-31 15:15:40,188 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:15:40] "GET /uploads/a97811b9515d/ORB_best.png HTTP/1.1" 200 - +2026-07-31 15:15:40,190 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:15:40] "GET /uploads/a97811b9515d/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 15:15:40,191 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:15:40] "GET /uploads/a97811b9515d/original.jpeg HTTP/1.1" 200 - +2026-07-31 15:15:40,192 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:15:40] "GET /uploads/a97811b9515d/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 15:15:40,193 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:15:40] "GET /uploads/a97811b9515d/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 15:15:40,193 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:15:40] "GET /uploads/a97811b9515d/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 15:15:40,194 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:15:40] "GET /uploads/a97811b9515d/nobg.png HTTP/1.1" 200 - +2026-07-31 15:15:47,134 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:15:47] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 15:48:53,183 INFO [pipeline.engine] [71fb8ea9b929] new upload: 'Gemini_Generated_Image_9hin5g9hin5g9hin.png' (1361.6 KB) +2026-07-31 15:49:02,793 INFO [pipeline.engine] [71fb8ea9b929] background removal: 9.61s +2026-07-31 15:49:03,095 INFO [pipeline.engine] [71fb8ea9b929] SIFT: 0.28s +2026-07-31 15:49:03,375 INFO [pipeline.engine] [71fb8ea9b929] ORB: 0.28s +2026-07-31 15:49:04,431 INFO [pipeline.engine] [71fb8ea9b929] SuperGlue: 1.06s +2026-07-31 15:49:04,813 INFO [pipeline.engine] [71fb8ea9b929] LoFTR: 0.38s +2026-07-31 15:49:04,883 INFO [pipeline.engine] [71fb8ea9b929] color analysis: 0.04s +2026-07-31 15:49:04,993 INFO [pipeline.engine] [71fb8ea9b929] total: 11.81s, weighted best: SKU_2 +2026-07-31 15:49:05,066 INFO [pipeline.engine] [71fb8ea9b929] done, peak RSS so far: 13111 MB +2026-07-31 15:49:05,067 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:49:05] "POST /api/match HTTP/1.1" 200 - +2026-07-31 15:49:05,125 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:49:05] "GET /uploads/71fb8ea9b929/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 15:49:05,139 INFO [__main__] [71fb8ea9b929] verifying against SKU_2 via external endpoint +2026-07-31 15:49:05,143 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:49:05] "GET /uploads/71fb8ea9b929/nobg.png HTTP/1.1" 200 - +2026-07-31 15:49:05,146 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:49:05] "GET /uploads/71fb8ea9b929/original.png HTTP/1.1" 200 - +2026-07-31 15:49:05,416 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:49:05] "GET /uploads/71fb8ea9b929/ORB_best.png HTTP/1.1" 200 - +2026-07-31 15:49:05,608 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:49:05] "GET /uploads/71fb8ea9b929/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 15:49:05,804 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:49:05] "GET /uploads/71fb8ea9b929/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 15:49:05,816 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:49:05] "GET /uploads/71fb8ea9b929/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 15:49:05,966 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:49:05] "GET /uploads/71fb8ea9b929/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 15:49:20,487 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:49:20] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 15:55:41,547 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 15:55:41,547 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 15:55:41,710 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 15:55:43,838 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 15:55:43,904 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 15:55:44,057 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 15:55:44,183 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 15:55:44,242 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 15:55:44,376 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 15:55:44,376 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 15:55:44,389 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 15:55:44,389 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 15:55:54,605 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:55:54] "GET / HTTP/1.1" 200 - +2026-07-31 15:56:03,913 INFO [pipeline.engine] [b40666dbf935] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-07-31 15:56:03,946 INFO [pipeline.engine] [b40666dbf935] background removal: 0.03s +2026-07-31 15:56:04,291 INFO [pipeline.engine] [b40666dbf935] SIFT: 0.32s +2026-07-31 15:56:04,630 INFO [pipeline.engine] [b40666dbf935] ORB: 0.32s +2026-07-31 15:56:04,835 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 15:56:06,011 INFO [pipeline.engine] [b40666dbf935] SuperGlue: 1.38s +2026-07-31 15:56:06,026 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 15:56:06,636 INFO [pipeline.engine] [b40666dbf935] LoFTR: 0.62s +2026-07-31 15:56:06,799 INFO [pipeline.engine] [b40666dbf935] color analysis: 0.12s +2026-07-31 15:56:06,804 INFO [pipeline.engine] [b40666dbf935] shape analysis: 0.01s +2026-07-31 15:56:07,035 INFO [pipeline.engine] [b40666dbf935] texture analysis: 0.23s +2026-07-31 15:56:07,176 INFO [pipeline.engine] [b40666dbf935] total: 3.26s, weighted best: SKU_1 +2026-07-31 15:56:07,255 INFO [pipeline.engine] [b40666dbf935] done, peak RSS so far: 1803 MB +2026-07-31 15:56:07,257 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:56:07] "POST /api/match HTTP/1.1" 200 - +2026-07-31 15:56:56,798 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:56:56] "GET /uploads/b40666dbf935/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 15:56:56,804 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:56:56] "GET /uploads/b40666dbf935/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 15:56:56,809 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:56:56] "GET /uploads/b40666dbf935/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 15:56:56,814 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:56:56] "GET /uploads/b40666dbf935/input_lbp.png HTTP/1.1" 200 - +2026-07-31 15:56:56,819 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 15:56:56] "GET /uploads/b40666dbf935/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:01:04,395 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 16:01:04,396 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 16:01:04,514 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 16:01:05,511 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 16:01:05,576 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 16:01:05,730 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 16:01:05,856 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 16:01:05,915 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 16:01:06,047 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 16:01:06,048 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 16:01:06,061 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 16:01:06,061 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 16:01:18,971 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:01:18] "GET / HTTP/1.1" 200 - +2026-07-31 16:03:00,761 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:00] "GET / HTTP/1.1" 200 - +2026-07-31 16:03:00,774 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:00] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 16:03:00,777 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:00] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 16:03:01,035 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:01] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 16:03:01,035 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:01] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 16:03:01,036 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:01] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 16:03:01,036 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:01] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 16:03:01,037 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:01] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 16:03:01,037 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:01] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 16:03:01,137 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:01] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-31 16:03:03,296 INFO [pipeline.engine] [ddc87cf15ebc] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-07-31 16:03:03,330 INFO [pipeline.engine] [ddc87cf15ebc] background removal: 0.03s +2026-07-31 16:03:03,665 INFO [pipeline.engine] [ddc87cf15ebc] SIFT: 0.31s +2026-07-31 16:03:04,013 INFO [pipeline.engine] [ddc87cf15ebc] ORB: 0.33s +2026-07-31 16:03:04,087 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 16:03:05,166 INFO [pipeline.engine] [ddc87cf15ebc] SuperGlue: 1.15s +2026-07-31 16:03:05,182 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 16:03:05,749 INFO [pipeline.engine] [ddc87cf15ebc] LoFTR: 0.58s +2026-07-31 16:03:05,917 INFO [pipeline.engine] [ddc87cf15ebc] color analysis: 0.13s +2026-07-31 16:03:05,922 INFO [pipeline.engine] [ddc87cf15ebc] shape analysis: 0.00s +2026-07-31 16:03:06,155 INFO [pipeline.engine] [ddc87cf15ebc] texture analysis: 0.23s +2026-07-31 16:03:06,304 INFO [pipeline.engine] [ddc87cf15ebc] total: 3.01s, weighted best: SKU_1 +2026-07-31 16:03:06,391 INFO [pipeline.engine] [ddc87cf15ebc] done, peak RSS so far: 1826 MB +2026-07-31 16:03:06,394 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:03:06,449 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/nobg.png HTTP/1.1" 200 - +2026-07-31 16:03:06,451 INFO [__main__] [ddc87cf15ebc] verifying against SKU_1 via external endpoint +2026-07-31 16:03:06,452 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/original.jpg HTTP/1.1" 200 - +2026-07-31 16:03:06,453 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:03:06,453 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:03:06,453 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:03:06,467 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:03:06,469 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:03:06,469 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:03:06,470 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:03:06,475 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:03:06,475 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:03:06,476 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:03:06,477 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:06] "GET /uploads/ddc87cf15ebc/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:03:46,256 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:03:46] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:04:10,965 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:10] "GET / HTTP/1.1" 200 - +2026-07-31 16:04:31,053 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:31] "GET / HTTP/1.1" 200 - +2026-07-31 16:04:31,363 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:31] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 16:04:31,379 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:31] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 16:04:31,380 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:31] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 16:04:31,649 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:31] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 16:04:31,653 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:31] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 16:04:31,664 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:31] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 16:04:31,668 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:31] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 16:04:31,680 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:31] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 16:04:39,423 INFO [pipeline.engine] [35701c43c2df] new upload: 'Gemini_Generated_Image_9hin5g9hin5g9hin.png' (1361.6 KB) +2026-07-31 16:04:39,439 INFO [pipeline.engine] [35701c43c2df] background removal: 0.01s +2026-07-31 16:04:39,763 INFO [pipeline.engine] [35701c43c2df] SIFT: 0.30s +2026-07-31 16:04:40,037 INFO [pipeline.engine] [35701c43c2df] ORB: 0.27s +2026-07-31 16:04:41,068 INFO [pipeline.engine] [35701c43c2df] SuperGlue: 1.03s +2026-07-31 16:04:41,442 INFO [pipeline.engine] [35701c43c2df] LoFTR: 0.37s +2026-07-31 16:04:41,508 INFO [pipeline.engine] [35701c43c2df] color analysis: 0.04s +2026-07-31 16:04:41,512 INFO [pipeline.engine] [35701c43c2df] shape analysis: 0.00s +2026-07-31 16:04:41,707 INFO [pipeline.engine] [35701c43c2df] texture analysis: 0.19s +2026-07-31 16:04:41,836 INFO [pipeline.engine] [35701c43c2df] total: 2.41s, weighted best: SKU_2 +2026-07-31 16:04:41,914 INFO [pipeline.engine] [35701c43c2df] done, peak RSS so far: 1910 MB +2026-07-31 16:04:41,915 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:41] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:04:41,993 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:41] "GET /uploads/35701c43c2df/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:04:42,005 INFO [__main__] [35701c43c2df] verifying against SKU_2 via external endpoint +2026-07-31 16:04:42,009 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:04:42,010 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:04:42,011 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:04:42,019 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:04:42,025 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:04:42,027 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:04:42,034 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:04:42,034 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:04:42,036 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/nobg.png HTTP/1.1" 200 - +2026-07-31 16:04:42,038 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:04:42,045 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:04:42,049 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:42] "GET /uploads/35701c43c2df/original.png HTTP/1.1" 200 - +2026-07-31 16:04:55,173 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:04:55] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:06:41,234 INFO [pipeline.engine] [a276304f3bde] new upload: 'SKU_1_Mod_2.jpeg' (48.5 KB) +2026-07-31 16:06:41,240 INFO [pipeline.engine] [a276304f3bde] background removal: 0.01s +2026-07-31 16:06:41,412 INFO [pipeline.engine] [a276304f3bde] SIFT: 0.16s +2026-07-31 16:06:41,640 INFO [pipeline.engine] [a276304f3bde] ORB: 0.23s +2026-07-31 16:06:42,608 INFO [pipeline.engine] [a276304f3bde] SuperGlue: 0.97s +2026-07-31 16:06:42,981 INFO [pipeline.engine] [a276304f3bde] LoFTR: 0.37s +2026-07-31 16:06:43,039 INFO [pipeline.engine] [a276304f3bde] color analysis: 0.03s +2026-07-31 16:06:43,042 INFO [pipeline.engine] [a276304f3bde] shape analysis: 0.00s +2026-07-31 16:06:43,130 INFO [pipeline.engine] [a276304f3bde] texture analysis: 0.09s +2026-07-31 16:06:43,202 INFO [pipeline.engine] [a276304f3bde] total: 1.97s, weighted best: SKU_1 +2026-07-31 16:06:43,283 INFO [pipeline.engine] [a276304f3bde] done, peak RSS so far: 1910 MB +2026-07-31 16:06:43,284 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:06:43,352 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:06:43,366 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:06:43,367 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:06:43,369 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:06:43,370 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:06:43,371 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:06:43,373 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:06:43,375 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/nobg.png HTTP/1.1" 200 - +2026-07-31 16:06:43,376 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:06:43,380 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:06:43,382 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:06:43,382 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:06:43,400 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:43] "GET /uploads/a276304f3bde/original.jpeg HTTP/1.1" 200 - +2026-07-31 16:06:43,401 INFO [__main__] [a276304f3bde] verifying against SKU_1 via external endpoint +2026-07-31 16:06:49,503 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:06:49] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:18:10,228 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:18:10] "GET / HTTP/1.1" 200 - +2026-07-31 16:18:10,234 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:18:10] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 16:19:06,515 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:06] "GET / HTTP/1.1" 200 - +2026-07-31 16:19:06,525 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:06] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 16:19:06,525 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:06] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 16:19:06,780 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:06] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 16:19:06,781 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:06] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 16:19:06,782 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:06] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 16:19:06,782 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:06] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 16:19:06,783 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:06] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 16:19:06,783 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:06] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 16:19:06,871 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:06] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-31 16:19:09,048 INFO [pipeline.engine] [e1babf10602d] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-07-31 16:19:09,082 INFO [pipeline.engine] [e1babf10602d] background removal: 0.03s +2026-07-31 16:19:09,426 INFO [pipeline.engine] [e1babf10602d] SIFT: 0.31s +2026-07-31 16:19:09,753 INFO [pipeline.engine] [e1babf10602d] ORB: 0.33s +2026-07-31 16:19:10,737 INFO [pipeline.engine] [e1babf10602d] SuperGlue: 0.98s +2026-07-31 16:19:11,114 INFO [pipeline.engine] [e1babf10602d] LoFTR: 0.37s +2026-07-31 16:19:11,189 INFO [pipeline.engine] [e1babf10602d] color analysis: 0.04s +2026-07-31 16:19:11,194 INFO [pipeline.engine] [e1babf10602d] shape analysis: 0.01s +2026-07-31 16:19:11,423 INFO [pipeline.engine] [e1babf10602d] texture analysis: 0.23s +2026-07-31 16:19:11,573 INFO [pipeline.engine] [e1babf10602d] total: 2.52s, weighted best: SKU_1 +2026-07-31 16:19:11,658 INFO [pipeline.engine] [e1babf10602d] done, peak RSS so far: 1992 MB +2026-07-31 16:19:11,660 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:19:11,731 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:19:11,731 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/nobg.png HTTP/1.1" 200 - +2026-07-31 16:19:11,731 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:19:11,731 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/original.jpg HTTP/1.1" 200 - +2026-07-31 16:19:11,732 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:19:11,732 INFO [__main__] [e1babf10602d] verifying against SKU_1 via external endpoint +2026-07-31 16:19:11,742 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:19:11,743 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:19:11,744 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:19:11,745 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:19:11,749 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:19:11,750 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:19:11,751 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:19:11,751 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:11] "GET /uploads/e1babf10602d/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:19:23,961 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:19:23] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:20:01,159 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:01] "GET / HTTP/1.1" 200 - +2026-07-31 16:20:32,700 INFO [pipeline.engine] [0f339e026390] new upload: 'SKU_1_Mod_2.jpeg' (48.5 KB) +2026-07-31 16:20:32,705 INFO [pipeline.engine] [0f339e026390] background removal: 0.01s +2026-07-31 16:20:32,852 INFO [pipeline.engine] [0f339e026390] SIFT: 0.14s +2026-07-31 16:20:33,080 INFO [pipeline.engine] [0f339e026390] ORB: 0.23s +2026-07-31 16:20:34,032 INFO [pipeline.engine] [0f339e026390] SuperGlue: 0.95s +2026-07-31 16:20:34,412 INFO [pipeline.engine] [0f339e026390] LoFTR: 0.37s +2026-07-31 16:20:34,469 INFO [pipeline.engine] [0f339e026390] color analysis: 0.03s +2026-07-31 16:20:34,471 INFO [pipeline.engine] [0f339e026390] shape analysis: 0.00s +2026-07-31 16:20:34,561 INFO [pipeline.engine] [0f339e026390] texture analysis: 0.09s +2026-07-31 16:20:34,634 INFO [pipeline.engine] [0f339e026390] total: 1.93s, weighted best: SKU_1 +2026-07-31 16:20:34,715 INFO [pipeline.engine] [0f339e026390] done, peak RSS so far: 1992 MB +2026-07-31 16:20:34,716 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:20:34,767 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:20:34,777 INFO [__main__] [0f339e026390] verifying against SKU_1 via external endpoint +2026-07-31 16:20:34,780 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:20:34,781 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:20:34,783 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:20:34,783 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:20:34,785 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/nobg.png HTTP/1.1" 200 - +2026-07-31 16:20:34,785 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:20:34,787 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:20:34,789 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:20:34,790 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:20:34,791 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:20:34,793 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/original.jpeg HTTP/1.1" 200 - +2026-07-31 16:20:34,794 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:34] "GET /uploads/0f339e026390/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:20:39,525 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:39] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:20:47,885 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:47] "GET / HTTP/1.1" 200 - +2026-07-31 16:20:48,121 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:48] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 16:20:48,122 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:48] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 16:20:48,129 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:48] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 16:20:48,369 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:48] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 16:20:48,370 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:48] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 16:20:48,372 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:48] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 16:20:48,374 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:48] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 16:20:48,374 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:48] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 16:20:52,352 INFO [pipeline.engine] [5ef5b73be85c] new upload: 'WhatsApp Image 2026-07-13 at 6.15.18 PM (3).jpeg' (194.2 KB) +2026-07-31 16:20:52,371 INFO [pipeline.engine] [5ef5b73be85c] background removal: 0.02s +2026-07-31 16:20:52,696 INFO [pipeline.engine] [5ef5b73be85c] SIFT: 0.30s +2026-07-31 16:20:53,002 INFO [pipeline.engine] [5ef5b73be85c] ORB: 0.31s +2026-07-31 16:20:53,949 INFO [pipeline.engine] [5ef5b73be85c] SuperGlue: 0.95s +2026-07-31 16:20:54,436 INFO [pipeline.engine] [5ef5b73be85c] LoFTR: 0.48s +2026-07-31 16:20:54,499 INFO [pipeline.engine] [5ef5b73be85c] color analysis: 0.04s +2026-07-31 16:20:54,504 INFO [pipeline.engine] [5ef5b73be85c] shape analysis: 0.00s +2026-07-31 16:20:54,731 INFO [pipeline.engine] [5ef5b73be85c] texture analysis: 0.23s +2026-07-31 16:20:54,855 INFO [pipeline.engine] [5ef5b73be85c] total: 2.50s, weighted best: SKU_1 +2026-07-31 16:20:54,934 INFO [pipeline.engine] [5ef5b73be85c] done, peak RSS so far: 2183 MB +2026-07-31 16:20:54,935 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:54] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:20:55,016 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:20:55,018 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:20:55,020 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:20:55,020 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/original.jpeg HTTP/1.1" 200 - +2026-07-31 16:20:55,021 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:20:55,022 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:20:55,024 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:20:55,025 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:20:55,027 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:20:55,029 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:20:55,031 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/nobg.png HTTP/1.1" 200 - +2026-07-31 16:20:55,032 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:20:55,033 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:55] "GET /uploads/5ef5b73be85c/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:20:55,033 INFO [__main__] [5ef5b73be85c] verifying against SKU_1 via external endpoint +2026-07-31 16:20:59,337 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:20:59] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:22:20,700 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 16:22:20,701 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 16:22:20,811 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 16:22:21,792 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 16:22:21,858 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 16:22:22,011 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 16:22:22,138 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 16:22:22,197 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 16:22:22,325 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 16:22:22,325 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 16:22:22,326 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 16:22:22,326 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 16:22:30,410 INFO [pipeline.engine] [06c4e0be5d07] new upload: 'WhatsApp Image 2026-07-13 at 6.15.18 PM (3).jpeg' (194.2 KB) +2026-07-31 16:22:30,431 INFO [pipeline.engine] [06c4e0be5d07] background removal: 0.02s +2026-07-31 16:22:30,753 INFO [pipeline.engine] [06c4e0be5d07] SIFT: 0.30s +2026-07-31 16:22:31,075 INFO [pipeline.engine] [06c4e0be5d07] ORB: 0.31s +2026-07-31 16:22:31,156 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 16:22:32,231 INFO [pipeline.engine] [06c4e0be5d07] SuperGlue: 1.16s +2026-07-31 16:22:32,250 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 16:22:32,932 INFO [pipeline.engine] [06c4e0be5d07] LoFTR: 0.69s +2026-07-31 16:22:33,077 INFO [pipeline.engine] [06c4e0be5d07] color analysis: 0.12s +2026-07-31 16:22:33,108 INFO [pipeline.engine] [06c4e0be5d07] shape analysis: 0.03s +2026-07-31 16:22:33,346 INFO [pipeline.engine] [06c4e0be5d07] texture analysis: 0.24s +2026-07-31 16:22:33,478 INFO [pipeline.engine] [06c4e0be5d07] total: 3.07s, weighted best: SKU_1 +2026-07-31 16:22:33,555 INFO [pipeline.engine] [06c4e0be5d07] done, peak RSS so far: 1760 MB +2026-07-31 16:22:33,555 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:22:33,604 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:22:33,618 INFO [__main__] [06c4e0be5d07] verifying against SKU_1 via external endpoint +2026-07-31 16:22:33,621 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:22:33,623 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:22:33,625 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:22:33,625 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:22:33,626 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/original.jpeg HTTP/1.1" 200 - +2026-07-31 16:22:33,629 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:22:33,630 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/nobg.png HTTP/1.1" 200 - +2026-07-31 16:22:33,632 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:22:33,634 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:22:33,636 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:22:33,638 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:22:33,638 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:33] "GET /uploads/06c4e0be5d07/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:22:38,389 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:22:38] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:23:31,852 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:23:31] "GET / HTTP/1.1" 200 - +2026-07-31 16:24:05,454 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:05] "GET / HTTP/1.1" 200 - +2026-07-31 16:24:05,468 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:05] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 16:24:05,469 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:05] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 16:24:05,747 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:05] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 16:24:05,748 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:05] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 16:24:05,748 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:05] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 16:24:05,749 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:05] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 16:24:05,750 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:05] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 16:24:05,750 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:05] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 16:24:05,819 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:05] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-31 16:24:07,991 INFO [pipeline.engine] [ebf4d001633e] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-07-31 16:24:08,026 INFO [pipeline.engine] [ebf4d001633e] background removal: 0.03s +2026-07-31 16:24:08,364 INFO [pipeline.engine] [ebf4d001633e] SIFT: 0.31s +2026-07-31 16:24:08,699 INFO [pipeline.engine] [ebf4d001633e] ORB: 0.33s +2026-07-31 16:24:09,715 INFO [pipeline.engine] [ebf4d001633e] SuperGlue: 1.02s +2026-07-31 16:24:10,105 INFO [pipeline.engine] [ebf4d001633e] LoFTR: 0.38s +2026-07-31 16:24:10,184 INFO [pipeline.engine] [ebf4d001633e] color analysis: 0.04s +2026-07-31 16:24:10,190 INFO [pipeline.engine] [ebf4d001633e] shape analysis: 0.01s +2026-07-31 16:24:10,423 INFO [pipeline.engine] [ebf4d001633e] texture analysis: 0.23s +2026-07-31 16:24:10,565 INFO [pipeline.engine] [ebf4d001633e] total: 2.57s, weighted best: SKU_1 +2026-07-31 16:24:10,647 INFO [pipeline.engine] [ebf4d001633e] done, peak RSS so far: 1945 MB +2026-07-31 16:24:10,649 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:24:10,709 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:24:10,709 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:24:10,710 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/original.jpg HTTP/1.1" 200 - +2026-07-31 16:24:10,710 INFO [__main__] [ebf4d001633e] verifying against SKU_1 via external endpoint +2026-07-31 16:24:10,711 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/nobg.png HTTP/1.1" 200 - +2026-07-31 16:24:10,711 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:24:10,721 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:24:10,721 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:24:10,722 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:24:10,724 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:24:10,729 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:24:10,730 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:24:10,731 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:24:10,731 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:10] "GET /uploads/ebf4d001633e/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:24:20,378 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:24:20] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:25:14,547 INFO [pipeline.engine] [03bb526e19db] new upload: 'WhatsApp Image 2026-07-13 at 6.15.18 PM (3).jpeg' (194.2 KB) +2026-07-31 16:25:14,565 INFO [pipeline.engine] [03bb526e19db] background removal: 0.02s +2026-07-31 16:25:14,845 INFO [pipeline.engine] [03bb526e19db] SIFT: 0.26s +2026-07-31 16:25:15,160 INFO [pipeline.engine] [03bb526e19db] ORB: 0.31s +2026-07-31 16:25:16,137 INFO [pipeline.engine] [03bb526e19db] SuperGlue: 0.98s +2026-07-31 16:25:16,625 INFO [pipeline.engine] [03bb526e19db] LoFTR: 0.48s +2026-07-31 16:25:16,692 INFO [pipeline.engine] [03bb526e19db] color analysis: 0.04s +2026-07-31 16:25:16,697 INFO [pipeline.engine] [03bb526e19db] shape analysis: 0.00s +2026-07-31 16:25:16,930 INFO [pipeline.engine] [03bb526e19db] texture analysis: 0.23s +2026-07-31 16:25:17,055 INFO [pipeline.engine] [03bb526e19db] total: 2.51s, weighted best: SKU_1 +2026-07-31 16:25:17,131 INFO [pipeline.engine] [03bb526e19db] done, peak RSS so far: 1983 MB +2026-07-31 16:25:17,131 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:25:17,181 INFO [__main__] [03bb526e19db] verifying against SKU_1 via external endpoint +2026-07-31 16:25:17,195 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/nobg.png HTTP/1.1" 200 - +2026-07-31 16:25:17,197 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:25:17,199 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:25:17,201 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:25:17,202 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:25:17,203 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:25:17,205 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/original.jpeg HTTP/1.1" 200 - +2026-07-31 16:25:17,207 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:25:17,208 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:25:17,208 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:25:17,211 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:25:17,211 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:25:17,213 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:17] "GET /uploads/03bb526e19db/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:25:22,436 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:25:22] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:27:54,262 INFO [pipeline.engine] [5e57de9ccff3] new upload: 'SKU_1.png' (34.4 KB) +2026-07-31 16:27:54,263 INFO [pipeline.engine] [5e57de9ccff3] background removal: 0.00s +2026-07-31 16:27:54,295 INFO [pipeline.engine] [5e57de9ccff3] SIFT: 0.03s +2026-07-31 16:27:54,329 INFO [pipeline.engine] [5e57de9ccff3] ORB: 0.03s +2026-07-31 16:27:54,723 INFO [pipeline.engine] [5e57de9ccff3] SuperGlue: 0.39s +2026-07-31 16:27:55,028 INFO [pipeline.engine] [5e57de9ccff3] LoFTR: 0.30s +2026-07-31 16:27:55,064 INFO [pipeline.engine] [5e57de9ccff3] color analysis: 0.01s +2026-07-31 16:27:55,065 INFO [pipeline.engine] [5e57de9ccff3] shape analysis: 0.00s +2026-07-31 16:27:55,078 INFO [pipeline.engine] [5e57de9ccff3] texture analysis: 0.01s +2026-07-31 16:27:55,115 INFO [pipeline.engine] [5e57de9ccff3] total: 0.85s, weighted best: SKU_1 +2026-07-31 16:27:55,190 INFO [pipeline.engine] [5e57de9ccff3] done, peak RSS so far: 1983 MB +2026-07-31 16:27:55,190 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:27:55,240 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:27:55,255 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:27:55,256 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:27:55,257 INFO [__main__] [5e57de9ccff3] verifying against SKU_1 via external endpoint +2026-07-31 16:27:55,258 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:27:55,261 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:27:55,262 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/original.png HTTP/1.1" 200 - +2026-07-31 16:27:55,266 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:27:55,267 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:27:55,268 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/nobg.png HTTP/1.1" 200 - +2026-07-31 16:27:55,269 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:27:55,270 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:27:55,271 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:27:55,272 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:27:55] "GET /uploads/5e57de9ccff3/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:28:04,334 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:28:04] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:47:37,008 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 16:47:37,008 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 16:47:37,124 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 16:47:38,162 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 16:47:38,226 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 16:47:38,381 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 16:47:38,501 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 16:47:38,560 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 16:47:38,689 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 16:47:38,689 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 16:47:38,690 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 16:47:38,690 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 16:47:40,904 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:47:40] "GET / HTTP/1.1" 200 - +2026-07-31 16:49:17,085 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:17] "GET / HTTP/1.1" 200 - +2026-07-31 16:49:17,094 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:17] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 16:49:17,095 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:17] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 16:49:17,326 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:17] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 16:49:17,327 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:17] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 16:49:17,327 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:17] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 16:49:17,327 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:17] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 16:49:17,327 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:17] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 16:49:17,328 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:17] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 16:49:17,395 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:17] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-31 16:49:19,615 INFO [pipeline.engine] [cd3fbd4a3396] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-07-31 16:49:19,648 INFO [pipeline.engine] [cd3fbd4a3396] background removal: 0.03s +2026-07-31 16:49:19,976 INFO [pipeline.engine] [cd3fbd4a3396] SIFT: 0.30s +2026-07-31 16:49:20,365 INFO [pipeline.engine] [cd3fbd4a3396] ORB: 0.37s +2026-07-31 16:49:20,436 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 16:49:21,518 INFO [pipeline.engine] [cd3fbd4a3396] SuperGlue: 1.15s +2026-07-31 16:49:21,533 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 16:49:22,125 INFO [pipeline.engine] [cd3fbd4a3396] LoFTR: 0.60s +2026-07-31 16:49:22,314 INFO [pipeline.engine] [cd3fbd4a3396] color analysis: 0.13s +2026-07-31 16:49:22,322 INFO [pipeline.engine] [cd3fbd4a3396] shape analysis: 0.01s +2026-07-31 16:49:22,554 INFO [pipeline.engine] [cd3fbd4a3396] texture analysis: 0.23s +2026-07-31 16:49:22,698 INFO [pipeline.engine] [cd3fbd4a3396] total: 3.08s, weighted best: SKU_1 +2026-07-31 16:49:22,773 INFO [pipeline.engine] [cd3fbd4a3396] done, peak RSS so far: 1800 MB +2026-07-31 16:49:22,775 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:49:22,841 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/nobg.png HTTP/1.1" 200 - +2026-07-31 16:49:22,843 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:49:22,843 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:49:22,844 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:49:22,844 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/original.jpg HTTP/1.1" 200 - +2026-07-31 16:49:22,845 INFO [__main__] [cd3fbd4a3396] verifying against SKU_1 via external endpoint +2026-07-31 16:49:22,852 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:49:22,858 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:49:22,858 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:49:22,860 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:49:22,862 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:49:22,864 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:49:22,868 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:49:22,869 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:22] "GET /uploads/cd3fbd4a3396/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:49:24,817 INFO [pipeline.engine] [cd3fbd4a3396] unloaded matching-pipeline models before SAM run +2026-07-31 16:49:24,818 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-07-31 16:49:32,806 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:32] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:49:38,389 INFO [pipeline.engine] [cd3fbd4a3396] flower count: 13.67s, total=6 +2026-07-31 16:49:38,389 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:38] "POST /api/count_flowers HTTP/1.1" 200 - +2026-07-31 16:49:38,393 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:49:38] "GET /uploads/cd3fbd4a3396/flower_count.png?t=1785496778392 HTTP/1.1" 200 - +2026-07-31 16:50:03,212 INFO [pipeline.engine] [9b97f58815d5] new upload: '20260727_163536.jpg' (12616.7 KB) +2026-07-31 16:50:03,245 INFO [pipeline.engine] [9b97f58815d5] background removal: 0.03s +2026-07-31 16:50:03,832 INFO [pipeline.engine] [9b97f58815d5] SIFT: 0.56s +2026-07-31 16:50:04,139 INFO [pipeline.engine] [9b97f58815d5] ORB: 0.31s +2026-07-31 16:50:04,161 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 16:50:04,198 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 16:50:05,130 INFO [pipeline.engine] [9b97f58815d5] SuperGlue: 0.99s +2026-07-31 16:50:05,146 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 16:50:05,690 INFO [pipeline.engine] [9b97f58815d5] LoFTR: 0.55s +2026-07-31 16:50:05,769 INFO [pipeline.engine] [9b97f58815d5] color analysis: 0.05s +2026-07-31 16:50:05,773 INFO [pipeline.engine] [9b97f58815d5] shape analysis: 0.00s +2026-07-31 16:50:05,993 INFO [pipeline.engine] [9b97f58815d5] texture analysis: 0.22s +2026-07-31 16:50:06,139 INFO [pipeline.engine] [9b97f58815d5] total: 2.93s, weighted best: SKU_2 +2026-07-31 16:50:06,222 INFO [pipeline.engine] [9b97f58815d5] done, peak RSS so far: 2823 MB +2026-07-31 16:50:06,223 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:50:06] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:51:18,949 INFO [pipeline.engine] [38b25f74c86d] new upload: 'SKU_1.png' (34.4 KB) +2026-07-31 16:51:18,950 INFO [pipeline.engine] [38b25f74c86d] background removal: 0.00s +2026-07-31 16:51:18,984 INFO [pipeline.engine] [38b25f74c86d] SIFT: 0.03s +2026-07-31 16:51:19,018 INFO [pipeline.engine] [38b25f74c86d] ORB: 0.03s +2026-07-31 16:51:19,427 INFO [pipeline.engine] [38b25f74c86d] SuperGlue: 0.41s +2026-07-31 16:51:19,751 INFO [pipeline.engine] [38b25f74c86d] LoFTR: 0.32s +2026-07-31 16:51:19,789 INFO [pipeline.engine] [38b25f74c86d] color analysis: 0.01s +2026-07-31 16:51:19,790 INFO [pipeline.engine] [38b25f74c86d] shape analysis: 0.00s +2026-07-31 16:51:19,802 INFO [pipeline.engine] [38b25f74c86d] texture analysis: 0.01s +2026-07-31 16:51:19,839 INFO [pipeline.engine] [38b25f74c86d] total: 0.89s, weighted best: SKU_1 +2026-07-31 16:51:19,915 INFO [pipeline.engine] [38b25f74c86d] done, peak RSS so far: 2823 MB +2026-07-31 16:51:19,916 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:51:19,963 INFO [__main__] [38b25f74c86d] verifying against SKU_1 via external endpoint +2026-07-31 16:51:19,975 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/nobg.png HTTP/1.1" 200 - +2026-07-31 16:51:19,976 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:51:19,978 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:51:19,981 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:51:19,982 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:51:19,983 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:51:19,984 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:51:19,987 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/original.png HTTP/1.1" 200 - +2026-07-31 16:51:19,987 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:51:19,989 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:51:19,992 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:51:19,992 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:51:19,992 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:19] "GET /uploads/38b25f74c86d/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:51:30,227 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:30] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:51:41,709 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:41] "GET / HTTP/1.1" 200 - +2026-07-31 16:51:41,958 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:41] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 16:51:41,958 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:41] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 16:51:42,206 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:42] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 16:51:42,207 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:42] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 16:51:42,209 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:42] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 16:51:42,210 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:42] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 16:51:42,211 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:42] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 16:51:42,219 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:42] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 16:51:47,728 INFO [pipeline.engine] [0bea324ae613] new upload: 'WhatsApp Image 2026-07-13 at 6.15.18 PM (3).jpeg' (194.2 KB) +2026-07-31 16:51:47,747 INFO [pipeline.engine] [0bea324ae613] background removal: 0.02s +2026-07-31 16:51:48,201 INFO [pipeline.engine] [0bea324ae613] SIFT: 0.43s +2026-07-31 16:51:48,502 INFO [pipeline.engine] [0bea324ae613] ORB: 0.30s +2026-07-31 16:51:49,465 INFO [pipeline.engine] [0bea324ae613] SuperGlue: 0.96s +2026-07-31 16:51:49,972 INFO [pipeline.engine] [0bea324ae613] LoFTR: 0.50s +2026-07-31 16:51:50,043 INFO [pipeline.engine] [0bea324ae613] color analysis: 0.05s +2026-07-31 16:51:50,047 INFO [pipeline.engine] [0bea324ae613] shape analysis: 0.00s +2026-07-31 16:51:50,282 INFO [pipeline.engine] [0bea324ae613] texture analysis: 0.23s +2026-07-31 16:51:50,411 INFO [pipeline.engine] [0bea324ae613] total: 2.68s, weighted best: SKU_1 +2026-07-31 16:51:50,485 INFO [pipeline.engine] [0bea324ae613] done, peak RSS so far: 3042 MB +2026-07-31 16:51:50,486 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:51:50,547 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:51:50,548 INFO [__main__] [0bea324ae613] verifying against SKU_1 via external endpoint +2026-07-31 16:51:50,549 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/original.jpeg HTTP/1.1" 200 - +2026-07-31 16:51:50,554 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:51:50,554 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:51:50,555 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/nobg.png HTTP/1.1" 200 - +2026-07-31 16:51:50,555 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:51:50,557 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:51:50,560 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:51:50,562 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:51:50,563 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:51:50,563 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:51:50,565 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:51:50,566 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:50] "GET /uploads/0bea324ae613/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:51:55,980 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:51:55] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:51:58,444 INFO [pipeline.engine] [0bea324ae613] unloaded matching-pipeline models before SAM run +2026-07-31 16:51:58,445 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-07-31 16:52:12,006 INFO [pipeline.engine] [0bea324ae613] flower count: 13.66s, total=18 +2026-07-31 16:52:12,007 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:52:12] "POST /api/count_flowers HTTP/1.1" 200 - +2026-07-31 16:52:12,043 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:52:12] "GET /uploads/0bea324ae613/flower_count.png?t=1785496932019 HTTP/1.1" 200 - +2026-07-31 16:52:33,253 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:52:33] "GET /uploads/0bea324ae613/flower_count.png?t=1785496932019 HTTP/1.1" 304 - +2026-07-31 16:53:24,594 INFO [pipeline.utils] Compressed upload: 15.4 MB -> 0.3 MB (738x1600, JPEG q92) +2026-07-31 16:53:24,595 INFO [pipeline.engine] [1c5ff526daca] new upload: '20260727_174451.jpg' (262.5 KB) +2026-07-31 16:53:26,673 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-31 16:53:26,673 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-31 16:53:36,469 INFO [pipeline.engine] [1c5ff526daca] background removal: 11.87s +2026-07-31 16:53:36,813 INFO [pipeline.engine] [1c5ff526daca] SIFT: 0.33s +2026-07-31 16:53:37,135 INFO [pipeline.engine] [1c5ff526daca] ORB: 0.32s +2026-07-31 16:53:37,157 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 16:53:37,195 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 16:53:38,224 INFO [pipeline.engine] [1c5ff526daca] SuperGlue: 1.09s +2026-07-31 16:53:38,239 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 16:53:38,774 INFO [pipeline.engine] [1c5ff526daca] LoFTR: 0.54s +2026-07-31 16:53:38,865 INFO [pipeline.engine] [1c5ff526daca] color analysis: 0.05s +2026-07-31 16:53:38,869 INFO [pipeline.engine] [1c5ff526daca] shape analysis: 0.00s +2026-07-31 16:53:39,090 INFO [pipeline.engine] [1c5ff526daca] texture analysis: 0.22s +2026-07-31 16:53:39,257 INFO [pipeline.engine] [1c5ff526daca] total: 14.66s, weighted best: SKU_3 +2026-07-31 16:53:39,332 INFO [pipeline.engine] [1c5ff526daca] done, peak RSS so far: 9306 MB +2026-07-31 16:53:39,334 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "POST /api/match HTTP/1.1" 200 - +2026-07-31 16:53:39,387 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:53:39,403 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 16:53:39,407 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/ORB_best.png HTTP/1.1" 200 - +2026-07-31 16:53:39,409 INFO [__main__] [1c5ff526daca] verifying against SKU_3 via external endpoint +2026-07-31 16:53:39,409 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/original.jpg HTTP/1.1" 200 - +2026-07-31 16:53:39,410 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 16:53:39,412 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 16:53:39,414 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:53:39,415 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/nobg.png HTTP/1.1" 200 - +2026-07-31 16:53:39,416 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 16:53:39,419 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 16:53:39,421 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/template_lbp.png HTTP/1.1" 200 - +2026-07-31 16:53:39,422 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 16:53:39,423 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:39] "GET /uploads/1c5ff526daca/input_lbp.png HTTP/1.1" 200 - +2026-07-31 16:53:50,974 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:53:50] "POST /api/verify HTTP/1.1" 200 - +2026-07-31 16:54:14,277 INFO [pipeline.engine] [1c5ff526daca] unloaded matching-pipeline models before SAM run +2026-07-31 16:54:14,277 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-07-31 16:54:27,656 INFO [pipeline.engine] [1c5ff526daca] flower count: 13.80s, total=16 +2026-07-31 16:54:27,656 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:54:27] "POST /api/count_flowers HTTP/1.1" 200 - +2026-07-31 16:54:27,693 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 16:54:27] "GET /uploads/1c5ff526daca/flower_count.png?t=1785497067668 HTTP/1.1" 200 - +2026-07-31 17:45:47,247 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 17:45:47,247 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 17:45:47,373 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 17:45:48,308 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 17:45:48,373 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 17:45:48,530 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 17:45:48,653 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 17:45:48,712 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 17:45:48,849 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 17:45:48,849 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 17:45:48,850 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 17:45:48,850 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 17:45:51,110 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:45:51] "GET / HTTP/1.1" 200 - +2026-07-31 17:48:54,719 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:48:54] "GET / HTTP/1.1" 200 - +2026-07-31 17:48:54,730 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:48:54] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 17:48:54,730 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:48:54] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 17:48:55,013 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:48:55] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 17:48:55,013 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:48:55] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 17:48:55,013 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:48:55] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 17:48:55,014 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:48:55] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 17:48:55,015 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:48:55] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 17:48:55,015 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:48:55] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 17:48:55,103 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:48:55] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-31 17:48:57,251 INFO [pipeline.engine] [69f1781416e1] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-07-31 17:48:57,283 INFO [pipeline.engine] [69f1781416e1] background removal: 0.03s +2026-07-31 17:48:57,621 INFO [pipeline.engine] [69f1781416e1] SIFT: 0.31s +2026-07-31 17:48:57,969 INFO [pipeline.engine] [69f1781416e1] ORB: 0.33s +2026-07-31 17:48:58,033 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 17:48:59,099 INFO [pipeline.engine] [69f1781416e1] SuperGlue: 1.13s +2026-07-31 17:48:59,115 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 17:48:59,700 INFO [pipeline.engine] [69f1781416e1] LoFTR: 0.59s +2026-07-31 17:48:59,867 INFO [pipeline.engine] [69f1781416e1] color analysis: 0.13s +2026-07-31 17:48:59,873 INFO [pipeline.engine] [69f1781416e1] shape analysis: 0.01s +2026-07-31 17:49:00,116 INFO [pipeline.engine] [69f1781416e1] texture analysis: 0.24s +2026-07-31 17:49:00,269 INFO [pipeline.engine] [69f1781416e1] total: 3.02s, weighted best: SKU_1 +2026-07-31 17:49:00,345 INFO [pipeline.engine] [69f1781416e1] done, peak RSS so far: 1784 MB +2026-07-31 17:49:00,347 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "POST /api/match HTTP/1.1" 200 - +2026-07-31 17:49:00,409 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/original.jpg HTTP/1.1" 200 - +2026-07-31 17:49:00,410 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 17:49:00,410 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 17:49:00,411 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/ORB_best.png HTTP/1.1" 200 - +2026-07-31 17:49:00,411 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/nobg.png HTTP/1.1" 200 - +2026-07-31 17:49:00,412 INFO [__main__] [69f1781416e1] verifying against SKU_1 via external endpoint +2026-07-31 17:49:00,421 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 17:49:00,422 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 17:49:00,423 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 17:49:00,424 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 17:49:00,428 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/template_lbp.png HTTP/1.1" 200 - +2026-07-31 17:49:00,429 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/input_lbp.png HTTP/1.1" 200 - +2026-07-31 17:49:00,431 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 17:49:00,432 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "GET /uploads/69f1781416e1/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 17:49:00,433 WARNING [__main__] [69f1781416e1] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-07-31 17:49:00,433 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:00] "POST /api/verify HTTP/1.1" 502 - +2026-07-31 17:49:02,365 INFO [pipeline.engine] [69f1781416e1] unloaded matching-pipeline models before SAM/YOLO-World run +2026-07-31 17:49:02,365 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-07-31 17:49:05,530 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-07-31 17:49:18,919 INFO [pipeline.engine] [69f1781416e1] flower count: 16.65s, SAM total=3, YOLO flower/vase/ribbon=1/1/0 +2026-07-31 17:49:18,927 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:18] "POST /api/count_flowers HTTP/1.1" 200 - +2026-07-31 17:49:18,930 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:18] "GET /uploads/69f1781416e1/flower_count_sam.png?t=1785500358928 HTTP/1.1" 200 - +2026-07-31 17:49:18,931 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:18] "GET /uploads/69f1781416e1/flower_count_yolo.png?t=1785500358928 HTTP/1.1" 200 - +2026-07-31 17:49:47,075 INFO [pipeline.engine] [818dfa702eea] new upload: '20260727_174422.jpg' (9958.5 KB) +2026-07-31 17:49:47,106 INFO [pipeline.engine] [818dfa702eea] background removal: 0.03s +2026-07-31 17:49:47,507 INFO [pipeline.engine] [818dfa702eea] SIFT: 0.38s +2026-07-31 17:49:47,826 INFO [pipeline.engine] [818dfa702eea] ORB: 0.32s +2026-07-31 17:49:47,837 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 17:49:47,872 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 17:49:48,909 INFO [pipeline.engine] [818dfa702eea] SuperGlue: 1.08s +2026-07-31 17:49:48,925 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 17:49:49,482 INFO [pipeline.engine] [818dfa702eea] LoFTR: 0.57s +2026-07-31 17:49:49,573 INFO [pipeline.engine] [818dfa702eea] color analysis: 0.06s +2026-07-31 17:49:49,577 INFO [pipeline.engine] [818dfa702eea] shape analysis: 0.00s +2026-07-31 17:49:49,815 INFO [pipeline.engine] [818dfa702eea] texture analysis: 0.24s +2026-07-31 17:49:50,030 INFO [pipeline.engine] [818dfa702eea] total: 2.95s, weighted best: SKU_3 +2026-07-31 17:49:50,115 INFO [pipeline.engine] [818dfa702eea] done, peak RSS so far: 3176 MB +2026-07-31 17:49:50,117 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:49:50] "POST /api/match HTTP/1.1" 200 - +2026-07-31 17:50:43,219 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:50:43] "GET / HTTP/1.1" 200 - +2026-07-31 17:50:43,469 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:50:43] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 17:50:43,482 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:50:43] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 17:50:43,740 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:50:43] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 17:50:43,741 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:50:43] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 17:50:43,754 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:50:43] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 17:50:43,756 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:50:43] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 17:50:43,756 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:50:43] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 17:50:43,757 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:50:43] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 17:50:49,532 INFO [pipeline.engine] [777659eea52a] new upload: 'SKU_2.png' (50.7 KB) +2026-07-31 17:50:51,707 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-07-31 17:50:51,707 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-07-31 17:51:01,499 INFO [pipeline.engine] [777659eea52a] background removal: 11.97s +2026-07-31 17:51:01,546 INFO [pipeline.engine] [777659eea52a] SIFT: 0.05s +2026-07-31 17:51:01,609 INFO [pipeline.engine] [777659eea52a] ORB: 0.06s +2026-07-31 17:51:01,999 INFO [pipeline.engine] [777659eea52a] SuperGlue: 0.39s +2026-07-31 17:51:02,323 INFO [pipeline.engine] [777659eea52a] LoFTR: 0.32s +2026-07-31 17:51:02,367 INFO [pipeline.engine] [777659eea52a] color analysis: 0.02s +2026-07-31 17:51:02,368 INFO [pipeline.engine] [777659eea52a] shape analysis: 0.00s +2026-07-31 17:51:02,380 INFO [pipeline.engine] [777659eea52a] texture analysis: 0.01s +2026-07-31 17:51:02,435 INFO [pipeline.engine] [777659eea52a] total: 12.90s, weighted best: SKU_2 +2026-07-31 17:51:02,510 INFO [pipeline.engine] [777659eea52a] done, peak RSS so far: 8987 MB +2026-07-31 17:51:02,510 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "POST /api/match HTTP/1.1" 200 - +2026-07-31 17:51:02,581 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 17:51:02,581 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/template_lbp.png HTTP/1.1" 200 - +2026-07-31 17:51:02,583 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/input_lbp.png HTTP/1.1" 200 - +2026-07-31 17:51:02,584 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/original.png HTTP/1.1" 200 - +2026-07-31 17:51:02,585 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 17:51:02,586 INFO [__main__] [777659eea52a] verifying against SKU_2 via external endpoint +2026-07-31 17:51:02,590 WARNING [__main__] [777659eea52a] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-07-31 17:51:02,590 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "POST /api/verify HTTP/1.1" 502 - +2026-07-31 17:51:02,596 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/nobg.png HTTP/1.1" 200 - +2026-07-31 17:51:02,598 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 17:51:02,598 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 17:51:02,599 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/ORB_best.png HTTP/1.1" 200 - +2026-07-31 17:51:02,601 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 17:51:02,603 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 17:51:02,603 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 17:51:02,605 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:02] "GET /uploads/777659eea52a/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 17:51:36,367 INFO [pipeline.engine] [777659eea52a] unloaded matching-pipeline models before SAM/YOLO-World run +2026-07-31 17:51:36,367 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-07-31 17:51:39,160 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-07-31 17:51:52,394 INFO [pipeline.engine] [777659eea52a] flower count: 16.43s, SAM total=8, YOLO flower/vase/ribbon=1/1/0 +2026-07-31 17:51:52,401 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:52] "POST /api/count_flowers HTTP/1.1" 200 - +2026-07-31 17:51:52,440 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:52] "GET /uploads/777659eea52a/flower_count_yolo.png?t=1785500512416 HTTP/1.1" 200 - +2026-07-31 17:51:52,442 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:51:52] "GET /uploads/777659eea52a/flower_count_sam.png?t=1785500512416 HTTP/1.1" 200 - +2026-07-31 17:53:06,504 INFO [pipeline.engine] [65f5fa07f03f] new upload: '20260727_193610.jpg' (10858.6 KB) +2026-07-31 17:53:06,528 INFO [pipeline.engine] [65f5fa07f03f] background removal: 0.02s +2026-07-31 17:53:06,815 INFO [pipeline.engine] [65f5fa07f03f] SIFT: 0.27s +2026-07-31 17:53:07,126 INFO [pipeline.engine] [65f5fa07f03f] ORB: 0.31s +2026-07-31 17:53:07,142 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 17:53:07,179 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 17:53:08,163 INFO [pipeline.engine] [65f5fa07f03f] SuperGlue: 1.04s +2026-07-31 17:53:08,178 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 17:53:08,713 INFO [pipeline.engine] [65f5fa07f03f] LoFTR: 0.54s +2026-07-31 17:53:08,785 INFO [pipeline.engine] [65f5fa07f03f] color analysis: 0.05s +2026-07-31 17:53:08,789 INFO [pipeline.engine] [65f5fa07f03f] shape analysis: 0.00s +2026-07-31 17:53:09,004 INFO [pipeline.engine] [65f5fa07f03f] texture analysis: 0.22s +2026-07-31 17:53:09,129 INFO [pipeline.engine] [65f5fa07f03f] total: 2.62s, weighted best: SKU_5 +2026-07-31 17:53:09,205 INFO [pipeline.engine] [65f5fa07f03f] done, peak RSS so far: 8988 MB +2026-07-31 17:53:09,207 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "POST /api/match HTTP/1.1" 200 - +2026-07-31 17:53:09,268 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/nobg.png HTTP/1.1" 200 - +2026-07-31 17:53:09,282 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 17:53:09,283 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/original.jpg HTTP/1.1" 200 - +2026-07-31 17:53:09,284 INFO [__main__] [65f5fa07f03f] verifying against SKU_5 via external endpoint +2026-07-31 17:53:09,286 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 17:53:09,286 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 17:53:09,287 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 17:53:09,288 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 17:53:09,290 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 17:53:09,292 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 17:53:09,293 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/input_lbp.png HTTP/1.1" 200 - +2026-07-31 17:53:09,300 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/template_lbp.png HTTP/1.1" 200 - +2026-07-31 17:53:09,301 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/ORB_best.png HTTP/1.1" 200 - +2026-07-31 17:53:09,302 WARNING [__main__] [65f5fa07f03f] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-07-31 17:53:09,303 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "POST /api/verify HTTP/1.1" 502 - +2026-07-31 17:53:09,320 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:53:09] "GET /uploads/65f5fa07f03f/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 17:53:45,809 INFO [pipeline.engine] [65f5fa07f03f] unloaded matching-pipeline models before SAM/YOLO-World run +2026-07-31 17:53:45,809 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-07-31 17:53:48,476 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-07-31 17:54:01,725 INFO [pipeline.engine] [65f5fa07f03f] flower count: 16.02s, SAM total=4, YOLO flower/vase/ribbon=1/1/0 +2026-07-31 17:54:01,727 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:54:01] "POST /api/count_flowers HTTP/1.1" 200 - +2026-07-31 17:54:01,766 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:54:01] "GET /uploads/65f5fa07f03f/flower_count_sam.png?t=1785500641740 HTTP/1.1" 200 - +2026-07-31 17:54:01,767 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:54:01] "GET /uploads/65f5fa07f03f/flower_count_yolo.png?t=1785500641740 HTTP/1.1" 200 - +2026-07-31 17:54:21,510 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 17:54:21] "GET /uploads/65f5fa07f03f/flower_count_sam.png?t=1785500641740 HTTP/1.1" 304 - +2026-07-31 18:09:03,849 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-07-31 18:09:03,849 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-07-31 18:09:03,973 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 18:09:04,896 INFO [pipeline.engine] template ready: SKU_1 +2026-07-31 18:09:04,962 INFO [pipeline.engine] template ready: SKU_2 +2026-07-31 18:09:05,113 INFO [pipeline.engine] template ready: SKU_3 +2026-07-31 18:09:05,238 INFO [pipeline.engine] template ready: SKU_4 +2026-07-31 18:09:05,297 INFO [pipeline.engine] template ready: SKU_5 +2026-07-31 18:09:05,429 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-07-31 18:09:05,429 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-07-31 18:09:05,430 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-07-31 18:09:05,431 INFO [werkzeug] Press CTRL+C to quit +2026-07-31 18:09:07,719 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:09:07] "GET / HTTP/1.1" 200 - +2026-07-31 18:11:34,805 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:34] "GET / HTTP/1.1" 200 - +2026-07-31 18:11:34,814 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:34] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 18:11:34,815 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:34] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 18:11:35,094 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:35] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-07-31 18:11:35,096 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:35] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-07-31 18:11:35,096 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:35] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-07-31 18:11:35,097 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:35] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-07-31 18:11:35,097 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:35] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-07-31 18:11:35,099 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:35] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-07-31 18:11:35,168 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:35] "GET /favicon.ico HTTP/1.1" 404 - +2026-07-31 18:11:37,339 INFO [pipeline.engine] [96787f96a1b2] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-07-31 18:11:37,371 INFO [pipeline.engine] [96787f96a1b2] background removal: 0.03s +2026-07-31 18:11:37,701 INFO [pipeline.engine] [96787f96a1b2] SIFT: 0.31s +2026-07-31 18:11:38,060 INFO [pipeline.engine] [96787f96a1b2] ORB: 0.34s +2026-07-31 18:11:38,130 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 18:11:39,199 INFO [pipeline.engine] [96787f96a1b2] SuperGlue: 1.14s +2026-07-31 18:11:39,214 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 18:11:39,781 INFO [pipeline.engine] [96787f96a1b2] LoFTR: 0.58s +2026-07-31 18:11:39,931 INFO [pipeline.engine] [96787f96a1b2] color analysis: 0.12s +2026-07-31 18:11:39,937 INFO [pipeline.engine] [96787f96a1b2] shape analysis: 0.01s +2026-07-31 18:11:40,168 INFO [pipeline.engine] [96787f96a1b2] texture analysis: 0.23s +2026-07-31 18:11:40,315 INFO [pipeline.engine] [96787f96a1b2] total: 2.98s, weighted best: SKU_1 +2026-07-31 18:11:40,391 INFO [pipeline.engine] [96787f96a1b2] done, peak RSS so far: 1775 MB +2026-07-31 18:11:40,393 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "POST /api/match HTTP/1.1" 200 - +2026-07-31 18:11:40,462 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/ORB_best.png HTTP/1.1" 200 - +2026-07-31 18:11:40,462 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 18:11:40,463 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/nobg.png HTTP/1.1" 200 - +2026-07-31 18:11:40,463 INFO [__main__] [96787f96a1b2] verifying against SKU_1 via external endpoint +2026-07-31 18:11:40,464 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 18:11:40,466 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/original.jpg HTTP/1.1" 200 - +2026-07-31 18:11:40,471 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 18:11:40,471 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 18:11:40,480 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 18:11:40,482 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 18:11:40,482 WARNING [__main__] [96787f96a1b2] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-07-31 18:11:40,483 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "POST /api/verify HTTP/1.1" 502 - +2026-07-31 18:11:40,489 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/template_lbp.png HTTP/1.1" 200 - +2026-07-31 18:11:40,490 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/input_lbp.png HTTP/1.1" 200 - +2026-07-31 18:11:40,492 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 18:11:40,493 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:11:40] "GET /uploads/96787f96a1b2/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 18:11:42,451 INFO [pipeline.engine] [96787f96a1b2] unloaded matching-pipeline models before SAM/YOLO-World/DINO/CLIP run +2026-07-31 18:11:42,451 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-07-31 18:11:45,597 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-07-31 18:11:58,647 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-07-31 18:11:59,775 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-07-31 18:12:02,789 INFO [pipeline.engine] [96787f96a1b2] flower count: 20.44s, SAM total=3, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-07-31 18:12:02,795 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:12:02] "POST /api/count_flowers HTTP/1.1" 200 - +2026-07-31 18:12:02,800 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:12:02] "GET /uploads/96787f96a1b2/vase_crop_input.png?t=1785501722797 HTTP/1.1" 200 - +2026-07-31 18:12:02,801 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:12:02] "GET /uploads/96787f96a1b2/flower_count_sam.png?t=1785501722796 HTTP/1.1" 200 - +2026-07-31 18:12:02,801 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:12:02] "GET /uploads/96787f96a1b2/vase_crop_template.png?t=1785501722797 HTTP/1.1" 200 - +2026-07-31 18:12:02,802 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:12:02] "GET /uploads/96787f96a1b2/flower_count_yolo.png?t=1785501722797 HTTP/1.1" 200 - +2026-07-31 18:12:25,945 INFO [pipeline.engine] [9e1610164a97] new upload: '20260727_154535.jpg' (12857.5 KB) +2026-07-31 18:12:25,977 INFO [pipeline.engine] [9e1610164a97] background removal: 0.03s +2026-07-31 18:12:26,341 INFO [pipeline.engine] [9e1610164a97] SIFT: 0.34s +2026-07-31 18:12:26,670 INFO [pipeline.engine] [9e1610164a97] ORB: 0.33s +2026-07-31 18:12:26,683 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 18:12:26,718 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 18:12:27,728 INFO [pipeline.engine] [9e1610164a97] SuperGlue: 1.06s +2026-07-31 18:12:27,743 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 18:12:28,299 INFO [pipeline.engine] [9e1610164a97] LoFTR: 0.56s +2026-07-31 18:12:28,386 INFO [pipeline.engine] [9e1610164a97] color analysis: 0.05s +2026-07-31 18:12:28,390 INFO [pipeline.engine] [9e1610164a97] shape analysis: 0.00s +2026-07-31 18:12:28,616 INFO [pipeline.engine] [9e1610164a97] texture analysis: 0.23s +2026-07-31 18:12:28,740 INFO [pipeline.engine] [9e1610164a97] total: 2.79s, weighted best: SKU_5 +2026-07-31 18:12:28,825 INFO [pipeline.engine] [9e1610164a97] done, peak RSS so far: 3321 MB +2026-07-31 18:12:28,827 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:12:28] "POST /api/match HTTP/1.1" 200 - +2026-07-31 18:13:33,649 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:33] "GET / HTTP/1.1" 200 - +2026-07-31 18:13:33,888 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:33] "GET /static/js/main.js HTTP/1.1" 200 - +2026-07-31 18:13:33,900 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:33] "GET /static/css/style.css HTTP/1.1" 200 - +2026-07-31 18:13:34,153 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:34] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-07-31 18:13:34,154 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:34] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-07-31 18:13:34,166 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:34] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-07-31 18:13:34,167 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:34] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-07-31 18:13:34,169 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:34] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-07-31 18:13:34,172 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:34] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-07-31 18:13:55,542 INFO [pipeline.utils] Compressed upload: 15.4 MB -> 0.3 MB (738x1600, JPEG q92) +2026-07-31 18:13:55,542 INFO [pipeline.engine] [c94fbe0994eb] new upload: '20260727_174451.jpg' (262.5 KB) +2026-07-31 18:13:55,555 INFO [pipeline.engine] [c94fbe0994eb] background removal: 0.01s +2026-07-31 18:13:55,933 INFO [pipeline.engine] [c94fbe0994eb] SIFT: 0.36s +2026-07-31 18:13:56,240 INFO [pipeline.engine] [c94fbe0994eb] ORB: 0.31s +2026-07-31 18:13:57,234 INFO [pipeline.engine] [c94fbe0994eb] SuperGlue: 0.99s +2026-07-31 18:13:57,626 INFO [pipeline.engine] [c94fbe0994eb] LoFTR: 0.38s +2026-07-31 18:13:57,718 INFO [pipeline.engine] [c94fbe0994eb] color analysis: 0.05s +2026-07-31 18:13:57,721 INFO [pipeline.engine] [c94fbe0994eb] shape analysis: 0.00s +2026-07-31 18:13:57,938 INFO [pipeline.engine] [c94fbe0994eb] texture analysis: 0.22s +2026-07-31 18:13:58,098 INFO [pipeline.engine] [c94fbe0994eb] total: 2.56s, weighted best: SKU_3 +2026-07-31 18:13:58,184 INFO [pipeline.engine] [c94fbe0994eb] done, peak RSS so far: 3527 MB +2026-07-31 18:13:58,186 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "POST /api/match HTTP/1.1" 200 - +2026-07-31 18:13:58,271 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 18:13:58,272 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/input_lbp.png HTTP/1.1" 200 - +2026-07-31 18:13:58,274 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 18:13:58,275 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/ORB_best.png HTTP/1.1" 200 - +2026-07-31 18:13:58,276 INFO [__main__] [c94fbe0994eb] verifying against SKU_3 via external endpoint +2026-07-31 18:13:58,277 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/nobg.png HTTP/1.1" 200 - +2026-07-31 18:13:58,285 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 18:13:58,286 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 18:13:58,287 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 18:13:58,290 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/template_lbp.png HTTP/1.1" 200 - +2026-07-31 18:13:58,291 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 18:13:58,292 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/original.jpg HTTP/1.1" 200 - +2026-07-31 18:13:58,292 WARNING [__main__] [c94fbe0994eb] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-07-31 18:13:58,293 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 18:13:58,293 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "GET /uploads/c94fbe0994eb/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 18:13:58,294 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:13:58] "POST /api/verify HTTP/1.1" 502 - +2026-07-31 18:14:39,300 INFO [pipeline.engine] [c94fbe0994eb] unloaded matching-pipeline models before SAM/YOLO-World/DINO/CLIP run +2026-07-31 18:14:39,300 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-07-31 18:14:42,114 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-07-31 18:14:55,623 INFO [pipeline.engine] [c94fbe0994eb] flower count: 16.43s, SAM total=16, YOLO flower/vase/ribbon=1/0/0, vase comparison=None +2026-07-31 18:14:55,623 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:14:55] "POST /api/count_flowers HTTP/1.1" 200 - +2026-07-31 18:14:55,663 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:14:55] "GET /uploads/c94fbe0994eb/flower_count_sam.png?t=1785501895638 HTTP/1.1" 200 - +2026-07-31 18:14:55,664 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:14:55] "GET /uploads/c94fbe0994eb/flower_count_yolo.png?t=1785501895638 HTTP/1.1" 200 - +2026-07-31 18:15:22,104 INFO [pipeline.utils] Compressed upload: 15.5 MB -> 0.3 MB (738x1600, JPEG q92) +2026-07-31 18:15:22,108 INFO [pipeline.engine] [2d946ea1ea6f] new upload: '20260727_194450.jpg' (260.6 KB) +2026-07-31 18:15:22,122 INFO [pipeline.engine] [2d946ea1ea6f] background removal: 0.01s +2026-07-31 18:15:22,552 INFO [pipeline.engine] [2d946ea1ea6f] SIFT: 0.41s +2026-07-31 18:15:22,847 INFO [pipeline.engine] [2d946ea1ea6f] ORB: 0.30s +2026-07-31 18:15:22,858 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-07-31 18:15:22,892 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-07-31 18:15:23,846 INFO [pipeline.engine] [2d946ea1ea6f] SuperGlue: 1.00s +2026-07-31 18:15:23,862 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-07-31 18:15:24,399 INFO [pipeline.engine] [2d946ea1ea6f] LoFTR: 0.55s +2026-07-31 18:15:24,477 INFO [pipeline.engine] [2d946ea1ea6f] color analysis: 0.05s +2026-07-31 18:15:24,482 INFO [pipeline.engine] [2d946ea1ea6f] shape analysis: 0.00s +2026-07-31 18:15:24,698 INFO [pipeline.engine] [2d946ea1ea6f] texture analysis: 0.22s +2026-07-31 18:15:24,838 INFO [pipeline.engine] [2d946ea1ea6f] total: 2.73s, weighted best: SKU_1 +2026-07-31 18:15:24,926 INFO [pipeline.engine] [2d946ea1ea6f] done, peak RSS so far: 4189 MB +2026-07-31 18:15:24,929 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:24] "POST /api/match HTTP/1.1" 200 - +2026-07-31 18:15:25,004 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/input_silhouette.png HTTP/1.1" 200 - +2026-07-31 18:15:25,006 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/input_lbp.png HTTP/1.1" 200 - +2026-07-31 18:15:25,007 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/original.jpg HTTP/1.1" 200 - +2026-07-31 18:15:25,020 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/LoFTR_best.png HTTP/1.1" 200 - +2026-07-31 18:15:25,022 INFO [__main__] [2d946ea1ea6f] verifying against SKU_1 via external endpoint +2026-07-31 18:15:25,022 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/template_family_grid.png HTTP/1.1" 200 - +2026-07-31 18:15:25,026 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/SuperGlue_best.png HTTP/1.1" 200 - +2026-07-31 18:15:25,027 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/SIFT_best.png HTTP/1.1" 200 - +2026-07-31 18:15:25,028 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/template_silhouette.png HTTP/1.1" 200 - +2026-07-31 18:15:25,029 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/ORB_best.png HTTP/1.1" 200 - +2026-07-31 18:15:25,029 WARNING [__main__] [2d946ea1ea6f] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-07-31 18:15:25,031 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/template_lbp.png HTTP/1.1" 200 - +2026-07-31 18:15:25,031 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/input_family_grid.png HTTP/1.1" 200 - +2026-07-31 18:15:25,032 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "POST /api/verify HTTP/1.1" 502 - +2026-07-31 18:15:25,033 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/nobg.png HTTP/1.1" 200 - +2026-07-31 18:15:25,035 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:15:25] "GET /uploads/2d946ea1ea6f/shape_overlay.png HTTP/1.1" 200 - +2026-07-31 18:15:54,855 INFO [pipeline.engine] [2d946ea1ea6f] unloaded matching-pipeline models before SAM/YOLO-World/DINO/CLIP run +2026-07-31 18:15:54,855 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-07-31 18:15:57,645 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-07-31 18:16:10,517 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-07-31 18:16:11,538 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-07-31 18:16:14,647 INFO [pipeline.engine] [2d946ea1ea6f] flower count: 19.90s, SAM total=5, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-07-31 18:16:14,648 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:16:14] "POST /api/count_flowers HTTP/1.1" 200 - +2026-07-31 18:16:14,695 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:16:14] "GET /uploads/2d946ea1ea6f/flower_count_sam.png?t=1785501974662 HTTP/1.1" 200 - +2026-07-31 18:16:14,696 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:16:14] "GET /uploads/2d946ea1ea6f/vase_crop_input.png?t=1785501974662 HTTP/1.1" 200 - +2026-07-31 18:16:14,698 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:16:14] "GET /uploads/2d946ea1ea6f/vase_crop_template.png?t=1785501974662 HTTP/1.1" 200 - +2026-07-31 18:16:14,699 INFO [werkzeug] 127.0.0.1 - - [31/Jul/2026 18:16:14] "GET /uploads/2d946ea1ea6f/flower_count_yolo.png?t=1785501974662 HTTP/1.1" 200 - +2026-08-01 02:11:17,920 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-08-01 02:11:17,920 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-08-01 02:11:18,036 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-01 02:11:19,029 INFO [pipeline.engine] template ready: SKU_1 +2026-08-01 02:11:19,097 INFO [pipeline.engine] template ready: SKU_2 +2026-08-01 02:11:19,257 INFO [pipeline.engine] template ready: SKU_3 +2026-08-01 02:11:19,384 INFO [pipeline.engine] template ready: SKU_4 +2026-08-01 02:11:19,443 INFO [pipeline.engine] template ready: SKU_5 +2026-08-01 02:11:19,578 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-08-01 02:11:19,578 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-08-01 02:11:19,579 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-08-01 02:11:19,579 INFO [werkzeug] Press CTRL+C to quit +2026-08-01 02:11:21,621 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:21] "GET / HTTP/1.1" 200 - +2026-08-01 02:11:37,120 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:37] "GET / HTTP/1.1" 200 - +2026-08-01 02:11:37,130 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:37] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-01 02:11:37,130 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:37] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-01 02:11:37,345 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:37] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-01 02:11:37,347 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:37] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-01 02:11:37,347 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:37] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-01 02:11:37,348 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:37] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-01 02:11:37,348 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:37] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-01 02:11:37,349 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:37] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-01 02:11:37,441 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:37] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-01 02:11:39,683 INFO [pipeline.engine] [7aa2011a6e64] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-08-01 02:11:39,718 INFO [pipeline.engine] [7aa2011a6e64] background removal: 0.03s +2026-08-01 02:11:40,079 INFO [pipeline.engine] [7aa2011a6e64] SIFT: 0.33s +2026-08-01 02:11:40,447 INFO [pipeline.engine] [7aa2011a6e64] ORB: 0.36s +2026-08-01 02:11:40,515 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-01 02:11:41,640 INFO [pipeline.engine] [7aa2011a6e64] SuperGlue: 1.19s +2026-08-01 02:11:41,656 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-01 02:11:42,235 INFO [pipeline.engine] [7aa2011a6e64] LoFTR: 0.59s +2026-08-01 02:11:42,401 INFO [pipeline.engine] [7aa2011a6e64] color analysis: 0.13s +2026-08-01 02:11:42,406 INFO [pipeline.engine] [7aa2011a6e64] shape analysis: 0.00s +2026-08-01 02:11:42,639 INFO [pipeline.engine] [7aa2011a6e64] texture analysis: 0.23s +2026-08-01 02:11:42,789 INFO [pipeline.engine] [7aa2011a6e64] total: 3.11s, weighted best: SKU_1 +2026-08-01 02:11:42,871 INFO [pipeline.engine] [7aa2011a6e64] done, peak RSS so far: 1774 MB +2026-08-01 02:11:42,874 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "POST /api/match HTTP/1.1" 200 - +2026-08-01 02:11:42,935 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/original.jpg HTTP/1.1" 200 - +2026-08-01 02:11:42,936 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/SIFT_best.png HTTP/1.1" 200 - +2026-08-01 02:11:42,937 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/ORB_best.png HTTP/1.1" 200 - +2026-08-01 02:11:42,937 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/nobg.png HTTP/1.1" 200 - +2026-08-01 02:11:42,938 INFO [__main__] [7aa2011a6e64] verifying against SKU_1 via external endpoint +2026-08-01 02:11:42,939 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/LoFTR_best.png HTTP/1.1" 200 - +2026-08-01 02:11:42,945 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/input_silhouette.png HTTP/1.1" 200 - +2026-08-01 02:11:42,945 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/template_silhouette.png HTTP/1.1" 200 - +2026-08-01 02:11:42,946 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-01 02:11:42,956 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/shape_overlay.png HTTP/1.1" 200 - +2026-08-01 02:11:42,958 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/input_lbp.png HTTP/1.1" 200 - +2026-08-01 02:11:42,961 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/input_family_grid.png HTTP/1.1" 200 - +2026-08-01 02:11:42,961 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/template_family_grid.png HTTP/1.1" 200 - +2026-08-01 02:11:42,962 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "GET /uploads/7aa2011a6e64/template_lbp.png HTTP/1.1" 200 - +2026-08-01 02:11:42,965 WARNING [__main__] [7aa2011a6e64] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-01 02:11:42,966 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:11:42] "POST /api/verify HTTP/1.1" 502 - +2026-08-01 02:11:45,927 INFO [pipeline.engine] [7aa2011a6e64] unloaded matching-pipeline models before SAM/YOLO-World/DINO/CLIP run +2026-08-01 02:11:45,928 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-01 02:11:49,277 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-08-01 02:12:31,094 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-01 02:12:32,245 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-01 02:12:35,366 INFO [pipeline.engine] [7aa2011a6e64] flower count: 49.54s, SAM total=17, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-08-01 02:12:35,368 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:12:35] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-01 02:12:35,373 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:12:35] "GET /uploads/7aa2011a6e64/vase_crop_input.png?t=1785530555370 HTTP/1.1" 200 - +2026-08-01 02:12:35,374 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:12:35] "GET /uploads/7aa2011a6e64/flower_count_yolo.png?t=1785530555370 HTTP/1.1" 200 - +2026-08-01 02:12:35,374 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:12:35] "GET /uploads/7aa2011a6e64/flower_count_sam.png?t=1785530555370 HTTP/1.1" 200 - +2026-08-01 02:12:35,375 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:12:35] "GET /uploads/7aa2011a6e64/vase_crop_template.png?t=1785530555370 HTTP/1.1" 200 - +2026-08-01 02:12:56,098 INFO [pipeline.engine] [5da0ec457b14] new upload: '20260727_160751.jpg' (12915.6 KB) +2026-08-01 02:12:56,132 INFO [pipeline.engine] [5da0ec457b14] background removal: 0.03s +2026-08-01 02:12:56,701 INFO [pipeline.engine] [5da0ec457b14] SIFT: 0.54s +2026-08-01 02:12:57,032 INFO [pipeline.engine] [5da0ec457b14] ORB: 0.33s +2026-08-01 02:12:57,041 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-01 02:12:57,079 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-01 02:12:58,160 INFO [pipeline.engine] [5da0ec457b14] SuperGlue: 1.13s +2026-08-01 02:12:58,176 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-01 02:12:58,748 INFO [pipeline.engine] [5da0ec457b14] LoFTR: 0.58s +2026-08-01 02:12:58,838 INFO [pipeline.engine] [5da0ec457b14] color analysis: 0.05s +2026-08-01 02:12:58,843 INFO [pipeline.engine] [5da0ec457b14] shape analysis: 0.00s +2026-08-01 02:12:59,087 INFO [pipeline.engine] [5da0ec457b14] texture analysis: 0.24s +2026-08-01 02:12:59,281 INFO [pipeline.engine] [5da0ec457b14] total: 3.18s, weighted best: SKU_4 +2026-08-01 02:12:59,373 INFO [pipeline.engine] [5da0ec457b14] done, peak RSS so far: 3283 MB +2026-08-01 02:12:59,375 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:12:59] "POST /api/match HTTP/1.1" 200 - +2026-08-01 02:13:55,422 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:13:55] "GET / HTTP/1.1" 200 - +2026-08-01 02:13:55,678 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:13:55] "GET /static/css/style.css HTTP/1.1" 304 - +2026-08-01 02:13:55,715 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:13:55] "GET /static/js/main.js HTTP/1.1" 304 - +2026-08-01 02:13:55,951 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:13:55] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-01 02:13:55,952 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:13:55] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-01 02:13:55,983 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:13:55] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-01 02:13:55,985 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:13:55] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-01 02:13:55,987 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:13:55] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-01 02:13:55,987 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:13:55] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-01 02:14:09,132 INFO [pipeline.utils] Compressed upload: 15.5 MB -> 0.3 MB (738x1600, JPEG q92) +2026-08-01 02:14:09,132 INFO [pipeline.engine] [0fcfc40b331e] new upload: '20260727_194450.jpg' (260.6 KB) +2026-08-01 02:14:09,148 INFO [pipeline.engine] [0fcfc40b331e] background removal: 0.02s +2026-08-01 02:14:09,586 INFO [pipeline.engine] [0fcfc40b331e] SIFT: 0.42s +2026-08-01 02:14:09,885 INFO [pipeline.engine] [0fcfc40b331e] ORB: 0.30s +2026-08-01 02:14:10,833 INFO [pipeline.engine] [0fcfc40b331e] SuperGlue: 0.95s +2026-08-01 02:14:11,232 INFO [pipeline.engine] [0fcfc40b331e] LoFTR: 0.39s +2026-08-01 02:14:11,314 INFO [pipeline.engine] [0fcfc40b331e] color analysis: 0.06s +2026-08-01 02:14:11,320 INFO [pipeline.engine] [0fcfc40b331e] shape analysis: 0.01s +2026-08-01 02:14:11,551 INFO [pipeline.engine] [0fcfc40b331e] texture analysis: 0.23s +2026-08-01 02:14:11,695 INFO [pipeline.engine] [0fcfc40b331e] total: 2.56s, weighted best: SKU_1 +2026-08-01 02:14:11,791 INFO [pipeline.engine] [0fcfc40b331e] done, peak RSS so far: 3674 MB +2026-08-01 02:14:11,793 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "POST /api/match HTTP/1.1" 200 - +2026-08-01 02:14:11,928 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/shape_overlay.png HTTP/1.1" 200 - +2026-08-01 02:14:11,929 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/template_silhouette.png HTTP/1.1" 200 - +2026-08-01 02:14:11,931 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/input_family_grid.png HTTP/1.1" 200 - +2026-08-01 02:14:11,932 INFO [__main__] [0fcfc40b331e] verifying against SKU_1 via external endpoint +2026-08-01 02:14:11,934 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/ORB_best.png HTTP/1.1" 200 - +2026-08-01 02:14:11,934 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/template_lbp.png HTTP/1.1" 200 - +2026-08-01 02:14:11,937 WARNING [__main__] [0fcfc40b331e] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-01 02:14:11,938 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "POST /api/verify HTTP/1.1" 502 - +2026-08-01 02:14:11,964 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/nobg.png HTTP/1.1" 200 - +2026-08-01 02:14:11,965 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/input_silhouette.png HTTP/1.1" 200 - +2026-08-01 02:14:11,969 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/LoFTR_best.png HTTP/1.1" 200 - +2026-08-01 02:14:11,971 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-01 02:14:11,974 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/SIFT_best.png HTTP/1.1" 200 - +2026-08-01 02:14:11,974 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/input_lbp.png HTTP/1.1" 200 - +2026-08-01 02:14:11,974 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/original.jpg HTTP/1.1" 200 - +2026-08-01 02:14:11,975 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:14:11] "GET /uploads/0fcfc40b331e/template_family_grid.png HTTP/1.1" 200 - +2026-08-01 02:14:18,165 INFO [pipeline.engine] [0fcfc40b331e] unloaded matching-pipeline models before SAM/YOLO-World/DINO/CLIP run +2026-08-01 02:14:18,165 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-01 02:14:21,092 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-08-01 02:15:02,161 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-01 02:15:03,076 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-01 02:15:06,260 INFO [pipeline.engine] [0fcfc40b331e] flower count: 48.21s, SAM total=15, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-08-01 02:15:06,261 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:15:06] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-01 02:15:06,730 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:15:06] "GET /uploads/0fcfc40b331e/flower_count_sam.png?t=1785530706282 HTTP/1.1" 200 - +2026-08-01 02:15:06,731 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:15:06] "GET /uploads/0fcfc40b331e/flower_count_yolo.png?t=1785530706282 HTTP/1.1" 200 - +2026-08-01 02:15:06,733 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:15:06] "GET /uploads/0fcfc40b331e/vase_crop_template.png?t=1785530706282 HTTP/1.1" 200 - +2026-08-01 02:15:06,734 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 02:15:06] "GET /uploads/0fcfc40b331e/vase_crop_input.png?t=1785530706282 HTTP/1.1" 200 - +2026-08-01 11:53:22,043 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 11:53:22] "GET / HTTP/1.1" 200 - +2026-08-01 11:53:22,315 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 11:53:22] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-01 11:53:22,374 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 11:53:22] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-01 11:53:22,638 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 11:53:22] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-01 11:53:22,649 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 11:53:22] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-01 11:53:22,701 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 11:53:22] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-01 11:53:22,702 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 11:53:22] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-01 11:53:22,709 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 11:53:22] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-01 11:53:22,710 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 11:53:22] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-01 11:53:22,712 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 11:53:22] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-01 11:53:52,509 INFO [werkzeug] 127.0.0.1 - - [01/Aug/2026 11:53:52] "GET / HTTP/1.1" 200 - +2026-08-02 17:12:56,884 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:12:56] "GET / HTTP/1.1" 200 - +2026-08-02 17:12:57,592 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:12:57] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-02 17:12:57,609 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:12:57] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-02 17:12:58,330 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:12:58] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-02 17:12:58,335 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:12:58] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-02 17:12:58,669 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:12:58] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-02 17:12:58,689 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:12:58] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-02 17:12:58,701 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:12:58] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-02 17:12:58,775 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:12:58] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-02 17:12:58,838 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:12:58] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-02 17:14:28,453 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:14:28] "GET / HTTP/1.1" 200 - +2026-08-02 17:14:28,989 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:14:28] "GET /static/css/style.css HTTP/1.1" 304 - +2026-08-02 17:14:28,992 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:14:28] "GET /static/js/main.js HTTP/1.1" 304 - +2026-08-02 17:14:29,566 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:14:29] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-02 17:14:29,568 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:14:29] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-02 17:14:29,572 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:14:29] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-02 17:14:29,575 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:14:29] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-02 17:14:29,576 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:14:29] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-02 17:14:29,689 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:14:29] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-02 17:15:07,073 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:07] "GET / HTTP/1.1" 200 - +2026-08-02 17:15:07,647 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:07] "GET /static/css/style.css HTTP/1.1" 304 - +2026-08-02 17:15:07,655 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:07] "GET /static/js/main.js HTTP/1.1" 304 - +2026-08-02 17:15:08,445 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:08] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-02 17:15:08,448 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:08] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-02 17:15:08,449 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:08] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-02 17:15:08,451 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:08] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-02 17:15:08,452 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:08] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-02 17:15:08,460 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:08] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-02 17:15:41,581 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:41] "GET / HTTP/1.1" 200 - +2026-08-02 17:15:42,077 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:42] "GET /static/css/style.css HTTP/1.1" 304 - +2026-08-02 17:15:42,089 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:42] "GET /static/js/main.js HTTP/1.1" 304 - +2026-08-02 17:15:42,595 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:42] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-02 17:15:42,608 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:42] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-02 17:15:42,647 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:42] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-02 17:15:42,648 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:42] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-02 17:15:42,649 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:42] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-02 17:15:42,651 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:15:42] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-02 17:16:32,814 INFO [pipeline.engine] [f12d63cb85f8] new upload: '20260727_162558.jpg' (13650.7 KB) +2026-08-02 17:16:34,237 INFO [pipeline.bg_removal] Resized upload (16320, 7532) -> (1600, 738) before processing +2026-08-02 17:16:36,233 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-08-02 17:16:36,233 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-08-02 17:16:45,798 INFO [pipeline.engine] [f12d63cb85f8] background removal: 12.98s +2026-08-02 17:16:46,266 INFO [pipeline.engine] [f12d63cb85f8] SIFT: 0.45s +2026-08-02 17:16:46,574 INFO [pipeline.engine] [f12d63cb85f8] ORB: 0.31s +2026-08-02 17:16:46,586 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-02 17:16:46,661 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-02 17:16:47,684 INFO [pipeline.engine] [f12d63cb85f8] SuperGlue: 1.11s +2026-08-02 17:16:47,699 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-02 17:16:48,215 INFO [pipeline.engine] [f12d63cb85f8] LoFTR: 0.52s +2026-08-02 17:16:48,314 INFO [pipeline.engine] [f12d63cb85f8] color analysis: 0.06s +2026-08-02 17:16:48,318 INFO [pipeline.engine] [f12d63cb85f8] shape analysis: 0.00s +2026-08-02 17:16:48,538 INFO [pipeline.engine] [f12d63cb85f8] texture analysis: 0.22s +2026-08-02 17:16:48,715 INFO [pipeline.engine] [f12d63cb85f8] total: 15.90s, weighted best: SKU_4 +2026-08-02 17:16:48,794 INFO [pipeline.engine] [f12d63cb85f8] done, peak RSS so far: 10820 MB +2026-08-02 17:16:48,797 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:16:48] "POST /api/match HTTP/1.1" 200 - +2026-08-02 17:16:49,927 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:16:49] "GET /uploads/f12d63cb85f8/LoFTR_best.png HTTP/1.1" 200 - +2026-08-02 17:16:49,929 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:16:49] "GET /uploads/f12d63cb85f8/SIFT_best.png HTTP/1.1" 200 - +2026-08-02 17:16:49,932 INFO [__main__] [f12d63cb85f8] verifying against SKU_4 via external endpoint +2026-08-02 17:16:49,932 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:16:49] "GET /uploads/f12d63cb85f8/original.jpg HTTP/1.1" 200 - +2026-08-02 17:16:49,934 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:16:49] "GET /uploads/f12d63cb85f8/nobg.png HTTP/1.1" 200 - +2026-08-02 17:16:49,936 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:16:49] "GET /uploads/f12d63cb85f8/ORB_best.png HTTP/1.1" 200 - +2026-08-02 17:16:49,969 WARNING [__main__] [f12d63cb85f8] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-02 17:16:49,970 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:16:49] "POST /api/verify HTTP/1.1" 502 - +2026-08-02 17:16:50,300 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:16:50] "GET /uploads/f12d63cb85f8/input_silhouette.png HTTP/1.1" 200 - +2026-08-02 17:16:50,301 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:16:50] "GET /uploads/f12d63cb85f8/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-02 17:16:51,099 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:16:51] "GET /uploads/f12d63cb85f8/template_silhouette.png HTTP/1.1" 200 - +2026-08-02 17:23:19,951 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:19] "GET / HTTP/1.1" 200 - +2026-08-02 17:23:20,452 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:20] "GET /static/css/style.css HTTP/1.1" 304 - +2026-08-02 17:23:20,461 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:20] "GET /static/js/main.js HTTP/1.1" 304 - +2026-08-02 17:23:20,989 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:20] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-02 17:23:20,990 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:20] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-02 17:23:20,994 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:20] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-02 17:23:20,995 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:20] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-02 17:23:21,724 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:21] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-02 17:23:21,803 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:21] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-02 17:23:43,388 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:43] "GET / HTTP/1.1" 200 - +2026-08-02 17:23:43,727 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:43] "GET /static/css/style.css HTTP/1.1" 304 - +2026-08-02 17:23:43,729 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:43] "GET /static/js/main.js HTTP/1.1" 304 - +2026-08-02 17:23:44,119 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:44] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-02 17:23:44,137 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:44] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-02 17:23:44,152 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:44] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-02 17:23:44,153 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:44] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-02 17:23:44,153 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:44] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-02 17:23:44,156 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:23:44] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-02 17:24:00,090 INFO [pipeline.engine] [ce98e83f9b11] new upload: 'Screenshot_20260802_145259_Gallery.jpg' (2118.1 KB) +2026-08-02 17:24:00,174 INFO [pipeline.bg_removal] Resized upload (1440, 3120) -> (738, 1599) before processing +2026-08-02 17:24:10,060 INFO [pipeline.engine] [ce98e83f9b11] background removal: 9.97s +2026-08-02 17:24:10,688 INFO [pipeline.engine] [ce98e83f9b11] SIFT: 0.60s +2026-08-02 17:24:10,941 INFO [pipeline.engine] [ce98e83f9b11] ORB: 0.25s +2026-08-02 17:24:11,901 INFO [pipeline.engine] [ce98e83f9b11] SuperGlue: 0.96s +2026-08-02 17:24:12,290 INFO [pipeline.engine] [ce98e83f9b11] LoFTR: 0.38s +2026-08-02 17:24:12,382 INFO [pipeline.engine] [ce98e83f9b11] color analysis: 0.05s +2026-08-02 17:24:12,386 INFO [pipeline.engine] [ce98e83f9b11] shape analysis: 0.00s +2026-08-02 17:24:12,603 INFO [pipeline.engine] [ce98e83f9b11] texture analysis: 0.22s +2026-08-02 17:24:12,779 INFO [pipeline.engine] [ce98e83f9b11] total: 12.69s, weighted best: SKU_4 +2026-08-02 17:24:12,861 INFO [pipeline.engine] [ce98e83f9b11] done, peak RSS so far: 15530 MB +2026-08-02 17:24:12,862 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:12] "POST /api/match HTTP/1.1" 200 - +2026-08-02 17:24:13,282 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:13] "GET /uploads/ce98e83f9b11/ORB_best.png HTTP/1.1" 200 - +2026-08-02 17:24:13,284 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:13] "GET /uploads/ce98e83f9b11/original.jpg HTTP/1.1" 200 - +2026-08-02 17:24:13,285 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:13] "GET /uploads/ce98e83f9b11/nobg.png HTTP/1.1" 200 - +2026-08-02 17:24:13,286 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:13] "GET /uploads/ce98e83f9b11/LoFTR_best.png HTTP/1.1" 200 - +2026-08-02 17:24:13,287 INFO [__main__] [ce98e83f9b11] verifying against SKU_4 via external endpoint +2026-08-02 17:24:13,291 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:13] "GET /uploads/ce98e83f9b11/SIFT_best.png HTTP/1.1" 200 - +2026-08-02 17:24:13,293 WARNING [__main__] [ce98e83f9b11] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-02 17:24:13,293 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:13] "POST /api/verify HTTP/1.1" 502 - +2026-08-02 17:24:13,631 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:13] "GET /uploads/ce98e83f9b11/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-02 17:24:13,640 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:13] "GET /uploads/ce98e83f9b11/input_silhouette.png HTTP/1.1" 200 - +2026-08-02 17:24:13,641 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:13] "GET /uploads/ce98e83f9b11/template_silhouette.png HTTP/1.1" 200 - +2026-08-02 17:24:14,981 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:14] "GET /uploads/ce98e83f9b11/shape_overlay.png HTTP/1.1" 200 - +2026-08-02 17:24:15,001 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:15] "GET /uploads/ce98e83f9b11/input_lbp.png HTTP/1.1" 200 - +2026-08-02 17:24:15,012 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:15] "GET /uploads/ce98e83f9b11/template_lbp.png HTTP/1.1" 200 - +2026-08-02 17:24:15,021 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:15] "GET /uploads/ce98e83f9b11/input_family_grid.png HTTP/1.1" 200 - +2026-08-02 17:24:15,047 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 17:24:15] "GET /uploads/ce98e83f9b11/template_family_grid.png HTTP/1.1" 200 - +2026-08-02 21:22:16,957 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:16] "GET / HTTP/1.1" 200 - +2026-08-02 21:22:17,273 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:17] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-02 21:22:17,282 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:17] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-02 21:22:17,284 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:17] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-02 21:22:17,309 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:17] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-02 21:22:17,314 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:17] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-02 21:22:17,316 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:17] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-02 21:22:17,527 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:17] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-02 21:22:17,540 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:17] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-02 21:22:20,125 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:20] "GET / HTTP/1.1" 200 - +2026-08-02 21:22:20,232 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:20] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-02 21:22:20,269 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:20] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-02 21:22:20,375 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:20] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-02 21:22:20,377 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:20] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-02 21:22:20,412 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:20] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-02 21:22:20,416 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:20] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-02 21:22:20,417 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:20] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-02 21:22:20,417 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:20] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-02 21:22:20,576 INFO [werkzeug] 127.0.0.1 - - [02/Aug/2026 21:22:20] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 11:12:26,744 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-08-03 11:12:26,760 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-08-03 11:12:27,782 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 11:12:35,824 INFO [pipeline.engine] template ready: SKU_1 +2026-08-03 11:12:35,902 INFO [pipeline.engine] template ready: SKU_2 +2026-08-03 11:12:36,110 INFO [pipeline.engine] template ready: SKU_3 +2026-08-03 11:12:36,250 INFO [pipeline.engine] template ready: SKU_4 +2026-08-03 11:12:36,333 INFO [pipeline.engine] template ready: SKU_5 +2026-08-03 11:12:36,478 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-08-03 11:12:36,478 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-08-03 11:12:36,497 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-08-03 11:12:36,497 INFO [werkzeug] Press CTRL+C to quit +2026-08-03 11:12:42,699 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:12:42] "GET / HTTP/1.1" 200 - +2026-08-03 11:12:42,975 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:12:42] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 11:12:42,984 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:12:42] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 11:12:43,114 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:12:43] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-03 11:12:43,116 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:12:43] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-03 11:12:43,117 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:12:43] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-03 11:12:43,119 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:12:43] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-03 11:12:43,120 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:12:43] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-03 11:12:43,121 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:12:43] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-03 11:12:54,459 INFO [pipeline.engine] [c87922279e1e] new upload: '20260727_161234.jpg' (11300.7 KB) +2026-08-03 11:12:54,521 INFO [pipeline.engine] [c87922279e1e] background removal: 0.06s +2026-08-03 11:12:54,962 INFO [pipeline.engine] [c87922279e1e] SIFT: 0.41s +2026-08-03 11:12:55,297 INFO [pipeline.engine] [c87922279e1e] ORB: 0.33s +2026-08-03 11:12:56,030 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 11:12:57,910 INFO [pipeline.engine] [c87922279e1e] SuperGlue: 2.61s +2026-08-03 11:12:57,926 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 11:12:59,843 INFO [pipeline.engine] [c87922279e1e] LoFTR: 1.93s +2026-08-03 11:13:00,086 INFO [pipeline.engine] [c87922279e1e] color analysis: 0.13s +2026-08-03 11:13:00,092 INFO [pipeline.engine] [c87922279e1e] shape analysis: 0.01s +2026-08-03 11:13:00,321 INFO [pipeline.engine] [c87922279e1e] texture analysis: 0.23s +2026-08-03 11:13:00,541 INFO [pipeline.engine] [c87922279e1e] total: 6.08s, weighted best: SKU_4 +2026-08-03 11:13:00,616 INFO [pipeline.engine] [c87922279e1e] done, peak RSS so far: 1771 MB +2026-08-03 11:13:00,618 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "POST /api/match HTTP/1.1" 200 - +2026-08-03 11:13:00,773 INFO [__main__] [c87922279e1e] verifying against SKU_4 via external endpoint +2026-08-03 11:13:00,785 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/original.jpg HTTP/1.1" 200 - +2026-08-03 11:13:00,786 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/nobg.png HTTP/1.1" 200 - +2026-08-03 11:13:00,787 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 11:13:00,787 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 11:13:00,787 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/ORB_best.png HTTP/1.1" 200 - +2026-08-03 11:13:00,791 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 11:13:00,792 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 11:13:00,795 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 11:13:00,795 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 11:13:00,798 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/input_lbp.png HTTP/1.1" 200 - +2026-08-03 11:13:00,799 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/template_lbp.png HTTP/1.1" 200 - +2026-08-03 11:13:00,801 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 11:13:00,803 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "GET /uploads/c87922279e1e/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 11:13:00,868 WARNING [__main__] [c87922279e1e] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 11:13:00,869 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:13:00] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 11:15:01,298 INFO [pipeline.engine] [c87922279e1e] unloaded matching-pipeline models before SAM/YOLO-World/DINO/CLIP run +2026-08-03 11:15:01,298 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-03 11:15:06,765 INFO [pipeline.flower_count] Loading SAM (/media/suman/Backup_of_extra_/Sasi/SAM/sam_b.pt) on cuda... +2026-08-03 11:15:52,102 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-03 11:15:54,716 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 11:15:58,009 INFO [pipeline.engine] [c87922279e1e] flower count: 56.81s, SAM total=18, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-08-03 11:15:58,016 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:15:58] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-03 11:15:58,026 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:15:58] "GET /uploads/c87922279e1e/flower_count_sam.png?t=1785735958019 HTTP/1.1" 200 - +2026-08-03 11:15:58,027 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:15:58] "GET /uploads/c87922279e1e/vase_crop_input.png?t=1785735958019 HTTP/1.1" 200 - +2026-08-03 11:15:58,028 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:15:58] "GET /uploads/c87922279e1e/vase_crop_template.png?t=1785735958019 HTTP/1.1" 200 - +2026-08-03 11:15:58,030 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 11:15:58] "GET /uploads/c87922279e1e/flower_count_yolo.png?t=1785735958019 HTTP/1.1" 200 - +2026-08-03 15:00:32,079 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-08-03 15:00:32,121 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-08-03 15:00:32,475 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 15:00:38,204 INFO [pipeline.engine] template ready: SKU_1 +2026-08-03 15:00:38,269 INFO [pipeline.engine] template ready: SKU_2 +2026-08-03 15:00:38,438 INFO [pipeline.engine] template ready: SKU_3 +2026-08-03 15:00:38,570 INFO [pipeline.engine] template ready: SKU_4 +2026-08-03 15:00:38,656 INFO [pipeline.engine] template ready: SKU_5 +2026-08-03 15:00:38,799 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-08-03 15:00:38,799 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-08-03 15:00:38,800 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-08-03 15:00:38,800 INFO [werkzeug] Press CTRL+C to quit +2026-08-03 15:00:45,794 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:00:45] "GET / HTTP/1.1" 200 - +2026-08-03 15:01:35,501 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:35] "GET / HTTP/1.1" 200 - +2026-08-03 15:01:35,533 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:35] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 15:01:35,547 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:35] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 15:01:35,729 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:35] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-03 15:01:35,731 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:35] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-03 15:01:35,732 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:35] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-03 15:01:35,732 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:35] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-03 15:01:35,733 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:35] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-03 15:01:35,733 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:35] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 15:01:35,801 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:35] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 15:01:38,040 INFO [pipeline.engine] [e2330df01028] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-08-03 15:01:38,080 INFO [pipeline.engine] [e2330df01028] background removal: 0.03s +2026-08-03 15:01:38,428 INFO [pipeline.engine] [e2330df01028] SIFT: 0.32s +2026-08-03 15:01:38,785 INFO [pipeline.engine] [e2330df01028] ORB: 0.33s +2026-08-03 15:01:38,862 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 15:01:39,987 INFO [pipeline.engine] [e2330df01028] SuperGlue: 1.20s +2026-08-03 15:01:40,003 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 15:01:40,578 INFO [pipeline.engine] [e2330df01028] LoFTR: 0.58s +2026-08-03 15:01:40,740 INFO [pipeline.engine] [e2330df01028] color analysis: 0.13s +2026-08-03 15:01:40,746 INFO [pipeline.engine] [e2330df01028] shape analysis: 0.01s +2026-08-03 15:01:40,983 INFO [pipeline.engine] [e2330df01028] texture analysis: 0.24s +2026-08-03 15:01:41,128 INFO [pipeline.engine] [e2330df01028] total: 3.09s, weighted best: SKU_1 +2026-08-03 15:01:41,204 INFO [pipeline.engine] [e2330df01028] done, peak RSS so far: 1753 MB +2026-08-03 15:01:41,207 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "POST /api/match HTTP/1.1" 200 - +2026-08-03 15:01:41,271 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 15:01:41,271 INFO [__main__] [e2330df01028] verifying against SKU_1 via external endpoint +2026-08-03 15:01:41,273 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/original.jpg HTTP/1.1" 200 - +2026-08-03 15:01:41,274 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/ORB_best.png HTTP/1.1" 200 - +2026-08-03 15:01:41,275 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/nobg.png HTTP/1.1" 200 - +2026-08-03 15:01:41,275 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 15:01:41,283 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 15:01:41,283 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 15:01:41,284 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 15:01:41,289 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 15:01:41,292 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/input_lbp.png HTTP/1.1" 200 - +2026-08-03 15:01:41,293 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/template_lbp.png HTTP/1.1" 200 - +2026-08-03 15:01:41,294 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 15:01:41,295 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "GET /uploads/e2330df01028/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 15:01:41,309 WARNING [__main__] [e2330df01028] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 15:01:41,309 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:01:41] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 15:01:43,260 INFO [pipeline.engine] [e2330df01028] unloaded matching-pipeline models before SAM3/YOLO-World/DINO/CLIP run +2026-08-03 15:01:43,260 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-03 15:02:04,841 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-03 15:02:06,124 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 15:02:08,823 INFO [pipeline.engine] [e2330df01028] flower count: 25.66s, SAM3 total=23, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-08-03 15:02:08,824 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:02:08] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-03 15:02:08,828 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:02:08] "GET /uploads/e2330df01028/flower_count_sam.png?t=1785749528825 HTTP/1.1" 200 - +2026-08-03 15:02:08,828 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:02:08] "GET /uploads/e2330df01028/vase_crop_input.png?t=1785749528825 HTTP/1.1" 200 - +2026-08-03 15:02:08,829 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:02:08] "GET /uploads/e2330df01028/flower_count_yolo.png?t=1785749528825 HTTP/1.1" 200 - +2026-08-03 15:02:08,831 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:02:08] "GET /uploads/e2330df01028/vase_crop_template.png?t=1785749528825 HTTP/1.1" 200 - +2026-08-03 15:03:07,596 INFO [pipeline.engine] [964fe4c79f05] new upload: '20260727_163536.jpg' (12616.7 KB) +2026-08-03 15:03:07,648 INFO [pipeline.engine] [964fe4c79f05] background removal: 0.05s +2026-08-03 15:03:08,260 INFO [pipeline.engine] [964fe4c79f05] SIFT: 0.59s +2026-08-03 15:03:08,592 INFO [pipeline.engine] [964fe4c79f05] ORB: 0.33s +2026-08-03 15:03:08,611 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 15:03:08,650 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 15:03:09,587 INFO [pipeline.engine] [964fe4c79f05] SuperGlue: 0.99s +2026-08-03 15:03:09,604 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 15:03:10,160 INFO [pipeline.engine] [964fe4c79f05] LoFTR: 0.57s +2026-08-03 15:03:10,242 INFO [pipeline.engine] [964fe4c79f05] color analysis: 0.05s +2026-08-03 15:03:10,247 INFO [pipeline.engine] [964fe4c79f05] shape analysis: 0.00s +2026-08-03 15:03:10,473 INFO [pipeline.engine] [964fe4c79f05] texture analysis: 0.23s +2026-08-03 15:03:10,626 INFO [pipeline.engine] [964fe4c79f05] total: 3.03s, weighted best: SKU_2 +2026-08-03 15:03:10,712 INFO [pipeline.engine] [964fe4c79f05] done, peak RSS so far: 3134 MB +2026-08-03 15:03:10,714 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:03:10] "POST /api/match HTTP/1.1" 200 - +2026-08-03 15:04:08,483 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:08] "GET / HTTP/1.1" 200 - +2026-08-03 15:04:08,523 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:08] "GET /static/js/main.js HTTP/1.1" 304 - +2026-08-03 15:04:08,524 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:08] "GET /static/css/style.css HTTP/1.1" 304 - +2026-08-03 15:04:08,558 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:08] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-03 15:04:08,559 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:08] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-03 15:04:08,560 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:08] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-03 15:04:08,561 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:08] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-03 15:04:08,562 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:08] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-03 15:04:08,563 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:08] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-03 15:04:18,260 INFO [pipeline.engine] [203af0ef2d9f] new upload: '20260727_164154.jpg' (11153.5 KB) +2026-08-03 15:04:19,791 INFO [pipeline.bg_removal] Resized upload (16320, 7532) -> (1600, 738) before processing +2026-08-03 15:04:21,993 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-08-03 15:04:21,993 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-08-03 15:04:32,265 INFO [pipeline.engine] [203af0ef2d9f] background removal: 14.00s +2026-08-03 15:04:32,848 INFO [pipeline.engine] [203af0ef2d9f] SIFT: 0.56s +2026-08-03 15:04:33,174 INFO [pipeline.engine] [203af0ef2d9f] ORB: 0.33s +2026-08-03 15:04:34,128 INFO [pipeline.engine] [203af0ef2d9f] SuperGlue: 0.95s +2026-08-03 15:04:34,557 INFO [pipeline.engine] [203af0ef2d9f] LoFTR: 0.42s +2026-08-03 15:04:34,687 INFO [pipeline.engine] [203af0ef2d9f] color analysis: 0.05s +2026-08-03 15:04:34,692 INFO [pipeline.engine] [203af0ef2d9f] shape analysis: 0.01s +2026-08-03 15:04:34,936 INFO [pipeline.engine] [203af0ef2d9f] texture analysis: 0.24s +2026-08-03 15:04:35,090 INFO [pipeline.engine] [203af0ef2d9f] total: 16.83s, weighted best: SKU_2 +2026-08-03 15:04:35,175 INFO [pipeline.engine] [203af0ef2d9f] done, peak RSS so far: 9086 MB +2026-08-03 15:04:35,179 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "POST /api/match HTTP/1.1" 200 - +2026-08-03 15:04:35,209 INFO [__main__] [203af0ef2d9f] verifying against SKU_2 via external endpoint +2026-08-03 15:04:35,213 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/original.jpg HTTP/1.1" 200 - +2026-08-03 15:04:35,213 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/nobg.png HTTP/1.1" 200 - +2026-08-03 15:04:35,213 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 15:04:35,215 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/ORB_best.png HTTP/1.1" 200 - +2026-08-03 15:04:35,216 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 15:04:35,219 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 15:04:35,219 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 15:04:35,222 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 15:04:35,223 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 15:04:35,226 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/template_lbp.png HTTP/1.1" 200 - +2026-08-03 15:04:35,226 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/input_lbp.png HTTP/1.1" 200 - +2026-08-03 15:04:35,227 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 15:04:35,229 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "GET /uploads/203af0ef2d9f/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 15:04:35,270 WARNING [__main__] [203af0ef2d9f] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 15:04:35,271 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:04:35] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 15:05:04,894 INFO [pipeline.engine] [203af0ef2d9f] unloaded matching-pipeline models before SAM3/YOLO-World/DINO/CLIP run +2026-08-03 15:05:04,894 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-03 15:05:37,437 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-03 15:05:38,204 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 15:05:41,199 INFO [pipeline.engine] [203af0ef2d9f] flower count: 36.76s, SAM3 total=22, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-08-03 15:05:41,199 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:05:41] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-03 15:05:41,208 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:05:41] "GET /uploads/203af0ef2d9f/flower_count_sam.png?t=1785749741203 HTTP/1.1" 200 - +2026-08-03 15:05:41,209 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:05:41] "GET /uploads/203af0ef2d9f/vase_crop_input.png?t=1785749741203 HTTP/1.1" 200 - +2026-08-03 15:05:41,210 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:05:41] "GET /uploads/203af0ef2d9f/vase_crop_template.png?t=1785749741203 HTTP/1.1" 200 - +2026-08-03 15:05:41,212 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:05:41] "GET /uploads/203af0ef2d9f/flower_count_yolo.png?t=1785749741203 HTTP/1.1" 200 - +2026-08-03 15:06:45,090 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:06:45] "GET / HTTP/1.1" 200 - +2026-08-03 15:08:12,667 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:08:12] "GET / HTTP/1.1" 200 - +2026-08-03 15:08:12,979 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:08:12] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 15:08:12,992 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:08:12] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 15:08:13,236 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:08:13] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-03 15:08:13,243 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:08:13] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-03 15:08:13,248 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:08:13] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 15:08:13,255 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:08:13] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-03 15:08:13,269 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:08:13] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-03 15:08:13,314 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:08:13] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-03 15:08:13,556 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:08:13] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 15:18:42,917 INFO [pipeline.engine] [ca4db0968d07] new upload: '20260727_194202.jpg' (11872.1 KB) +2026-08-03 15:18:42,969 INFO [pipeline.engine] [ca4db0968d07] background removal: 0.05s +2026-08-03 15:18:43,385 INFO [pipeline.engine] [ca4db0968d07] SIFT: 0.40s +2026-08-03 15:18:43,671 INFO [pipeline.engine] [ca4db0968d07] ORB: 0.29s +2026-08-03 15:18:43,689 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 15:18:43,736 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 15:18:44,848 INFO [pipeline.engine] [ca4db0968d07] SuperGlue: 1.18s +2026-08-03 15:18:44,863 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 15:18:45,451 INFO [pipeline.engine] [ca4db0968d07] LoFTR: 0.60s +2026-08-03 15:18:45,529 INFO [pipeline.engine] [ca4db0968d07] color analysis: 0.05s +2026-08-03 15:18:45,533 INFO [pipeline.engine] [ca4db0968d07] shape analysis: 0.00s +2026-08-03 15:18:45,749 INFO [pipeline.engine] [ca4db0968d07] texture analysis: 0.22s +2026-08-03 15:18:45,877 INFO [pipeline.engine] [ca4db0968d07] total: 2.96s, weighted best: SKU_1 +2026-08-03 15:18:45,958 INFO [pipeline.engine] [ca4db0968d07] done, peak RSS so far: 9086 MB +2026-08-03 15:18:45,960 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:45] "POST /api/match HTTP/1.1" 200 - +2026-08-03 15:18:46,016 INFO [__main__] [ca4db0968d07] verifying against SKU_1 via external endpoint +2026-08-03 15:18:46,020 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 15:18:46,024 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 15:18:46,025 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 15:18:46,027 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 15:18:46,028 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/ORB_best.png HTTP/1.1" 200 - +2026-08-03 15:18:46,028 WARNING [__main__] [ca4db0968d07] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 15:18:46,029 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 15:18:46,031 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 15:18:46,032 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/input_lbp.png HTTP/1.1" 200 - +2026-08-03 15:18:46,034 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 15:18:46,034 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/nobg.png HTTP/1.1" 200 - +2026-08-03 15:18:46,035 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/template_lbp.png HTTP/1.1" 200 - +2026-08-03 15:18:46,036 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 15:18:46,039 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 15:18:46,040 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:18:46] "GET /uploads/ca4db0968d07/original.jpg HTTP/1.1" 200 - +2026-08-03 15:26:20,537 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-08-03 15:26:20,537 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-08-03 15:26:20,662 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 15:26:24,369 INFO [pipeline.engine] template ready: SKU_1 +2026-08-03 15:26:24,435 INFO [pipeline.engine] template ready: SKU_2 +2026-08-03 15:26:24,606 INFO [pipeline.engine] template ready: SKU_3 +2026-08-03 15:26:24,740 INFO [pipeline.engine] template ready: SKU_4 +2026-08-03 15:26:24,800 INFO [pipeline.engine] template ready: SKU_5 +2026-08-03 15:26:24,948 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-08-03 15:26:24,948 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-08-03 15:26:24,949 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-08-03 15:26:24,949 INFO [werkzeug] Press CTRL+C to quit +2026-08-03 15:26:25,017 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:26:25] "GET / HTTP/1.1" 200 - +2026-08-03 15:27:56,374 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:27:56] "GET / HTTP/1.1" 200 - +2026-08-03 15:27:56,383 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:27:56] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 15:27:56,383 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:27:56] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 15:27:56,597 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:27:56] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-03 15:27:56,598 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:27:56] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-03 15:27:56,598 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:27:56] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-03 15:27:56,598 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:27:56] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-03 15:27:56,599 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:27:56] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-03 15:27:56,599 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:27:56] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 15:27:56,676 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:27:56] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 15:27:58,909 INFO [pipeline.engine] [339c9981ee6d] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-08-03 15:27:58,952 INFO [pipeline.engine] [339c9981ee6d] background removal: 0.04s +2026-08-03 15:27:59,290 INFO [pipeline.engine] [339c9981ee6d] SIFT: 0.31s +2026-08-03 15:27:59,648 INFO [pipeline.engine] [339c9981ee6d] ORB: 0.34s +2026-08-03 15:27:59,713 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 15:28:00,803 INFO [pipeline.engine] [339c9981ee6d] SuperGlue: 1.15s +2026-08-03 15:28:00,818 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 15:28:01,396 INFO [pipeline.engine] [339c9981ee6d] LoFTR: 0.59s +2026-08-03 15:28:01,553 INFO [pipeline.engine] [339c9981ee6d] color analysis: 0.12s +2026-08-03 15:28:01,559 INFO [pipeline.engine] [339c9981ee6d] shape analysis: 0.01s +2026-08-03 15:28:01,797 INFO [pipeline.engine] [339c9981ee6d] texture analysis: 0.24s +2026-08-03 15:28:01,946 INFO [pipeline.engine] [339c9981ee6d] total: 3.04s, weighted best: SKU_1 +2026-08-03 15:28:02,024 INFO [pipeline.engine] [339c9981ee6d] done, peak RSS so far: 1760 MB +2026-08-03 15:28:02,027 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "POST /api/match HTTP/1.1" 200 - +2026-08-03 15:28:02,096 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/original.jpg HTTP/1.1" 200 - +2026-08-03 15:28:02,096 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 15:28:02,096 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 15:28:02,097 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/ORB_best.png HTTP/1.1" 200 - +2026-08-03 15:28:02,097 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/nobg.png HTTP/1.1" 200 - +2026-08-03 15:28:02,098 INFO [__main__] [339c9981ee6d] verifying against SKU_1 via external endpoint +2026-08-03 15:28:02,104 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 15:28:02,104 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 15:28:02,105 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 15:28:02,111 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 15:28:02,114 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/input_lbp.png HTTP/1.1" 200 - +2026-08-03 15:28:02,114 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/template_lbp.png HTTP/1.1" 200 - +2026-08-03 15:28:02,115 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 15:28:02,120 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "GET /uploads/339c9981ee6d/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 15:28:02,130 WARNING [__main__] [339c9981ee6d] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 15:28:02,131 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:02] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 15:28:04,061 INFO [pipeline.engine] [339c9981ee6d] unloaded matching-pipeline models before SAM3/YOLO-World/DINO/CLIP run +2026-08-03 15:28:04,062 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-03 15:28:26,723 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-03 15:28:29,126 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 15:28:31,632 INFO [pipeline.engine] [339c9981ee6d] flower count: 27.68s, SAM3 total=23, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-08-03 15:28:31,632 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:31] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-03 15:28:31,636 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:31] "GET /uploads/339c9981ee6d/flower_count_sam.png?t=1785751111634 HTTP/1.1" 200 - +2026-08-03 15:28:31,637 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:31] "GET /uploads/339c9981ee6d/flower_count_yolo.png?t=1785751111634 HTTP/1.1" 200 - +2026-08-03 15:28:31,638 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:31] "GET /uploads/339c9981ee6d/vase_crop_input.png?t=1785751111634 HTTP/1.1" 200 - +2026-08-03 15:28:31,639 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:28:31] "GET /uploads/339c9981ee6d/vase_crop_template.png?t=1785751111634 HTTP/1.1" 200 - +2026-08-03 15:40:58,590 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:40:58] "GET / HTTP/1.1" 200 - +2026-08-03 15:40:58,608 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:40:58] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 15:40:58,610 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:40:58] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 15:40:58,763 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:40:58] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 15:40:59,301 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:40:59] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-03 15:40:59,302 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:40:59] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-03 15:40:59,304 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:40:59] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-03 15:40:59,312 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:40:59] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-03 15:40:59,313 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:40:59] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-03 15:40:59,313 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:40:59] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 15:41:03,617 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:41:03] "GET / HTTP/1.1" 200 - +2026-08-03 15:41:04,921 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:41:04] "GET / HTTP/1.1" 200 - +2026-08-03 15:41:50,809 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:41:50] "GET / HTTP/1.1" 200 - +2026-08-03 15:42:57,967 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:42:57] "GET / HTTP/1.1" 200 - +2026-08-03 15:42:58,193 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:42:58] "GET / HTTP/1.1" 200 - +2026-08-03 15:42:59,622 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:42:59] "GET / HTTP/1.1" 200 - +2026-08-03 15:43:37,137 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:43:37] "GET / HTTP/1.1" 200 - +2026-08-03 15:43:48,766 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:43:48] "GET / HTTP/1.1" 200 - +2026-08-03 15:43:58,437 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:43:58] "GET / HTTP/1.1" 200 - +2026-08-03 15:43:59,168 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:43:59] "GET / HTTP/1.1" 200 - +2026-08-03 15:44:14,687 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:44:14] "GET / HTTP/1.1" 200 - +2026-08-03 15:44:26,483 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:44:26] "GET / HTTP/1.1" 200 - +2026-08-03 15:44:59,411 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:44:59] "GET / HTTP/1.1" 200 - +2026-08-03 15:45:29,999 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:45:29] "GET /.env HTTP/1.1" 404 - +2026-08-03 15:45:31,332 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:45:31] "GET /.git/HEAD HTTP/1.1" 404 - +2026-08-03 15:46:48,549 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:46:48] "GET / HTTP/1.1" 200 - +2026-08-03 15:47:57,411 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:47:57] "GET / HTTP/1.1" 200 - +2026-08-03 15:48:44,548 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:48:44] "GET /.well-known/agent-card.json HTTP/1.1" 404 - +2026-08-03 15:48:44,992 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:48:44] "GET /.well-known/agent.json HTTP/1.1" 404 - +2026-08-03 15:48:45,468 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:48:45] "GET /.well-known/mcp/server-card.json HTTP/1.1" 404 - +2026-08-03 15:48:45,977 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:48:45] "GET /.well-known/mcp HTTP/1.1" 404 - +2026-08-03 15:48:46,485 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:48:46] "GET /.well-known/agents.json HTTP/1.1" 404 - +2026-08-03 15:49:04,783 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:49:04] "GET / HTTP/1.1" 200 - +2026-08-03 15:49:05,678 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:49:05] "GET / HTTP/1.1" 200 - +2026-08-03 15:50:18,273 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:18] "GET / HTTP/1.1" 200 - +2026-08-03 15:50:18,304 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:18] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 15:50:18,304 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:18] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 15:50:18,331 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:18] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-03 15:50:18,332 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:18] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-03 15:50:18,333 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:18] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-03 15:50:18,334 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:18] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-03 15:50:18,335 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:18] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-03 15:50:18,336 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:18] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-03 15:50:31,382 INFO [pipeline.engine] [912895e076c3] new upload: '20260727_161915.jpg' (10468.4 KB) +2026-08-03 15:50:33,585 INFO [pipeline.bg_removal] Resized upload (16320, 7532) -> (1600, 738) before processing +2026-08-03 15:50:35,891 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-08-03 15:50:35,891 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-08-03 15:50:45,859 INFO [pipeline.engine] [912895e076c3] background removal: 14.47s +2026-08-03 15:50:46,374 INFO [pipeline.engine] [912895e076c3] SIFT: 0.49s +2026-08-03 15:50:46,687 INFO [pipeline.engine] [912895e076c3] ORB: 0.31s +2026-08-03 15:50:46,704 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 15:50:46,741 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 15:50:47,765 INFO [pipeline.engine] [912895e076c3] SuperGlue: 1.08s +2026-08-03 15:50:47,780 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 15:50:48,320 INFO [pipeline.engine] [912895e076c3] LoFTR: 0.55s +2026-08-03 15:50:48,412 INFO [pipeline.engine] [912895e076c3] color analysis: 0.06s +2026-08-03 15:50:48,417 INFO [pipeline.engine] [912895e076c3] shape analysis: 0.01s +2026-08-03 15:50:48,650 INFO [pipeline.engine] [912895e076c3] texture analysis: 0.23s +2026-08-03 15:50:48,857 INFO [pipeline.engine] [912895e076c3] total: 17.47s, weighted best: SKU_4 +2026-08-03 15:50:48,940 INFO [pipeline.engine] [912895e076c3] done, peak RSS so far: 9051 MB +2026-08-03 15:50:48,942 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:48] "POST /api/match HTTP/1.1" 200 - +2026-08-03 15:50:48,982 INFO [__main__] [912895e076c3] verifying against SKU_4 via external endpoint +2026-08-03 15:50:48,986 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:48] "GET /uploads/912895e076c3/original.jpg HTTP/1.1" 200 - +2026-08-03 15:50:48,988 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:48] "GET /uploads/912895e076c3/nobg.png HTTP/1.1" 200 - +2026-08-03 15:50:48,989 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:48] "GET /uploads/912895e076c3/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 15:50:48,991 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:48] "GET /uploads/912895e076c3/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 15:50:48,991 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:48] "GET /uploads/912895e076c3/ORB_best.png HTTP/1.1" 200 - +2026-08-03 15:50:48,994 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:48] "GET /uploads/912895e076c3/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 15:50:48,995 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:48] "GET /uploads/912895e076c3/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 15:50:48,997 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:48] "GET /uploads/912895e076c3/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 15:50:48,999 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:48] "GET /uploads/912895e076c3/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 15:50:49,000 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:49] "GET /uploads/912895e076c3/input_lbp.png HTTP/1.1" 200 - +2026-08-03 15:50:49,002 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:49] "GET /uploads/912895e076c3/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 15:50:49,003 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:49] "GET /uploads/912895e076c3/template_lbp.png HTTP/1.1" 200 - +2026-08-03 15:50:49,006 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:49] "GET /uploads/912895e076c3/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 15:50:49,025 WARNING [__main__] [912895e076c3] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 15:50:49,026 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:50:49] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 15:51:10,411 INFO [pipeline.engine] [912895e076c3] unloaded matching-pipeline models before SAM3/YOLO-World/DINO/CLIP run +2026-08-03 15:51:10,411 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-03 15:51:32,258 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-03 15:51:33,051 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 15:51:35,544 INFO [pipeline.engine] [912895e076c3] flower count: 25.55s, SAM3 total=11, YOLO flower/vase/ribbon=1/1/0, vase comparison=different +2026-08-03 15:51:35,545 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:51:35] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-03 15:51:35,553 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:51:35] "GET /uploads/912895e076c3/flower_count_sam.png?t=1785752495547 HTTP/1.1" 200 - +2026-08-03 15:51:35,553 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:51:35] "GET /uploads/912895e076c3/vase_crop_input.png?t=1785752495548 HTTP/1.1" 200 - +2026-08-03 15:51:35,554 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:51:35] "GET /uploads/912895e076c3/vase_crop_template.png?t=1785752495548 HTTP/1.1" 200 - +2026-08-03 15:51:35,555 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 15:51:35] "GET /uploads/912895e076c3/flower_count_yolo.png?t=1785752495548 HTTP/1.1" 200 - +2026-08-03 15:58:30,041 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 15:58:30] "GET / HTTP/1.1" 200 - +2026-08-03 16:00:13,728 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:00:13] "GET / HTTP/1.1" 200 - +2026-08-03 16:02:39,352 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:39] "GET /.env HTTP/1.1" 404 - +2026-08-03 16:02:40,718 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:40] "GET /.git/HEAD HTTP/1.1" 404 - +2026-08-03 16:02:41,728 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:41] "GET /.env.backup HTTP/1.1" 404 - +2026-08-03 16:02:43,506 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:43] "GET /.env.old HTTP/1.1" 404 - +2026-08-03 16:02:44,692 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:44] "GET /.env.save HTTP/1.1" 404 - +2026-08-03 16:02:45,911 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:45] "GET /.env.bak HTTP/1.1" 404 - +2026-08-03 16:02:47,043 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:47] "GET /.env.prod HTTP/1.1" 404 - +2026-08-03 16:02:48,889 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:48] "GET /.env.production HTTP/1.1" 404 - +2026-08-03 16:02:50,237 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:50] "GET /.env.staging HTTP/1.1" 404 - +2026-08-03 16:02:51,473 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:51] "GET /.env.local HTTP/1.1" 404 - +2026-08-03 16:02:53,488 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:53] "GET /.env.live HTTP/1.1" 404 - +2026-08-03 16:02:54,724 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:54] "GET /.env.dev HTTP/1.1" 404 - +2026-08-03 16:02:55,981 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:02:55] "GET /.env.stage HTTP/1.1" 404 - +2026-08-03 16:03:00,476 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:03:00] "GET /config/.env HTTP/1.1" 404 - +2026-08-03 16:03:02,279 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:03:02] "GET /app/.env HTTP/1.1" 404 - +2026-08-03 16:03:07,191 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:03:07] "GET /api/.env HTTP/1.1" 404 - +2026-08-03 16:03:07,533 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:03:07] "GET /application/.env HTTP/1.1" 404 - +2026-08-03 16:03:08,153 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:03:08] "GET /functions/.env HTTP/1.1" 404 - +2026-08-03 16:05:59,554 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-08-03 16:05:59,554 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-08-03 16:05:59,678 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 16:06:00,680 INFO [pipeline.engine] template ready: SKU_1 +2026-08-03 16:06:00,747 INFO [pipeline.engine] template ready: SKU_2 +2026-08-03 16:06:00,903 INFO [pipeline.engine] template ready: SKU_3 +2026-08-03 16:06:01,028 INFO [pipeline.engine] template ready: SKU_4 +2026-08-03 16:06:01,087 INFO [pipeline.engine] template ready: SKU_5 +2026-08-03 16:06:01,221 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-08-03 16:06:01,221 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-08-03 16:06:01,222 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-08-03 16:06:01,222 INFO [werkzeug] Press CTRL+C to quit +2026-08-03 16:06:05,289 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:06:05] "GET / HTTP/1.1" 200 - +2026-08-03 16:07:33,440 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:33] "GET / HTTP/1.1" 200 - +2026-08-03 16:07:33,449 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:33] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 16:07:33,450 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:33] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 16:07:33,664 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:33] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-03 16:07:33,666 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:33] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-03 16:07:33,667 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:33] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-03 16:07:33,668 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:33] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 16:07:33,668 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:33] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-03 16:07:33,669 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:33] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-03 16:07:33,738 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:33] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 16:07:35,972 INFO [pipeline.engine] [ff0b32f17a2b] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-08-03 16:07:36,005 INFO [pipeline.engine] [ff0b32f17a2b] background removal: 0.03s +2026-08-03 16:07:36,343 INFO [pipeline.engine] [ff0b32f17a2b] SIFT: 0.31s +2026-08-03 16:07:36,712 INFO [pipeline.engine] [ff0b32f17a2b] ORB: 0.35s +2026-08-03 16:07:36,789 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 16:07:37,900 INFO [pipeline.engine] [ff0b32f17a2b] SuperGlue: 1.19s +2026-08-03 16:07:37,916 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 16:07:38,480 INFO [pipeline.engine] [ff0b32f17a2b] LoFTR: 0.57s +2026-08-03 16:07:38,635 INFO [pipeline.engine] [ff0b32f17a2b] color analysis: 0.12s +2026-08-03 16:07:38,640 INFO [pipeline.engine] [ff0b32f17a2b] shape analysis: 0.00s +2026-08-03 16:07:38,864 INFO [pipeline.engine] [ff0b32f17a2b] texture analysis: 0.22s +2026-08-03 16:07:39,015 INFO [pipeline.engine] [ff0b32f17a2b] total: 3.04s, weighted best: SKU_1 +2026-08-03 16:07:39,092 INFO [pipeline.engine] [ff0b32f17a2b] done, peak RSS so far: 1757 MB +2026-08-03 16:07:39,094 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "POST /api/match HTTP/1.1" 200 - +2026-08-03 16:07:39,161 INFO [__main__] [ff0b32f17a2b] verifying against SKU_1 via external endpoint +2026-08-03 16:07:39,162 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/ORB_best.png HTTP/1.1" 200 - +2026-08-03 16:07:39,163 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/nobg.png HTTP/1.1" 200 - +2026-08-03 16:07:39,163 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 16:07:39,164 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/original.jpg HTTP/1.1" 200 - +2026-08-03 16:07:39,165 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 16:07:39,173 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 16:07:39,174 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 16:07:39,175 WARNING [__main__] [ff0b32f17a2b] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 16:07:39,175 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 16:07:39,176 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 16:07:39,185 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 16:07:39,185 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/input_lbp.png HTTP/1.1" 200 - +2026-08-03 16:07:39,187 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 16:07:39,187 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 16:07:39,188 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:07:39] "GET /uploads/ff0b32f17a2b/template_lbp.png HTTP/1.1" 200 - +2026-08-03 16:10:27,238 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:27] "GET / HTTP/1.1" 200 - +2026-08-03 16:10:27,476 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:27] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 16:10:27,685 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:27] "GET /favicon.png HTTP/1.1" 404 - +2026-08-03 16:10:39,339 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:39] "GET / HTTP/1.1" 200 - +2026-08-03 16:10:39,584 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:39] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 16:10:40,003 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:40] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 16:10:40,086 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:40] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-03 16:10:40,426 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:40] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-03 16:10:40,504 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:40] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-03 16:10:40,505 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:40] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-03 16:10:40,509 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:40] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 16:10:40,512 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:10:40] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-03 16:11:23,875 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:23] "GET / HTTP/1.1" 200 - +2026-08-03 16:11:23,912 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:23] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 16:11:23,914 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:23] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 16:11:23,916 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:23] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-03 16:11:23,917 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:23] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-03 16:11:23,918 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:23] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-03 16:11:23,920 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:23] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-03 16:11:23,921 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:23] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-03 16:11:23,923 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:23] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-03 16:11:31,046 INFO [pipeline.engine] [33d6f4956817] new upload: '20260727_162103.jpg' (11246.4 KB) +2026-08-03 16:11:32,518 INFO [pipeline.bg_removal] Resized upload (16320, 7532) -> (1600, 738) before processing +2026-08-03 16:11:34,604 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-08-03 16:11:34,604 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-08-03 16:11:44,540 INFO [pipeline.engine] [33d6f4956817] background removal: 13.49s +2026-08-03 16:11:44,870 INFO [pipeline.engine] [33d6f4956817] SIFT: 0.31s +2026-08-03 16:11:45,210 INFO [pipeline.engine] [33d6f4956817] ORB: 0.34s +2026-08-03 16:11:46,234 INFO [pipeline.engine] [33d6f4956817] SuperGlue: 1.02s +2026-08-03 16:11:46,615 INFO [pipeline.engine] [33d6f4956817] LoFTR: 0.37s +2026-08-03 16:11:46,696 INFO [pipeline.engine] [33d6f4956817] color analysis: 0.04s +2026-08-03 16:11:46,700 INFO [pipeline.engine] [33d6f4956817] shape analysis: 0.00s +2026-08-03 16:11:46,927 INFO [pipeline.engine] [33d6f4956817] texture analysis: 0.23s +2026-08-03 16:11:47,099 INFO [pipeline.engine] [33d6f4956817] total: 16.05s, weighted best: SKU_4 +2026-08-03 16:11:47,174 INFO [pipeline.engine] [33d6f4956817] done, peak RSS so far: 8209 MB +2026-08-03 16:11:47,176 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "POST /api/match HTTP/1.1" 200 - +2026-08-03 16:11:47,200 INFO [__main__] [33d6f4956817] verifying against SKU_4 via external endpoint +2026-08-03 16:11:47,204 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/nobg.png HTTP/1.1" 200 - +2026-08-03 16:11:47,204 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/original.jpg HTTP/1.1" 200 - +2026-08-03 16:11:47,208 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/ORB_best.png HTTP/1.1" 200 - +2026-08-03 16:11:47,209 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 16:11:47,210 WARNING [__main__] [33d6f4956817] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 16:11:47,211 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 16:11:47,212 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 16:11:47,213 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 16:11:47,216 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 16:11:47,216 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 16:11:47,219 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 16:11:47,221 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/template_lbp.png HTTP/1.1" 200 - +2026-08-03 16:11:47,222 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/input_lbp.png HTTP/1.1" 200 - +2026-08-03 16:11:47,223 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 16:11:47,225 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:11:47] "GET /uploads/33d6f4956817/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 16:12:08,883 INFO [pipeline.engine] [33d6f4956817] unloaded matching-pipeline models before SAM3/YOLO-World/DINO/CLIP run +2026-08-03 16:12:08,883 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-03 16:12:30,651 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-03 16:12:31,532 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 16:12:33,950 INFO [pipeline.engine] [33d6f4956817] flower count: 25.48s, SAM3 total=11, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-08-03 16:12:33,951 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:12:33] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-03 16:12:33,958 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:12:33] "GET /uploads/33d6f4956817/flower_count_sam.png?t=1785753753954 HTTP/1.1" 200 - +2026-08-03 16:12:33,959 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:12:33] "GET /uploads/33d6f4956817/flower_count_yolo.png?t=1785753753954 HTTP/1.1" 200 - +2026-08-03 16:12:33,960 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:12:33] "GET /uploads/33d6f4956817/vase_crop_template.png?t=1785753753954 HTTP/1.1" 200 - +2026-08-03 16:12:33,961 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:12:33] "GET /uploads/33d6f4956817/vase_crop_input.png?t=1785753753954 HTTP/1.1" 200 - +2026-08-03 16:18:12,049 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:18:12] "GET /.env HTTP/1.1" 404 - +2026-08-03 16:18:13,308 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:18:13] "POST /aaa HTTP/1.1" 404 - +2026-08-03 16:22:44,428 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:22:44] "GET /robots.txt HTTP/1.1" 404 - +2026-08-03 16:22:45,407 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:22:45] "GET / HTTP/1.1" 200 - +2026-08-03 16:22:50,815 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:22:50] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 16:22:53,766 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:22:53] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 16:22:56,228 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:22:56] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 16:22:58,539 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:22:58] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-03 16:23:00,567 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:23:00] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-03 16:23:02,345 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:23:02] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-03 16:23:04,079 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:23:04] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-03 16:23:05,513 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:23:05] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-03 16:40:56,871 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:40:56] "GET / HTTP/1.1" 200 - +2026-08-03 16:47:32,955 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:47:32] "GET /.env HTTP/1.1" 404 - +2026-08-03 16:47:33,793 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:47:33] "GET /.git/config HTTP/1.1" 404 - +2026-08-03 16:51:16,692 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-08-03 16:51:16,692 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-08-03 16:51:16,820 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 16:51:17,848 INFO [pipeline.engine] template ready: SKU_1 +2026-08-03 16:51:17,915 INFO [pipeline.engine] template ready: SKU_2 +2026-08-03 16:51:18,074 INFO [pipeline.engine] template ready: SKU_3 +2026-08-03 16:51:18,198 INFO [pipeline.engine] template ready: SKU_4 +2026-08-03 16:51:18,257 INFO [pipeline.engine] template ready: SKU_5 +2026-08-03 16:51:18,388 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-08-03 16:51:18,388 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-08-03 16:51:18,389 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-08-03 16:51:18,389 INFO [werkzeug] Press CTRL+C to quit +2026-08-03 16:51:22,502 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:51:22] "GET / HTTP/1.1" 200 - +2026-08-03 16:52:02,629 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:02] "GET / HTTP/1.1" 200 - +2026-08-03 16:52:02,638 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:02] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 16:52:02,638 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:02] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 16:52:02,851 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:02] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-03 16:52:02,851 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:02] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-03 16:52:02,852 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:02] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-03 16:52:02,852 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:02] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-03 16:52:02,852 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:02] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 16:52:02,853 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:02] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-03 16:52:02,928 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:02] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 16:52:05,161 INFO [pipeline.engine] [5c22ae5e2c7d] new upload: '20260727_193449.jpg' (12590.8 KB) +2026-08-03 16:52:05,195 INFO [pipeline.engine] [5c22ae5e2c7d] background removal: 0.03s +2026-08-03 16:52:05,533 INFO [pipeline.engine] [5c22ae5e2c7d] SIFT: 0.31s +2026-08-03 16:52:05,890 INFO [pipeline.engine] [5c22ae5e2c7d] ORB: 0.33s +2026-08-03 16:52:05,966 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 16:52:07,052 INFO [pipeline.engine] [5c22ae5e2c7d] SuperGlue: 1.16s +2026-08-03 16:52:07,067 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 16:52:07,632 INFO [pipeline.engine] [5c22ae5e2c7d] LoFTR: 0.57s +2026-08-03 16:52:07,791 INFO [pipeline.engine] [5c22ae5e2c7d] color analysis: 0.13s +2026-08-03 16:52:07,798 INFO [pipeline.engine] [5c22ae5e2c7d] shape analysis: 0.01s +2026-08-03 16:52:08,027 INFO [pipeline.engine] [5c22ae5e2c7d] texture analysis: 0.23s +2026-08-03 16:52:08,175 INFO [pipeline.engine] [5c22ae5e2c7d] total: 3.01s, weighted best: SKU_1 +2026-08-03 16:52:08,257 INFO [pipeline.engine] [5c22ae5e2c7d] done, peak RSS so far: 1769 MB +2026-08-03 16:52:08,259 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "POST /api/match HTTP/1.1" 200 - +2026-08-03 16:52:08,321 INFO [__main__] [5c22ae5e2c7d] verifying against SKU_1 via external endpoint +2026-08-03 16:52:08,324 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/ORB_best.png HTTP/1.1" 200 - +2026-08-03 16:52:08,325 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/original.jpg HTTP/1.1" 200 - +2026-08-03 16:52:08,325 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/nobg.png HTTP/1.1" 200 - +2026-08-03 16:52:08,325 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 16:52:08,338 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 16:52:08,340 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 16:52:08,341 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 16:52:08,344 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 16:52:08,347 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 16:52:08,348 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/input_lbp.png HTTP/1.1" 200 - +2026-08-03 16:52:08,349 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/template_lbp.png HTTP/1.1" 200 - +2026-08-03 16:52:08,351 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 16:52:08,356 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "GET /uploads/5c22ae5e2c7d/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 16:52:08,448 WARNING [__main__] [5c22ae5e2c7d] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 16:52:08,453 INFO [pipeline.engine] [5c22ae5e2c7d] unloaded matching-pipeline models before flower summary +2026-08-03 16:52:08,454 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:08] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 16:52:24,246 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 16:52:26,788 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:52:26] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-03 16:52:58,145 INFO [pipeline.engine] [c146220dc967] new upload: '20260727_174422.jpg' (9958.5 KB) +2026-08-03 16:52:58,175 INFO [pipeline.engine] [c146220dc967] background removal: 0.03s +2026-08-03 16:52:58,453 INFO [pipeline.engine] [c146220dc967] SIFT: 0.26s +2026-08-03 16:52:58,794 INFO [pipeline.engine] [c146220dc967] ORB: 0.34s +2026-08-03 16:52:58,812 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 16:52:58,851 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 16:52:59,943 INFO [pipeline.engine] [c146220dc967] SuperGlue: 1.15s +2026-08-03 16:52:59,958 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 16:53:00,491 INFO [pipeline.engine] [c146220dc967] LoFTR: 0.54s +2026-08-03 16:53:00,561 INFO [pipeline.engine] [c146220dc967] color analysis: 0.04s +2026-08-03 16:53:00,566 INFO [pipeline.engine] [c146220dc967] shape analysis: 0.00s +2026-08-03 16:53:00,795 INFO [pipeline.engine] [c146220dc967] texture analysis: 0.23s +2026-08-03 16:53:00,950 INFO [pipeline.engine] [c146220dc967] total: 2.80s, weighted best: SKU_3 +2026-08-03 16:53:01,032 INFO [pipeline.engine] [c146220dc967] done, peak RSS so far: 2332 MB +2026-08-03 16:53:01,034 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:53:01] "POST /api/match HTTP/1.1" 200 - +2026-08-03 16:53:44,939 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:53:44] "GET / HTTP/1.1" 200 - +2026-08-03 16:53:44,973 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:53:44] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 16:53:44,974 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:53:44] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 16:53:44,977 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:53:44] "GET /template_image/SKU_2.png HTTP/1.1" 304 - +2026-08-03 16:53:44,977 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:53:44] "GET /template_image/SKU_1.png HTTP/1.1" 304 - +2026-08-03 16:53:44,980 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:53:44] "GET /template_image/SKU_4.png HTTP/1.1" 304 - +2026-08-03 16:53:44,981 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:53:44] "GET /template_image/SKU_3.png HTTP/1.1" 304 - +2026-08-03 16:53:44,982 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:53:44] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 304 - +2026-08-03 16:53:44,982 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:53:44] "GET /template_image/SKU_5.png HTTP/1.1" 304 - +2026-08-03 16:54:08,079 INFO [pipeline.engine] [bcbccf94ce99] new upload: '20260727_163706.jpg' (5697.4 KB) +2026-08-03 16:54:08,100 INFO [pipeline.engine] [bcbccf94ce99] background removal: 0.02s +2026-08-03 16:54:08,468 INFO [pipeline.engine] [bcbccf94ce99] SIFT: 0.34s +2026-08-03 16:54:08,776 INFO [pipeline.engine] [bcbccf94ce99] ORB: 0.31s +2026-08-03 16:54:09,804 INFO [pipeline.engine] [bcbccf94ce99] SuperGlue: 1.03s +2026-08-03 16:54:10,182 INFO [pipeline.engine] [bcbccf94ce99] LoFTR: 0.37s +2026-08-03 16:54:10,248 INFO [pipeline.engine] [bcbccf94ce99] color analysis: 0.04s +2026-08-03 16:54:10,252 INFO [pipeline.engine] [bcbccf94ce99] shape analysis: 0.00s +2026-08-03 16:54:10,472 INFO [pipeline.engine] [bcbccf94ce99] texture analysis: 0.22s +2026-08-03 16:54:10,612 INFO [pipeline.engine] [bcbccf94ce99] total: 2.53s, weighted best: SKU_2 +2026-08-03 16:54:10,691 INFO [pipeline.engine] [bcbccf94ce99] done, peak RSS so far: 2332 MB +2026-08-03 16:54:10,692 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "POST /api/match HTTP/1.1" 200 - +2026-08-03 16:54:10,715 INFO [__main__] [bcbccf94ce99] verifying against SKU_2 via external endpoint +2026-08-03 16:54:10,718 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/original.jpg HTTP/1.1" 200 - +2026-08-03 16:54:10,720 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/nobg.png HTTP/1.1" 200 - +2026-08-03 16:54:10,721 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 16:54:10,722 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/ORB_best.png HTTP/1.1" 200 - +2026-08-03 16:54:10,724 WARNING [__main__] [bcbccf94ce99] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 16:54:10,725 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 16:54:10,726 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 16:54:10,726 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 16:54:10,728 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 16:54:10,731 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 16:54:10,731 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 16:54:10,732 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/input_lbp.png HTTP/1.1" 200 - +2026-08-03 16:54:10,733 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/template_lbp.png HTTP/1.1" 200 - +2026-08-03 16:54:10,735 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 16:54:10,736 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:10] "GET /uploads/bcbccf94ce99/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 16:54:10,836 INFO [pipeline.engine] [bcbccf94ce99] unloaded matching-pipeline models before flower summary +2026-08-03 16:54:26,067 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 16:54:28,349 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:54:28] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-03 16:54:48,936 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-03 16:55:05,563 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:55:05] "GET / HTTP/1.1" 200 - +2026-08-03 16:55:05,775 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:55:05] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 16:55:10,750 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-03 16:55:11,489 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 16:55:13,893 INFO [pipeline.engine] [bcbccf94ce99] flower count: 24.97s, SAM3 total=19, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-08-03 16:55:13,893 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:55:13] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-03 16:55:13,900 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:55:13] "GET /uploads/bcbccf94ce99/flower_count_sam.png?t=1785756313896 HTTP/1.1" 200 - +2026-08-03 16:55:13,901 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:55:13] "GET /uploads/bcbccf94ce99/flower_count_yolo.png?t=1785756313896 HTTP/1.1" 200 - +2026-08-03 16:55:13,903 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:55:13] "GET /uploads/bcbccf94ce99/vase_crop_input.png?t=1785756313896 HTTP/1.1" 200 - +2026-08-03 16:55:13,903 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 16:55:13] "GET /uploads/bcbccf94ce99/vase_crop_template.png?t=1785756313896 HTTP/1.1" 200 - +2026-08-03 16:55:37,493 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:55:37] "GET / HTTP/1.1" 200 - +2026-08-03 16:55:37,503 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:55:37] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 16:55:37,504 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:55:37] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-03 16:55:37,505 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:55:37] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-03 16:55:37,512 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:55:37] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-03 16:55:37,513 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:55:37] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-03 16:55:37,522 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:55:37] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-03 16:55:37,523 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:55:37] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 16:55:37,666 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:55:37] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 16:56:02,873 INFO [pipeline.engine] [58c6dcfb5d85] new upload: '20260727_163614.jpg' (6208.3 KB) +2026-08-03 16:56:02,895 INFO [pipeline.engine] [58c6dcfb5d85] background removal: 0.02s +2026-08-03 16:56:03,407 INFO [pipeline.engine] [58c6dcfb5d85] SIFT: 0.49s +2026-08-03 16:56:03,731 INFO [pipeline.engine] [58c6dcfb5d85] ORB: 0.32s +2026-08-03 16:56:03,752 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 16:56:03,790 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 16:56:04,771 INFO [pipeline.engine] [58c6dcfb5d85] SuperGlue: 1.04s +2026-08-03 16:56:04,786 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 16:56:05,323 INFO [pipeline.engine] [58c6dcfb5d85] LoFTR: 0.55s +2026-08-03 16:56:05,400 INFO [pipeline.engine] [58c6dcfb5d85] color analysis: 0.05s +2026-08-03 16:56:05,404 INFO [pipeline.engine] [58c6dcfb5d85] shape analysis: 0.00s +2026-08-03 16:56:05,625 INFO [pipeline.engine] [58c6dcfb5d85] texture analysis: 0.22s +2026-08-03 16:56:05,770 INFO [pipeline.engine] [58c6dcfb5d85] total: 2.90s, weighted best: SKU_2 +2026-08-03 16:56:05,853 INFO [pipeline.engine] [58c6dcfb5d85] done, peak RSS so far: 3573 MB +2026-08-03 16:56:05,854 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:05] "POST /api/match HTTP/1.1" 200 - +2026-08-03 16:56:05,917 INFO [__main__] [58c6dcfb5d85] verifying against SKU_2 via external endpoint +2026-08-03 16:56:05,919 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:05] "GET /uploads/58c6dcfb5d85/nobg.png HTTP/1.1" 200 - +2026-08-03 16:56:05,921 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:05] "GET /uploads/58c6dcfb5d85/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 16:56:05,922 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:05] "GET /uploads/58c6dcfb5d85/original.jpg HTTP/1.1" 200 - +2026-08-03 16:56:05,923 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:05] "GET /uploads/58c6dcfb5d85/ORB_best.png HTTP/1.1" 200 - +2026-08-03 16:56:05,924 WARNING [__main__] [58c6dcfb5d85] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 16:56:05,924 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:05] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 16:56:05,935 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:05] "GET /uploads/58c6dcfb5d85/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 16:56:05,937 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:05] "GET /uploads/58c6dcfb5d85/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 16:56:05,939 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:05] "GET /uploads/58c6dcfb5d85/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 16:56:05,943 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:05] "GET /uploads/58c6dcfb5d85/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 16:56:05,946 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:05] "GET /uploads/58c6dcfb5d85/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 16:56:06,047 INFO [pipeline.engine] [58c6dcfb5d85] unloaded matching-pipeline models before flower summary +2026-08-03 16:56:06,050 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:06] "GET /uploads/58c6dcfb5d85/template_lbp.png HTTP/1.1" 200 - +2026-08-03 16:56:06,051 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:06] "GET /uploads/58c6dcfb5d85/input_lbp.png HTTP/1.1" 200 - +2026-08-03 16:56:06,051 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:06] "GET /uploads/58c6dcfb5d85/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 16:56:06,054 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:06] "GET /uploads/58c6dcfb5d85/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 16:56:21,005 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 16:56:23,285 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:23] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-03 16:56:30,038 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-03 16:56:51,417 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-03 16:56:52,070 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 16:56:54,455 INFO [pipeline.engine] [58c6dcfb5d85] flower count: 24.43s, SAM3 total=29, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-08-03 16:56:54,456 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:54] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-03 16:56:54,462 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:54] "GET /uploads/58c6dcfb5d85/flower_count_sam.png?t=1785756414458 HTTP/1.1" 200 - +2026-08-03 16:56:54,463 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:54] "GET /uploads/58c6dcfb5d85/vase_crop_template.png?t=1785756414458 HTTP/1.1" 200 - +2026-08-03 16:56:54,463 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:54] "GET /uploads/58c6dcfb5d85/vase_crop_input.png?t=1785756414458 HTTP/1.1" 200 - +2026-08-03 16:56:54,464 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:56:54] "GET /uploads/58c6dcfb5d85/flower_count_yolo.png?t=1785756414458 HTTP/1.1" 200 - +2026-08-03 16:58:19,770 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:58:19] "GET / HTTP/1.1" 200 - +2026-08-03 16:58:19,866 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:58:19] "GET / HTTP/1.1" 200 - +2026-08-03 16:58:33,226 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:58:33] "GET / HTTP/1.1" 200 - +2026-08-03 16:59:51,122 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 16:59:51] "HEAD / HTTP/1.1" 200 - +2026-08-03 17:02:45,819 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:02:45] "GET / HTTP/1.1" 200 - +2026-08-03 17:02:49,652 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:02:49] "GET / HTTP/1.1" 200 - +2026-08-03 17:38:10,673 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-08-03 17:38:10,673 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-08-03 17:38:10,803 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 17:38:11,740 INFO [pipeline.engine] template ready: SKU_1 +2026-08-03 17:38:11,805 INFO [pipeline.engine] template ready: SKU_2 +2026-08-03 17:38:11,957 INFO [pipeline.engine] template ready: SKU_3 +2026-08-03 17:38:12,077 INFO [pipeline.engine] template ready: SKU_4 +2026-08-03 17:38:12,136 INFO [pipeline.engine] template ready: SKU_5 +2026-08-03 17:38:12,265 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-08-03 17:38:12,265 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-08-03 17:38:12,266 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-08-03 17:38:12,266 INFO [werkzeug] Press CTRL+C to quit +2026-08-03 17:38:18,556 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:38:18] "GET / HTTP/1.1" 200 - +2026-08-03 17:39:41,194 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:39:41] "GET / HTTP/1.1" 200 - +2026-08-03 17:39:41,243 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:39:41] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 17:39:41,244 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:39:41] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 17:39:41,467 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:39:41] "GET /template_image/SKU_2.png HTTP/1.1" 200 - +2026-08-03 17:39:41,468 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:39:41] "GET /template_image/SKU_1.png HTTP/1.1" 200 - +2026-08-03 17:39:41,483 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:39:41] "GET /template_image/SKU_3.png HTTP/1.1" 200 - +2026-08-03 17:39:41,484 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:39:41] "GET /template_image/SKU_5.png HTTP/1.1" 200 - +2026-08-03 17:39:41,485 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:39:41] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 17:39:41,486 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:39:41] "GET /template_image/SKU_4.png HTTP/1.1" 200 - +2026-08-03 17:39:41,529 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:39:41] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 17:39:55,333 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:39:55] "GET / HTTP/1.1" 200 - +2026-08-03 17:40:01,614 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:40:01] "GET / HTTP/1.1" 200 - +2026-08-03 17:40:56,864 INFO [pipeline.engine] [9b2700f96086] new upload: '54569.jpg' (4284.8 KB) +2026-08-03 17:40:57,010 INFO [pipeline.bg_removal] Resized upload (2160, 3840) -> (900, 1600) before processing +2026-08-03 17:40:59,255 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-08-03 17:40:59,256 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-08-03 17:41:09,001 INFO [pipeline.engine] [9b2700f96086] background removal: 12.14s +2026-08-03 17:41:09,450 INFO [pipeline.engine] [9b2700f96086] SIFT: 0.41s +2026-08-03 17:41:09,791 INFO [pipeline.engine] [9b2700f96086] ORB: 0.32s +2026-08-03 17:41:09,881 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 17:41:10,978 INFO [pipeline.engine] [9b2700f96086] SuperGlue: 1.19s +2026-08-03 17:41:10,998 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 17:41:11,599 INFO [pipeline.engine] [9b2700f96086] LoFTR: 0.61s +2026-08-03 17:41:11,776 INFO [pipeline.engine] [9b2700f96086] color analysis: 0.13s +2026-08-03 17:41:11,783 INFO [pipeline.engine] [9b2700f96086] shape analysis: 0.01s +2026-08-03 17:41:12,065 INFO [pipeline.engine] [9b2700f96086] texture analysis: 0.28s +2026-08-03 17:41:12,232 INFO [pipeline.engine] [9b2700f96086] total: 15.37s, weighted best: SKU_5 +2026-08-03 17:41:12,307 INFO [pipeline.engine] [9b2700f96086] done, peak RSS so far: 7986 MB +2026-08-03 17:41:12,308 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:12] "POST /api/match HTTP/1.1" 200 - +2026-08-03 17:41:12,564 INFO [__main__] [9b2700f96086] verifying against SKU_5 via external endpoint +2026-08-03 17:41:12,565 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:12] "GET /uploads/9b2700f96086/nobg.png HTTP/1.1" 200 - +2026-08-03 17:41:12,567 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:12] "GET /uploads/9b2700f96086/original.jpg HTTP/1.1" 200 - +2026-08-03 17:41:12,569 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:12] "GET /uploads/9b2700f96086/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 17:41:12,572 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:12] "GET /uploads/9b2700f96086/ORB_best.png HTTP/1.1" 200 - +2026-08-03 17:41:12,920 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:12] "GET /uploads/9b2700f96086/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 17:41:12,996 WARNING [__main__] [9b2700f96086] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 17:41:12,997 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:12] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 17:41:12,998 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:12] "GET /uploads/9b2700f96086/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 17:41:12,998 INFO [pipeline.engine] [9b2700f96086] unloaded matching-pipeline models before flower summary +2026-08-03 17:41:12,999 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:12] "GET /uploads/9b2700f96086/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 17:41:13,032 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:13] "GET /uploads/9b2700f96086/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 17:41:13,034 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:13] "GET /uploads/9b2700f96086/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 17:41:13,069 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:13] "GET /uploads/9b2700f96086/input_lbp.png HTTP/1.1" 200 - +2026-08-03 17:41:13,100 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:13] "GET /uploads/9b2700f96086/template_lbp.png HTTP/1.1" 200 - +2026-08-03 17:41:13,101 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:13] "GET /uploads/9b2700f96086/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 17:41:13,164 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:13] "GET /uploads/9b2700f96086/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 17:41:23,159 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:23] "GET / HTTP/1.1" 200 - +2026-08-03 17:41:27,349 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 17:41:29,877 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:29] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-03 17:41:42,763 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:41:42] "HEAD / HTTP/1.1" 200 - +2026-08-03 17:43:49,593 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:43:49] "GET /.env HTTP/1.1" 404 - +2026-08-03 17:43:49,911 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:43:49] "GET /.git/config HTTP/1.1" 404 - +2026-08-03 17:46:16,606 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:46:16] "GET / HTTP/1.1" 200 - +2026-08-03 17:46:32,070 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:46:32] "GET / HTTP/1.1" 200 - +2026-08-03 17:49:46,404 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:49:46] "HEAD / HTTP/1.1" 200 - +2026-08-03 17:49:46,434 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:49:46] "HEAD / HTTP/1.1" 200 - +2026-08-03 17:49:49,890 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:49:49] "GET / HTTP/1.1" 200 - +2026-08-03 17:51:26,662 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:26] "GET / HTTP/1.1" 200 - +2026-08-03 17:51:26,818 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:26] "GET /js/twint_ch.js HTTP/1.1" 404 - +2026-08-03 17:51:27,652 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:27] "GET /licensor.js HTTP/1.1" 404 - +2026-08-03 17:51:27,810 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:27] "GET /bot-connect.js HTTP/1.1" 404 - +2026-08-03 17:51:28,288 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:28] "GET /css/support_parent.css HTTP/1.1" 404 - +2026-08-03 17:51:28,600 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:28] "GET /static/style/protect/index.js HTTP/1.1" 404 - +2026-08-03 17:51:29,079 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:29] "GET /assets/js/qr_modal.js HTTP/1.1" 404 - +2026-08-03 17:51:29,396 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:29] "GET /js/lkk_ch.js HTTP/1.1" 404 - +2026-08-03 17:51:29,551 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:29] "GET /static/style/sys_files/index.js HTTP/1.1" 404 - +2026-08-03 17:51:29,710 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:29] "GET /assets/js/message.js HTTP/1.1" 404 - +2026-08-03 17:51:29,865 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:29] "GET /js/antibot-client.js HTTP/1.1" 404 - +2026-08-03 17:51:30,021 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:30] "GET /robots.txt HTTP/1.1" 404 - +2026-08-03 17:51:30,347 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:51:30] "GET /assets/js/auth.js HTTP/1.1" 404 - +2026-08-03 17:54:23,303 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:54:23] "HEAD / HTTP/1.1" 200 - +2026-08-03 17:54:23,394 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:54:23] "HEAD / HTTP/1.1" 200 - +2026-08-03 17:54:23,573 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:54:23] "GET / HTTP/1.1" 200 - +2026-08-03 17:54:23,620 INFO [werkzeug] 127.0.0.1 - - [03/Aug/2026 17:54:23] "HEAD / HTTP/1.1" 200 - +2026-08-03 17:58:26,510 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 17:58:26] "GET / HTTP/1.1" 200 - +2026-08-03 18:01:53,957 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:01:53] "GET / HTTP/1.1" 200 - +2026-08-03 18:03:49,206 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:03:49] "GET /.env.production HTTP/1.1" 404 - +2026-08-03 18:15:58,454 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:15:58] "HEAD / HTTP/1.1" 200 - +2026-08-03 18:15:58,476 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:15:58] "HEAD / HTTP/1.1" 200 - +2026-08-03 18:37:49,394 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:37:49] "GET / HTTP/1.1" 200 - +2026-08-03 18:45:28,480 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-08-03 18:45:28,480 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-08-03 18:45:30,725 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-08-03 18:45:30,725 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-08-03 18:45:40,669 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 18:45:41,809 INFO [pipeline.engine] template ready: SKU_1 +2026-08-03 18:45:52,107 INFO [pipeline.engine] template ready: SKU_2 +2026-08-03 18:46:01,580 INFO [pipeline.engine] template ready: SKU_3 +2026-08-03 18:46:11,030 INFO [pipeline.engine] template ready: SKU_4 +2026-08-03 18:46:20,781 INFO [pipeline.engine] template ready: SKU_5 +2026-08-03 18:46:30,061 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-08-03 18:46:30,061 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-08-03 18:46:30,063 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-08-03 18:46:30,063 INFO [werkzeug] Press CTRL+C to quit +2026-08-03 18:46:53,013 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:46:53] "GET / HTTP/1.1" 200 - +2026-08-03 18:46:53,074 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:46:53] "GET /template_image/SKU_1.jpg HTTP/1.1" 200 - +2026-08-03 18:46:53,074 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:46:53] "GET /template_image/SKU_2.jpg HTTP/1.1" 200 - +2026-08-03 18:46:53,076 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:46:53] "GET /template_image/SKU_3.jpg HTTP/1.1" 200 - +2026-08-03 18:46:53,077 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:46:53] "GET /template_image/SKU_4.jpg HTTP/1.1" 200 - +2026-08-03 18:46:53,078 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:46:53] "GET /template_image/SKU_5.jpg HTTP/1.1" 200 - +2026-08-03 18:47:06,351 INFO [pipeline.engine] [d45dc888d07d] new upload: 'WhatsApp Image 2026-07-13 at 3.32.47 PM (5).jpeg' (139.5 KB) +2026-08-03 18:47:15,991 INFO [pipeline.engine] [d45dc888d07d] background removal: 9.64s +2026-08-03 18:47:16,421 INFO [pipeline.engine] [d45dc888d07d] SIFT: 0.40s +2026-08-03 18:47:16,828 INFO [pipeline.engine] [d45dc888d07d] ORB: 0.39s +2026-08-03 18:47:16,898 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 18:47:17,911 INFO [pipeline.engine] [d45dc888d07d] SuperGlue: 1.08s +2026-08-03 18:47:17,930 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 18:47:18,636 INFO [pipeline.engine] [d45dc888d07d] LoFTR: 0.71s +2026-08-03 18:47:18,885 INFO [pipeline.engine] [d45dc888d07d] color analysis: 0.12s +2026-08-03 18:47:18,891 INFO [pipeline.engine] [d45dc888d07d] shape analysis: 0.01s +2026-08-03 18:47:19,143 INFO [pipeline.engine] [d45dc888d07d] texture analysis: 0.25s +2026-08-03 18:47:19,407 INFO [pipeline.engine] [d45dc888d07d] total: 13.06s, weighted best: SKU_5 +2026-08-03 18:47:19,493 INFO [pipeline.engine] [d45dc888d07d] done, peak RSS so far: 12847 MB +2026-08-03 18:47:19,494 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "POST /api/match HTTP/1.1" 200 - +2026-08-03 18:47:19,530 INFO [__main__] [d45dc888d07d] verifying against SKU_5 via external endpoint +2026-08-03 18:47:19,532 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/nobg.png HTTP/1.1" 200 - +2026-08-03 18:47:19,536 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 18:47:19,536 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/ORB_best.png HTTP/1.1" 200 - +2026-08-03 18:47:19,537 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/original.jpeg HTTP/1.1" 200 - +2026-08-03 18:47:19,552 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 18:47:19,554 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 18:47:19,556 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 18:47:19,559 WARNING [__main__] [d45dc888d07d] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 18:47:19,560 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 18:47:19,564 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 18:47:19,567 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/input_lbp.png HTTP/1.1" 200 - +2026-08-03 18:47:19,568 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 18:47:19,568 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/template_lbp.png HTTP/1.1" 200 - +2026-08-03 18:47:19,570 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 18:47:19,572 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:19] "GET /uploads/d45dc888d07d/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 18:47:20,197 INFO [pipeline.engine] [d45dc888d07d] unloaded matching-pipeline models before flower summary +2026-08-03 18:47:35,605 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 18:47:38,107 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:47:38] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-03 18:47:52,006 INFO [pipeline.engine] [f9a2baa5ad72] new upload: 'SKU_5.jpg' (115.4 KB) +2026-08-03 18:47:52,085 INFO [pipeline.bg_removal] Resized upload (1440, 3120) -> (738, 1599) before processing +2026-08-03 18:47:54,451 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-08-03 18:47:54,451 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-08-03 18:48:04,606 INFO [pipeline.engine] [f9a2baa5ad72] background removal: 12.60s +2026-08-03 18:48:04,865 INFO [pipeline.engine] [f9a2baa5ad72] SIFT: 0.24s +2026-08-03 18:48:05,201 INFO [pipeline.engine] [f9a2baa5ad72] ORB: 0.34s +2026-08-03 18:48:05,217 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 18:48:05,257 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 18:48:05,876 INFO [pipeline.engine] [f9a2baa5ad72] SuperGlue: 0.67s +2026-08-03 18:48:05,891 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 18:48:06,464 INFO [pipeline.engine] [f9a2baa5ad72] LoFTR: 0.58s +2026-08-03 18:48:06,636 INFO [pipeline.engine] [f9a2baa5ad72] color analysis: 0.04s +2026-08-03 18:48:06,640 INFO [pipeline.engine] [f9a2baa5ad72] shape analysis: 0.00s +2026-08-03 18:48:06,870 INFO [pipeline.engine] [f9a2baa5ad72] texture analysis: 0.23s +2026-08-03 18:48:07,050 INFO [pipeline.engine] [f9a2baa5ad72] total: 15.04s, weighted best: SKU_5 +2026-08-03 18:48:07,131 INFO [pipeline.engine] [f9a2baa5ad72] done, peak RSS so far: 12849 MB +2026-08-03 18:48:07,132 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "POST /api/match HTTP/1.1" 200 - +2026-08-03 18:48:07,148 INFO [__main__] [f9a2baa5ad72] verifying against SKU_5 via external endpoint +2026-08-03 18:48:07,149 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 18:48:07,149 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/nobg.png HTTP/1.1" 200 - +2026-08-03 18:48:07,150 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/original.jpg HTTP/1.1" 200 - +2026-08-03 18:48:07,152 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/ORB_best.png HTTP/1.1" 200 - +2026-08-03 18:48:07,156 WARNING [__main__] [f9a2baa5ad72] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 18:48:07,156 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 18:48:07,165 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 18:48:07,166 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 18:48:07,170 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 18:48:07,171 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 18:48:07,173 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 18:48:07,178 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/input_lbp.png HTTP/1.1" 200 - +2026-08-03 18:48:07,180 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/template_lbp.png HTTP/1.1" 200 - +2026-08-03 18:48:07,181 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 18:48:07,183 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:07] "GET /uploads/f9a2baa5ad72/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 18:48:07,670 INFO [pipeline.engine] [f9a2baa5ad72] unloaded matching-pipeline models before flower summary +2026-08-03 18:48:22,807 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 18:48:25,127 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:48:25] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-03 18:51:55,035 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:51:55] "GET / HTTP/1.1" 200 - +2026-08-03 18:51:59,479 INFO [pipeline.engine] [87e797f3113c] new upload: 'SKU_5.jpg' (115.4 KB) +2026-08-03 18:51:59,493 INFO [pipeline.engine] [87e797f3113c] background removal: 0.01s +2026-08-03 18:51:59,772 INFO [pipeline.engine] [87e797f3113c] SIFT: 0.26s +2026-08-03 18:52:00,092 INFO [pipeline.engine] [87e797f3113c] ORB: 0.32s +2026-08-03 18:52:00,103 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 18:52:00,142 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 18:52:00,761 INFO [pipeline.engine] [87e797f3113c] SuperGlue: 0.67s +2026-08-03 18:52:00,777 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 18:52:01,351 INFO [pipeline.engine] [87e797f3113c] LoFTR: 0.58s +2026-08-03 18:52:01,515 INFO [pipeline.engine] [87e797f3113c] color analysis: 0.04s +2026-08-03 18:52:01,519 INFO [pipeline.engine] [87e797f3113c] shape analysis: 0.00s +2026-08-03 18:52:01,740 INFO [pipeline.engine] [87e797f3113c] texture analysis: 0.22s +2026-08-03 18:52:01,913 INFO [pipeline.engine] [87e797f3113c] total: 2.43s, weighted best: SKU_5 +2026-08-03 18:52:01,993 INFO [pipeline.engine] [87e797f3113c] done, peak RSS so far: 12849 MB +2026-08-03 18:52:01,993 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:01] "POST /api/match HTTP/1.1" 200 - +2026-08-03 18:52:02,022 INFO [__main__] [87e797f3113c] verifying against SKU_5 via external endpoint +2026-08-03 18:52:02,026 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/original.jpg HTTP/1.1" 200 - +2026-08-03 18:52:02,027 WARNING [__main__] [87e797f3113c] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 18:52:02,027 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/nobg.png HTTP/1.1" 200 - +2026-08-03 18:52:02,029 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 18:52:02,029 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 18:52:02,032 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/ORB_best.png HTTP/1.1" 200 - +2026-08-03 18:52:02,035 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 18:52:02,041 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 18:52:02,051 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 18:52:02,053 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 18:52:02,055 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/input_lbp.png HTTP/1.1" 200 - +2026-08-03 18:52:02,055 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 18:52:02,058 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 18:52:02,058 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/template_lbp.png HTTP/1.1" 200 - +2026-08-03 18:52:02,060 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:02] "GET /uploads/87e797f3113c/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 18:52:02,160 INFO [pipeline.engine] [87e797f3113c] unloaded matching-pipeline models before flower summary +2026-08-03 18:52:17,232 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 18:52:19,575 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:52:19] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-03 18:53:01,320 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-08-03 18:53:01,320 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-08-03 18:53:01,569 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-03 18:53:02,676 INFO [pipeline.engine] template ready: SKU_1 +2026-08-03 18:53:03,084 INFO [pipeline.engine] template ready: SKU_2 +2026-08-03 18:53:03,357 INFO [pipeline.engine] template ready: SKU_3 +2026-08-03 18:53:03,640 INFO [pipeline.engine] template ready: SKU_4 +2026-08-03 18:53:04,039 INFO [pipeline.engine] template ready: SKU_5 +2026-08-03 18:53:04,161 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-08-03 18:53:04,161 INFO [pipeline.engine] 6 templates ready (device: cuda). +2026-08-03 18:53:04,162 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-08-03 18:53:04,163 INFO [werkzeug] Press CTRL+C to quit +2026-08-03 18:53:07,805 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:07] "GET / HTTP/1.1" 200 - +2026-08-03 18:53:12,214 INFO [pipeline.engine] [b704c34a7e42] new upload: 'SKU_2.jpg' (54.9 KB) +2026-08-03 18:53:14,530 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-08-03 18:53:14,530 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-08-03 18:53:24,583 INFO [pipeline.engine] [b704c34a7e42] background removal: 12.37s +2026-08-03 18:53:24,920 INFO [pipeline.engine] [b704c34a7e42] SIFT: 0.32s +2026-08-03 18:53:25,292 INFO [pipeline.engine] [b704c34a7e42] ORB: 0.36s +2026-08-03 18:53:25,336 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-03 18:53:25,892 INFO [pipeline.engine] [b704c34a7e42] SuperGlue: 0.60s +2026-08-03 18:53:25,909 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-03 18:53:26,485 INFO [pipeline.engine] [b704c34a7e42] LoFTR: 0.59s +2026-08-03 18:53:26,734 INFO [pipeline.engine] [b704c34a7e42] color analysis: 0.12s +2026-08-03 18:53:26,738 INFO [pipeline.engine] [b704c34a7e42] shape analysis: 0.00s +2026-08-03 18:53:26,958 INFO [pipeline.engine] [b704c34a7e42] texture analysis: 0.22s +2026-08-03 18:53:27,140 INFO [pipeline.engine] [b704c34a7e42] total: 14.93s, weighted best: SKU_2 +2026-08-03 18:53:27,218 INFO [pipeline.engine] [b704c34a7e42] done, peak RSS so far: 8136 MB +2026-08-03 18:53:27,219 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "POST /api/match HTTP/1.1" 200 - +2026-08-03 18:53:27,249 INFO [__main__] [b704c34a7e42] verifying against SKU_2 via external endpoint +2026-08-03 18:53:27,251 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/original.jpg HTTP/1.1" 200 - +2026-08-03 18:53:27,252 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/nobg.png HTTP/1.1" 200 - +2026-08-03 18:53:27,254 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/LoFTR_best.png HTTP/1.1" 200 - +2026-08-03 18:53:27,257 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/ORB_best.png HTTP/1.1" 200 - +2026-08-03 18:53:27,262 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/SIFT_best.png HTTP/1.1" 200 - +2026-08-03 18:53:27,266 WARNING [__main__] [b704c34a7e42] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-03 18:53:27,266 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "POST /api/verify HTTP/1.1" 502 - +2026-08-03 18:53:27,277 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/input_silhouette.png HTTP/1.1" 200 - +2026-08-03 18:53:27,277 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-03 18:53:27,278 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/template_silhouette.png HTTP/1.1" 200 - +2026-08-03 18:53:27,280 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/input_lbp.png HTTP/1.1" 200 - +2026-08-03 18:53:27,281 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/shape_overlay.png HTTP/1.1" 200 - +2026-08-03 18:53:27,283 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/template_lbp.png HTTP/1.1" 200 - +2026-08-03 18:53:27,290 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/template_family_grid.png HTTP/1.1" 200 - +2026-08-03 18:53:27,291 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:27] "GET /uploads/b704c34a7e42/input_family_grid.png HTTP/1.1" 200 - +2026-08-03 18:53:27,724 INFO [pipeline.engine] [b704c34a7e42] unloaded matching-pipeline models before flower summary +2026-08-03 18:53:42,852 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 18:53:45,455 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:53:45] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-03 18:53:54,370 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-03 18:54:16,546 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-03 18:54:17,270 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-03 18:54:19,705 INFO [pipeline.engine] [b704c34a7e42] flower count: 25.35s, SAM3 total=18, YOLO flower/vase/ribbon=1/1/0, vase comparison=same +2026-08-03 18:54:19,705 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:54:19] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-03 18:54:19,713 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:54:19] "GET /uploads/b704c34a7e42/flower_count_sam.png?t=1785763459709 HTTP/1.1" 200 - +2026-08-03 18:54:19,715 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:54:19] "GET /uploads/b704c34a7e42/vase_crop_input.png?t=1785763459709 HTTP/1.1" 200 - +2026-08-03 18:54:19,716 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:54:19] "GET /uploads/b704c34a7e42/flower_count_yolo.png?t=1785763459709 HTTP/1.1" 200 - +2026-08-03 18:54:19,716 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 18:54:19] "GET /uploads/b704c34a7e42/vase_crop_template.png?t=1785763459709 HTTP/1.1" 200 - +2026-08-03 19:15:00,120 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 19:15:00] "GET / HTTP/1.1" 200 - +2026-08-03 19:15:01,099 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 19:15:01] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 19:15:04,539 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 19:15:04] "GET / HTTP/1.1" 200 - +2026-08-03 19:15:28,057 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 19:15:28] "GET / HTTP/1.1" 200 - +2026-08-03 20:24:58,585 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:24:58] "GET / HTTP/1.1" 200 - +2026-08-03 20:24:58,626 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:24:58] "GET / HTTP/1.1" 200 - +2026-08-03 20:38:01,781 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:01] "GET / HTTP/1.1" 200 - +2026-08-03 20:38:01,853 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:01] "POST / HTTP/1.1" 405 - +2026-08-03 20:38:07,434 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /.ssh/id_rsa HTTP/1.1" 404 - +2026-08-03 20:38:07,436 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /storage/logs/laravel.log HTTP/1.1" 404 - +2026-08-03 20:38:07,452 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /config.php HTTP/1.1" 404 - +2026-08-03 20:38:07,493 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /config.xml HTTP/1.1" 404 - +2026-08-03 20:38:07,582 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /dump.sql HTTP/1.1" 404 - +2026-08-03 20:38:07,585 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /backup.sql HTTP/1.1" 404 - +2026-08-03 20:38:07,605 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /database.sql HTTP/1.1" 404 - +2026-08-03 20:38:07,655 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /database_backup.sql HTTP/1.1" 404 - +2026-08-03 20:38:07,729 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /wp-config.php HTTP/1.1" 404 - +2026-08-03 20:38:07,737 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /backup.zip HTTP/1.1" 404 - +2026-08-03 20:38:07,757 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /actuator/heapdump HTTP/1.1" 404 - +2026-08-03 20:38:07,817 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /.svn/wc.db HTTP/1.1" 404 - +2026-08-03 20:38:07,875 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /backup.tar.gz HTTP/1.1" 404 - +2026-08-03 20:38:07,887 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /.ssh/id_ed25519 HTTP/1.1" 404 - +2026-08-03 20:38:07,921 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /.ssh/id_ecdsa HTTP/1.1" 404 - +2026-08-03 20:38:07,984 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:07] "GET /config/production.json HTTP/1.1" 404 - +2026-08-03 20:38:08,022 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /user_secrets.yml HTTP/1.1" 404 - +2026-08-03 20:38:08,035 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /_vti_pvt/service.pwd HTTP/1.1" 404 - +2026-08-03 20:38:08,074 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /wp-admin/setup-config.php HTTP/1.1" 404 - +2026-08-03 20:38:08,149 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /.env.production HTTP/1.1" 404 - +2026-08-03 20:38:08,179 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /.git/HEAD HTTP/1.1" 404 - +2026-08-03 20:38:08,188 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /etc/ssl/private/server.key HTTP/1.1" 404 - +2026-08-03 20:38:08,227 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /server.key HTTP/1.1" 404 - +2026-08-03 20:38:08,312 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /.env HTTP/1.1" 404 - +2026-08-03 20:38:08,326 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /api/.env HTTP/1.1" 404 - +2026-08-03 20:38:08,336 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /docker-compose.yml HTTP/1.1" 404 - +2026-08-03 20:38:08,379 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /phpinfo.php HTTP/1.1" 404 - +2026-08-03 20:38:08,474 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /.vscode/sftp.json HTTP/1.1" 404 - +2026-08-03 20:38:08,479 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /secrets.json HTTP/1.1" 404 - +2026-08-03 20:38:08,491 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /.npmrc HTTP/1.1" 404 - +2026-08-03 20:38:08,532 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:38:08] "GET /.bash_history HTTP/1.1" 404 - +2026-08-03 20:49:05,179 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:49:05] "GET / HTTP/1.1" 200 - +2026-08-03 20:49:05,512 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:49:05] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 20:49:06,051 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:49:06] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 20:49:06,252 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:49:06] "GET /template_image/SKU_1.jpg HTTP/1.1" 200 - +2026-08-03 20:49:06,422 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:49:06] "GET /template_image/SKU_2.jpg HTTP/1.1" 200 - +2026-08-03 20:49:06,769 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:49:06] "GET /template_image/SKU_3.jpg HTTP/1.1" 200 - +2026-08-03 20:49:06,791 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:49:06] "GET /template_image/SKU_5.jpg HTTP/1.1" 200 - +2026-08-03 20:49:06,793 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:49:06] "GET /template_image/SKU_4.jpg HTTP/1.1" 200 - +2026-08-03 20:49:06,834 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:49:06] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 20:50:46,008 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:50:46] "GET / HTTP/1.1" 200 - +2026-08-03 20:50:49,136 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:50:49] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 20:50:55,127 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 20:50:55] "GET / HTTP/1.1" 200 - +2026-08-03 21:02:58,177 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:58] "GET / HTTP/1.1" 200 - +2026-08-03 21:02:58,778 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:58] "GET /config.js HTTP/1.1" 404 - +2026-08-03 21:02:58,984 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:58] "GET /js/config.js HTTP/1.1" 404 - +2026-08-03 21:02:59,039 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:59] "GET /.env HTTP/1.1" 404 - +2026-08-03 21:02:59,193 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:59] "GET /.env.local HTTP/1.1" 404 - +2026-08-03 21:02:59,239 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:59] "GET /.env.production HTTP/1.1" 404 - +2026-08-03 21:02:59,268 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:59] "GET /.env.example HTTP/1.1" 404 - +2026-08-03 21:02:59,417 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:59] "GET /api/config HTTP/1.1" 404 - +2026-08-03 21:02:59,476 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:59] "GET /api/env HTTP/1.1" 404 - +2026-08-03 21:02:59,495 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:59] "GET /config.json HTTP/1.1" 404 - +2026-08-03 21:02:59,499 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:59] "GET /js/env.js HTTP/1.1" 404 - +2026-08-03 21:02:59,642 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:59] "GET /settings.js HTTP/1.1" 404 - +2026-08-03 21:02:59,715 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:02:59] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 21:10:48,508 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:10:48] "GET / HTTP/1.1" 200 - +2026-08-03 21:10:49,559 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:10:49] "GET / HTTP/1.1" 200 - +2026-08-03 21:10:49,745 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:10:49] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 21:10:49,751 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:10:49] "GET /template_image/SKU_1.jpg HTTP/1.1" 200 - +2026-08-03 21:10:49,999 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:10:49] "GET /template_image/SKU_2.jpg HTTP/1.1" 200 - +2026-08-03 21:10:50,082 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:10:50] "GET /template_image/SKU_3.jpg HTTP/1.1" 200 - +2026-08-03 21:10:50,259 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:10:50] "GET /template_image/SKU_4.jpg HTTP/1.1" 200 - +2026-08-03 21:10:50,412 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:10:50] "GET /template_image/SKU_5.jpg HTTP/1.1" 200 - +2026-08-03 21:10:50,421 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:10:50] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 21:10:50,885 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:10:50] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 21:10:51,310 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 21:10:51] "GET / HTTP/1.1" 200 - +2026-08-03 22:14:29,983 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 22:14:29] "GET / HTTP/1.1" 200 - +2026-08-03 22:14:30,316 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 22:14:30] "GET /template_image/SKU_1.jpg HTTP/1.1" 200 - +2026-08-03 22:14:30,317 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 22:14:30] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-03 22:14:30,838 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 22:14:30] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-03 22:14:30,841 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 22:14:30] "GET /template_image/SKU_2.jpg HTTP/1.1" 200 - +2026-08-03 22:14:30,843 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 22:14:30] "GET /template_image/SKU_4.jpg HTTP/1.1" 200 - +2026-08-03 22:14:30,844 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 22:14:30] "GET /template_image/SKU_3.jpg HTTP/1.1" 200 - +2026-08-03 22:14:30,847 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 22:14:30] "GET /template_image/SKU_5.jpg HTTP/1.1" 200 - +2026-08-03 22:14:30,877 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 22:14:30] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-03 22:14:32,539 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 22:14:32] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-03 22:14:38,389 INFO [werkzeug] 192.168.2.205 - - [03/Aug/2026 22:14:38] "GET / HTTP/1.1" 200 - +2026-08-04 00:22:53,125 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:22:53] "HEAD / HTTP/1.1" 200 - +2026-08-04 00:22:53,126 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:22:53] "HEAD / HTTP/1.1" 200 - +2026-08-04 00:22:53,629 INFO [werkzeug] 127.0.0.1 - - [04/Aug/2026 00:22:53] "HEAD / HTTP/1.1" 200 - +2026-08-04 00:28:05,875 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:28:05] "HEAD / HTTP/1.1" 200 - +2026-08-04 00:28:05,875 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:28:05] "HEAD / HTTP/1.1" 200 - +2026-08-04 00:28:06,361 INFO [werkzeug] 127.0.0.1 - - [04/Aug/2026 00:28:06] "HEAD / HTTP/1.1" 200 - +2026-08-04 00:50:16,005 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:16] "GET / HTTP/1.1" 200 - +2026-08-04 00:50:16,606 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:16] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-04 00:50:16,606 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:16] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-04 00:50:16,804 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:16] "GET /template_image/SKU_2.jpg HTTP/1.1" 200 - +2026-08-04 00:50:16,805 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:16] "GET /template_image/SKU_1.jpg HTTP/1.1" 200 - +2026-08-04 00:50:16,816 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:16] "GET /template_image/SKU_3.jpg HTTP/1.1" 200 - +2026-08-04 00:50:16,820 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:16] "GET /template_image/SKU_4.jpg HTTP/1.1" 200 - +2026-08-04 00:50:16,821 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:16] "GET /template_image/SKU_5.jpg HTTP/1.1" 200 - +2026-08-04 00:50:16,823 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:16] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-04 00:50:16,880 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:16] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-04 00:50:39,641 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:39] "GET / HTTP/1.1" 200 - +2026-08-04 00:50:50,033 INFO [pipeline.engine] [f8e8ac4d35d5] new upload: 'WhatsApp Image 2026-07-13 at 6.15.16 PM.jpeg' (186.7 KB) +2026-08-04 00:50:50,069 INFO [pipeline.engine] [f8e8ac4d35d5] background removal: 0.04s +2026-08-04 00:50:50,637 INFO [pipeline.engine] [f8e8ac4d35d5] SIFT: 0.55s +2026-08-04 00:50:51,027 INFO [pipeline.engine] [f8e8ac4d35d5] ORB: 0.39s +2026-08-04 00:50:51,039 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-04 00:50:51,095 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-04 00:50:52,100 INFO [pipeline.engine] [f8e8ac4d35d5] SuperGlue: 1.07s +2026-08-04 00:50:52,120 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-04 00:50:52,802 INFO [pipeline.engine] [f8e8ac4d35d5] LoFTR: 0.69s +2026-08-04 00:50:52,933 INFO [pipeline.engine] [f8e8ac4d35d5] color analysis: 0.05s +2026-08-04 00:50:52,937 INFO [pipeline.engine] [f8e8ac4d35d5] shape analysis: 0.00s +2026-08-04 00:50:53,174 INFO [pipeline.engine] [f8e8ac4d35d5] texture analysis: 0.24s +2026-08-04 00:50:53,405 INFO [pipeline.engine] [f8e8ac4d35d5] total: 3.37s, weighted best: SKU_2 +2026-08-04 00:50:53,496 INFO [pipeline.engine] [f8e8ac4d35d5] done, peak RSS so far: 8136 MB +2026-08-04 00:50:53,496 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "POST /api/match HTTP/1.1" 200 - +2026-08-04 00:50:53,528 INFO [__main__] [f8e8ac4d35d5] verifying against SKU_2 via external endpoint +2026-08-04 00:50:53,532 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/LoFTR_best.png HTTP/1.1" 200 - +2026-08-04 00:50:53,533 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/ORB_best.png HTTP/1.1" 200 - +2026-08-04 00:50:53,533 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/nobg.png HTTP/1.1" 200 - +2026-08-04 00:50:53,533 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/original.jpeg HTTP/1.1" 200 - +2026-08-04 00:50:53,537 WARNING [__main__] [f8e8ac4d35d5] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-04 00:50:53,538 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "POST /api/verify HTTP/1.1" 502 - +2026-08-04 00:50:53,545 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/SIFT_best.png HTTP/1.1" 200 - +2026-08-04 00:50:53,553 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-04 00:50:53,556 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/input_silhouette.png HTTP/1.1" 200 - +2026-08-04 00:50:53,558 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/shape_overlay.png HTTP/1.1" 200 - +2026-08-04 00:50:53,558 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/template_silhouette.png HTTP/1.1" 200 - +2026-08-04 00:50:53,562 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/input_lbp.png HTTP/1.1" 200 - +2026-08-04 00:50:53,563 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/template_lbp.png HTTP/1.1" 200 - +2026-08-04 00:50:53,564 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/input_family_grid.png HTTP/1.1" 200 - +2026-08-04 00:50:53,566 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:50:53] "GET /uploads/f8e8ac4d35d5/template_family_grid.png HTTP/1.1" 200 - +2026-08-04 00:50:53,680 INFO [pipeline.engine] [f8e8ac4d35d5] unloaded matching-pipeline models before flower summary +2026-08-04 00:51:09,057 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-04 00:51:12,040 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:12] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-04 00:51:51,641 INFO [pipeline.engine] [5743ebfb42eb] new upload: 'WhatsApp Image 2026-07-13 at 6.14.55 PM.jpeg' (180.8 KB) +2026-08-04 00:51:51,679 INFO [pipeline.engine] [5743ebfb42eb] background removal: 0.04s +2026-08-04 00:51:52,211 INFO [pipeline.engine] [5743ebfb42eb] SIFT: 0.51s +2026-08-04 00:51:52,601 INFO [pipeline.engine] [5743ebfb42eb] ORB: 0.39s +2026-08-04 00:51:52,611 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-04 00:51:52,665 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-04 00:51:53,602 INFO [pipeline.engine] [5743ebfb42eb] SuperGlue: 1.00s +2026-08-04 00:51:53,624 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-04 00:51:54,306 INFO [pipeline.engine] [5743ebfb42eb] LoFTR: 0.69s +2026-08-04 00:51:54,426 INFO [pipeline.engine] [5743ebfb42eb] color analysis: 0.05s +2026-08-04 00:51:54,431 INFO [pipeline.engine] [5743ebfb42eb] shape analysis: 0.00s +2026-08-04 00:51:54,668 INFO [pipeline.engine] [5743ebfb42eb] texture analysis: 0.24s +2026-08-04 00:51:54,897 INFO [pipeline.engine] [5743ebfb42eb] total: 3.26s, weighted best: SKU_5 +2026-08-04 00:51:54,990 INFO [pipeline.engine] [5743ebfb42eb] done, peak RSS so far: 8136 MB +2026-08-04 00:51:54,990 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:54] "POST /api/match HTTP/1.1" 200 - +2026-08-04 00:51:55,005 INFO [__main__] [5743ebfb42eb] verifying against SKU_5 via external endpoint +2026-08-04 00:51:55,008 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/nobg.png HTTP/1.1" 200 - +2026-08-04 00:51:55,008 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/original.jpeg HTTP/1.1" 200 - +2026-08-04 00:51:55,009 WARNING [__main__] [5743ebfb42eb] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-04 00:51:55,010 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/LoFTR_best.png HTTP/1.1" 200 - +2026-08-04 00:51:55,010 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "POST /api/verify HTTP/1.1" 502 - +2026-08-04 00:51:55,012 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/ORB_best.png HTTP/1.1" 200 - +2026-08-04 00:51:55,019 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/SIFT_best.png HTTP/1.1" 200 - +2026-08-04 00:51:55,030 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-04 00:51:55,031 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/template_silhouette.png HTTP/1.1" 200 - +2026-08-04 00:51:55,031 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/input_silhouette.png HTTP/1.1" 200 - +2026-08-04 00:51:55,033 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/shape_overlay.png HTTP/1.1" 200 - +2026-08-04 00:51:55,034 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/input_lbp.png HTTP/1.1" 200 - +2026-08-04 00:51:55,042 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/input_family_grid.png HTTP/1.1" 200 - +2026-08-04 00:51:55,042 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/template_lbp.png HTTP/1.1" 200 - +2026-08-04 00:51:55,043 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:51:55] "GET /uploads/5743ebfb42eb/template_family_grid.png HTTP/1.1" 200 - +2026-08-04 00:51:55,153 INFO [pipeline.engine] [5743ebfb42eb] unloaded matching-pipeline models before flower summary +2026-08-04 00:52:10,539 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-04 00:52:12,915 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:52:12] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-04 00:55:22,884 INFO [pipeline.engine] [8e63f43d6c63] new upload: 'WhatsApp Image 2026-07-13 at 3.32.48 PM.jpeg' (166.9 KB) +2026-08-04 00:55:25,246 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-08-04 00:55:25,246 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-08-04 00:55:36,098 INFO [pipeline.engine] [8e63f43d6c63] background removal: 13.21s +2026-08-04 00:55:36,919 INFO [pipeline.engine] [8e63f43d6c63] SIFT: 0.79s +2026-08-04 00:55:37,333 INFO [pipeline.engine] [8e63f43d6c63] ORB: 0.41s +2026-08-04 00:55:37,343 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-04 00:55:37,398 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-04 00:55:38,433 INFO [pipeline.engine] [8e63f43d6c63] SuperGlue: 1.10s +2026-08-04 00:55:38,455 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-04 00:55:39,149 INFO [pipeline.engine] [8e63f43d6c63] LoFTR: 0.71s +2026-08-04 00:55:39,327 INFO [pipeline.engine] [8e63f43d6c63] color analysis: 0.06s +2026-08-04 00:55:39,334 INFO [pipeline.engine] [8e63f43d6c63] shape analysis: 0.01s +2026-08-04 00:55:39,593 INFO [pipeline.engine] [8e63f43d6c63] texture analysis: 0.26s +2026-08-04 00:55:39,877 INFO [pipeline.engine] [8e63f43d6c63] total: 16.99s, weighted best: SKU_2 +2026-08-04 00:55:39,961 INFO [pipeline.engine] [8e63f43d6c63] done, peak RSS so far: 9683 MB +2026-08-04 00:55:39,961 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:39] "POST /api/match HTTP/1.1" 200 - +2026-08-04 00:55:39,977 INFO [__main__] [8e63f43d6c63] verifying against SKU_2 via external endpoint +2026-08-04 00:55:39,980 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:39] "GET /uploads/8e63f43d6c63/original.jpeg HTTP/1.1" 200 - +2026-08-04 00:55:39,980 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:39] "GET /uploads/8e63f43d6c63/nobg.png HTTP/1.1" 200 - +2026-08-04 00:55:39,981 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:39] "GET /uploads/8e63f43d6c63/LoFTR_best.png HTTP/1.1" 200 - +2026-08-04 00:55:39,982 WARNING [__main__] [8e63f43d6c63] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-04 00:55:39,983 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:39] "POST /api/verify HTTP/1.1" 502 - +2026-08-04 00:55:39,995 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:39] "GET /uploads/8e63f43d6c63/ORB_best.png HTTP/1.1" 200 - +2026-08-04 00:55:39,997 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:39] "GET /uploads/8e63f43d6c63/SIFT_best.png HTTP/1.1" 200 - +2026-08-04 00:55:40,008 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:40] "GET /uploads/8e63f43d6c63/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-04 00:55:40,009 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:40] "GET /uploads/8e63f43d6c63/input_silhouette.png HTTP/1.1" 200 - +2026-08-04 00:55:40,015 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:40] "GET /uploads/8e63f43d6c63/template_silhouette.png HTTP/1.1" 200 - +2026-08-04 00:55:40,018 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:40] "GET /uploads/8e63f43d6c63/shape_overlay.png HTTP/1.1" 200 - +2026-08-04 00:55:40,020 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:40] "GET /uploads/8e63f43d6c63/input_lbp.png HTTP/1.1" 200 - +2026-08-04 00:55:40,021 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:40] "GET /uploads/8e63f43d6c63/template_lbp.png HTTP/1.1" 200 - +2026-08-04 00:55:40,022 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:40] "GET /uploads/8e63f43d6c63/input_family_grid.png HTTP/1.1" 200 - +2026-08-04 00:55:40,478 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:40] "GET /uploads/8e63f43d6c63/template_family_grid.png HTTP/1.1" 200 - +2026-08-04 00:55:40,478 INFO [pipeline.engine] [8e63f43d6c63] unloaded matching-pipeline models before flower summary +2026-08-04 00:55:55,817 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-04 00:55:58,271 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:55:58] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-04 00:56:39,517 INFO [pipeline.engine] [04e3459932c4] new upload: 'thumb-IMG_3152.jpeg' (24.5 KB) +2026-08-04 00:56:39,539 INFO [pipeline.engine] [04e3459932c4] background removal: 0.02s +2026-08-04 00:56:39,635 INFO [pipeline.engine] [04e3459932c4] SIFT: 0.09s +2026-08-04 00:56:39,827 INFO [pipeline.engine] [04e3459932c4] ORB: 0.19s +2026-08-04 00:56:39,828 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-04 00:56:39,877 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-04 00:56:40,742 INFO [pipeline.engine] [04e3459932c4] SuperGlue: 0.91s +2026-08-04 00:56:40,754 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-04 00:56:41,318 INFO [pipeline.engine] [04e3459932c4] LoFTR: 0.57s +2026-08-04 00:56:41,425 INFO [pipeline.engine] [04e3459932c4] color analysis: 0.04s +2026-08-04 00:56:41,426 INFO [pipeline.engine] [04e3459932c4] shape analysis: 0.00s +2026-08-04 00:56:41,447 INFO [pipeline.engine] [04e3459932c4] texture analysis: 0.02s +2026-08-04 00:56:41,605 INFO [pipeline.engine] [04e3459932c4] total: 2.09s, weighted best: SKU_5 +2026-08-04 00:56:41,695 INFO [pipeline.engine] [04e3459932c4] done, peak RSS so far: 9683 MB +2026-08-04 00:56:41,696 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "POST /api/match HTTP/1.1" 200 - +2026-08-04 00:56:41,709 INFO [__main__] [04e3459932c4] verifying against SKU_5 via external endpoint +2026-08-04 00:56:41,712 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/nobg.png HTTP/1.1" 200 - +2026-08-04 00:56:41,714 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/original.jpeg HTTP/1.1" 200 - +2026-08-04 00:56:41,715 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/ORB_best.png HTTP/1.1" 200 - +2026-08-04 00:56:41,717 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/LoFTR_best.png HTTP/1.1" 200 - +2026-08-04 00:56:41,720 WARNING [__main__] [04e3459932c4] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-04 00:56:41,720 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "POST /api/verify HTTP/1.1" 502 - +2026-08-04 00:56:41,730 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/SIFT_best.png HTTP/1.1" 200 - +2026-08-04 00:56:41,731 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-04 00:56:41,733 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/input_silhouette.png HTTP/1.1" 200 - +2026-08-04 00:56:41,734 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/template_silhouette.png HTTP/1.1" 200 - +2026-08-04 00:56:41,737 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/shape_overlay.png HTTP/1.1" 200 - +2026-08-04 00:56:41,838 INFO [pipeline.engine] [04e3459932c4] unloaded matching-pipeline models before flower summary +2026-08-04 00:56:41,839 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/input_lbp.png HTTP/1.1" 200 - +2026-08-04 00:56:41,840 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/template_lbp.png HTTP/1.1" 200 - +2026-08-04 00:56:41,841 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/input_family_grid.png HTTP/1.1" 200 - +2026-08-04 00:56:41,842 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:41] "GET /uploads/04e3459932c4/template_family_grid.png HTTP/1.1" 200 - +2026-08-04 00:56:57,039 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-04 00:56:59,381 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:56:59] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-04 00:57:08,081 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-04 00:57:29,962 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-04 00:57:30,617 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-04 00:57:33,080 INFO [pipeline.engine] [04e3459932c4] flower count: 25.00s, SAM3 total=5, YOLO flower/vase/ribbon=2/1/0, vase comparison=different +2026-08-04 00:57:33,081 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:57:33] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-04 00:57:33,087 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:57:33] "GET /uploads/04e3459932c4/flower_count_yolo.png?t=1785785253084 HTTP/1.1" 200 - +2026-08-04 00:57:33,087 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:57:33] "GET /uploads/04e3459932c4/flower_count_sam.png?t=1785785253083 HTTP/1.1" 200 - +2026-08-04 00:57:33,089 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:57:33] "GET /uploads/04e3459932c4/vase_crop_template.png?t=1785785253084 HTTP/1.1" 200 - +2026-08-04 00:57:33,089 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 00:57:33] "GET /uploads/04e3459932c4/vase_crop_input.png?t=1785785253084 HTTP/1.1" 200 - +2026-08-04 01:45:50,715 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:50] "GET / HTTP/1.1" 200 - +2026-08-04 01:45:51,007 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:51] "GET / HTTP/1.1" 200 - +2026-08-04 01:45:51,299 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:51] "GET /wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:51,447 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:51] "GET /xmlrpc.php?rsd HTTP/1.1" 404 - +2026-08-04 01:45:51,594 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:51] "GET / HTTP/1.1" 200 - +2026-08-04 01:45:51,886 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:51] "GET /blog/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:52,033 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:52] "GET /web/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:52,180 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:52] "GET /wordpress/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:52,326 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:52] "GET /website/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:52,473 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:52] "GET /wp/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:52,620 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:52] "GET /news/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:52,767 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:52] "GET /2018/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:52,914 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:52] "GET /2019/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:53,063 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:53] "GET /shop/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:53,210 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:53] "GET /wp1/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:53,358 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:53] "GET /test/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:53,505 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:53] "GET /media/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:53,651 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:53] "GET /wp2/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:53,798 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:53] "GET /site/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:53,945 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:53] "GET /cms/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 01:45:54,092 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 01:45:54] "GET /sito/wp-includes/wlwmanifest.xml HTTP/1.1" 404 - +2026-08-04 03:16:19,879 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 03:16:19] "GET /wp-json/gravitysmtp/v1/tests/mock-data?page=gravitysmtp-settings HTTP/1.1" 404 - +2026-08-04 04:49:21,025 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:21] "GET / HTTP/1.1" 200 - +2026-08-04 04:49:21,186 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:21] "GET /robots.txt HTTP/1.1" 404 - +2026-08-04 04:49:21,350 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:21] "GET /js/lkk_ch.js HTTP/1.1" 404 - +2026-08-04 04:49:21,506 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:21] "GET /assets/js/qr_modal.js HTTP/1.1" 404 - +2026-08-04 04:49:21,661 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:21] "GET /assets/js/auth.js HTTP/1.1" 404 - +2026-08-04 04:49:21,820 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:21] "GET /bot-connect.js HTTP/1.1" 404 - +2026-08-04 04:49:21,976 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:21] "GET /css/support_parent.css HTTP/1.1" 404 - +2026-08-04 04:49:22,134 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:22] "GET /licensor.js HTTP/1.1" 404 - +2026-08-04 04:49:22,295 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:22] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-04 04:49:23,422 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:23] "GET /template_image/SKU_2.jpg HTTP/1.1" 200 - +2026-08-04 04:49:23,581 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:23] "GET /template_image/SKU_4.jpg HTTP/1.1" 200 - +2026-08-04 04:49:23,768 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:23] "GET /js/antibot-client.js HTTP/1.1" 404 - +2026-08-04 04:49:23,945 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:23] "GET /template_image/SKU_1.jpg HTTP/1.1" 200 - +2026-08-04 04:49:24,305 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:24] "GET /template_image/SKU_3.jpg HTTP/1.1" 200 - +2026-08-04 04:49:24,484 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:24] "GET /js/twint_ch.js HTTP/1.1" 404 - +2026-08-04 04:49:24,665 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:24] "GET /static/style/protect/index.js HTTP/1.1" 404 - +2026-08-04 04:49:24,841 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:24] "GET /static/style/sys_files/index.js HTTP/1.1" 404 - +2026-08-04 04:49:25,017 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:25] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-04 04:49:25,195 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:25] "GET /template_image/SKU_5.jpg HTTP/1.1" 200 - +2026-08-04 04:49:25,550 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:25] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-04 04:49:25,729 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 04:49:25] "GET /assets/js/message.js HTTP/1.1" 404 - +2026-08-04 05:26:26,896 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 05:26:26] "GET / HTTP/1.1" 200 - +2026-08-04 10:09:32,432 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:09:32] "GET / HTTP/1.1" 200 - +2026-08-04 10:14:37,852 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:14:37] "GET / HTTP/1.1" 200 - +2026-08-04 10:31:13,470 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:31:13] "GET / HTTP/1.1" 200 - +2026-08-04 10:31:13,608 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:31:13] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-04 10:37:41,057 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:37:41] "GET / HTTP/1.1" 200 - +2026-08-04 10:37:41,144 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:37:41] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-04 10:37:41,270 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:37:41] "GET /template_image/SKU_1.jpg HTTP/1.1" 200 - +2026-08-04 10:37:41,287 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:37:41] "GET /template_image/SKU_2.jpg HTTP/1.1" 200 - +2026-08-04 10:37:41,289 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:37:41] "GET /template_image/SKU_3.jpg HTTP/1.1" 200 - +2026-08-04 10:37:41,305 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:37:41] "GET /template_image/SKU_4.jpg HTTP/1.1" 200 - +2026-08-04 10:37:41,307 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:37:41] "GET /template_image/SKU_5.jpg HTTP/1.1" 200 - +2026-08-04 10:37:41,314 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:37:41] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-04 10:37:41,341 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:37:41] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-04 10:38:06,163 INFO [pipeline.engine] [2cf537d4aaa4] new upload: '54723.jpg' (1865.6 KB) +2026-08-04 10:38:06,300 INFO [pipeline.bg_removal] Resized upload (2160, 3840) -> (900, 1600) before processing +2026-08-04 10:38:08,613 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-08-04 10:38:08,613 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-08-04 10:38:19,204 INFO [pipeline.engine] [2cf537d4aaa4] background removal: 13.04s +2026-08-04 10:38:19,808 INFO [pipeline.engine] [2cf537d4aaa4] SIFT: 0.58s +2026-08-04 10:38:20,193 INFO [pipeline.engine] [2cf537d4aaa4] ORB: 0.39s +2026-08-04 10:38:20,205 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-04 10:38:20,250 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-04 10:38:21,298 INFO [pipeline.engine] [2cf537d4aaa4] SuperGlue: 1.10s +2026-08-04 10:38:21,323 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-04 10:38:21,972 INFO [pipeline.engine] [2cf537d4aaa4] LoFTR: 0.67s +2026-08-04 10:38:22,110 INFO [pipeline.engine] [2cf537d4aaa4] color analysis: 0.06s +2026-08-04 10:38:22,115 INFO [pipeline.engine] [2cf537d4aaa4] shape analysis: 0.01s +2026-08-04 10:38:22,406 INFO [pipeline.engine] [2cf537d4aaa4] texture analysis: 0.29s +2026-08-04 10:38:22,662 INFO [pipeline.engine] [2cf537d4aaa4] total: 16.50s, weighted best: SKU_5 +2026-08-04 10:38:22,750 INFO [pipeline.engine] [2cf537d4aaa4] done, peak RSS so far: 10300 MB +2026-08-04 10:38:22,751 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:22] "POST /api/match HTTP/1.1" 200 - +2026-08-04 10:38:22,947 INFO [__main__] [2cf537d4aaa4] verifying against SKU_5 via external endpoint +2026-08-04 10:38:22,949 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:22] "GET /uploads/2cf537d4aaa4/nobg.png HTTP/1.1" 200 - +2026-08-04 10:38:22,969 WARNING [__main__] [2cf537d4aaa4] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-04 10:38:22,969 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:22] "POST /api/verify HTTP/1.1" 502 - +2026-08-04 10:38:22,983 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:22] "GET /uploads/2cf537d4aaa4/original.jpg HTTP/1.1" 200 - +2026-08-04 10:38:22,985 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:22] "GET /uploads/2cf537d4aaa4/ORB_best.png HTTP/1.1" 200 - +2026-08-04 10:38:22,987 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:22] "GET /uploads/2cf537d4aaa4/SIFT_best.png HTTP/1.1" 200 - +2026-08-04 10:38:22,987 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:22] "GET /uploads/2cf537d4aaa4/LoFTR_best.png HTTP/1.1" 200 - +2026-08-04 10:38:23,002 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:23] "GET /uploads/2cf537d4aaa4/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-04 10:38:23,444 INFO [pipeline.engine] [2cf537d4aaa4] unloaded matching-pipeline models before flower summary +2026-08-04 10:38:23,445 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:23] "GET /uploads/2cf537d4aaa4/template_silhouette.png HTTP/1.1" 200 - +2026-08-04 10:38:23,446 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:23] "GET /uploads/2cf537d4aaa4/input_silhouette.png HTTP/1.1" 200 - +2026-08-04 10:38:23,447 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:23] "GET /uploads/2cf537d4aaa4/shape_overlay.png HTTP/1.1" 200 - +2026-08-04 10:38:23,449 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:23] "GET /uploads/2cf537d4aaa4/template_lbp.png HTTP/1.1" 200 - +2026-08-04 10:38:23,450 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:23] "GET /uploads/2cf537d4aaa4/input_lbp.png HTTP/1.1" 200 - +2026-08-04 10:38:23,468 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:23] "GET /uploads/2cf537d4aaa4/input_family_grid.png HTTP/1.1" 200 - +2026-08-04 10:38:23,469 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:23] "GET /uploads/2cf537d4aaa4/template_family_grid.png HTTP/1.1" 200 - +2026-08-04 10:38:38,931 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-04 10:38:41,285 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:38:41] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-04 10:40:50,650 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:40:50] "HEAD / HTTP/1.1" 200 - +2026-08-04 10:41:02,672 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:02] "GET / HTTP/1.1" 200 - +2026-08-04 10:41:11,226 INFO [pipeline.engine] [328a5fd253cf] new upload: '54723.jpg' (1865.6 KB) +2026-08-04 10:41:11,250 INFO [pipeline.engine] [328a5fd253cf] background removal: 0.02s +2026-08-04 10:41:11,836 INFO [pipeline.engine] [328a5fd253cf] SIFT: 0.56s +2026-08-04 10:41:12,200 INFO [pipeline.engine] [328a5fd253cf] ORB: 0.36s +2026-08-04 10:41:12,220 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-04 10:41:12,264 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-04 10:41:13,265 INFO [pipeline.engine] [328a5fd253cf] SuperGlue: 1.06s +2026-08-04 10:41:13,284 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-04 10:41:13,868 INFO [pipeline.engine] [328a5fd253cf] LoFTR: 0.60s +2026-08-04 10:41:13,994 INFO [pipeline.engine] [328a5fd253cf] color analysis: 0.05s +2026-08-04 10:41:13,998 INFO [pipeline.engine] [328a5fd253cf] shape analysis: 0.00s +2026-08-04 10:41:14,260 INFO [pipeline.engine] [328a5fd253cf] texture analysis: 0.26s +2026-08-04 10:41:14,478 INFO [pipeline.engine] [328a5fd253cf] total: 3.25s, weighted best: SKU_5 +2026-08-04 10:41:14,563 INFO [pipeline.engine] [328a5fd253cf] done, peak RSS so far: 10300 MB +2026-08-04 10:41:14,564 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "POST /api/match HTTP/1.1" 200 - +2026-08-04 10:41:14,637 INFO [__main__] [328a5fd253cf] verifying against SKU_5 via external endpoint +2026-08-04 10:41:14,638 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/nobg.png HTTP/1.1" 200 - +2026-08-04 10:41:14,645 WARNING [__main__] [328a5fd253cf] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-04 10:41:14,645 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "POST /api/verify HTTP/1.1" 502 - +2026-08-04 10:41:14,662 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/original.jpg HTTP/1.1" 200 - +2026-08-04 10:41:14,663 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/LoFTR_best.png HTTP/1.1" 200 - +2026-08-04 10:41:14,665 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/ORB_best.png HTTP/1.1" 200 - +2026-08-04 10:41:14,666 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/SIFT_best.png HTTP/1.1" 200 - +2026-08-04 10:41:14,673 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-04 10:41:14,688 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/input_silhouette.png HTTP/1.1" 200 - +2026-08-04 10:41:14,784 INFO [pipeline.engine] [328a5fd253cf] unloaded matching-pipeline models before flower summary +2026-08-04 10:41:14,785 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/template_silhouette.png HTTP/1.1" 200 - +2026-08-04 10:41:14,786 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/shape_overlay.png HTTP/1.1" 200 - +2026-08-04 10:41:14,787 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/input_lbp.png HTTP/1.1" 200 - +2026-08-04 10:41:14,788 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/template_lbp.png HTTP/1.1" 200 - +2026-08-04 10:41:14,789 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/input_family_grid.png HTTP/1.1" 200 - +2026-08-04 10:41:14,807 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:14] "GET /uploads/328a5fd253cf/template_family_grid.png HTTP/1.1" 200 - +2026-08-04 10:41:29,385 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-04 10:41:31,687 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:41:31] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-04 10:43:41,253 INFO [__main__] Starting Vase Matcher on 0.0.0.0:5053 (logs: /media/suman/Backup_of_extra_/Sasi/featureTransform/logs/app.log) +2026-08-04 10:43:41,254 INFO [pipeline.engine] Preparing templates (bg removal + feature precompute for SIFT / ORB / SuperGlue / LoFTR)... +2026-08-04 10:43:43,476 INFO [pipeline.bg_removal] rembg session ready, using providers: ['CPUExecutionProvider'] +2026-08-04 10:43:43,476 WARNING [pipeline.bg_removal] rembg is running on CPU (no CUDAExecutionProvider) -- background removal will be much slower. Check that onnxruntime-gpu is installed and the CUDA driver is visible. +2026-08-04 10:43:53,346 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-04 10:43:54,423 INFO [pipeline.engine] template ready: SKU_1 +2026-08-04 10:44:04,343 INFO [pipeline.engine] template ready: SKU_1_COLORED +2026-08-04 10:44:14,390 INFO [pipeline.engine] template ready: SKU_2 +2026-08-04 10:44:24,123 INFO [pipeline.engine] template ready: SKU_3 +2026-08-04 10:44:33,795 INFO [pipeline.engine] template ready: SKU_4 +2026-08-04 10:44:43,694 INFO [pipeline.engine] template ready: SKU_5 +2026-08-04 10:44:53,396 INFO [pipeline.engine] template ready: SKU_ULTRA_6 +2026-08-04 10:44:53,396 INFO [pipeline.engine] 7 templates ready (device: cuda). +2026-08-04 10:44:53,397 INFO [werkzeug] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://192.168.2.109:5053 +2026-08-04 10:44:53,397 INFO [werkzeug] Press CTRL+C to quit +2026-08-04 10:45:08,091 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:08] "GET / HTTP/1.1" 200 - +2026-08-04 10:45:08,144 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:08] "GET /template_image/SKU_1_COLORED.png HTTP/1.1" 200 - +2026-08-04 10:45:17,133 INFO [pipeline.engine] [a12c1ff544a1] new upload: 'WhatsApp Image 2026-07-13 at 5.44.09 PM.jpeg' (169.3 KB) +2026-08-04 10:45:17,275 INFO [pipeline.engine] [a12c1ff544a1] background removal: 0.14s +2026-08-04 10:45:17,737 INFO [pipeline.engine] [a12c1ff544a1] SIFT: 0.44s +2026-08-04 10:45:18,170 INFO [pipeline.engine] [a12c1ff544a1] ORB: 0.41s +2026-08-04 10:45:18,449 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-04 10:45:20,504 INFO [pipeline.engine] [a12c1ff544a1] SuperGlue: 2.33s +2026-08-04 10:45:20,518 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-04 10:45:21,835 INFO [pipeline.engine] [a12c1ff544a1] LoFTR: 1.32s +2026-08-04 10:45:22,122 INFO [pipeline.engine] [a12c1ff544a1] color analysis: 0.14s +2026-08-04 10:45:22,127 INFO [pipeline.engine] [a12c1ff544a1] shape analysis: 0.00s +2026-08-04 10:45:22,305 INFO [pipeline.engine] [a12c1ff544a1] texture analysis: 0.18s +2026-08-04 10:45:22,557 INFO [pipeline.engine] [a12c1ff544a1] total: 5.42s, weighted best: SKU_2 +2026-08-04 10:45:22,643 INFO [pipeline.engine] [a12c1ff544a1] done, peak RSS so far: 12920 MB +2026-08-04 10:45:22,643 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "POST /api/match HTTP/1.1" 200 - +2026-08-04 10:45:22,671 INFO [__main__] [a12c1ff544a1] verifying against SKU_2 via external endpoint +2026-08-04 10:45:22,672 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/nobg.png HTTP/1.1" 200 - +2026-08-04 10:45:22,674 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/original.jpeg HTTP/1.1" 200 - +2026-08-04 10:45:22,676 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/LoFTR_best.png HTTP/1.1" 200 - +2026-08-04 10:45:22,676 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/ORB_best.png HTTP/1.1" 200 - +2026-08-04 10:45:22,690 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/SIFT_best.png HTTP/1.1" 200 - +2026-08-04 10:45:22,692 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-04 10:45:22,692 WARNING [__main__] [a12c1ff544a1] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-04 10:45:22,692 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "POST /api/verify HTTP/1.1" 502 - +2026-08-04 10:45:22,698 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/input_silhouette.png HTTP/1.1" 200 - +2026-08-04 10:45:22,700 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/template_silhouette.png HTTP/1.1" 200 - +2026-08-04 10:45:22,701 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/shape_overlay.png HTTP/1.1" 200 - +2026-08-04 10:45:22,706 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/input_lbp.png HTTP/1.1" 200 - +2026-08-04 10:45:22,707 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/input_family_grid.png HTTP/1.1" 200 - +2026-08-04 10:45:22,707 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/template_lbp.png HTTP/1.1" 200 - +2026-08-04 10:45:22,708 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:22] "GET /uploads/a12c1ff544a1/template_family_grid.png HTTP/1.1" 200 - +2026-08-04 10:45:23,353 INFO [pipeline.engine] [a12c1ff544a1] unloaded matching-pipeline models before flower summary +2026-08-04 10:45:40,389 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-04 10:45:44,536 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:45:44] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-04 10:46:16,295 INFO [pipeline.yolo_world] Loading YOLO-World (/media/suman/Backup_of_extra_/Sasi/SAM/yolov8s-worldv2.pt) on cuda... +2026-08-04 10:46:39,598 INFO [pipeline.vase_compare] Loading DINOv2 (facebook/dinov2-base) on cuda... +2026-08-04 10:46:41,070 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-04 10:46:43,553 INFO [pipeline.engine] [a12c1ff544a1] flower count: 27.27s, SAM3 total=32, YOLO flower/vase/ribbon=1/1/0, vase comparison=uncertain +2026-08-04 10:46:43,554 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:46:43] "POST /api/count_flowers HTTP/1.1" 200 - +2026-08-04 10:46:43,560 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:46:43] "GET /uploads/a12c1ff544a1/flower_count_yolo.png?t=1785820603556 HTTP/1.1" 200 - +2026-08-04 10:46:43,561 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:46:43] "GET /uploads/a12c1ff544a1/vase_crop_input.png?t=1785820603556 HTTP/1.1" 200 - +2026-08-04 10:46:43,562 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:46:43] "GET /uploads/a12c1ff544a1/flower_count_sam.png?t=1785820603556 HTTP/1.1" 200 - +2026-08-04 10:46:43,562 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:46:43] "GET /uploads/a12c1ff544a1/vase_crop_template.png?t=1785820603556 HTTP/1.1" 200 - +2026-08-04 10:59:26,047 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:59:26] "GET /template_image/SKU_1.png HTTP/1.1" 404 - +2026-08-04 10:59:26,076 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:59:26] "GET /template_image/SKU_5.png HTTP/1.1" 404 - +2026-08-04 10:59:26,079 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:59:26] "GET /template_image/SKU_2.png HTTP/1.1" 404 - +2026-08-04 10:59:26,092 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:59:26] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-04 10:59:26,098 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:59:26] "GET /template_image/SKU_3.png HTTP/1.1" 404 - +2026-08-04 10:59:26,107 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 10:59:26] "GET /template_image/SKU_4.png HTTP/1.1" 404 - +2026-08-04 11:13:52,987 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 11:13:52] "HEAD / HTTP/1.1" 200 - +2026-08-04 12:35:13,567 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 12:35:13] "GET /.git/config HTTP/1.1" 404 - +2026-08-04 12:39:16,352 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 12:39:16] "GET / HTTP/1.1" 200 - +2026-08-04 12:39:23,023 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 12:39:23] "GET / HTTP/1.1" 200 - +2026-08-04 12:39:23,697 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 12:39:23] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-04 13:31:49,659 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 13:31:49] "GET / HTTP/1.1" 200 - +2026-08-04 13:31:49,772 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 13:31:49] "GET /template_image/SKU_1_COLORED.png HTTP/1.1" 200 - +2026-08-04 13:31:49,792 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 13:31:49] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-04 14:04:42,435 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:42] "GET / HTTP/1.1" 200 - +2026-08-04 14:04:42,598 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:42] "GET /.env HTTP/1.1" 404 - +2026-08-04 14:04:42,754 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:42] "GET /"/static/js/main.js" HTTP/1.1" 404 - +2026-08-04 14:04:42,911 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:42] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-04 14:04:43,177 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:43] "GET /.env HTTP/1.1" 404 - +2026-08-04 14:04:43,306 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:43] "GET /%2f.env HTTP/1.1" 404 - +2026-08-04 14:04:43,440 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:43] "GET /?phpinfo=1 HTTP/1.1" 200 - +2026-08-04 14:04:43,616 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:43] "GET /.aws/credentials HTTP/1.1" 404 - +2026-08-04 14:04:43,759 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:43] "GET /api/.env HTTP/1.1" 404 - +2026-08-04 14:04:43,897 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:43] "GET /.env.bak HTTP/1.1" 404 - +2026-08-04 14:04:44,028 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:44] "GET /aws-ses.json HTTP/1.1" 404 - +2026-08-04 14:04:44,158 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:44] "GET /.stripe/ HTTP/1.1" 404 - +2026-08-04 14:04:44,297 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:44] "GET /stripe/.env HTTP/1.1" 404 - +2026-08-04 14:04:44,427 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:44] "GET /.env.aws HTTP/1.1" 404 - +2026-08-04 14:04:44,576 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:44] "GET /.env.save HTTP/1.1" 404 - +2026-08-04 14:04:44,716 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:44] "GET /.env.local HTTP/1.1" 404 - +2026-08-04 14:04:44,846 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:44] "GET /backend/.env HTTP/1.1" 404 - +2026-08-04 14:04:45,165 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:45] "GET /test.php HTTP/1.1" 404 - +2026-08-04 14:04:45,312 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:45] "GET /.env.backup HTTP/1.1" 404 - +2026-08-04 14:04:45,456 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:45] "GET /.env.old HTTP/1.1" 404 - +2026-08-04 14:04:45,633 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:45] "GET /.env.tmp HTTP/1.1" 404 - +2026-08-04 14:04:45,792 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:45] "GET /.env.php.bak HTTP/1.1" 404 - +2026-08-04 14:04:45,932 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:45] "GET /.env.php HTTP/1.1" 404 - +2026-08-04 14:04:46,116 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:46] "GET /.env.txt HTTP/1.1" 404 - +2026-08-04 14:04:46,278 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:46] "GET /.env.prod HTTP/1.1" 404 - +2026-08-04 14:04:46,548 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:46] "GET /.env.dev HTTP/1.1" 404 - +2026-08-04 14:04:46,687 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:46] "GET /config.json.save HTTP/1.1" 404 - +2026-08-04 14:04:46,817 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:46] "GET /.git/config HTTP/1.1" 404 - +2026-08-04 14:04:46,946 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:46] "GET /wp-config.php HTTP/1.1" 404 - +2026-08-04 14:04:47,077 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:47] "GET /wp-config.php.old HTTP/1.1" 404 - +2026-08-04 14:04:47,209 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:47] "GET /config.php HTTP/1.1" 404 - +2026-08-04 14:04:47,390 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:47] "GET /config.php.bak HTTP/1.1" 404 - +2026-08-04 14:04:47,540 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:47] "GET /config.js HTTP/1.1" 404 - +2026-08-04 14:04:47,682 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:47] "GET /aws-config.js HTTP/1.1" 404 - +2026-08-04 14:04:47,812 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:47] "GET /aws.config.js HTTP/1.1" 404 - +2026-08-04 14:04:47,951 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:04:47] "GET /phpinfo.php HTTP/1.1" 404 - +2026-08-04 14:44:47,620 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:44:47] "GET / HTTP/1.1" 200 - +2026-08-04 14:44:47,871 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:44:47] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-04 14:44:48,085 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:44:48] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-04 14:44:48,290 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:44:48] "GET /template_image/SKU_1_COLORED.png HTTP/1.1" 200 - +2026-08-04 14:44:48,314 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:44:48] "GET /template_image/SKU_1.jpg HTTP/1.1" 200 - +2026-08-04 14:44:48,624 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:44:48] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-04 14:44:48,625 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:44:48] "GET /template_image/SKU_3.jpg HTTP/1.1" 200 - +2026-08-04 14:44:48,626 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:44:48] "GET /template_image/SKU_2.jpg HTTP/1.1" 200 - +2026-08-04 14:44:48,627 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:44:48] "GET /template_image/SKU_4.jpg HTTP/1.1" 200 - +2026-08-04 14:44:48,732 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:44:48] "GET /template_image/SKU_5.jpg HTTP/1.1" 200 - +2026-08-04 14:44:48,839 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 14:44:48] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-04 16:12:22,900 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:22] "GET / HTTP/1.1" 200 - +2026-08-04 16:12:23,043 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:23] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-04 16:12:46,090 INFO [pipeline.engine] [ccacbc49c4c2] new upload: '54723.jpg' (1865.6 KB) +2026-08-04 16:12:46,112 INFO [pipeline.engine] [ccacbc49c4c2] background removal: 0.02s +2026-08-04 16:12:46,726 INFO [pipeline.engine] [ccacbc49c4c2] SIFT: 0.59s +2026-08-04 16:12:47,146 INFO [pipeline.engine] [ccacbc49c4c2] ORB: 0.42s +2026-08-04 16:12:47,159 INFO [pipeline.deep] Loading SuperPoint on cuda... +2026-08-04 16:12:47,203 INFO [pipeline.deep] Loading LightGlue on cuda... +2026-08-04 16:12:48,410 INFO [pipeline.engine] [ccacbc49c4c2] SuperGlue: 1.26s +2026-08-04 16:12:48,429 INFO [pipeline.deep] Loading LoFTR on cuda... +2026-08-04 16:12:49,104 INFO [pipeline.engine] [ccacbc49c4c2] LoFTR: 0.69s +2026-08-04 16:12:49,208 INFO [pipeline.engine] [ccacbc49c4c2] color analysis: 0.07s +2026-08-04 16:12:49,214 INFO [pipeline.engine] [ccacbc49c4c2] shape analysis: 0.01s +2026-08-04 16:12:49,493 INFO [pipeline.engine] [ccacbc49c4c2] texture analysis: 0.28s +2026-08-04 16:12:49,650 INFO [pipeline.engine] [ccacbc49c4c2] total: 3.56s, weighted best: SKU_1_COLORED +2026-08-04 16:12:49,744 INFO [pipeline.engine] [ccacbc49c4c2] done, peak RSS so far: 12920 MB +2026-08-04 16:12:49,745 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:49] "POST /api/match HTTP/1.1" 200 - +2026-08-04 16:12:49,900 INFO [__main__] [ccacbc49c4c2] verifying against SKU_1_COLORED via external endpoint +2026-08-04 16:12:49,902 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:49] "GET /uploads/ccacbc49c4c2/nobg.png HTTP/1.1" 200 - +2026-08-04 16:12:49,909 WARNING [__main__] [ccacbc49c4c2] verification endpoint unreachable: HTTPSConnectionPool(host='marshall-toys-ridge-showing.trycloudflare.com', port=443): Max retries exceeded with url: /verify (Caused by NameResolutionError(": Failed to resolve 'marshall-toys-ridge-showing.trycloudflare.com' ([Errno -2] Name or service not known)")) +2026-08-04 16:12:49,910 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:49] "POST /api/verify HTTP/1.1" 502 - +2026-08-04 16:12:49,921 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:49] "GET /uploads/ccacbc49c4c2/original.jpg HTTP/1.1" 200 - +2026-08-04 16:12:50,040 INFO [pipeline.engine] [ccacbc49c4c2] unloaded matching-pipeline models before flower summary +2026-08-04 16:12:50,041 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:50] "GET /uploads/ccacbc49c4c2/ORB_best.png HTTP/1.1" 200 - +2026-08-04 16:12:50,042 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:50] "GET /uploads/ccacbc49c4c2/LoFTR_best.png HTTP/1.1" 200 - +2026-08-04 16:12:50,043 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:50] "GET /uploads/ccacbc49c4c2/SIFT_best.png HTTP/1.1" 200 - +2026-08-04 16:12:50,116 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:50] "GET /uploads/ccacbc49c4c2/input_silhouette.png HTTP/1.1" 200 - +2026-08-04 16:12:50,117 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:50] "GET /uploads/ccacbc49c4c2/SuperGlue_best.png HTTP/1.1" 200 - +2026-08-04 16:12:50,166 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:50] "GET /uploads/ccacbc49c4c2/shape_overlay.png HTTP/1.1" 200 - +2026-08-04 16:12:50,167 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:50] "GET /uploads/ccacbc49c4c2/template_silhouette.png HTTP/1.1" 200 - +2026-08-04 16:12:50,201 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:50] "GET /uploads/ccacbc49c4c2/input_lbp.png HTTP/1.1" 200 - +2026-08-04 16:12:50,203 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:50] "GET /uploads/ccacbc49c4c2/template_lbp.png HTTP/1.1" 200 - +2026-08-04 16:12:50,203 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:50] "GET /uploads/ccacbc49c4c2/input_family_grid.png HTTP/1.1" 200 - +2026-08-04 16:12:50,255 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:12:50] "GET /uploads/ccacbc49c4c2/template_family_grid.png HTTP/1.1" 200 - +2026-08-04 16:13:05,706 INFO [pipeline.vase_compare] Loading CLIP (openai/clip-vit-base-patch32) on cuda... +2026-08-04 16:13:08,110 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:13:08] "POST /api/flower_summary HTTP/1.1" 200 - +2026-08-04 16:49:03,728 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:03] "GET / HTTP/1.1" 200 - +2026-08-04 16:49:03,885 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:03] "GET /js/twint_ch.js HTTP/1.1" 404 - +2026-08-04 16:49:04,042 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:04] "GET /assets/js/qr_modal.js HTTP/1.1" 404 - +2026-08-04 16:49:04,203 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:04] "GET /static/style/sys_files/index.js HTTP/1.1" 404 - +2026-08-04 16:49:04,357 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:04] "GET /js/antibot-client.js HTTP/1.1" 404 - +2026-08-04 16:49:04,512 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:04] "GET /template_image/SKU_2.jpg HTTP/1.1" 200 - +2026-08-04 16:49:04,986 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:04] "GET /static/style/protect/index.js HTTP/1.1" 404 - +2026-08-04 16:49:05,144 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:05] "GET /template_image/SKU_5.jpg HTTP/1.1" 200 - +2026-08-04 16:49:05,457 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:05] "GET /template_image/SKU_4.jpg HTTP/1.1" 200 - +2026-08-04 16:49:05,617 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:05] "GET /template_image/SKU_1_COLORED.png HTTP/1.1" 200 - +2026-08-04 16:49:05,784 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:05] "GET /template_image/SKU_ULTRA_6.png HTTP/1.1" 200 - +2026-08-04 16:49:06,100 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:06] "GET /licensor.js HTTP/1.1" 404 - +2026-08-04 16:49:06,254 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:06] "GET /js/lkk_ch.js HTTP/1.1" 404 - +2026-08-04 16:49:06,409 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:06] "GET /css/support_parent.css HTTP/1.1" 404 - +2026-08-04 16:49:06,567 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:06] "GET /assets/js/message.js HTTP/1.1" 404 - +2026-08-04 16:49:06,722 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:06] "GET /static/js/main.js HTTP/1.1" 200 - +2026-08-04 16:49:07,032 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:07] "GET /robots.txt HTTP/1.1" 404 - +2026-08-04 16:49:07,184 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:07] "GET /assets/js/auth.js HTTP/1.1" 404 - +2026-08-04 16:49:07,340 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:07] "GET /static/css/style.css HTTP/1.1" 200 - +2026-08-04 16:49:07,496 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:07] "GET /template_image/SKU_3.jpg HTTP/1.1" 200 - +2026-08-04 16:49:07,651 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:07] "GET /template_image/SKU_1.jpg HTTP/1.1" 200 - +2026-08-04 16:49:07,814 INFO [werkzeug] 192.168.2.205 - - [04/Aug/2026 16:49:07] "GET /bot-connect.js HTTP/1.1" 404 - diff --git a/maxColour.py b/maxColour.py new file mode 100644 index 0000000..dc0ee1d --- /dev/null +++ b/maxColour.py @@ -0,0 +1,161 @@ +""" +Dynamic Color Family Grid Extractor (Unsupervised Clustering). + +Dynamically discovers color families in your image using K-Means in LAB space, +retains the ORIGINAL image colors for each group, and places them into a single +grid with separation lines. + +Requirements: + pip install numpy pillow scikit-learn --break-system-packages + +Usage: + python dynamic_color_families.py input.png --k 5 --out grid_dynamic.png +""" + +import argparse +import math +import numpy as np +from PIL import Image, ImageDraw, ImageFont +from sklearn.cluster import KMeans + + +def rgb_to_lab(rgb_array): + """ + Converts RGB array [0-255] to CIELAB space for perceptual color clustering. + CIELAB separates lightness (L) from color channels (A, B). + """ + # Standard sRGB to XYZ conversion + rgb = rgb_array.astype(np.float64) / 255.0 + mask = rgb > 0.04045 + rgb[mask] = np.power((rgb[mask] + 0.055) / 1.055, 2.4) + rgb[~mask] = rgb[~mask] / 12.92 + + # sRGB matrix transformation to D65 XYZ + transform = np.array([ + [0.4124564, 0.3575761, 0.1804375], + [0.2126729, 0.7151522, 0.0721750], + [0.0193339, 0.1191920, 0.9503041] + ]) + xyz = np.dot(rgb, transform.T) + + # Reference white point D65 + xyz[:, 0] /= 0.95047 + xyz[:, 1] /= 1.00000 + xyz[:, 2] /= 1.08883 + + mask = xyz > 0.008856 + xyz[mask] = np.power(xyz[mask], 1.0 / 3.0) + xyz[~mask] = (7.787 * xyz[~mask]) + (16.0 / 116.0) + + L = (116.0 * xyz[:, 1]) - 16.0 + A = 500.0 * (xyz[:, 0] - xyz[:, 1]) + B = 200.0 * (xyz[:, 1] - xyz[:, 2]) + + return np.stack([L, A, B], axis=1) + + +def create_dynamic_family_grid(image_path, output_path, n_clusters=5, line_width=6, line_color=(180, 180, 180, 255)): + # Open image with transparency + img = Image.open(image_path).convert("RGBA") + arr = np.array(img) + + h, w, _ = arr.shape + alpha = arr[:, :, 3] + fg_mask = alpha > 0 # Ignore background + + rgb_flat = arr[:, :, :3][fg_mask] + if len(rgb_flat) == 0: + raise ValueError("No non-transparent foreground pixels found in image!") + + print(f"Extracting {n_clusters} dynamic color families using LAB clustering...") + + # 1. Convert to CIELAB color space (perceptually uniform) + lab_pixels = rgb_to_lab(rgb_flat) + + # 2. Dynamically cluster colors into K groups + # We weight color channels (A, B) slightly higher than Lightness (L) so light/dark shadows + # of the same color family stay clustered together better. + features = lab_pixels.copy() + features[:, 0] *= 0.6 # Scale down Lightness influence to resist shadows + + kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10) + labels = kmeans.fit_predict(features) + + # Calculate average RGB color for each dynamically found group (for label tags) + cluster_avg_colors = [] + for i in range(n_clusters): + avg_rgb = rgb_flat[labels == i].mean(axis=0).astype(int) + cluster_avg_colors.append(avg_rgb) + + # Order families by pixel count (largest family first) + unique_labels, counts = np.unique(labels, return_counts=True) + sorted_indices = np.argsort(-counts) + + # 3. Create Grid canvas with separation lines + cols = math.ceil(math.sqrt(n_clusters)) + rows = math.ceil(n_clusters / cols) + + grid_w = cols * w + (cols + 1) * line_width + grid_h = rows * h + (rows + 1) * line_width + + canvas = Image.new("RGBA", (grid_w, grid_h), (25, 25, 25, 255)) + draw = ImageDraw.Draw(canvas) + + for rank, cluster_idx in enumerate(sorted_indices): + r_idx = rank // cols + c_idx = rank % cols + + x_start = line_width + c_idx * (w + line_width) + y_start = line_width + r_idx * (h + line_width) + + # Mask pixels belonging to this dynamic family + family_mask_1d = labels == cluster_idx + full_mask = np.zeros((h, w), dtype=bool) + full_mask[fg_mask] = family_mask_1d + + # Extract tile retaining ORIGINAL image pixels + tile_arr = np.zeros_like(arr) + tile_arr[full_mask] = arr[full_mask] + + tile_img = Image.fromarray(tile_arr, mode="RGBA") + canvas.paste(tile_img, (x_start, y_start), tile_img) + + # Draw separation lines around panel + box_coords = [ + x_start - line_width // 2, + y_start - line_width // 2, + x_start + w + line_width // 2, + y_start + h + line_width // 2, + ] + draw.rectangle(box_coords, outline=line_color, width=line_width) + + # Label tile with family ID and average RGB swatch + avg_c = cluster_avg_colors[cluster_idx] + label_text = f"Family #{rank + 1} ({counts[cluster_idx]} px)" + + # Label box background + draw.rectangle( + [x_start + 10, y_start + 10, x_start + 200, y_start + 40], + fill=(0, 0, 0, 180) + ) + # Average color swatch tag + draw.rectangle( + [x_start + 15, y_start + 18, x_start + 30, y_start + 33], + fill=(avg_c[0], avg_c[1], avg_c[2], 255), + outline=(255, 255, 255, 255) + ) + draw.text((x_start + 38, y_start + 18), label_text, fill=(255, 255, 255, 255)) + + canvas.save(output_path) + print(f"Saved dynamic grid with {n_clusters} families to: {output_path}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Dynamic color family clustering in single grid with separation lines.") + parser.add_argument("image_path", type=str, help="Path to input image.") + parser.add_argument("--out", type=str, default="dynamic_families_grid.png", help="Output path for grid image.") + parser.add_argument("--k", type=int, default=5, help="Number of dynamic color families to discover (default: 5).") + parser.add_argument("--line-width", type=int, default=6, help="Width of separation lines.") + args = parser.parse_args() + + create_dynamic_family_grid(args.image_path, args.out, n_clusters=args.k, line_width=args.line_width) \ No newline at end of file diff --git a/pipeline/__init__.py b/pipeline/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pipeline/__pycache__/__init__.cpython-310.pyc b/pipeline/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..3731417 Binary files /dev/null and b/pipeline/__pycache__/__init__.cpython-310.pyc differ diff --git a/pipeline/__pycache__/__init__.cpython-311.pyc b/pipeline/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..96cda4b Binary files /dev/null and b/pipeline/__pycache__/__init__.cpython-311.pyc differ diff --git a/pipeline/__pycache__/__init__.cpython-38.pyc b/pipeline/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..8e9be7c Binary files /dev/null and b/pipeline/__pycache__/__init__.cpython-38.pyc differ diff --git a/pipeline/__pycache__/bg_removal.cpython-310.pyc b/pipeline/__pycache__/bg_removal.cpython-310.pyc new file mode 100644 index 0000000..6d6b94d Binary files /dev/null and b/pipeline/__pycache__/bg_removal.cpython-310.pyc differ diff --git a/pipeline/__pycache__/bg_removal.cpython-311.pyc b/pipeline/__pycache__/bg_removal.cpython-311.pyc new file mode 100644 index 0000000..045ba55 Binary files /dev/null and b/pipeline/__pycache__/bg_removal.cpython-311.pyc differ diff --git a/pipeline/__pycache__/bg_removal.cpython-38.pyc b/pipeline/__pycache__/bg_removal.cpython-38.pyc new file mode 100644 index 0000000..beba8d8 Binary files /dev/null and b/pipeline/__pycache__/bg_removal.cpython-38.pyc differ diff --git a/pipeline/__pycache__/classical.cpython-310.pyc b/pipeline/__pycache__/classical.cpython-310.pyc new file mode 100644 index 0000000..259fb49 Binary files /dev/null and b/pipeline/__pycache__/classical.cpython-310.pyc differ diff --git a/pipeline/__pycache__/classical.cpython-311.pyc b/pipeline/__pycache__/classical.cpython-311.pyc new file mode 100644 index 0000000..555f521 Binary files /dev/null and b/pipeline/__pycache__/classical.cpython-311.pyc differ diff --git a/pipeline/__pycache__/classical.cpython-38.pyc b/pipeline/__pycache__/classical.cpython-38.pyc new file mode 100644 index 0000000..fe00dd5 Binary files /dev/null and b/pipeline/__pycache__/classical.cpython-38.pyc differ diff --git a/pipeline/__pycache__/color.cpython-310.pyc b/pipeline/__pycache__/color.cpython-310.pyc new file mode 100644 index 0000000..27b3bbd Binary files /dev/null and b/pipeline/__pycache__/color.cpython-310.pyc differ diff --git a/pipeline/__pycache__/color.cpython-311.pyc b/pipeline/__pycache__/color.cpython-311.pyc new file mode 100644 index 0000000..d5609fd Binary files /dev/null and b/pipeline/__pycache__/color.cpython-311.pyc differ diff --git a/pipeline/__pycache__/color.cpython-38.pyc b/pipeline/__pycache__/color.cpython-38.pyc new file mode 100644 index 0000000..6950290 Binary files /dev/null and b/pipeline/__pycache__/color.cpython-38.pyc differ diff --git a/pipeline/__pycache__/color_grid.cpython-310.pyc b/pipeline/__pycache__/color_grid.cpython-310.pyc new file mode 100644 index 0000000..10fb310 Binary files /dev/null and b/pipeline/__pycache__/color_grid.cpython-310.pyc differ diff --git a/pipeline/__pycache__/color_grid.cpython-311.pyc b/pipeline/__pycache__/color_grid.cpython-311.pyc new file mode 100644 index 0000000..415b751 Binary files /dev/null and b/pipeline/__pycache__/color_grid.cpython-311.pyc differ diff --git a/pipeline/__pycache__/color_grid.cpython-38.pyc b/pipeline/__pycache__/color_grid.cpython-38.pyc new file mode 100644 index 0000000..5dac1e9 Binary files /dev/null and b/pipeline/__pycache__/color_grid.cpython-38.pyc differ diff --git a/pipeline/__pycache__/deep.cpython-310.pyc b/pipeline/__pycache__/deep.cpython-310.pyc new file mode 100644 index 0000000..fad4648 Binary files /dev/null and b/pipeline/__pycache__/deep.cpython-310.pyc differ diff --git a/pipeline/__pycache__/deep.cpython-311.pyc b/pipeline/__pycache__/deep.cpython-311.pyc new file mode 100644 index 0000000..6863701 Binary files /dev/null and b/pipeline/__pycache__/deep.cpython-311.pyc differ diff --git a/pipeline/__pycache__/deep.cpython-38.pyc b/pipeline/__pycache__/deep.cpython-38.pyc new file mode 100644 index 0000000..546f2f5 Binary files /dev/null and b/pipeline/__pycache__/deep.cpython-38.pyc differ diff --git a/pipeline/__pycache__/engine.cpython-310.pyc b/pipeline/__pycache__/engine.cpython-310.pyc new file mode 100644 index 0000000..c7d963e Binary files /dev/null and b/pipeline/__pycache__/engine.cpython-310.pyc differ diff --git a/pipeline/__pycache__/engine.cpython-311.pyc b/pipeline/__pycache__/engine.cpython-311.pyc new file mode 100644 index 0000000..d238004 Binary files /dev/null and b/pipeline/__pycache__/engine.cpython-311.pyc differ diff --git a/pipeline/__pycache__/engine.cpython-38.pyc b/pipeline/__pycache__/engine.cpython-38.pyc new file mode 100644 index 0000000..07a69a3 Binary files /dev/null and b/pipeline/__pycache__/engine.cpython-38.pyc differ diff --git a/pipeline/__pycache__/flower_count.cpython-38.pyc b/pipeline/__pycache__/flower_count.cpython-38.pyc new file mode 100644 index 0000000..44735fb Binary files /dev/null and b/pipeline/__pycache__/flower_count.cpython-38.pyc differ diff --git a/pipeline/__pycache__/sam3_client.cpython-38.pyc b/pipeline/__pycache__/sam3_client.cpython-38.pyc new file mode 100644 index 0000000..9dd8aec Binary files /dev/null and b/pipeline/__pycache__/sam3_client.cpython-38.pyc differ diff --git a/pipeline/__pycache__/shape_match.cpython-310.pyc b/pipeline/__pycache__/shape_match.cpython-310.pyc new file mode 100644 index 0000000..106d6d3 Binary files /dev/null and b/pipeline/__pycache__/shape_match.cpython-310.pyc differ diff --git a/pipeline/__pycache__/shape_match.cpython-38.pyc b/pipeline/__pycache__/shape_match.cpython-38.pyc new file mode 100644 index 0000000..a8a4d99 Binary files /dev/null and b/pipeline/__pycache__/shape_match.cpython-38.pyc differ diff --git a/pipeline/__pycache__/texture_match.cpython-310.pyc b/pipeline/__pycache__/texture_match.cpython-310.pyc new file mode 100644 index 0000000..9cfe2bd Binary files /dev/null and b/pipeline/__pycache__/texture_match.cpython-310.pyc differ diff --git a/pipeline/__pycache__/texture_match.cpython-38.pyc b/pipeline/__pycache__/texture_match.cpython-38.pyc new file mode 100644 index 0000000..a87ca61 Binary files /dev/null and b/pipeline/__pycache__/texture_match.cpython-38.pyc differ diff --git a/pipeline/__pycache__/utils.cpython-310.pyc b/pipeline/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000..08518b6 Binary files /dev/null and b/pipeline/__pycache__/utils.cpython-310.pyc differ diff --git a/pipeline/__pycache__/utils.cpython-311.pyc b/pipeline/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000..8540991 Binary files /dev/null and b/pipeline/__pycache__/utils.cpython-311.pyc differ diff --git a/pipeline/__pycache__/utils.cpython-38.pyc b/pipeline/__pycache__/utils.cpython-38.pyc new file mode 100644 index 0000000..b25b804 Binary files /dev/null and b/pipeline/__pycache__/utils.cpython-38.pyc differ diff --git a/pipeline/__pycache__/vase_compare.cpython-38.pyc b/pipeline/__pycache__/vase_compare.cpython-38.pyc new file mode 100644 index 0000000..c52acf1 Binary files /dev/null and b/pipeline/__pycache__/vase_compare.cpython-38.pyc differ diff --git a/pipeline/__pycache__/verify.cpython-310.pyc b/pipeline/__pycache__/verify.cpython-310.pyc new file mode 100644 index 0000000..8af417d Binary files /dev/null and b/pipeline/__pycache__/verify.cpython-310.pyc differ diff --git a/pipeline/__pycache__/verify.cpython-38.pyc b/pipeline/__pycache__/verify.cpython-38.pyc new file mode 100644 index 0000000..457aee5 Binary files /dev/null and b/pipeline/__pycache__/verify.cpython-38.pyc differ diff --git a/pipeline/__pycache__/yolo_world.cpython-38.pyc b/pipeline/__pycache__/yolo_world.cpython-38.pyc new file mode 100644 index 0000000..3d57977 Binary files /dev/null and b/pipeline/__pycache__/yolo_world.cpython-38.pyc differ diff --git a/pipeline/bg_removal.py b/pipeline/bg_removal.py new file mode 100644 index 0000000..fc0f56c --- /dev/null +++ b/pipeline/bg_removal.py @@ -0,0 +1,147 @@ +""" +Background removal via rembg (BiRefNet lite), disk-cached by content hash +so a re-upload of the same image never re-runs the model. +""" + +import gc +import hashlib +import io +import logging +import os + +import cv2 +import numpy as np +from PIL import Image +from rembg import remove, new_session + +import config + +logger = logging.getLogger(__name__) + +_session = None + + +def get_session(): + """Lazily create the rembg session once and reuse it for every request.""" + global _session + if _session is None: + try: + _session = new_session(config.REMBG_MODEL_NAME, + providers=["CUDAExecutionProvider", "CPUExecutionProvider"]) + except Exception: + logger.exception( + "Failed to create rembg session with CUDAExecutionProvider, " + "falling back to CPU-only" + ) + _session = new_session(config.REMBG_MODEL_NAME, providers=["CPUExecutionProvider"]) + + try: + providers = _session.inner_session.get_providers() + logger.info("rembg session ready, using providers: %s", providers) + if "CUDAExecutionProvider" not in providers: + logger.warning( + "rembg is running on CPU (no CUDAExecutionProvider) -- " + "background removal will be much slower. Check that " + "onnxruntime-gpu is installed and the CUDA driver is visible." + ) + except AttributeError: + pass + return _session + + +def unload_session(): + """Drops the rembg/onnxruntime session so its (possibly CUDA-backed) + memory is freed. It's a lazy singleton (see get_session above), so the + next call to remove_background_bytes/_file simply recreates it. Used to + make room for SAM-based flower counting on an 8GB card.""" + global _session + freed = _session is not None + _session = None + if freed: + gc.collect() + return freed + + +def resize_max_dim(pil_img: Image.Image, max_dim: int) -> Image.Image: + """Downscale in place-equivalent fashion so neither side exceeds max_dim. + No-op (returns the same image) if already within bounds -- this is the + single choke point that keeps memory/time bounded for every model in the + pipeline (bg removal, SIFT/ORB, SuperPoint, LoFTR), regardless of how + large the original upload was.""" + w, h = pil_img.size + scale = max_dim / max(w, h) + if scale >= 1.0: + return pil_img + new_size = (max(1, int(w * scale)), max(1, int(h * scale))) + return pil_img.resize(new_size, Image.LANCZOS) + + +def hash_bytes(data: bytes) -> str: + return hashlib.sha1(data).hexdigest()[:20] + + +def remove_background_bytes(image_bytes: bytes, cache_dir: str): + """ + Runs background removal on raw image bytes (an upload), caching the + result by content hash. Returns (rgba_bgra_ndarray, cache_key). + """ + os.makedirs(cache_dir, exist_ok=True) + key = hash_bytes(image_bytes) + cache_path = os.path.join(cache_dir, key + ".png") + + if os.path.exists(cache_path): + img = cv2.imread(cache_path, cv2.IMREAD_UNCHANGED) + if img is not None and img.ndim == 3 and img.shape[2] == 4: + return img, key + + pil_img = Image.open(io.BytesIO(image_bytes)).convert("RGB") + orig_size = pil_img.size + pil_img = resize_max_dim(pil_img, config.MAX_IMAGE_DIM) + if pil_img.size != orig_size: + logger.info("Resized upload %s -> %s before processing", orig_size, pil_img.size) + + result = remove(pil_img, session=get_session()) + result.save(cache_path) + + rgba = cv2.cvtColor(np.array(result), cv2.COLOR_RGBA2BGRA) + return rgba, key + + +def remove_background_file(src_path: str, cache_dir: str): + """Same as remove_background_bytes, but caches by original filename -- + used for the fixed template set, which doesn't change between requests.""" + os.makedirs(cache_dir, exist_ok=True) + base_name = os.path.splitext(os.path.basename(src_path))[0] + cache_path = os.path.join(cache_dir, base_name + ".png") + + if os.path.exists(cache_path): + img = cv2.imread(cache_path, cv2.IMREAD_UNCHANGED) + if img is not None and img.ndim == 3 and img.shape[2] == 4: + return img + + pil_img = Image.open(src_path).convert("RGB") + pil_img = resize_max_dim(pil_img, config.MAX_IMAGE_DIM) + result = remove(pil_img, session=get_session()) + result.save(cache_path) + + return cv2.cvtColor(np.array(result), cv2.COLOR_RGBA2BGRA) + + +def create_mask(alpha): + _, mask = cv2.threshold(alpha, config.ALPHA_THRESHOLD, 255, cv2.THRESH_BINARY) + kernel = np.ones((3, 3), np.uint8) + mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) + mask = cv2.erode(mask, kernel, iterations=config.ERODE_ITER) + return mask + + +def split_rgba(rgba): + """rgba: BGRA ndarray -> (bgr, alpha, mask)""" + if rgba.shape[2] == 4: + bgr = rgba[:, :, :3] + alpha = rgba[:, :, 3] + else: + bgr = rgba + alpha = np.ones(bgr.shape[:2], dtype=np.uint8) * 255 + mask = create_mask(alpha) + return bgr, alpha, mask diff --git a/pipeline/classical.py b/pipeline/classical.py new file mode 100644 index 0000000..ceed40b --- /dev/null +++ b/pipeline/classical.py @@ -0,0 +1,110 @@ +""" +SIFT / ORB matching: one query image vs the fixed template set. +Template keypoints/descriptors are precomputed once at startup and reused +for every request -- only the query image is processed per request. +""" + +import cv2 +import numpy as np + +import config + +_sift = None +_orb = None +_template_features = {"SIFT": None, "ORB": None} # name -> {template_name: {"kp","des"}} + + +def _get_sift(): + global _sift + if _sift is None: + _sift = cv2.SIFT_create() + return _sift + + +def _get_orb(): + global _orb + if _orb is None: + _orb = cv2.ORB_create(nfeatures=config.ORB_N_FEATURES) + return _orb + + +def _detector_for(method): + return _get_sift() if method == "SIFT" else _get_orb() + + +def _matcher_for(method): + if method == "SIFT": + index_params = dict(algorithm=1, trees=5) # FLANN_INDEX_KDTREE + else: + index_params = dict(algorithm=6, table_number=6, key_size=12, + multi_probe_level=1) # FLANN_INDEX_LSH + search_params = dict(checks=50) + return cv2.FlannBasedMatcher(index_params, search_params) + + +def extract_features(method, bgr, mask): + gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) + detector = _detector_for(method) + kp, des = detector.detectAndCompute(gray, mask) + return kp, des + + +def set_template_features(method, template_name, kp, des): + if _template_features[method] is None: + _template_features[method] = {} + _template_features[method][template_name] = {"kp": kp, "des": des} + + +def get_template_features(method): + return _template_features[method] or {} + + +def match_pair(method, kp_q, des_q, kp_t, des_t): + """Returns (inlier_count, confidence_pct).""" + if des_q is None or des_t is None or len(kp_q) == 0 or len(kp_t) == 0: + return 0, 0.0 + + matcher = _matcher_for(method) + try: + raw_matches = matcher.knnMatch(des_q, des_t, k=2) + except cv2.error: + return 0, 0.0 + + good = [] + for pair in raw_matches: + if len(pair) != 2: + continue + m, n = pair + if m.distance < config.LOWE_RATIO * n.distance: + good.append(m) + + if len(good) < config.MIN_RAW_MATCHES: + return 0, 0.0 + + src = np.float32([kp_q[m.queryIdx].pt for m in good]).reshape(-1, 1, 2) + dst = np.float32([kp_t[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) + + _, ransac_mask = cv2.findHomography(src, dst, cv2.RANSAC, 5.0) + if ransac_mask is None: + return 0, 0.0 + + inlier_count = int(ransac_mask.sum()) + confidence_pct = (inlier_count / len(good)) * 100 if good else 0.0 + return inlier_count, confidence_pct + + +def match_against_templates(method, kp_q, des_q): + """Returns a list of {"template": name, "score": int, "confidence": float}, + sorted by score descending, for every precomputed template.""" + results = [] + for template_name, data in get_template_features(method).items(): + inlier_count, confidence_pct = match_pair( + method, kp_q, des_q, data["kp"], data["des"] + ) + results.append({ + "template": template_name, + "score": inlier_count, + "confidence": round(confidence_pct, 1), + }) + results.sort(key=lambda r: r["score"], reverse=True) + return results diff --git a/pipeline/color.py b/pipeline/color.py new file mode 100644 index 0000000..9a7288e --- /dev/null +++ b/pipeline/color.py @@ -0,0 +1,148 @@ +""" +Independent color-space comparison: how much of the uploaded photo's color +distribution is also present in each template, plus which specific colors +matched. Entirely separate from the SIFT/ORB/SuperGlue/LoFTR scores and the +weighted final match -- nothing here feeds into those, it's its own section. + +Template-side color data (histogram + dominant colors) is precomputed once +at startup from the same masked bgr/mask already produced during bootstrap, +same principle as the other methods: a request only ever analyzes the one +uploaded image. +""" + +import cv2 +import numpy as np + +N_DOMINANT_COLORS = 5 +HIST_HUE_BINS = 30 +HIST_SAT_BINS = 32 + +# k-means on every foreground pixel is wasteful and, given this app's +# history of memory blowups, worth bounding explicitly -- a random sample +# is statistically equivalent for "what are the dominant colors" purposes. +MAX_KMEANS_SAMPLE = 20000 + +# Empirical ceiling for CIE76 Lab distance beyond which two colors are +# considered maximally dissimilar (similarity floors at 0%). ~100 comfortably +# covers the largest perceptual differences (e.g. black vs. white is ~100). +MAX_LAB_DISTANCE = 100.0 + +_template_color_data = {} # name -> {"hist": ndarray, "colors": [...]} + + +def _masked_pixels_bgr(bgr, mask): + ys, xs = np.where(mask > 0) + if len(ys) == 0: + return np.zeros((0, 3), dtype=np.uint8) + return bgr[ys, xs] + + +def compute_hs_histogram(bgr, mask): + """Hue+Saturation 2D histogram (Value/brightness deliberately excluded + so lighting differences between photos don't masquerade as color + differences), normalized so it sums to 1.""" + hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV) + hist = cv2.calcHist([hsv], [0, 1], mask, [HIST_HUE_BINS, HIST_SAT_BINS], + [0, 180, 0, 256]) + total = hist.sum() + if total > 0: + hist = hist / total + return hist + + +def histogram_match_pct(hist_a, hist_b): + """% of one distribution's mass that the other also covers -- both + histograms are pre-normalized, so HISTCMP_INTERSECT directly sums + min(a[i], b[i]) into a 0-1 overlap fraction.""" + intersection = cv2.compareHist(hist_a.astype(np.float32), hist_b.astype(np.float32), + cv2.HISTCMP_INTERSECT) + return round(float(intersection) * 100, 1) + + +def dominant_colors(bgr, mask, k=N_DOMINANT_COLORS): + pixels = _masked_pixels_bgr(bgr, mask) + if len(pixels) == 0: + return [] + + if len(pixels) > MAX_KMEANS_SAMPLE: + idx = np.random.choice(len(pixels), MAX_KMEANS_SAMPLE, replace=False) + pixels = pixels[idx] + + unique_count = len(np.unique(pixels, axis=0)) + k_eff = min(k, unique_count) + if k_eff < 1: + return [] + + criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.5) + _, labels, centers = cv2.kmeans(pixels.astype(np.float32), k_eff, None, + criteria, 3, cv2.KMEANS_PP_CENTERS) + + labels = labels.flatten() + counts = np.bincount(labels, minlength=k_eff) + total = counts.sum() + + colors = [] + for i in range(k_eff): + b, g, r = centers[i] + colors.append({ + "rgb": [int(round(r)), int(round(g)), int(round(b))], + "pct": round(float(counts[i]) / total * 100, 1), + }) + colors.sort(key=lambda c: c["pct"], reverse=True) + return colors + + +def _lab_distance(rgb_a, rgb_b): + a = np.uint8([[[rgb_a[2], rgb_a[1], rgb_a[0]]]]) # rgb -> bgr for cv2 + b = np.uint8([[[rgb_b[2], rgb_b[1], rgb_b[0]]]]) + lab_a = cv2.cvtColor(a, cv2.COLOR_BGR2LAB)[0][0].astype(np.float32) + lab_b = cv2.cvtColor(b, cv2.COLOR_BGR2LAB)[0][0].astype(np.float32) + return float(np.linalg.norm(lab_a - lab_b)) + + +def match_color_pairs(input_colors, template_colors): + """For each of the input's dominant colors, find the closest template + dominant color by perceptual (Lab) distance and report a similarity %.""" + pairs = [] + for ic in input_colors: + if not template_colors: + break + best = min(template_colors, key=lambda tc: _lab_distance(ic["rgb"], tc["rgb"])) + dist = _lab_distance(ic["rgb"], best["rgb"]) + similarity = max(0.0, 100.0 * (1 - dist / MAX_LAB_DISTANCE)) + pairs.append({ + "input_rgb": ic["rgb"], + "input_pct": ic["pct"], + "template_rgb": best["rgb"], + "template_pct": best["pct"], + "similarity": round(similarity, 1), + }) + return pairs + + +def set_template_color_data(name, bgr, mask): + _template_color_data[name] = { + "hist": compute_hs_histogram(bgr, mask), + "colors": dominant_colors(bgr, mask), + } + + +def compare_input_to_templates(input_bgr, input_mask): + input_hist = compute_hs_histogram(input_bgr, input_mask) + input_colors = dominant_colors(input_bgr, input_mask) + + results = [] + for name, data in _template_color_data.items(): + match_pct = histogram_match_pct(input_hist, data["hist"]) + pairs = match_color_pairs(input_colors, data["colors"]) + results.append({ + "template": name, + "match_pct": match_pct, + "color_pairs": pairs, + }) + results.sort(key=lambda r: r["match_pct"], reverse=True) + + return { + "input_dominant_colors": input_colors, + "templates": results, + } diff --git a/pipeline/color_grid.py b/pipeline/color_grid.py new file mode 100644 index 0000000..184fc36 --- /dev/null +++ b/pipeline/color_grid.py @@ -0,0 +1,194 @@ +""" +Color family grid: dynamically discovers color regions within an image via +K-means clustering in LAB space (adapted from a standalone dynamic-color- +family script the user provided as a reference), then renders each region +as its own tile in a grid -- keeping only that region's original pixels, +everything else left dark -- and, given a second image, matches each region +to its closest counterpart by average color and reports how much area they +each cover. + +Purely visual/informational, like the AI verification section: nothing here +feeds into any score. +""" + +import logging +import math + +import cv2 +import numpy as np +from PIL import Image, ImageDraw + +import config + +logger = logging.getLogger(__name__) + +# Bounded the same way pipeline/color.py bounds its own k-means call -- +# clustering every foreground pixel is wasteful, a random sample is +# statistically equivalent for finding cluster centers. +MAX_KMEANS_SAMPLE = 20000 + + +def cluster_families(bgr, mask, k=None): + """K-means-clusters the masked (foreground) pixels into k color + families in LAB space. Returns a list sorted by area descending: + {"mask": HxW bool ndarray, "rgb": [r,g,b], "pct": float, "pixel_count": int} + """ + k = k or config.FAMILY_GRID_K + ys, xs = np.where(mask > 0) + if len(ys) == 0: + return [] + + lab = cv2.cvtColor(bgr, cv2.COLOR_BGR2LAB).astype(np.float32) + fg_lab = lab[ys, xs] + + # Down-weight lightness so light/dark shadows of the same hue land in + # the same family instead of splitting across families by brightness. + features = fg_lab.copy() + features[:, 0] *= config.FAMILY_GRID_LIGHTNESS_WEIGHT + + if len(features) > MAX_KMEANS_SAMPLE: + sample_idx = np.random.choice(len(features), MAX_KMEANS_SAMPLE, replace=False) + sample = features[sample_idx] + else: + sample = features + + k_eff = min(k, len(np.unique(sample, axis=0))) + if k_eff < 1: + return [] + + criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.5) + _, _, centers = cv2.kmeans(sample, k_eff, None, criteria, 3, cv2.KMEANS_PP_CENTERS) + + # Assign EVERY foreground pixel (not just the sample) to its nearest + # center -- needed to build full-resolution family masks. Cheap: a + # handful of vectorized (N,) distance passes, one per cluster. + dists = np.stack([np.linalg.norm(features - c, axis=1) for c in centers], axis=1) + labels = np.argmin(dists, axis=1) + + h, w = mask.shape + total = len(labels) + families = [] + for i in range(k_eff): + member = labels == i + count = int(member.sum()) + if count == 0: + continue + full_mask = np.zeros((h, w), dtype=bool) + full_mask[ys[member], xs[member]] = True + mean_bgr = bgr[ys[member], xs[member]].mean(axis=0) + families.append({ + "mask": full_mask, + "rgb": [int(round(mean_bgr[2])), int(round(mean_bgr[1])), int(round(mean_bgr[0]))], + "pct": round(count / total * 100, 1), + "pixel_count": count, + }) + + families.sort(key=lambda f: f["pct"], reverse=True) + return families + + +def _lab_distance_rgb(rgb_a, rgb_b): + a = np.uint8([[[rgb_a[2], rgb_a[1], rgb_a[0]]]]) + b = np.uint8([[[rgb_b[2], rgb_b[1], rgb_b[0]]]]) + lab_a = cv2.cvtColor(a, cv2.COLOR_BGR2LAB)[0][0].astype(np.float32) + lab_b = cv2.cvtColor(b, cv2.COLOR_BGR2LAB)[0][0].astype(np.float32) + return float(np.linalg.norm(lab_a - lab_b)) + + +def match_families(input_families, template_families): + """For each input family (largest first), finds its closest template + family by average color and reports an area-match %: the smaller area + share divided by the larger, so it reads 100% when both cover the same + proportion of their own (differently-sized) images, regardless of which + one is physically bigger.""" + pairs = [] + for rank, ifam in enumerate(input_families): + if not template_families: + break + tfam = min(template_families, + key=lambda f: _lab_distance_rgb(ifam["rgb"], f["rgb"])) + color_dist = _lab_distance_rgb(ifam["rgb"], tfam["rgb"]) + color_similarity = max(0.0, 100.0 * (1 - color_dist / 100.0)) + bigger = max(ifam["pct"], tfam["pct"]) + area_match = (min(ifam["pct"], tfam["pct"]) / bigger * 100) if bigger > 0 else 0.0 + pairs.append({ + "rank": rank + 1, + "input_rgb": ifam["rgb"], + "input_pct": ifam["pct"], + "template_rgb": tfam["rgb"], + "template_pct": tfam["pct"], + "area_match_pct": round(area_match, 1), + "color_similarity_pct": round(color_similarity, 1), + }) + return pairs + + +def overall_area_match(pairs): + """Single headline %: each pair's area-match weighted by how much of + the input image that family actually covers (so a good match on the + dominant color counts for more than a good match on a sliver).""" + if not pairs: + return None + total_weight = sum(p["input_pct"] for p in pairs) + if total_weight <= 0: + return None + weighted = sum(p["area_match_pct"] * p["input_pct"] for p in pairs) + return round(weighted / total_weight, 1) + + +def render_family_grid(bgr, families): + """Renders each family as its own tile (original colors preserved, + everything else left dark) arranged in a grid with separator lines and + a rank/percentage label -- returns a BGR ndarray ready for cv2.imwrite. + Each tile is downscaled to FAMILY_GRID_TILE_MAX_DIM before being placed, + so the assembled canvas stays small by construction.""" + if not families: + return bgr.copy() + + h, w = bgr.shape[:2] + tile_max = config.FAMILY_GRID_TILE_MAX_DIM + scale = min(1.0, tile_max / max(h, w)) + tw, th = max(1, int(w * scale)), max(1, int(h * scale)) + + rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB) + if scale < 1.0: + rgb_small = cv2.resize(rgb, (tw, th), interpolation=cv2.INTER_AREA) + else: + rgb_small = rgb + + line_width = config.FAMILY_GRID_LINE_WIDTH + k = len(families) + cols = math.ceil(math.sqrt(k)) + rows = math.ceil(k / cols) + + grid_w = cols * tw + (cols + 1) * line_width + grid_h = rows * th + (rows + 1) * line_width + + canvas = Image.new("RGB", (grid_w, grid_h), (24, 22, 19)) + draw = ImageDraw.Draw(canvas) + + for rank, fam in enumerate(families): + r_idx, c_idx = divmod(rank, cols) + x0 = line_width + c_idx * (tw + line_width) + y0 = line_width + r_idx * (th + line_width) + + mask_small = fam["mask"] + if scale < 1.0: + mask_small = cv2.resize(mask_small.astype(np.uint8), (tw, th), + interpolation=cv2.INTER_NEAREST).astype(bool) + + tile = np.zeros_like(rgb_small) + tile[mask_small] = rgb_small[mask_small] + canvas.paste(Image.fromarray(tile, mode="RGB"), (x0, y0)) + + draw.rectangle([x0, y0, x0 + tw - 1, y0 + th - 1], + outline=(210, 200, 180), width=max(1, line_width // 2)) + + label = f"#{rank + 1} {fam['pct']}%" + label_w = 9 * len(label) + 16 + draw.rectangle([x0 + 6, y0 + 6, x0 + 6 + label_w, y0 + 26], fill=(20, 18, 16)) + draw.rectangle([x0 + 10, y0 + 10, x0 + 22, y0 + 22], + fill=tuple(fam["rgb"]), outline=(255, 255, 255)) + draw.text((x0 + 28, y0 + 10), label, fill=(240, 235, 225)) + + return cv2.cvtColor(np.array(canvas), cv2.COLOR_RGB2BGR) diff --git a/pipeline/deep.py b/pipeline/deep.py new file mode 100644 index 0000000..8caae61 --- /dev/null +++ b/pipeline/deep.py @@ -0,0 +1,235 @@ +""" +Deep-learning matchers: SuperPoint+LightGlue ("SuperGlue" in the UI/output +naming, per the existing convention -- LightGlue is the permissively +licensed, actively maintained successor actually running under the hood) +and LoFTR (dense, pairwise). + +Template-side features/tensors are precomputed once at startup and reused +for every request; only the query image is processed per request. Since +there are only a handful of templates, even LoFTR (which has no reusable +per-image descriptor and must re-run a full forward pass per pair) is cheap +here -- it does NOT scale the way it would against hundreds of images. +""" + +import gc +import logging + +import cv2 +import numpy as np +import torch + +import config + +logger = logging.getLogger(__name__) + +DEVICE = "cuda" if torch.cuda.is_available() else "cpu" + +_superpoint = None +_lightglue = None +_loftr = None + +_template_superpoint_feats = {} # template_name -> {"feats", "mask"} +_template_loftr_tensors = {} # template_name -> {"tensor", "mask"} + + +def get_superpoint(): + global _superpoint + if _superpoint is None: + logger.info("Loading SuperPoint on %s...", DEVICE) + from lightglue import SuperPoint + _superpoint = SuperPoint( + max_num_keypoints=config.SUPERPOINT_MAX_KEYPOINTS + ).eval().to(DEVICE) + return _superpoint + + +def get_lightglue(): + global _lightglue + if _lightglue is None: + logger.info("Loading LightGlue on %s...", DEVICE) + from lightglue import LightGlue + _lightglue = LightGlue(features="superpoint").eval().to(DEVICE) + return _lightglue + + +def get_loftr(): + global _loftr + if _loftr is None: + logger.info("Loading LoFTR on %s...", DEVICE) + import kornia.feature as KF + _loftr = KF.LoFTR(pretrained="outdoor").eval().to(DEVICE) + return _loftr + + +def unload_models(): + """Drops the SuperPoint/LightGlue/LoFTR model objects (not the small + per-template feature/tensor caches, which stay put) and frees their CUDA + memory. They're plain lazy singletons (see get_superpoint/get_lightglue/ + get_loftr above), so the next call to any of those simply reloads -- + exactly like a fresh process start. Used to make room for SAM-based + flower counting on an 8GB card that can't hold everything at once.""" + global _superpoint, _lightglue, _loftr + freed = _superpoint is not None or _lightglue is not None or _loftr is not None + _superpoint = None + _lightglue = None + _loftr = None + if freed: + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + return freed + + +def masked_gray_tensor(bgr, mask, max_dim=None, fill_value=0.5): + gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY).astype(np.float32) / 255.0 + + if max_dim is not None: + h, w = gray.shape + scale = max_dim / max(h, w) + if scale < 1.0: + new_w, new_h = int(w * scale), int(h * scale) + gray = cv2.resize(gray, (new_w, new_h), interpolation=cv2.INTER_AREA) + mask = cv2.resize(mask, (new_w, new_h), interpolation=cv2.INTER_NEAREST) + + gray[mask == 0] = fill_value + tensor = torch.from_numpy(gray)[None, None].to(DEVICE) + return tensor, mask + + +def keep_points_inside_mask(pts, mask): + if len(pts) == 0: + return np.zeros(0, dtype=bool) + h, w = mask.shape + xs = np.clip(pts[:, 0].round().astype(int), 0, w - 1) + ys = np.clip(pts[:, 1].round().astype(int), 0, h - 1) + return mask[ys, xs] > 0 + + +# --------------------------------------------------------------- +# SuperPoint + LightGlue +# --------------------------------------------------------------- + +def superpoint_extract(bgr, mask): + # ASSUMPTION: cap at MAX_IMAGE_DIM even though uploads are already + # resized upstream -- this is what used to run at full (sometimes + # multi-thousand-pixel) upload resolution and was the main driver of + # the multi-GB memory spikes that got the process OOM-killed. + tensor, resized_mask = masked_gray_tensor(bgr, mask, max_dim=config.MAX_IMAGE_DIM) + with torch.no_grad(): + feats = get_superpoint().extract(tensor) + return feats, resized_mask + + +def set_template_superpoint(template_name, bgr, mask): + feats, resized_mask = superpoint_extract(bgr, mask) + _template_superpoint_feats[template_name] = {"feats": feats, "mask": resized_mask} + + +def _lightglue_pair(feats_q, feats_t, mask_q, mask_t): + from lightglue.utils import rbd + + with torch.no_grad(): + matches01 = get_lightglue()({"image0": feats_q, "image1": feats_t}) + + feats_q_, feats_t_, matches01_ = [rbd(x) for x in [feats_q, feats_t, matches01]] + matches = matches01_["matches"] + if matches.shape[0] == 0: + return 0, 0.0 + + kpts_q = feats_q_["keypoints"][matches[..., 0]].cpu().numpy() + kpts_t = feats_t_["keypoints"][matches[..., 1]].cpu().numpy() + + keep = keep_points_inside_mask(kpts_q, mask_q) & keep_points_inside_mask(kpts_t, mask_t) + kpts_q, kpts_t = kpts_q[keep], kpts_t[keep] + + if len(kpts_q) < 4: + return 0, 0.0 + + src = kpts_q.reshape(-1, 1, 2).astype(np.float32) + dst = kpts_t.reshape(-1, 1, 2).astype(np.float32) + + _, ransac_mask = cv2.findHomography(src, dst, cv2.RANSAC, 5.0) + if ransac_mask is None: + return 0, 0.0 + + inlier_count = int(ransac_mask.sum()) + confidence_pct = (inlier_count / len(src)) * 100 if len(src) > 0 else 0.0 + return inlier_count, confidence_pct + + +def superglue_match_against_templates(bgr, mask): + feats_q, mask_q = superpoint_extract(bgr, mask) + results = [] + for template_name, data in _template_superpoint_feats.items(): + inlier_count, confidence_pct = _lightglue_pair( + feats_q, data["feats"], mask_q, data["mask"] + ) + results.append({ + "template": template_name, + "score": inlier_count, + "confidence": round(confidence_pct, 1), + }) + results.sort(key=lambda r: r["score"], reverse=True) + return results + + +# --------------------------------------------------------------- +# LoFTR +# --------------------------------------------------------------- + +def set_template_loftr(template_name, bgr, mask): + tensor, resized_mask = masked_gray_tensor(bgr, mask, max_dim=config.LOFTR_MAX_DIM) + _template_loftr_tensors[template_name] = {"tensor": tensor, "mask": resized_mask} + + +def _loftr_pair(tensor_q, tensor_t, mask_q, mask_t): + with torch.no_grad(): + out = get_loftr()({"image0": tensor_q, "image1": tensor_t}) + + conf = out["confidence"].cpu().numpy() + keep_conf = conf >= config.LOFTR_CONFIDENCE_THRESHOLD + + kpts_q = out["keypoints0"].cpu().numpy()[keep_conf] + kpts_t = out["keypoints1"].cpu().numpy()[keep_conf] + + keep = keep_points_inside_mask(kpts_q, mask_q) & keep_points_inside_mask(kpts_t, mask_t) + kpts_q, kpts_t = kpts_q[keep], kpts_t[keep] + + if len(kpts_q) < 4: + return 0, 0.0 + + src = kpts_q.reshape(-1, 1, 2).astype(np.float32) + dst = kpts_t.reshape(-1, 1, 2).astype(np.float32) + + _, ransac_mask = cv2.findHomography(src, dst, cv2.RANSAC, 5.0) + if ransac_mask is None: + return 0, 0.0 + + inlier_count = int(ransac_mask.sum()) + confidence_pct = (inlier_count / len(src)) * 100 if len(src) > 0 else 0.0 + return inlier_count, confidence_pct + + +def loftr_match_against_templates(bgr, mask): + tensor_q, mask_q = masked_gray_tensor(bgr, mask, max_dim=config.LOFTR_MAX_DIM) + results = [] + for template_name, data in _template_loftr_tensors.items(): + inlier_count, confidence_pct = _loftr_pair( + tensor_q, data["tensor"], mask_q, data["mask"] + ) + results.append({ + "template": template_name, + "score": inlier_count, + "confidence": round(confidence_pct, 1), + }) + # LoFTR has no reusable per-image descriptor -- this is a full dense + # CNN+transformer forward pass PER TEMPLATE (6 of them per query, + # back to back). Left uncleared, each pass's intermediate + # activations fragment the allocator further than SuperPoint/ + # LightGlue's much lighter per-template cost ever does, and on an + # 8GB card that's enough on its own to tip into CUDA OOM a few + # templates in. + if torch.cuda.is_available(): + torch.cuda.empty_cache() + results.sort(key=lambda r: r["score"], reverse=True) + return results diff --git a/pipeline/engine.py b/pipeline/engine.py new file mode 100644 index 0000000..013d48e --- /dev/null +++ b/pipeline/engine.py @@ -0,0 +1,858 @@ +""" +Orchestrates the whole match pipeline: + + startup (once): bg-remove every template + precompute features for all + four methods, so a request only ever has to process the + single uploaded image. + + per request: bg-remove the upload, then run SIFT / ORB / SuperGlue / + LoFTR one after another. They used to run concurrently + (real wall-clock ~max() instead of sum()), but on an + 8GB card that let SuperGlue and LoFTR hold overlapping + GPU allocations at once, which was enough on its own to + tip into CUDA OOM. Running them sequentially caps peak + GPU memory to whichever single method needs the most, + at the cost of some latency. +""" + +import gc +import logging +import os +import resource +import shutil +import threading +import time +import uuid + +import cv2 +import torch + +import config +from pipeline import (bg_removal, classical, color, color_grid, deep, + flower_count, sam3_client, shape_match, texture_match, + utils, vase_compare, yolo_world) + +logger = logging.getLogger(__name__) + +METHODS = ("SIFT", "ORB", "SuperGlue", "LoFTR") + +_templates_meta = {} # name -> {"original_filename", "nobg_path"} +_bootstrapped = False + +# Serializes each request's pipeline end-to-end. Combined with running the +# four methods sequentially (see below), only one method for one request is +# ever doing heavy CPU/GPU work at any instant across the whole process. +_pipeline_lock = threading.Lock() + + +def bootstrap(): + """Precompute everything template-side. Safe to call more than once; + only does real work the first time.""" + global _bootstrapped + if _bootstrapped: + return + + logger.info("Preparing templates (bg removal + feature precompute for " + "SIFT / ORB / SuperGlue / LoFTR)...") + + for fname in utils.list_template_files(): + name = utils.template_name(fname) + src_path = os.path.join(config.TEMPLATE_IMAGES_DIR, fname) + + rgba = bg_removal.remove_background_file(src_path, config.TEMPLATES_NOBG_CACHE) + bgr, _, mask = bg_removal.split_rgba(rgba) + + kp, des = classical.extract_features("SIFT", bgr, mask) + classical.set_template_features("SIFT", name, kp, des) + + kp, des = classical.extract_features("ORB", bgr, mask) + classical.set_template_features("ORB", name, kp, des) + + deep.set_template_superpoint(name, bgr, mask) + deep.set_template_loftr(name, bgr, mask) + color.set_template_color_data(name, bgr, mask) + shape_match.set_template_shape_data(name, mask) + texture_match.set_template_texture_data(name, bgr, mask) + + _templates_meta[name] = { + "original_filename": fname, + "nobg_path": os.path.join(config.TEMPLATES_NOBG_CACHE, name + ".png"), + } + logger.info(" template ready: %s", name) + + _bootstrapped = True + logger.info("%d templates ready (device: %s).", len(_templates_meta), deep.DEVICE) + + +def templates_meta(): + return _templates_meta + + +def _run_sift(bgr, mask): + kp, des = classical.extract_features("SIFT", bgr, mask) + return classical.match_against_templates("SIFT", kp, des) + + +def _run_orb(bgr, mask): + kp, des = classical.extract_features("ORB", bgr, mask) + return classical.match_against_templates("ORB", kp, des) + + +def _run_superglue(bgr, mask): + return deep.superglue_match_against_templates(bgr, mask) + + +def _run_loftr(bgr, mask): + return deep.loftr_match_against_templates(bgr, mask) + + +_METHOD_RUNNERS = { + "SIFT": _run_sift, + "ORB": _run_orb, + "SuperGlue": _run_superglue, + "LoFTR": _run_loftr, +} + + +def _timed(method, fn, *args): + """Runs one method's matcher, catching any exception so a single + failing method (e.g. a CUDA OOM on an unusual image) is logged and + reported back as a failed card instead of taking the whole request + down with it.""" + start = time.perf_counter() + try: + result = fn(*args) + error = None + except Exception as e: + logger.exception("Method %s failed", method) + result = [] + error = str(e) + elapsed = time.perf_counter() - start + return result, elapsed, error + + +def _overall_best(method_results): + """Borda-count-style aggregate across methods: each method's ranking of + templates contributes points, so one noisy method can't dominate the + call the way a raw-score sum could.""" + points = {} + for method, payload in method_results.items(): + ranked = payload["results"] + n = len(ranked) + for idx, row in enumerate(ranked): + points[row["template"]] = points.get(row["template"], 0) + (n - idx) + + if not points: + return None + return max(points, key=points.get) + + +def _weighted_scores(method_results): + """Literal weighted sum per template: weighted_score(t) = sum_m + WEIGHT[m] * raw_score(m, t). Returns (winning_template_or_None, ranked + list of {"template", "weighted_score", "breakdown"} sorted descending). + A method that errored contributes 0 everywhere (its results list is + empty), it doesn't skew the total.""" + totals = {} + breakdown = {} # template -> {method: contribution} + + for method, payload in method_results.items(): + weight = config.METHOD_WEIGHTS.get(method, 0) + for row in payload["results"]: + template = row["template"] + contribution = weight * row["score"] + totals[template] = totals.get(template, 0.0) + contribution + breakdown.setdefault(template, {})[method] = round(contribution, 2) + + if not totals: + return None, [] + + ranked = sorted( + ( + { + "template": template, + "weighted_score": round(total, 2), + "breakdown": breakdown.get(template, {}), + } + for template, total in totals.items() + ), + key=lambda r: r["weighted_score"], + reverse=True, + ) + return ranked[0]["template"], ranked + + +def _color_as_method_result(color_analysis, elapsed, error): + """Reshapes color.compare_input_to_templates()'s output into the same + {"template", "score", "confidence"} shape the other methods use, so it + can be handed to _weighted_scores() generically -- that's the only + place this participates; it's deliberately kept out of the sequential + METHODS loop (color analysis isn't a GPU/CPU-heavy per-template model + call, no need for that machinery) and out of _overall_best (Borda stays + exactly the original four methods, unchanged).""" + results = [ + {"template": t["template"], "score": t["match_pct"], "confidence": t["match_pct"]} + for t in color_analysis.get("templates", []) + ] + best = results[0] if results else None + return { + "results": results, + "time_sec": elapsed, + "error": error, + "best": best, + "is_confident": bool(best and best["score"] >= config.SCORE_THRESHOLD["Color"]), + "best_image_file": None, + } + + +def _build_family_grid(request_dir, input_bgr, input_mask, weighted_best): + """Purely visual, tied to the weighted-best template only: clusters + both the upload and the winning template into color-region tiles, + renders each as its own side-by-side grid image, and matches up + corresponding regions by color to report an area-match % per region.""" + input_families = color_grid.cluster_families(input_bgr, input_mask) + + template_rgba = cv2.imread( + _templates_meta[weighted_best]["nobg_path"], cv2.IMREAD_UNCHANGED + ) + template_bgr, _, template_mask = bg_removal.split_rgba(template_rgba) + template_families = color_grid.cluster_families(template_bgr, template_mask) + + matches = color_grid.match_families(input_families, template_families) + overall_pct = color_grid.overall_area_match(matches) + + input_grid_file = "input_family_grid.png" + template_grid_file = "template_family_grid.png" + cv2.imwrite(os.path.join(request_dir, input_grid_file), + color_grid.render_family_grid(input_bgr, input_families)) + cv2.imwrite(os.path.join(request_dir, template_grid_file), + color_grid.render_family_grid(template_bgr, template_families)) + + return { + "template": weighted_best, + "input_grid_file": input_grid_file, + "template_grid_file": template_grid_file, + "overall_area_match_pct": overall_pct, + "matches": matches, + "error": None, + } + + +def _build_shape_visuals(request_dir, input_shape_data, weighted_best): + """Purely visual, tied to the weighted-best template: renders both + silhouettes (normalized into the same canvas) side by side plus an + overlay highlighting exactly where they agree/diverge.""" + template_shape_data = shape_match._template_shape_data.get(weighted_best) + if template_shape_data is None: + return None + + input_file = "input_silhouette.png" + template_file = "template_silhouette.png" + overlay_file = "shape_overlay.png" + cv2.imwrite(os.path.join(request_dir, input_file), + shape_match.render_silhouette(input_shape_data["canonical_mask"], + shape_match._INPUT_COLOR)) + cv2.imwrite(os.path.join(request_dir, template_file), + shape_match.render_silhouette(template_shape_data["canonical_mask"], + shape_match._TEMPLATE_COLOR)) + cv2.imwrite(os.path.join(request_dir, overlay_file), + shape_match.render_overlay(input_shape_data["canonical_mask"], + template_shape_data["canonical_mask"])) + + return { + "input_file": input_file, + "template_file": template_file, + "overlay_file": overlay_file, + } + + +def _build_texture_visuals(request_dir, input_texture_data, weighted_best): + """Purely visual, tied to the weighted-best template: renders both + images' LBP (local micro-pattern) maps side by side.""" + template_texture_data = texture_match._template_texture_data.get(weighted_best) + if template_texture_data is None: + return None + + input_file = "input_lbp.png" + template_file = "template_lbp.png" + cv2.imwrite(os.path.join(request_dir, input_file), + texture_match.render_lbp_visual(input_texture_data["lbp_image"], + input_texture_data["mask_bool"])) + cv2.imwrite(os.path.join(request_dir, template_file), + texture_match.render_lbp_visual(template_texture_data["lbp_image"], + template_texture_data["mask_bool"])) + + return { + "input_file": input_file, + "template_file": template_file, + } + + +def _cleanup_old_uploads(): + if not os.path.isdir(config.UPLOADS_DIR): + return + cutoff = time.time() - config.MAX_UPLOAD_AGE_SECONDS + for entry in os.listdir(config.UPLOADS_DIR): + path = os.path.join(config.UPLOADS_DIR, entry) + try: + if os.path.isdir(path) and os.path.getmtime(path) < cutoff: + shutil.rmtree(path, ignore_errors=True) + except OSError: + pass + + +def _peak_rss_mb(): + # ru_maxrss is KB on Linux, bytes on macOS -- this app only targets Linux. + return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024 + + +def _release_resources(): + """Best-effort cleanup between requests. gc.collect() drops any + lingering numpy/cv2/torch objects promptly instead of waiting for the + next allocation to trigger a cycle; empty_cache() hands unused *cached* + CUDA blocks back to the driver so nvidia-smi/other processes see them + freed (it does not, and cannot, free host RAM).""" + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + + +def _build_flower_count_comparison(input_count, template_count, template): + diff = input_count - template_count + if diff == 0: + message = ( + f"Your upload and {template} both show {input_count} flowers -- " + f"flower count doesn't look like a factor in the match score here." + ) + else: + more_fewer = "more" if diff > 0 else "fewer" + message = ( + f"Your upload has {input_count} flowers detected vs {template_count} in " + f"{template} -- {abs(diff)} {more_fewer}. No method above scores flower " + f"count directly, but a mismatch like this usually also lowers the " + f"keypoint (SIFT/ORB/SuperGlue/LoFTR) and shape/texture scores, since " + f"there's simply more or less bouquet for them to match against -- so " + f"it's often part of why the overall match isn't higher." + ) + return { + "input_count": input_count, + "template_count": template_count, + "diff": diff, + "message": message, + "error": None, + } + + +def count_flowers(request_id: str, template: str = None) -> dict: + """On-demand flower counting for an already-processed upload, via two + independent methods shown side by side, plus (if a matched template + name is given) a vase-identity comparison: + + - SAM3 (instance segmentation): finds individual flower-shaped + regions by prompting SAM3 with the plain-English concept "flower". + Unlike SAM1's old "segment everything, then guess" approach, this + never proposes the vase or any ribbon/bow in the first place -- no + exclude-box filtering needed. Runs as a subprocess into a separate + Python 3.10 env (see pipeline/sam3_client.py) since transformers' + Sam3Model needs Python>=3.10, incompatible with this app's own env. + The same subprocess call also fetches SAM3's "vase" mask for the + upload (and the template's, if a match is known) for the vase + comparison below -- one model load covers every job. + - YOLO-World (open-vocabulary detection): independent second opinion, + unchanged from before -- its own "flower"/"vase"/"ribbon"/"bow" + counts and box visualization, shown as its own coarser corroborating + signal (one box per contiguous flower region, not per bloom). + - Vase comparison (DINOv2 + CLIP): crops the vase out of the upload + and the matched template using SAM3's precise masks (background + pixels inside the crop are blacked out, so the embeddings only see + the vase itself), then embeds both crops with DINOv2 (fine detail) + and CLIP (holistic/semantic) and reports a same/uncertain/different + verdict. Skipped (not an error) if no vase was detected on either + side. + + Heavyweight and strictly opt-in -- triggered only by its own UI button, + never run as part of process_upload. Unloads the matching pipeline's own + GPU-resident models first (SuperPoint/LightGlue/LoFTR, rembg's + onnxruntime session) so YOLO-World/DINOv2/CLIP never have to share the + 8GB card with them (SAM3 runs in its own process/env regardless), then + unloads YOLO-World/DINOv2/CLIP again afterward -- everything lazily + reloads itself on whichever request needs it next, exactly like a fresh + process start would.""" + request_dir = os.path.join(config.UPLOADS_DIR, request_id) + nobg_path = os.path.join(request_dir, "nobg.png") + if not os.path.isfile(nobg_path): + raise FileNotFoundError(f"no processed upload found for request {request_id}") + + with _pipeline_lock: + start = time.perf_counter() + rgba = cv2.imread(nobg_path, cv2.IMREAD_UNCHANGED) + bgr, _, mask = bg_removal.split_rgba(rgba) + + freed_deep = deep.unload_models() + freed_rembg = bg_removal.unload_session() + if freed_deep or freed_rembg: + logger.info("[%s] unloaded matching-pipeline models before " + "SAM3/YOLO-World/DINO/CLIP run", request_id) + + try: + by_class = yolo_world.detect(bgr) + yolo_error = None + except Exception as e: + logger.exception("[%s] YOLO-World detection failed", request_id) + by_class = {} + yolo_error = str(e) + + template_bgr = None + template_mask = None + if template is not None and template in _templates_meta: + template_rgba = cv2.imread( + _templates_meta[template]["nobg_path"], cv2.IMREAD_UNCHANGED + ) + template_bgr, _, template_mask = bg_removal.split_rgba(template_rgba) + + sam3_images = {"input": bgr} + sam3_jobs = [ + {"image": "input", "prompt": config.SAM3_FLOWER_PROMPT, + "threshold": config.SAM3_FLOWER_THRESHOLD}, + {"image": "input", "prompt": config.SAM3_VASE_PROMPT, + "threshold": config.SAM3_VASE_THRESHOLD}, + ] + if template_bgr is not None: + sam3_images["template"] = template_bgr + sam3_jobs.append({"image": "template", "prompt": config.SAM3_VASE_PROMPT, + "threshold": config.SAM3_VASE_THRESHOLD}) + # Also count flowers in the template photo itself (same "flower" + # concept prompt) -- lets the UI tell the user when a lower match + # score might partly be explained by a different flower count, + # rather than leaving that as an unexplained low number. + sam3_jobs.append({"image": "template", "prompt": config.SAM3_FLOWER_PROMPT, + "threshold": config.SAM3_FLOWER_THRESHOLD}) + + try: + sam3_result = sam3_client.run_jobs(sam3_images, sam3_jobs, workdir=request_dir) + sam3_error = None + except Exception as e: + logger.exception("[%s] SAM3 failed", request_id) + sam3_result = {} + sam3_error = str(e) + + try: + flower_instances = sam3_result.get(("input", config.SAM3_FLOWER_PROMPT), []) + count_data = flower_count.count_flowers(bgr, mask, request_dir, + instances_raw=flower_instances) + sam_error = sam3_error + except Exception as e: + logger.exception("[%s] flower counting (SAM3) failed", request_id) + count_data = {"total_count": 0, "clusters": []} + sam_error = sam3_error or str(e) + + sam_visual_file = None + if sam_error is None: + try: + visual = flower_count.render_instances(bgr, count_data) + sam_visual_file = "flower_count_sam.png" + cv2.imwrite(os.path.join(request_dir, sam_visual_file), visual) + except Exception: + logger.exception("[%s] SAM3 flower count visualization failed", request_id) + + # Same flower-instance segmentation, run on the matched template's + # own photo -- lets callers (the web UI's mismatch note, tester.py's + # report image) show/compare "your photo's flowers" side by side + # with "the template's flowers", not just two bare numbers. + template_count_data = {"total_count": 0, "clusters": []} + template_sam_visual_file = None + template_sam_error = None + if template_bgr is not None and template_mask is not None: + if sam3_error is not None: + template_sam_error = sam3_error + else: + try: + template_flower_instances = sam3_result.get( + ("template", config.SAM3_FLOWER_PROMPT), [] + ) + template_count_data = flower_count.count_flowers( + template_bgr, template_mask, request_dir, + instances_raw=template_flower_instances, + ) + visual = flower_count.render_instances(template_bgr, template_count_data) + template_sam_visual_file = "flower_count_sam_template.png" + cv2.imwrite(os.path.join(request_dir, template_sam_visual_file), visual) + except Exception as e: + logger.exception("[%s] template flower count failed", request_id) + template_sam_error = str(e) + + yolo_visual_file = None + if yolo_error is None: + try: + yolo_overlay = yolo_world.render_boxes(bgr, by_class) + yolo_visual_file = "flower_count_yolo.png" + cv2.imwrite(os.path.join(request_dir, yolo_visual_file), yolo_overlay) + except Exception: + logger.exception("[%s] YOLO-World visualization failed", request_id) + + # Vase-identity comparison: needs a matched template name and a vase + # mask on both sides (from the batched SAM3 call above). Soft- + # skipped (not an error) if either is missing -- e.g. a weak/no + # match, or a photo where SAM3 simply didn't find the vase. + input_vase_instances = sam3_result.get(("input", config.SAM3_VASE_PROMPT), []) + vase_comparison = None + if template is not None and sam3_error is not None: + vase_comparison = {"error": f"SAM3 unavailable: {sam3_error}"} + elif template is not None and not input_vase_instances: + vase_comparison = {"error": "No vase detected in your upload."} + elif template is not None and template_bgr is not None: + try: + template_vase_instances = sam3_result.get( + ("template", config.SAM3_VASE_PROMPT), [] + ) + if not template_vase_instances: + vase_comparison = {"error": "No vase detected in the matched template photo."} + else: + input_vase_mask = max(input_vase_instances, key=lambda i: i["score"])["mask"] + template_vase_mask = max(template_vase_instances, key=lambda i: i["score"])["mask"] + input_vase_crop = vase_compare.crop_mask(bgr, input_vase_mask) + template_vase_crop = vase_compare.crop_mask(template_bgr, template_vase_mask) + + result = vase_compare.compare_vases(input_vase_crop, template_vase_crop) + input_crop_file = "vase_crop_input.png" + template_crop_file = "vase_crop_template.png" + cv2.imwrite(os.path.join(request_dir, input_crop_file), input_vase_crop) + cv2.imwrite(os.path.join(request_dir, template_crop_file), template_vase_crop) + vase_comparison = { + **result, + "template": template, + "input_crop_file": input_crop_file, + "template_crop_file": template_crop_file, + "error": None, + } + except Exception as e: + logger.exception("[%s] vase comparison failed", request_id) + vase_comparison = {"error": str(e)} + + # Flower-count comparison: surfaces a plain-English explanation when + # the upload and the matched template simply have different numbers + # of flowers -- none of SIFT/ORB/SuperGlue/LoFTR/shape/texture score + # "flower count" directly, so a lower match score caused mostly by a + # count mismatch would otherwise look unexplained to the user. + flower_count_comparison = None + if template is not None and template_sam_error is None and template_bgr is not None: + flower_count_comparison = _build_flower_count_comparison( + count_data.get("total_count", 0), template_count_data.get("total_count", 0), template + ) + elif template is not None and template_sam_error is not None: + flower_count_comparison = {"error": f"SAM3 unavailable: {template_sam_error}"} + + yolo_world.unload_model() + vase_compare.unload_models() + _release_resources() + elapsed = time.perf_counter() - start + logger.info( + "[%s] flower count: %.2fs, SAM3 total=%s, YOLO flower/vase/ribbon=%s/%s/%s, " + "vase comparison=%s", + request_id, elapsed, count_data.get("total_count"), + len(by_class.get("flower", [])), len(by_class.get("vase", [])), + len(by_class.get("ribbon", [])) + len(by_class.get("bow", [])), + vase_comparison.get("verdict") if vase_comparison and not vase_comparison.get("error") else None, + ) + + return { + "sam": { + "total_count": count_data.get("total_count", 0), + "clusters": count_data.get("clusters", []), + "visual_file": sam_visual_file, + "error": sam_error, + }, + "sam_template": { + "total_count": template_count_data.get("total_count", 0), + "clusters": template_count_data.get("clusters", []), + "visual_file": template_sam_visual_file, + "error": template_sam_error, + }, + "yolo": { + "flower_count": len(by_class.get("flower", [])), + "vase_count": len(by_class.get("vase", [])), + "ribbon_count": len(by_class.get("ribbon", [])) + len(by_class.get("bow", [])), + "visual_file": yolo_visual_file, + "error": yolo_error, + }, + "vase_comparison": vase_comparison, + "flower_count_comparison": flower_count_comparison, + "time_sec": round(elapsed, 3), + } + + +def flower_summary(request_id: str, template: str) -> dict: + """Lightweight companion to the weighted verdict, shown automatically + right beside it (not behind the opt-in "Count flowers" button) as soon + as a confident match is found: just the flower-count comparison (same + message as count_flowers' version) plus a CLIP-only similarity of the + flower material itself (SAM3's "flower" masks on both sides, unioned + and background-blacked-out, then embedded with CLIP alone). + + Deliberately skips YOLO-World, DINOv2, and the vase comparison -- those + stay behind the button since this one runs unconditionally on every + confident match and should stay as fast as a SAM3 round trip allows. + Still needs the matching pipeline's GPU-resident models unloaded first, + same as count_flowers.""" + request_dir = os.path.join(config.UPLOADS_DIR, request_id) + nobg_path = os.path.join(request_dir, "nobg.png") + if not os.path.isfile(nobg_path): + raise FileNotFoundError(f"no processed upload found for request {request_id}") + if template not in _templates_meta: + raise ValueError(f"unknown template {template!r}") + + with _pipeline_lock: + rgba = cv2.imread(nobg_path, cv2.IMREAD_UNCHANGED) + bgr, _, mask = bg_removal.split_rgba(rgba) + template_rgba = cv2.imread( + _templates_meta[template]["nobg_path"], cv2.IMREAD_UNCHANGED + ) + template_bgr, _, template_mask = bg_removal.split_rgba(template_rgba) + + freed_deep = deep.unload_models() + freed_rembg = bg_removal.unload_session() + if freed_deep or freed_rembg: + logger.info("[%s] unloaded matching-pipeline models before flower summary", + request_id) + + count_comparison = None + clip_pct = None + error = None + try: + sam3_result = sam3_client.run_jobs( + images={"input": bgr, "template": template_bgr}, + jobs=[ + {"image": "input", "prompt": config.SAM3_FLOWER_PROMPT, + "threshold": config.SAM3_FLOWER_THRESHOLD}, + {"image": "template", "prompt": config.SAM3_FLOWER_PROMPT, + "threshold": config.SAM3_FLOWER_THRESHOLD}, + ], + workdir=request_dir, + ) + input_instances = sam3_result.get(("input", config.SAM3_FLOWER_PROMPT), []) + template_instances = sam3_result.get(("template", config.SAM3_FLOWER_PROMPT), []) + + input_data = flower_count.count_flowers(bgr, mask, request_dir, + instances_raw=input_instances) + template_data = flower_count.count_flowers(template_bgr, template_mask, request_dir, + instances_raw=template_instances) + count_comparison = _build_flower_count_comparison( + input_data["total_count"], template_data["total_count"], template + ) + + input_union = flower_count.union_mask(input_data["_instance_masks"]) + template_union = flower_count.union_mask(template_data["_instance_masks"]) + if input_union is not None and template_union is not None: + input_crop = vase_compare.crop_mask(bgr, input_union) + template_crop = vase_compare.crop_mask(template_bgr, template_union) + if input_crop is not None and template_crop is not None: + clip_pct = vase_compare.clip_similarity_pct(input_crop, template_crop) + except Exception as e: + logger.exception("[%s] flower summary failed", request_id) + error = str(e) + + vase_compare.unload_models() + _release_resources() + + return { + "flower_count_comparison": count_comparison, + "flower_clip_similarity_pct": clip_pct, + "error": error, + } + + +def process_upload(image_bytes: bytes, orig_filename: str) -> dict: + bootstrap() + _cleanup_old_uploads() + + request_id = uuid.uuid4().hex[:12] + logger.info("[%s] new upload: %r (%.1f KB)", request_id, orig_filename, + len(image_bytes) / 1024) + + with _pipeline_lock: + try: + result = _process_upload_locked(request_id, image_bytes, orig_filename) + except Exception: + logger.exception("[%s] pipeline failed", request_id) + raise + finally: + _release_resources() + logger.info("[%s] done, peak RSS so far: %.0f MB", request_id, _peak_rss_mb()) + + return result + + +def _process_upload_locked(request_id: str, image_bytes: bytes, orig_filename: str) -> dict: + request_dir = os.path.join(config.UPLOADS_DIR, request_id) + os.makedirs(request_dir, exist_ok=True) + + total_start = time.perf_counter() + + ext = os.path.splitext(orig_filename)[1].lower() or ".png" + original_path = os.path.join(request_dir, "original" + ext) + with open(original_path, "wb") as f: + f.write(image_bytes) + + bg_start = time.perf_counter() + rgba, _ = bg_removal.remove_background_bytes(image_bytes, config.UPLOADS_NOBG_CACHE) + bg_elapsed = time.perf_counter() - bg_start + logger.info("[%s] background removal: %.2fs", request_id, bg_elapsed) + bgr, _, mask = bg_removal.split_rgba(rgba) + + nobg_path = os.path.join(request_dir, "nobg.png") + cv2.imwrite(nobg_path, rgba) + + method_results = {} + for method in METHODS: + results, elapsed, error = _timed(method, _METHOD_RUNNERS[method], bgr, mask) + method_results[method] = {"results": results, "time_sec": elapsed, "error": error} + logger.info("[%s] %s: %.2fs%s", request_id, method, elapsed, + f" (FAILED: {error})" if error else "") + # Free this method's GPU allocations before the next one runs rather + # than waiting until the whole request finishes -- SuperGlue and + # LoFTR are the two that actually use the GPU, and freeing between + # them keeps their peak allocations from ever coexisting. + if torch.cuda.is_available(): + torch.cuda.empty_cache() + + for method, payload in method_results.items(): + results = payload["results"] + best = results[0] if results else None + payload["best"] = best + payload["is_confident"] = bool( + best and best["score"] >= config.SCORE_THRESHOLD[method] + ) + if best is not None: + template_bgr = cv2.imread( + _templates_meta[best["template"]]["nobg_path"], cv2.IMREAD_UNCHANGED + ) + annotated = utils.annotate_score( + template_bgr, best["score"], best["confidence"], + label=config.METHOD_LABELS[method], + ) + out_name = f"{method}_best.png" + cv2.imwrite(os.path.join(request_dir, out_name), annotated) + payload["best_image_file"] = out_name + + # Color-space comparison: its own section in the UI (independent of the + # method-grid cards above), but also folded into the weighted verdict + # below via config.METHOD_WEIGHTS["Color"]. A failure here shouldn't + # take down a request that otherwise succeeded. + color_start = time.perf_counter() + try: + color_analysis = color.compare_input_to_templates(bgr, mask) + color_error = None + except Exception as e: + logger.exception("[%s] color analysis failed", request_id) + color_analysis = {"input_dominant_colors": [], "templates": []} + color_error = str(e) + color_elapsed = time.perf_counter() - color_start + logger.info("[%s] color analysis: %.2fs%s", request_id, color_elapsed, + f" (FAILED: {color_error})" if color_error else "") + + # Shape matching (silhouette/contour, via Hu moments + canonical-aligned + # IoU) and texture matching (LBP + GLCM/Haralick) -- both independent + # sections, like color space: never fed into weighting or any score. + shape_start = time.perf_counter() + try: + input_shape_data, shape_results = shape_match.compare_to_templates(mask) + shape_error = None + except Exception as e: + logger.exception("[%s] shape analysis failed", request_id) + input_shape_data, shape_results = None, [] + shape_error = str(e) + shape_elapsed = time.perf_counter() - shape_start + logger.info("[%s] shape analysis: %.2fs%s", request_id, shape_elapsed, + f" (FAILED: {shape_error})" if shape_error else "") + + texture_start = time.perf_counter() + try: + input_texture_data, texture_results = texture_match.compare_to_templates(bgr, mask) + texture_error = None + except Exception as e: + logger.exception("[%s] texture analysis failed", request_id) + input_texture_data, texture_results = None, [] + texture_error = str(e) + texture_elapsed = time.perf_counter() - texture_start + logger.info("[%s] texture analysis: %.2fs%s", request_id, texture_elapsed, + f" (FAILED: {texture_error})" if texture_error else "") + + # Only used for weighting/the returned "methods" dict (so the frontend + # can look up Color's raw score for the weighted-breakdown display) -- + # NOT rendered as a 5th method-grid card, and NOT part of _overall_best. + methods_with_color = dict(method_results) + methods_with_color["Color"] = _color_as_method_result(color_analysis, color_elapsed, color_error) + + weighted_best, weighted_scores = _weighted_scores(methods_with_color) + + # Color family grid: purely visual, tied to whichever template the + # weighted verdict landed on. Skipped if there's no confident match at + # all (nothing to compare against). A failure here is likewise soft. + family_grid = None + if weighted_best is not None: + try: + family_grid = _build_family_grid(request_dir, bgr, mask, weighted_best) + except Exception as e: + logger.exception("[%s] family grid failed", request_id) + family_grid = {"error": str(e)} + + # Shape/texture visuals: same "tied to whichever template the weighted + # verdict landed on" convention as the color family grid. + shape_visuals = None + if weighted_best is not None and input_shape_data is not None: + try: + shape_visuals = _build_shape_visuals(request_dir, input_shape_data, weighted_best) + except Exception as e: + logger.exception("[%s] shape visuals failed", request_id) + shape_visuals = None + + texture_visuals = None + if weighted_best is not None and input_texture_data is not None: + try: + texture_visuals = _build_texture_visuals(request_dir, input_texture_data, weighted_best) + except Exception as e: + logger.exception("[%s] texture visuals failed", request_id) + texture_visuals = None + + total_elapsed = time.perf_counter() - total_start + logger.info("[%s] total: %.2fs, weighted best: %s", request_id, total_elapsed, weighted_best) + + return { + "request_id": request_id, + "upload_nobg_file": "nobg.png", + "upload_original_file": os.path.basename(original_path), + "bg_removal_time_sec": round(bg_elapsed, 3), + "total_time_sec": round(total_elapsed, 3), + "overall_best": _overall_best(method_results), + "method_weights": config.METHOD_WEIGHTS, + "weighted_best": weighted_best, + "weighted_scores": weighted_scores, + "color_analysis": color_analysis, + "color_analysis_time_sec": round(color_elapsed, 3), + "color_analysis_error": color_error, + "family_grid": family_grid, + "shape_analysis": { + "results": shape_results, + "time_sec": round(shape_elapsed, 3), + "error": shape_error, + "visuals": shape_visuals, + }, + "texture_analysis": { + "results": texture_results, + "time_sec": round(texture_elapsed, 3), + "error": texture_error, + "visuals": texture_visuals, + }, + "methods": { + method: { + "label": config.METHOD_LABELS[method], + "time_sec": round(payload["time_sec"], 3), + "best": payload["best"], + "is_confident": payload["is_confident"], + "best_image_file": payload.get("best_image_file"), + "results": payload["results"], + "error": payload["error"], + } + for method, payload in methods_with_color.items() + }, + } diff --git a/pipeline/flower_count.py b/pipeline/flower_count.py new file mode 100644 index 0000000..98bdfe5 --- /dev/null +++ b/pipeline/flower_count.py @@ -0,0 +1,138 @@ +""" +Flower-instance counting via SAM3 (facebook/sam3), prompted with the plain- +English concept "flower". See pipeline/sam3_client.py (and config.py's SAM3 +section) for why this runs as a one-shot subprocess into a separate Python +3.10 environment rather than an in-process model call. + +Unlike the earlier approach (SAM1 in automatic "segment everything" mode, +then guessing which proposals were flowers from size/position heuristics +and excluding boxes YOLO-World identified as vase/ribbon), SAM3's concept +prompting does the semantic part itself: prompted with "flower", it simply +never proposes the vase or any ribbon/bow in the first place. What's left +here is only: a light sanity filter (the instance must actually overlap the +already-known foreground), then color-clustering the survivors as a rough +proxy for distinct flower "kinds" -- there's still no trained species +classifier, just an assumption that different flower types usually differ +in color. +""" + +import logging + +import cv2 +import numpy as np + +import config +from pipeline import sam3_client + +logger = logging.getLogger(__name__) + + +def union_mask(instance_masks): + """OR-combines every per-flower instance mask into one -- "all the + flower material, regardless of which bloom it belongs to". Used to crop + just the flowers (excluding vase/ribbon/background) out of a photo for + the CLIP flower-similarity check. Returns None if there are no + instances to combine.""" + if not instance_masks: + return None + union = instance_masks[0].copy() + for m in instance_masks[1:]: + union |= m + return union + + +def count_flowers(bgr, mask, workdir, image_key="input", instances_raw=None): + """instances_raw, if given, reuses SAM3 results already fetched by the + caller (engine.py batches the "flower" job for the upload together with + any "vase" jobs into a single sam3_client.run_jobs() call so the model + only loads once per request); otherwise fetches them here standalone.""" + fg_area = int((mask > 0).sum()) + if fg_area == 0: + return {"total_count": 0, "clusters": [], "_instance_masks": [], "_cluster_of_instance": []} + + if instances_raw is None: + result = sam3_client.run_jobs( + images={image_key: bgr}, + jobs=[{"image": image_key, "prompt": config.SAM3_FLOWER_PROMPT, + "threshold": config.SAM3_FLOWER_THRESHOLD}], + workdir=workdir, + ) + instances_raw = result.get((image_key, config.SAM3_FLOWER_PROMPT), []) + + # Light sanity filter only -- SAM3 already did the semantic work of + # "is this a flower", this just guards against a stray instance + # entirely outside the known foreground (shouldn't happen against an + # already background-removed image, but costs nothing to check). + instance_masks = [ + inst["mask"] for inst in instances_raw + if np.logical_and(inst["mask"], mask > 0).any() + ] + + # Color-cluster the surviving instances as a proxy for distinct flower + # "kinds" -- same idea as the color-family grid elsewhere in this app + # (pipeline/color_grid.py), just applied per-instance instead of + # per-pixel-region. + avg_colors_lab = [] + for m in instance_masks: + pixels = bgr[m].reshape(-1, 1, 3).astype(np.uint8) + lab = cv2.cvtColor(pixels, cv2.COLOR_BGR2LAB).reshape(-1, 3) + avg_colors_lab.append(lab.mean(axis=0)) + + clusters = [] + cluster_of_instance = [] + if avg_colors_lab: + pts = np.array(avg_colors_lab, dtype=np.float32) + k = min(config.SAM_MAX_KIND_CLUSTERS, len(pts)) + if k <= 1: + labels = np.zeros(len(pts), dtype=int) + centers = pts + else: + criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.5) + _, labels, centers = cv2.kmeans(pts, k, None, criteria, 5, cv2.KMEANS_PP_CENTERS) + labels = labels.flatten() + cluster_of_instance = labels.tolist() + for c in range(len(centers)): + count = int((labels == c).sum()) + if count == 0: + continue + lab_center = centers[c].reshape(1, 1, 3).astype(np.uint8) + bgr_center = cv2.cvtColor(lab_center, cv2.COLOR_LAB2BGR)[0, 0] + clusters.append({ + "count": count, + "color_rgb": [int(bgr_center[2]), int(bgr_center[1]), int(bgr_center[0])], + }) + clusters.sort(key=lambda c: c["count"], reverse=True) + + return { + "total_count": len(instance_masks), + "clusters": clusters, + "_instance_masks": instance_masks, + "_cluster_of_instance": cluster_of_instance, + } + + +_PALETTE = [ + (66, 133, 244), (219, 68, 55), (244, 180, 0), (15, 157, 88), + (171, 71, 188), (255, 112, 67), (0, 172, 193), (158, 157, 36), +] + + +def render_instances(bgr, count_data): + """Overlays a translucent, distinctly-colored fill per detected flower + instance (color = its cluster/"kind") plus its index, so the count is + visually verifiable rather than just a bare number.""" + overlay = bgr.copy() + instance_masks = count_data.get("_instance_masks", []) + cluster_of_instance = count_data.get("_cluster_of_instance", []) + for idx, m in enumerate(instance_masks): + cluster_id = cluster_of_instance[idx] if idx < len(cluster_of_instance) else idx + color = np.array(_PALETTE[cluster_id % len(_PALETTE)], dtype=np.float32) + overlay[m] = (color * 0.55 + overlay[m].astype(np.float32) * 0.45).astype(np.uint8) + ys, xs = np.nonzero(m) + if len(xs): + cx, cy = int(xs.mean()), int(ys.mean()) + cv2.putText(overlay, str(idx + 1), (cx - 8, cy + 6), + cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2, cv2.LINE_AA) + cv2.putText(overlay, str(idx + 1), (cx - 8, cy + 6), + cv2.FONT_HERSHEY_SIMPLEX, 0.6, (30, 30, 30), 1, cv2.LINE_AA) + return overlay diff --git a/pipeline/sam3_client.py b/pipeline/sam3_client.py new file mode 100644 index 0000000..966ead5 --- /dev/null +++ b/pipeline/sam3_client.py @@ -0,0 +1,103 @@ +""" +Bridge from the main app (torch17_new, Python 3.8) to SAM3 (sam3_worker.py, +run under sam2_env's Python 3.10 -- see config.py's SAM3 section for why +this has to be a subprocess rather than an in-process import). + +One subprocess invocation can batch multiple (image, prompt) jobs -- e.g. +"flower" on the upload and "vase" on both the upload and the matched +template -- so the ~6s model load only happens once per request, not once +per job. +""" + +import json +import logging +import os +import shutil +import subprocess +import uuid + +import cv2 +import numpy as np + +import config + +logger = logging.getLogger(__name__) + + +class Sam3Error(RuntimeError): + pass + + +def run_jobs(images: dict, jobs: list, workdir: str) -> dict: + """images: {image_key: bgr_ndarray}. jobs: [{"image": key, "prompt": str, + "threshold": float}, ...]. Returns {(image_key, prompt): [{"mask": bool + ndarray, "score": float, "box": [x1,y1,x2,y2] or None}, ...]}. + + Raises Sam3Error on any failure (missing token, subprocess crash, + timeout, malformed response) -- callers treat this the same as any + other soft/optional-feature failure (caught, logged, reported back as + an error string, never taking the whole request down).""" + if not config.HF_TOKEN: + raise Sam3Error( + "No HF_TOKEN found (checked environment and .env) -- SAM3's " + "weights are gated on Hugging Face and can't be downloaded " + "without an access-granted token." + ) + + request_dir = os.path.join(workdir, f"sam3_{uuid.uuid4().hex[:8]}") + os.makedirs(request_dir, exist_ok=True) + try: + image_paths = {} + for key, bgr in images.items(): + path = os.path.join(request_dir, f"{key}.png") + cv2.imwrite(path, bgr) + image_paths[key] = path + + output_dir = os.path.join(request_dir, "out") + request = {"images": image_paths, "jobs": jobs, "output_dir": output_dir} + request_path = os.path.join(request_dir, "request.json") + with open(request_path, "w") as f: + json.dump(request, f) + + env = dict(os.environ) + env["HF_TOKEN"] = config.HF_TOKEN + + proc = subprocess.run( + [config.SAM3_PYTHON_BIN, config.SAM3_WORKER_SCRIPT, "--request", request_path], + capture_output=True, text=True, timeout=config.SAM3_TIMEOUT_SECONDS, env=env, + ) + + response_path = os.path.join(output_dir, "response.json") + if not os.path.isfile(response_path): + raise Sam3Error( + f"SAM3 worker produced no response (exit {proc.returncode}): " + f"{proc.stderr[-2000:] if proc.stderr else '(no stderr)'}" + ) + + with open(response_path) as f: + response = json.load(f) + + if response.get("error"): + raise Sam3Error(f"SAM3 worker failed: {response['error'][:2000]}") + + out = {} + for entry in response["results"]: + key = (entry["image"], entry["prompt"]) + instances = [] + for inst in entry["instances"]: + mask_path = os.path.join(output_dir, inst["mask_file"]) + mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) + if mask is None: + continue + instances.append({ + "mask": mask > 127, + "score": inst["score"], + "box": inst.get("box"), + }) + out[key] = instances + return out + + except subprocess.TimeoutExpired as e: + raise Sam3Error(f"SAM3 worker timed out after {config.SAM3_TIMEOUT_SECONDS}s") from e + finally: + shutil.rmtree(request_dir, ignore_errors=True) diff --git a/pipeline/shape_match.py b/pipeline/shape_match.py new file mode 100644 index 0000000..a6c654b --- /dev/null +++ b/pipeline/shape_match.py @@ -0,0 +1,135 @@ +""" +Shape matching: compares the overall silhouette/contour of the uploaded +arrangement against each template -- independent of color and of the local +keypoint/texture matching SIFT/ORB/SuperGlue/LoFTR do. Two complementary +signals, both standard, well-established methods (no deep learning needed +for this): + + - cv2.matchShapes (built on Hu moments): translation/rotation/scale + invariant shape-distance between the two contours' raw geometry. + - Silhouette IoU after canonical alignment: crop each mask to its own + bounding box, resize+center into a fixed canvas, then measure direct + pixel overlap -- catches proportion/aspect differences Hu moments can + miss, and doubles as the visual side-by-side/overlay image. + +Purely informational, its own section: never feeds into any score. +""" + +import logging + +import cv2 +import numpy as np + +import config + +logger = logging.getLogger(__name__) + +_template_shape_data = {} # name -> {"contour": ndarray|None, "canonical_mask": HxW bool} + + +def _largest_contour(mask): + contours, _ = cv2.findContours(mask.astype(np.uint8), cv2.RETR_EXTERNAL, + cv2.CHAIN_APPROX_SIMPLE) + if not contours: + return None + return max(contours, key=cv2.contourArea) + + +def _canonical_silhouette(mask): + """Crops to the mask's bounding box, then resizes+centers it into a + fixed square canvas preserving aspect ratio -- so silhouettes are + directly visually/IoU comparable regardless of the original photo's + scale, crop, or resolution.""" + size = config.SHAPE_CANONICAL_SIZE + ys, xs = np.where(mask > 0) + if len(ys) == 0: + return np.zeros((size, size), dtype=bool) + + y0, y1, x0, x1 = ys.min(), ys.max(), xs.min(), xs.max() + cropped = (mask[y0:y1 + 1, x0:x1 + 1] > 0).astype(np.uint8) * 255 + + h, w = cropped.shape + scale = (size * 0.9) / max(h, w) + new_w, new_h = max(1, int(w * scale)), max(1, int(h * scale)) + resized = cv2.resize(cropped, (new_w, new_h), interpolation=cv2.INTER_NEAREST) + + canvas = np.zeros((size, size), dtype=np.uint8) + y_off = (size - new_h) // 2 + x_off = (size - new_w) // 2 + canvas[y_off:y_off + new_h, x_off:x_off + new_w] = resized + return canvas > 0 + + +def compute_shape_data(mask): + return { + "contour": _largest_contour(mask), + "canonical_mask": _canonical_silhouette(mask), + } + + +def set_template_shape_data(name, mask): + _template_shape_data[name] = compute_shape_data(mask) + + +def _hu_similarity_pct(contour_a, contour_b): + if contour_a is None or contour_b is None: + return 0.0 + dist = cv2.matchShapes(contour_a, contour_b, cv2.CONTOURS_MATCH_I1, 0.0) + return max(0.0, 100.0 * (1 - dist / config.SHAPE_HU_DISTANCE_SCALE)) + + +def _iou_pct(mask_a, mask_b): + inter = np.logical_and(mask_a, mask_b).sum() + union = np.logical_or(mask_a, mask_b).sum() + return (float(inter) / float(union) * 100.0) if union > 0 else 0.0 + + +def compare_to_templates(mask): + """Returns (input_shape_data, ranked_results) -- results sorted by + match_pct descending, one entry per template with the Hu-based and + IoU-based sub-scores broken out too.""" + input_data = compute_shape_data(mask) + + results = [] + for name, tdata in _template_shape_data.items(): + hu_sim = _hu_similarity_pct(input_data["contour"], tdata["contour"]) + iou = _iou_pct(input_data["canonical_mask"], tdata["canonical_mask"]) + match_pct = round((hu_sim + iou) / 2, 1) + results.append({ + "template": name, + "match_pct": match_pct, + "hu_similarity_pct": round(hu_sim, 1), + "iou_pct": round(iou, 1), + }) + results.sort(key=lambda r: r["match_pct"], reverse=True) + return input_data, results + + +# --------------------------------------------------------------- +# Visuals: two normalized silhouettes side by side + an overlay showing +# exactly where they agree/diverge. +# --------------------------------------------------------------- + +_BG = (24, 22, 19) +_INPUT_COLOR = (118, 143, 124) # BGR -- matches the site's --sage +_TEMPLATE_COLOR = (90, 122, 185) # BGR -- matches the site's --terracotta +_OVERLAP_COLOR = (150, 205, 200) + + +def render_silhouette(canonical_mask, color=_INPUT_COLOR): + size = config.SHAPE_CANONICAL_SIZE + img = np.full((size, size, 3), _BG, dtype=np.uint8) + img[canonical_mask] = color + return img + + +def render_overlay(input_mask, template_mask): + size = config.SHAPE_CANONICAL_SIZE + img = np.full((size, size, 3), _BG, dtype=np.uint8) + only_input = input_mask & ~template_mask + only_template = template_mask & ~input_mask + both = input_mask & template_mask + img[only_input] = _INPUT_COLOR + img[only_template] = _TEMPLATE_COLOR + img[both] = _OVERLAP_COLOR + return img diff --git a/pipeline/texture_match.py b/pipeline/texture_match.py new file mode 100644 index 0000000..0016c17 --- /dev/null +++ b/pipeline/texture_match.py @@ -0,0 +1,134 @@ +""" +Texture matching: compares surface/material texture -- independent of +color and of overall silhouette shape. Two standard, complementary +classical texture descriptors (no deep learning needed): + + - Local Binary Patterns (LBP): encodes each pixel's local micro-pattern + relative to its neighbors, compared as a histogram (same convention as + pipeline/color.py's hue/saturation histogram) -- good at catching fine, + repetitive patterns like fabric weave or petal grain. + - GLCM (gray-level co-occurrence matrix) / Haralick features (contrast, + homogeneity, energy, correlation) -- coarser statistical texture + properties, good at catching smooth-vs-rough, uniform-vs-busy material + differences that a local pattern histogram alone can miss. + +Purely informational, its own section: never feeds into any score. +""" + +import logging + +import cv2 +import numpy as np +from skimage.feature import graycomatrix, graycoprops, local_binary_pattern + +import config + +logger = logging.getLogger(__name__) + +_LBP_BINS = config.TEXTURE_LBP_POINTS + 2 # "uniform" LBP yields P+2 distinct codes + +_template_texture_data = {} # name -> {"lbp_hist", "glcm_features", "lbp_image", "mask_bool"} + + +def _masked_gray(bgr, mask): + gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) + return gray, mask > 0 + + +def _compute_lbp(gray, mask_bool): + lbp_image = local_binary_pattern(gray, config.TEXTURE_LBP_POINTS, + config.TEXTURE_LBP_RADIUS, method="uniform") + values = lbp_image[mask_bool] + if values.size == 0: + return lbp_image, np.zeros(_LBP_BINS, dtype=np.float64) + hist, _ = np.histogram(values, bins=_LBP_BINS, range=(0, _LBP_BINS), density=True) + return lbp_image, hist + + +def _compute_glcm_features(gray, mask_bool): + ys, xs = np.where(mask_bool) + if len(ys) == 0: + return {p: 0.0 for p in config.TEXTURE_GLCM_PROPS} + + y0, y1, x0, x1 = ys.min(), ys.max() + 1, xs.min(), xs.max() + 1 + crop_gray = gray[y0:y1, x0:x1].copy() + crop_mask = mask_bool[y0:y1, x0:x1] + + levels = config.TEXTURE_GLCM_LEVELS + quantized = (crop_gray.astype(np.float32) / 256 * levels).astype(np.uint8) + quantized[~crop_mask] = 0 # background -> level 0, excluded from GLCM below + + angles = (0, np.pi / 4, np.pi / 2, 3 * np.pi / 4) + glcm = graycomatrix(quantized, distances=list(config.TEXTURE_GLCM_DISTANCES), + angles=list(angles), levels=levels, symmetric=True, normed=True) + + # Exclude any co-occurrence touching the masked-out background level. + glcm[0, :, :, :] = 0 + glcm[:, 0, :, :] = 0 + total = glcm.sum() + if total > 0: + glcm = glcm / total + + return {p: float(np.mean(graycoprops(glcm, p))) for p in config.TEXTURE_GLCM_PROPS} + + +def compute_texture_data(bgr, mask): + gray, mask_bool = _masked_gray(bgr, mask) + lbp_image, lbp_hist = _compute_lbp(gray, mask_bool) + glcm_features = _compute_glcm_features(gray, mask_bool) + return { + "lbp_hist": lbp_hist, + "glcm_features": glcm_features, + "lbp_image": lbp_image, + "mask_bool": mask_bool, + } + + +def set_template_texture_data(name, bgr, mask): + _template_texture_data[name] = compute_texture_data(bgr, mask) + + +def _hist_similarity_pct(hist_a, hist_b): + # Histogram intersection, same convention as pipeline/color.py. + return round(float(np.minimum(hist_a, hist_b).sum()) * 100, 1) + + +def _glcm_similarity_pct(features_a, features_b): + sims = [] + for prop in config.TEXTURE_GLCM_PROPS: + a, b = features_a[prop], features_b[prop] + scale = max(abs(a), abs(b), 1e-9) + sims.append(max(0.0, 1 - abs(a - b) / scale)) + return round(float(np.mean(sims)) * 100, 1) + + +def compare_to_templates(bgr, mask): + """Returns (input_texture_data, ranked_results) -- results sorted by + match_pct descending, one entry per template with the LBP-based and + GLCM-based sub-scores (plus the raw GLCM features) broken out too.""" + input_data = compute_texture_data(bgr, mask) + + results = [] + for name, tdata in _template_texture_data.items(): + lbp_sim = _hist_similarity_pct(input_data["lbp_hist"], tdata["lbp_hist"]) + glcm_sim = _glcm_similarity_pct(input_data["glcm_features"], tdata["glcm_features"]) + match_pct = round((lbp_sim + glcm_sim) / 2, 1) + results.append({ + "template": name, + "match_pct": match_pct, + "lbp_similarity_pct": lbp_sim, + "glcm_similarity_pct": glcm_sim, + "input_glcm_features": {p: round(v, 3) for p, v in input_data["glcm_features"].items()}, + "template_glcm_features": {p: round(v, 3) for p, v in tdata["glcm_features"].items()}, + }) + results.sort(key=lambda r: r["match_pct"], reverse=True) + return input_data, results + + +def render_lbp_visual(lbp_image, mask_bool): + """Normalizes the LBP code map to a viewable grayscale image, masked to + the foreground only, for the side-by-side visual comparison.""" + norm = cv2.normalize(lbp_image, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8) + out = np.zeros_like(norm) + out[mask_bool] = norm[mask_bool] + return cv2.cvtColor(out, cv2.COLOR_GRAY2BGR) diff --git a/pipeline/utils.py b/pipeline/utils.py new file mode 100644 index 0000000..fb64377 --- /dev/null +++ b/pipeline/utils.py @@ -0,0 +1,95 @@ +import io +import logging +import os + +import cv2 +from PIL import Image, ImageOps + +import config + +logger = logging.getLogger(__name__) + + +def list_template_files(): + if not os.path.isdir(config.TEMPLATE_IMAGES_DIR): + raise FileNotFoundError(f"Template folder not found: {config.TEMPLATE_IMAGES_DIR}") + return sorted( + f for f in os.listdir(config.TEMPLATE_IMAGES_DIR) + if f.lower().endswith(config.VALID_EXTS) + ) + + +def template_name(fname): + return os.path.splitext(fname)[0] + + +def annotate_score(bgr_img, score, confidence_pct, label=None): + img = bgr_img.copy() + text = f"Score: {score} Conf: {confidence_pct:.1f}%" + if label: + text = f"{label} | {text}" + + font = cv2.FONT_HERSHEY_SIMPLEX + scale = max(0.55, img.shape[1] / 900) + thickness = max(1, int(scale * 2)) + + (tw, th), baseline = cv2.getTextSize(text, font, scale, thickness) + cv2.rectangle(img, (5, 5), (15 + tw, 20 + th + baseline), (20, 20, 20), -1) + cv2.putText(img, text, (10, 15 + th), font, scale, (110, 231, 183), thickness, + cv2.LINE_AA) + return img + + +def encode_png_bytes(bgr_or_bgra_img): + ok, buf = cv2.imencode(".png", bgr_or_bgra_img) + if not ok: + raise RuntimeError("Failed to encode image to PNG") + return buf.tobytes() + + +def compress_image_bytes(image_bytes: bytes, max_bytes: int, max_dim: int) -> tuple: + """ + Downscale + re-encode as JPEG only if image_bytes exceeds max_bytes; + otherwise returns it untouched -- images already under the limit are + never re-compressed, so nothing is lost for the common case. + + Downscaling to max_dim costs no *usable* detail here: the matching + pipeline (bg removal, SIFT/ORB/SuperPoint/LoFTR) already caps every + image to this same size before processing it, and the external AI + verification endpoint's vision model downsamples internally to its own + fixed input resolution regardless. This just stops storing/transmitting + pixels nothing in the system ever actually looks at. + + Returns (bytes, was_compressed). + """ + if len(image_bytes) <= max_bytes: + return image_bytes, False + + original_size = len(image_bytes) + + pil_img = Image.open(io.BytesIO(image_bytes)) + pil_img = ImageOps.exif_transpose(pil_img) # bake in camera rotation before resizing + pil_img = pil_img.convert("RGB") + + w, h = pil_img.size + scale = max_dim / max(w, h) + if scale < 1.0: + pil_img = pil_img.resize((max(1, int(w * scale)), max(1, int(h * scale))), + Image.LANCZOS) + + quality = config.COMPRESS_JPEG_QUALITY_START + data = None + while True: + buf = io.BytesIO() + pil_img.save(buf, format="JPEG", quality=quality, optimize=True) + data = buf.getvalue() + if len(data) <= max_bytes or quality <= config.COMPRESS_JPEG_QUALITY_MIN: + break + quality -= config.COMPRESS_JPEG_QUALITY_STEP + + logger.info( + "Compressed upload: %.1f MB -> %.1f MB (%dx%d, JPEG q%d)", + original_size / (1024 * 1024), len(data) / (1024 * 1024), + pil_img.width, pil_img.height, quality, + ) + return data, True diff --git a/pipeline/vase_compare.py b/pipeline/vase_compare.py new file mode 100644 index 0000000..b044d4f --- /dev/null +++ b/pipeline/vase_compare.py @@ -0,0 +1,158 @@ +""" +Vase-identity comparison: crops the vase region (via SAM3's "vase" concept +mask -- see pipeline/sam3_client.py) from both the upload and the matched +template, then compares the two crops with two complementary embedding +models: + + - DINOv2 (facebook/dinov2-base): self-supervised, patch-level visual + features -- good at fine-grained shape/texture/material detail. + - CLIP (openai/clip-vit-base-patch32): contrastive image embedding -- a + coarser, more holistic notion of visual similarity, used as a second + opinion that isn't fooled by the same quirks DINO might be. + +Purely informational, opt-in (run alongside the SAM/YOLO-World flower count, +triggered by the same button) -- never feeds into matching/scoring. +""" + +import gc +import logging + +import cv2 +import numpy as np +import torch +from PIL import Image + +import config + +logger = logging.getLogger(__name__) + +DEVICE = "cuda" if torch.cuda.is_available() else "cpu" + +_dino_model = None +_dino_processor = None +_clip_model = None +_clip_processor = None + + +def _get_dino(): + global _dino_model, _dino_processor + if _dino_model is None: + logger.info("Loading DINOv2 (%s) on %s...", config.DINO_MODEL_NAME, DEVICE) + from transformers import AutoImageProcessor, AutoModel + _dino_processor = AutoImageProcessor.from_pretrained(config.DINO_MODEL_NAME) + _dino_model = AutoModel.from_pretrained(config.DINO_MODEL_NAME).eval().to(DEVICE) + return _dino_model, _dino_processor + + +def _get_clip(): + global _clip_model, _clip_processor + if _clip_model is None: + logger.info("Loading CLIP (%s) on %s...", config.CLIP_MODEL_NAME, DEVICE) + from transformers import CLIPModel, CLIPProcessor + _clip_model = CLIPModel.from_pretrained(config.CLIP_MODEL_NAME).eval().to(DEVICE) + _clip_processor = CLIPProcessor.from_pretrained(config.CLIP_MODEL_NAME) + return _clip_model, _clip_processor + + +def unload_models(): + global _dino_model, _dino_processor, _clip_model, _clip_processor + freed = _dino_model is not None or _clip_model is not None + _dino_model = None + _dino_processor = None + _clip_model = None + _clip_processor = None + if freed: + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + return freed + + +def _to_pil(bgr): + return Image.fromarray(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) + + +def _dino_embed(bgr): + model, processor = _get_dino() + with torch.no_grad(): + inputs = processor(images=_to_pil(bgr), return_tensors="pt").to(DEVICE) + out = model(**inputs) + feat = out.last_hidden_state[:, 0] # CLS token + feat = torch.nn.functional.normalize(feat, dim=-1) + return feat.cpu().numpy()[0] + + +def _clip_embed(bgr): + model, processor = _get_clip() + with torch.no_grad(): + inputs = processor(images=_to_pil(bgr), return_tensors="pt").to(DEVICE) + feat = model.get_image_features(**inputs) + feat = torch.nn.functional.normalize(feat, dim=-1) + return feat.cpu().numpy()[0] + + +def _cosine_pct(a, b): + """Cosine similarity of two L2-normalized vectors, clamped to [0, 1] and + reported as a percentage -- negative similarity (near-opposite vectors) + is clamped to 0% rather than reported as a negative number, since + "how similar" isn't meaningful past that point for this use case.""" + sim = float(np.dot(a, b)) + return round(max(0.0, min(1.0, sim)) * 100, 1) + + +def crop_mask(bgr, mask_bool): + """Crops the bounding box of mask_bool out of bgr, with a small pad + (config.VASE_CROP_PAD_FRAC) so the mask's own (occasionally imprecise) + edge doesn't cut off the vase's rim or base -- then blacks out any + pixel inside that padded box that the mask doesn't cover, so DINOv2/CLIP + only ever see vase pixels, not whatever flower stems or ribbon happen to + share the box's corners. Returns None if the mask is empty.""" + ys, xs = np.nonzero(mask_bool) + if len(xs) == 0: + return None + h, w = bgr.shape[:2] + x1, y1, x2, y2 = xs.min(), ys.min(), xs.max(), ys.max() + bw, bh = x2 - x1, y2 - y1 + pad = config.VASE_CROP_PAD_FRAC + px1, px2 = x1 - bw * pad, x2 + bw * pad + py1, py2 = y1 - bh * pad, y2 + bh * pad + px1, py1 = max(0, int(round(px1))), max(0, int(round(py1))) + px2, py2 = min(w, int(round(px2))), min(h, int(round(py2))) + if px2 <= px1 or py2 <= py1: + return None + + crop = bgr[py1:py2, px1:px2].copy() + mask_crop = mask_bool[py1:py2, px1:px2] + crop[~mask_crop] = 0 + return crop + + +def clip_similarity_pct(crop_a, crop_b): + """CLIP-only similarity between two crops -- no DINOv2. Used for the + auto-triggered "flower check" beside the weighted verdict (see + engine.flower_summary): unlike the opt-in vase comparison, that one runs + on every confident match, so it deliberately loads only CLIP (small, + fast) rather than both embedding models.""" + return _cosine_pct(_clip_embed(crop_a), _clip_embed(crop_b)) + + +def compare_vases(input_crop_bgr, template_crop_bgr): + dino_pct = _cosine_pct(_dino_embed(input_crop_bgr), _dino_embed(template_crop_bgr)) + clip_pct = _cosine_pct(_clip_embed(input_crop_bgr), _clip_embed(template_crop_bgr)) + combined_pct = round( + config.VASE_DINO_WEIGHT * dino_pct + config.VASE_CLIP_WEIGHT * clip_pct, 1 + ) + + if combined_pct >= config.VASE_SAME_THRESHOLD: + verdict = "same" + elif combined_pct >= config.VASE_UNCERTAIN_THRESHOLD: + verdict = "uncertain" + else: + verdict = "different" + + return { + "dino_similarity_pct": dino_pct, + "clip_similarity_pct": clip_pct, + "combined_pct": combined_pct, + "verdict": verdict, + } diff --git a/pipeline/verify.py b/pipeline/verify.py new file mode 100644 index 0000000..5f8146e --- /dev/null +++ b/pipeline/verify.py @@ -0,0 +1,76 @@ +""" +Optional third-party AI verification, layered on top of the core +feature-matching pipeline: sends the winning template's original photo and +the user's original upload to an external vision-LLM endpoint that runs a +detailed QC-style comparison (flowers, vase, ribbon, composition) and +returns a MATCH/DISCREPANCIES/CONFIDENCE verdict plus free-text description. + +This never affects the core match result -- if the endpoint is slow, down, +or unreachable (it's a Cloudflare tunnel, which can go stale), the caller +is expected to treat any exception here as a soft failure. +""" + +import logging +import os +import re + +import requests + +import config + +logger = logging.getLogger(__name__) + +_VERDICT_RE = re.compile( + # DISCREP\w* rather than a literal "DISCREPANCIES" -- the LLM behind + # the endpoint doesn't reliably spell it the same way every time + # ("DISCREPANCIES" vs "DISCREPENCIES" have both been observed), and a + # missed match here silently dumps the whole raw block into the UI. + r"MATCH:\s*\[?\s*(?PYES|NO|PARTIAL)\s*\]?\s*" + r"DISCREP\w*:\s*\[?\s*(?P.*?)\s*\]?\s*" + r"CONFIDENCE:\s*\[?\s*(?PHigh|Medium|Low)\s*\]?", + re.IGNORECASE | re.DOTALL, +) + + +def _parse_result_text(text: str) -> dict: + """The endpoint's `result` field is free text with an embedded + MATCH/DISCREPANCIES/CONFIDENCE block, sometimes followed by a prose + description, sometimes not. Pull out the structured bits; whatever's + left over (if anything) is the description.""" + text = text or "" + m = _VERDICT_RE.search(text) + + if not m: + return {"match": None, "confidence": None, "discrepancies": None, + "description": text.strip()} + + return { + "match": m.group("match").upper(), + "confidence": m.group("confidence").capitalize(), + "discrepancies": m.group("discrepancies").strip() or "None", + "description": text[m.end():].strip(), + } + + +def verify_images(reference_path: str, actual_path: str) -> dict: + """reference_path = the matched template's original photo (IMAGE 1), + actual_path = the user's original upload (IMAGE 2).""" + with open(reference_path, "rb") as f1, open(actual_path, "rb") as f2: + files = { + "image1": (os.path.basename(reference_path), f1, "image/png"), + "image2": (os.path.basename(actual_path), f2, "image/jpeg"), + } + response = requests.post(config.VERIFY_ENDPOINT_URL, files=files, + timeout=config.VERIFY_TIMEOUT_SECONDS) + response.raise_for_status() + data = response.json() + + parsed = _parse_result_text(data.get("result", "")) + return { + "match": parsed["match"], + "confidence": parsed["confidence"], + "discrepancies": parsed["discrepancies"], + "description": parsed["description"], + "raw_result": data.get("result"), + "pixel_precheck": data.get("pixel_precheck"), + } diff --git a/pipeline/yolo_world.py b/pipeline/yolo_world.py new file mode 100644 index 0000000..900b94b --- /dev/null +++ b/pipeline/yolo_world.py @@ -0,0 +1,94 @@ +""" +Open-vocabulary object detection via YOLO-World (YOLOv8 family, ultralytics), +run alongside SAM (see pipeline/flower_count.py) for the flower-count feature. + +SAM has no notion of "flower" -- it blindly proposes every objectlike region +it can find, so the vase and any ribbon/bow tied around it get segmented and +counted as if they were flowers. YOLO-World, prompted with plain-language +classes, actually knows what those things look like: its "vase"/"ribbon"/ +"bow" detections are used (in engine.count_flowers) to exclude those regions +from SAM's flower-instance count. + +Its own "flower" boxes are shown to the user as a second, independent count +-- in practice it tends to draw one box per contiguous flower region rather +than per individual bloom, so it's a coarser, corroborating signal, not a +replacement for SAM's per-instance count. +""" + +import gc +import logging + +import cv2 +import torch + +import config + +logger = logging.getLogger(__name__) + +DEVICE = "cuda" if torch.cuda.is_available() else "cpu" + +_model = None + + +def get_model(): + global _model + if _model is None: + logger.info("Loading YOLO-World (%s) on %s...", config.YOLO_WORLD_CHECKPOINT, DEVICE) + from ultralytics import YOLO + _model = YOLO(config.YOLO_WORLD_CHECKPOINT) + _model.set_classes(config.YOLO_WORLD_CLASSES) + return _model + + +def unload_model(): + global _model + freed = _model is not None + _model = None + if freed: + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + return freed + + +def detect(bgr): + """Returns {class_name: [{"xyxy": [x1,y1,x2,y2], "confidence": float}, ...]} + for every class in config.YOLO_WORLD_CLASSES (empty list if none found).""" + model = get_model() + with torch.no_grad(): + results = model.predict(bgr, conf=config.YOLO_WORLD_CONF, + iou=config.YOLO_WORLD_IOU, verbose=False) + r = results[0] + by_class = {name: [] for name in config.YOLO_WORLD_CLASSES} + for b in r.boxes: + name = r.names[int(b.cls[0])] + by_class.setdefault(name, []).append({ + "xyxy": [float(v) for v in b.xyxy[0].tolist()], + "confidence": round(float(b.conf[0]), 3), + }) + return by_class + + +_BOX_COLORS = { + "flower": (66, 133, 244), "vase": (219, 68, 55), + "ribbon": (244, 180, 0), "bow": (15, 157, 88), +} + + +def render_boxes(bgr, by_class): + """Draws a labeled box per detection, colored by class, so the user can + see exactly which regions YOLO-World identified as flower vs. vase vs. + ribbon/bow.""" + overlay = bgr.copy() + for name, boxes in by_class.items(): + color = _BOX_COLORS.get(name, (170, 170, 170)) + for box in boxes: + x1, y1, x2, y2 = [int(v) for v in box["xyxy"]] + cv2.rectangle(overlay, (x1, y1), (x2, y2), color, 3) + label = f"{name} {box['confidence']:.2f}" + (tw, th), _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.7, 2) + label_y = max(th + 6, y1) + cv2.rectangle(overlay, (x1, label_y - th - 8), (x1 + tw + 6, label_y), color, -1) + cv2.putText(overlay, label, (x1 + 3, label_y - 5), + cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2, cv2.LINE_AA) + return overlay diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..90e5390 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,13 @@ +flask +rembg +# CPU-only onnxruntime made background removal the slowest stage by far -- +# onnxruntime-gpu lets rembg run BiRefNet on CUDA instead (auto-detected). +# The two packages share the same import name and conflict; don't install both. +onnxruntime-gpu +opencv-contrib-python +numpy +Pillow +torch +torchvision +kornia +git+https://github.com/cvg/LightGlue.git diff --git a/sam3_worker.py b/sam3_worker.py new file mode 100644 index 0000000..82e373f --- /dev/null +++ b/sam3_worker.py @@ -0,0 +1,140 @@ +""" +Standalone SAM3 concept-segmentation worker. + +Runs under a SEPARATE Python environment (sam2_env, Python 3.10) from the +main Vase Matcher app (torch17_new, Python 3.8) -- transformers>=5.5.0 +(required for Sam3Model/Sam3Processor) itself requires Python>=3.10, so +this can't be imported in-process by the Flask app. Instead it's invoked +as a one-shot subprocess per request (see pipeline/sam3_client.py) with a +JSON request file describing which prompts to run against which images, +and writes a JSON response + one PNG mask per detected instance. + +Loaded in 4-bit (NF4) via bitsandbytes -- empirically ~700MB resident / +~1.9GB peak during inference on an 8GB card, vs. several GB unquantized, +and a single model load handles every job in the request (one process +per /api/count_flowers call, not per prompt/image). + +Usage: + python sam3_worker.py --request + +Request JSON: + { + "images": {"": "", ...}, + "jobs": [{"image": "", "prompt": "flower", "threshold": 0.5}, ...], + "output_dir": "" + } + +Response JSON (written to /response.json): + { + "results": [ + {"image": "...", "prompt": "...", "instances": [ + {"mask_file": "...", "score": 0.73, "box": [x1,y1,x2,y2]}, ... + ]}, ... + ], + "error": null # or a string on failure + } +""" + +import argparse +import json +import os +import sys +import traceback + +os.environ.setdefault("PYTORCH_CUDA_ALLOC_CONF", "expandable_segments:True") + +HF_MODEL_NAME = "facebook/sam3" + + +def load_model(): + import torch + from transformers import BitsAndBytesConfig, Sam3Model, Sam3Processor + + token = os.environ.get("HF_TOKEN") + processor = Sam3Processor.from_pretrained(HF_MODEL_NAME, token=token) + quant_config = BitsAndBytesConfig( + load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16, bnb_4bit_quant_type="nf4" + ) + model = Sam3Model.from_pretrained( + HF_MODEL_NAME, token=token, quantization_config=quant_config, + device_map="cuda:0", low_cpu_mem_usage=True, + ) + model.eval() + return model, processor + + +def run_job(model, processor, pil_img, prompt, threshold): + import torch + + inputs = processor(images=pil_img, text=prompt, return_tensors="pt").to("cuda:0") + with torch.no_grad(): + outputs = model(**inputs) + results = processor.post_process_instance_segmentation( + outputs, threshold=threshold, mask_threshold=0.5, + target_sizes=[pil_img.size[::-1]], + )[0] + + masks = results["masks"].cpu().numpy() + scores = results["scores"].cpu().numpy().tolist() + boxes = results["boxes"].cpu().numpy().tolist() if "boxes" in results else [None] * len(masks) + return masks, scores, boxes + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--request", required=True) + args = parser.parse_args() + + with open(args.request) as f: + request = json.load(f) + + output_dir = request["output_dir"] + os.makedirs(output_dir, exist_ok=True) + response = {"results": [], "error": None} + + try: + import cv2 + import numpy as np + from PIL import Image + + model, processor = load_model() + + loaded_images = {} + for key, path in request["images"].items(): + bgr = cv2.imread(path, cv2.IMREAD_COLOR) + if bgr is None: + raise ValueError(f"could not read image {path!r} for key {key!r}") + loaded_images[key] = Image.fromarray(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) + + for job_idx, job in enumerate(request["jobs"]): + image_key = job["image"] + prompt = job["prompt"] + threshold = job.get("threshold", 0.5) + pil_img = loaded_images[image_key] + + masks, scores, boxes = run_job(model, processor, pil_img, prompt, threshold) + + instances = [] + for i, (m, score, box) in enumerate(zip(masks, scores, boxes)): + m_bin = (m > 0.5).astype("uint8") * 255 + mask_file = f"{image_key}_{prompt.replace(' ', '_')}_{job_idx}_{i}.png" + cv2.imwrite(os.path.join(output_dir, mask_file), m_bin) + instances.append({"mask_file": mask_file, "score": round(float(score), 4), "box": box}) + + response["results"].append({ + "image": image_key, "prompt": prompt, "instances": instances, + }) + + except Exception as e: + response["error"] = f"{e}\n{traceback.format_exc()}" + + with open(os.path.join(output_dir, "response.json"), "w") as f: + json.dump(response, f) + + if response["error"]: + print(response["error"], file=sys.stderr) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..501a19e --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,1406 @@ +:root { + --bg: #f6f2ea; + --bg-alt: #efe9dd; + --surface: #fffdf8; + --ink: #2e2b26; + --ink-soft: #6b6459; + --border: #e3dac8; + --sage: #7c8f76; + --sage-deep: #5f7259; + --terracotta: #b97a5a; + --terracotta-deep: #9c5f42; + --shadow: 0 10px 30px -12px rgba(46, 43, 38, 0.18); + --shadow-sm: 0 4px 14px -6px rgba(46, 43, 38, 0.15); + --radius: 16px; + --serif: "Cormorant Garamond", Georgia, serif; + --sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + + --glass-bg: rgba(255, 255, 255, 0.55); + --glass-border: rgba(255, 255, 255, 0.6); + --blob-a: #9fb08f; + --blob-b: #d3a37e; + --blob-c: #cdbb8e; + --match-yes: #5f7259; + --match-no: #a3543a; + --match-partial: #b08a3e; +} + +@media (prefers-color-scheme: dark) { + :root { + --bg: #201e1a; + --bg-alt: #26241f; + --surface: #2b2925; + --ink: #ece6da; + --ink-soft: #b3ab9c; + --border: #3a3630; + --sage: #93a68c; + --sage-deep: #b7c7b0; + --terracotta: #cc9271; + --terracotta-deep: #dba98a; + --shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.45); + --shadow-sm: 0 4px 14px -6px rgba(0, 0, 0, 0.4); + + --glass-bg: rgba(43, 41, 37, 0.55); + --glass-border: rgba(255, 255, 255, 0.12); + --blob-a: #6f8264; + --blob-b: #a97c56; + --blob-c: #9c8a5a; + --match-yes: #b7c7b0; + --match-no: #d99b81; + --match-partial: #d8bd80; + } +} + +* { box-sizing: border-box; } + +/* Author rules that set `display` on an element (e.g. `.loading{display:flex}`, + `img{display:block}`) otherwise beat the UA's `[hidden]{display:none}` + regardless of specificity, since origin is compared before specificity. */ +[hidden] { display: none !important; } + +html { scroll-behavior: smooth; } + +body { + margin: 0; + background: var(--bg); + color: var(--ink); + font-family: var(--sans); + line-height: 1.5; + -webkit-font-smoothing: antialiased; +} + +img { max-width: 100%; display: block; } + +/* ---------- Hero ---------- */ + +.hero { + min-height: 78vh; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + padding: 6rem 1.5rem 4rem; + background: + radial-gradient(60% 50% at 50% 0%, var(--bg-alt) 0%, var(--bg) 70%); +} + +.hero-inner { max-width: 640px; } + +.eyebrow { + text-transform: uppercase; + letter-spacing: 0.14em; + font-size: 0.78rem; + color: var(--sage-deep); + font-weight: 600; + margin: 0 0 0.75rem; +} + +.hero h1 { + font-family: var(--serif); + font-size: clamp(2.8rem, 7vw, 4.6rem); + font-weight: 600; + margin: 0 0 1rem; + color: var(--ink); +} + +.tagline { + font-size: 1.08rem; + color: var(--ink-soft); + max-width: 460px; + margin: 0 auto 2.5rem; +} + +.scroll-cue { + display: inline-flex; + align-items: center; + gap: 0.4rem; + color: var(--sage-deep); + text-decoration: none; + font-weight: 500; + font-size: 0.92rem; + border-bottom: 1px solid transparent; + transition: border-color 0.2s ease, transform 0.2s ease; +} + +.scroll-cue:hover { + border-color: currentColor; + transform: translateY(2px); +} + +/* ---------- Sections ---------- */ + +.section { + max-width: 1080px; + margin: 0 auto; + padding: 3.5rem 1.5rem; +} + +.section-head { margin-bottom: 2rem; text-align: center; } + +.section-head h2 { + font-family: var(--serif); + font-size: 2.1rem; + font-weight: 600; + margin: 0 0 0.35rem; +} + +.section-head p { color: var(--ink-soft); margin: 0; font-size: 0.96rem; } + +/* ---------- Template gallery ---------- */ + +.template-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 1.25rem; +} + +.template-card { + margin: 0; + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + overflow: hidden; + box-shadow: var(--shadow-sm); + transition: transform 0.25s ease, box-shadow 0.25s ease; +} + +.template-card:hover { + transform: translateY(-4px); + box-shadow: var(--shadow); +} + +.template-card img { + width: 100%; + aspect-ratio: 1 / 1; + object-fit: cover; + background: var(--bg-alt); +} + +.template-card figcaption { + padding: 0.6rem 0.8rem 0.8rem; + font-size: 0.85rem; + color: var(--ink-soft); + text-align: center; + text-transform: capitalize; +} + +/* ---------- Upload ---------- */ + +.upload-panel { max-width: 560px; margin: 0 auto; } + +.dropzone { + display: block; + border: 1.5px dashed var(--border); + border-radius: var(--radius); + background: var(--surface); + padding: 2.2rem 1.5rem; + text-align: center; + cursor: pointer; + transition: border-color 0.2s ease, background 0.2s ease; +} + +.dropzone:hover, .dropzone.dragover { + border-color: var(--sage); + background: var(--bg-alt); +} + +.dropzone-content svg { margin: 0 auto 0.6rem; color: var(--sage-deep); } +.dropzone-content p { margin: 0.2rem 0; } +.dropzone-content .hint { color: var(--ink-soft); font-size: 0.82rem; } + +.preview-img { + max-height: 320px; + margin: 0 auto; + border-radius: 10px; + object-fit: contain; +} + +.upload-actions { + display: flex; + justify-content: center; + gap: 0.8rem; + margin-top: 1.4rem; +} + +.btn-primary, .btn-ghost { + font-family: var(--sans); + font-size: 0.94rem; + font-weight: 600; + padding: 0.7rem 1.6rem; + border-radius: 999px; + border: none; + cursor: pointer; + transition: transform 0.15s ease, opacity 0.15s ease, background 0.2s ease; +} + +.btn-primary { + background: var(--sage-deep); + color: #fbf9f4; +} + +.btn-primary:disabled { + opacity: 0.45; + cursor: not-allowed; +} + +.btn-primary:not(:disabled):hover { transform: translateY(-1px); } + +.btn-ghost { + background: transparent; + color: var(--ink-soft); + border: 1px solid var(--border); +} + +.btn-ghost:hover { border-color: var(--ink-soft); color: var(--ink); } + +.error-msg { + text-align: center; + color: var(--terracotta-deep); + font-size: 0.9rem; + margin-top: 1rem; +} + +/* ---------- Loading ---------- */ + +.loading { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.8rem; + margin-top: 2.4rem; + color: var(--ink-soft); + font-size: 0.92rem; +} + +.spinner { + width: 28px; + height: 28px; + border-radius: 50%; + border: 3px solid var(--border); + border-top-color: var(--sage); + animation: spin 0.9s linear infinite; +} + +@keyframes spin { to { transform: rotate(360deg); } } + +/* ---------- Results ---------- */ + +.overall-card { + background: linear-gradient(135deg, var(--sage-deep), var(--sage)); + color: #fbf9f4; + border-radius: var(--radius); + padding: 1.8rem 2rem; + box-shadow: var(--shadow); + margin-bottom: 2.2rem; + display: flex; + align-items: center; + gap: 1.4rem; + flex-wrap: wrap; +} + +.overall-card .overall-thumb { + width: 84px; + height: 84px; + border-radius: 12px; + object-fit: cover; + background: rgba(255,255,255,0.15); + flex-shrink: 0; +} + +.overall-card .overall-text .label { + text-transform: uppercase; + letter-spacing: 0.1em; + font-size: 0.72rem; + opacity: 0.85; + margin: 0 0 0.2rem; +} + +.overall-card .overall-text h3 { + font-family: var(--serif); + font-size: 1.8rem; + margin: 0; + text-transform: capitalize; +} + +.query-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 1.2rem; + margin-bottom: 2.4rem; +} + +.query-tile { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + overflow: hidden; + box-shadow: var(--shadow-sm); +} + +.query-tile img { + width: 100%; + aspect-ratio: 4 / 3; + object-fit: contain; + background: repeating-conic-gradient(var(--bg-alt) 0% 25%, var(--bg) 0% 50%) 50% / 18px 18px; +} + +.query-tile .tile-label { + padding: 0.55rem 0.8rem; + font-size: 0.82rem; + color: var(--ink-soft); + border-top: 1px solid var(--border); +} + +.method-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 1.4rem; +} + +.method-card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 1.3rem 1.4rem 1.5rem; + box-shadow: var(--shadow-sm); +} + +.method-card-head { + display: flex; + justify-content: space-between; + align-items: baseline; + margin-bottom: 0.9rem; + gap: 0.6rem; +} + +.method-card-head h4 { + margin: 0; + font-family: var(--serif); + font-size: 1.3rem; +} + +.time-badge { + font-size: 0.76rem; + font-weight: 600; + color: var(--sage-deep); + background: var(--bg-alt); + padding: 0.2rem 0.55rem; + border-radius: 999px; + white-space: nowrap; +} + +.best-row { + display: flex; + align-items: center; + gap: 0.9rem; + margin-bottom: 1.1rem; +} + +.best-row img { + width: 64px; + height: 64px; + object-fit: cover; + border-radius: 10px; + background: var(--bg-alt); +} + +.best-row .best-name { + font-weight: 600; + text-transform: capitalize; +} + +.best-row .best-score { + font-size: 0.82rem; + color: var(--ink-soft); +} + +.confidence-pill { + display: inline-block; + font-size: 0.72rem; + font-weight: 600; + padding: 0.15rem 0.5rem; + border-radius: 999px; + margin-top: 0.25rem; +} + +.confidence-pill.confident { + background: rgba(124, 143, 118, 0.18); + color: var(--sage-deep); +} + +.confidence-pill.weak { + background: rgba(185, 122, 90, 0.16); + color: var(--terracotta-deep); +} + +.score-bars { display: flex; flex-direction: column; gap: 0.45rem; } + +.score-bar-row { + display: grid; + grid-template-columns: 84px 1fr 34px; + align-items: center; + gap: 0.6rem; + font-size: 0.78rem; +} + +.score-bar-row .name { + color: var(--ink-soft); + text-transform: capitalize; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.score-bar-track { + height: 6px; + border-radius: 999px; + background: var(--bg-alt); + overflow: hidden; +} + +.score-bar-fill { + height: 100%; + border-radius: 999px; + background: var(--sage); + transition: width 0.5s ease; +} + +.score-bar-row.top .score-bar-fill { background: var(--terracotta); } +.score-bar-row .value { text-align: right; color: var(--ink-soft); } + +/* ---------- Flower count (SAM) ---------- */ + +.flower-count-section { + margin-top: 2.6rem; + padding-top: 2.2rem; + border-top: 1px solid var(--border); + text-align: center; +} + +.flower-count-section h3 { + font-family: var(--serif); + font-size: 1.7rem; + margin: 0 0 0.3rem; +} + +.flower-count-sub { + color: var(--ink-soft); + font-size: 0.86rem; + margin: 0 0 1.2rem; + max-width: 56ch; + margin-left: auto; + margin-right: auto; +} + +.flower-count-result { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: flex-start; + gap: 2.2rem; + margin-top: 1.4rem; + text-align: left; +} + +.flower-count-method { + display: flex; + flex-direction: column; + align-items: center; + width: 320px; + max-width: 100%; +} + +.flower-count-method-label { + font-size: 0.82rem; + font-weight: 600; + color: var(--ink-soft); + margin: 0 0 0.6rem; + text-align: center; +} + +.flower-count-result img { + max-width: 320px; + width: 100%; + border-radius: 14px; + border: 1px solid var(--border); + margin-bottom: 0.8rem; +} + +.flower-count-total { + font-family: var(--serif); + font-size: 1.3rem; + margin: 0 0 0.6rem; + text-align: center; +} + +.flower-count-clusters { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + gap: 0.6rem; + margin-bottom: 0.6rem; +} + +.flower-cluster-chip { + display: flex; + align-items: center; + gap: 0.35rem; + background: var(--surface); + border: 1px solid var(--border); + border-radius: 999px; + padding: 0.25rem 0.6rem 0.25rem 0.25rem; + font-size: 0.8rem; + color: var(--ink-soft); +} + +.flower-cluster-hint { + font-size: 0.78rem; + color: var(--ink-soft); + font-style: italic; +} + +.flower-count-time { + font-size: 0.8rem; + color: var(--ink-soft); + margin: 1rem 0 0; + text-align: center; +} + +/* ---------- Flower-count mismatch note ---------- */ + +.flower-count-mismatch { + max-width: 60ch; + margin: 1.4rem auto 0; + padding: 0.75rem 1.1rem; + border-radius: 12px; + background: var(--surface); + border: 1px solid var(--border); + font-size: 0.82rem; + color: var(--ink-soft); + text-align: center; +} + +.flower-count-mismatch.is-mismatch { + border-color: var(--match-partial); + color: var(--ink); +} + +/* ---------- Vase comparison (DINOv2 + CLIP) ---------- */ + +.vase-compare { + margin-top: 2rem; + padding-top: 1.8rem; + border-top: 1px dashed var(--border); +} + +.vase-compare-label { + text-align: center; + font-size: 0.86rem; + font-weight: 600; + color: var(--ink-soft); + margin: 0 0 1rem; +} + +.vase-compare-body { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + gap: 2rem; +} + +.vase-compare-thumbs { + display: flex; + align-items: center; + gap: 0.8rem; +} + +.vase-compare-tile { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.4rem; +} + +.vase-compare-tile img { + width: 120px; + height: 120px; + object-fit: cover; + border-radius: 12px; + border: 1px solid var(--border); + background: var(--surface); +} + +.vase-compare-tile span { + font-size: 0.78rem; + color: var(--ink-soft); +} + +.vase-compare-thumbs > .arrow { + font-family: var(--serif); + font-style: italic; + font-size: 1.1rem; + color: var(--ink-soft); +} + +.vase-compare-scores { + min-width: 260px; + max-width: 340px; +} + +.vase-verdict-pill { + display: inline-block; + margin: 0 0 0.9rem; + padding: 0.3rem 0.8rem; + border-radius: 999px; + font-size: 0.82rem; + font-weight: 700; + color: #fff; + background: var(--ink-soft); +} + +.vase-verdict-pill.same { background: var(--match-yes); } +.vase-verdict-pill.uncertain { background: var(--match-partial); } +.vase-verdict-pill.different { background: var(--match-no); } + +.vase-score-row { + display: grid; + grid-template-columns: 8.5rem 1fr 3rem; + align-items: center; + gap: 0.6rem; + font-size: 0.8rem; + color: var(--ink-soft); + margin-bottom: 0.5rem; +} + +.vase-score-row span:last-child { + text-align: right; +} + +.vase-score-row.combined { + font-weight: 700; + color: var(--ink); +} + +/* ---------- Color space ---------- */ + +.color-section, .shape-section, .texture-section { + margin-top: 2.6rem; + padding-top: 2.2rem; + border-top: 1px solid var(--border); +} + +.color-section h3, .shape-section h3, .texture-section h3 { + font-family: var(--serif); + font-size: 1.7rem; + margin: 0 0 0.3rem; + text-align: center; +} + +.color-sub, .shape-sub, .texture-sub { + text-align: center; + color: var(--ink-soft); + font-size: 0.86rem; + margin: 0 0 1.4rem; + max-width: 52ch; + margin-left: auto; + margin-right: auto; +} + +.input-palette { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + gap: 0.7rem; + margin-bottom: 1.8rem; +} + +.input-palette .palette-label { + font-size: 0.82rem; + color: var(--ink-soft); + margin-right: 0.3rem; +} + +.input-palette .swatch-chip { + display: flex; + align-items: center; + gap: 0.35rem; + background: var(--surface); + border: 1px solid var(--border); + border-radius: 999px; + padding: 0.25rem 0.6rem 0.25rem 0.25rem; + font-size: 0.76rem; + color: var(--ink-soft); +} + +.swatch { + display: inline-block; + width: 18px; + height: 18px; + border-radius: 50%; + border: 1px solid rgba(0, 0, 0, 0.08); + flex-shrink: 0; +} + +.color-grid, .shape-grid, .texture-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: 1.4rem; +} + +.color-card, .shape-card, .texture-card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 1.2rem 1.3rem 1.4rem; + box-shadow: var(--shadow-sm); +} + +.color-card-head, .shape-card-head, .texture-card-head { + display: flex; + align-items: center; + gap: 0.7rem; + margin-bottom: 0.9rem; +} + +.color-card-head img, .shape-card-head img, .texture-card-head img { + width: 44px; + height: 44px; + border-radius: 10px; + object-fit: cover; + background: var(--bg-alt); + flex-shrink: 0; +} + +.color-card-head .name, .shape-card-head .name, .texture-card-head .name { + font-family: var(--serif); + font-size: 1.1rem; + text-transform: capitalize; +} + +.color-match-row, .shape-match-row, .texture-match-row { + display: flex; + align-items: center; + gap: 0.6rem; + margin-bottom: 0.5rem; +} + +.color-match-row .score-bar-track, +.shape-match-row .score-bar-track, +.texture-match-row .score-bar-track { flex: 1; } + +.color-match-row .match-pct, +.shape-match-row .match-pct, +.texture-match-row .match-pct { + font-size: 0.82rem; + font-weight: 600; + color: var(--ink-soft); + white-space: nowrap; + min-width: 3.2em; + text-align: right; +} + +.shape-subscores, .texture-subscores { + font-size: 0.74rem; + color: var(--ink-soft); + margin: 0; +} + +.color-pairs { + display: flex; + flex-wrap: wrap; + gap: 0.9rem; +} + +.color-pair { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.35rem; +} + +.pair-swatches { + display: flex; + align-items: center; + gap: 0.3rem; +} + +.pair-swatches .swatch { width: 22px; height: 22px; } + +.pair-arrow { + color: var(--ink-soft); + font-size: 0.75rem; +} + +.pair-similarity { + font-size: 0.7rem; + color: var(--ink-soft); +} + +/* ---------- Weighted final match ---------- */ + +.weighted-section { + /* Leads #results now (moved up so the final verdict is visible without + scrolling past every individual method card first) -- border/spacing + flipped to the bottom to separate it from what follows instead of + what used to precede it. */ + margin-bottom: 2.6rem; + padding-bottom: 2.2rem; + border-bottom: 1px solid var(--border); +} + +.weighted-section h3 { + font-family: var(--serif); + font-size: 1.7rem; + margin: 0 0 0.3rem; + text-align: center; +} + +.weighted-sub { + text-align: center; + color: var(--ink-soft); + font-size: 0.86rem; + margin: 0 0 1.4rem; +} + +.weighted-top-row { + display: flex; + align-items: stretch; + gap: 1.2rem; + flex-wrap: wrap; + margin-bottom: 1.6rem; +} + +.weighted-card { + background: linear-gradient(135deg, var(--terracotta-deep), var(--terracotta)); + color: #fbf9f4; + border-radius: var(--radius); + padding: 1.8rem 2rem; + box-shadow: var(--shadow); + display: flex; + align-items: center; + gap: 1.4rem; + flex-wrap: wrap; + flex: 2 1 420px; +} + +.weighted-flower-check { + flex: 1 1 220px; + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 1.4rem 1.5rem; + display: flex; + flex-direction: column; + justify-content: center; +} + +.weighted-flower-check-label { + font-size: 0.76rem; + font-weight: 700; + color: var(--ink-soft); + margin: 0 0 0.8rem; + text-transform: uppercase; + letter-spacing: 0.03em; +} + +.weighted-flower-check-loading { + display: flex; + align-items: center; + gap: 0.7rem; + color: var(--ink-soft); + font-size: 0.85rem; +} + +.weighted-flower-check-loading p { margin: 0; } + +.spinner-sm { + width: 18px; + height: 18px; + border-width: 2px; + flex-shrink: 0; +} + +.weighted-flower-check-body .wfc-stat { + display: flex; + justify-content: space-between; + align-items: baseline; + gap: 0.8rem; + padding: 0.5rem 0; + border-bottom: 1px dashed var(--border); + font-size: 0.86rem; +} + +.weighted-flower-check-body .wfc-stat:last-child { border-bottom: none; } + +.wfc-stat-label { color: var(--ink-soft); } +.wfc-stat-value { font-weight: 700; color: var(--ink); } + +.weighted-card .weighted-thumb { + width: 84px; + height: 84px; + border-radius: 12px; + object-fit: cover; + background: rgba(255, 255, 255, 0.15); + flex-shrink: 0; +} + +.weighted-card .weighted-thumbs { + display: flex; + align-items: center; + gap: 0.5rem; + flex-shrink: 0; +} + +.weighted-card .weighted-thumbs img { + width: 64px; + height: 64px; + border-radius: 10px; + object-fit: cover; + background: rgba(255, 255, 255, 0.15); + flex-shrink: 0; +} + +.weighted-card .weighted-thumbs .arrow { + font-family: var(--serif); + font-style: italic; + opacity: 0.85; + font-size: 0.95rem; +} + +.weighted-card .weighted-text .weighted-supporting { + font-size: 0.78rem; + opacity: 0.85; + margin: 0.2rem 0 0; +} + +.weighted-card .verdict-pill { + display: inline-block; + margin-top: 0.5rem; + padding: 0.2rem 0.65rem; + border-radius: 999px; + font-size: 0.76rem; + font-weight: 700; + background: rgba(255, 255, 255, 0.22); + color: #fff; +} + +.weighted-card .weighted-text .label { + text-transform: uppercase; + letter-spacing: 0.1em; + font-size: 0.72rem; + opacity: 0.85; + margin: 0 0 0.2rem; +} + +.weighted-card .weighted-text h4 { + font-family: var(--serif); + font-size: 1.8rem; + margin: 0; + text-transform: capitalize; +} + +.weighted-card .weighted-text .weighted-total { + font-size: 0.82rem; + opacity: 0.9; + margin-top: 0.25rem; +} + +.weighted-card .weighted-breakdown { + margin-left: auto; + display: flex; + flex-direction: column; + gap: 0.25rem; + font-size: 0.78rem; + opacity: 0.95; + min-width: 200px; +} + +.weighted-card .weighted-breakdown .row { + display: flex; + justify-content: space-between; + gap: 0.8rem; +} + +.weighted-ranked { + display: flex; + flex-direction: column; + gap: 0.5rem; + max-width: 480px; + margin: 0 auto; +} + +/* ---------- Color family grid ---------- */ + +.family-grid-section { + margin-top: 2.6rem; + padding-top: 2.2rem; + border-top: 1px solid var(--border); +} + +.family-grid-section h3 { + font-family: var(--serif); + font-size: 1.7rem; + margin: 0 0 0.3rem; + text-align: center; +} + +.family-grid-sub { + text-align: center; + color: var(--ink-soft); + font-size: 0.86rem; + margin: 0 0 1.2rem; + max-width: 56ch; + margin-left: auto; + margin-right: auto; +} + +.family-grid-sub strong { text-transform: capitalize; color: var(--ink); } + +.family-grid-overall { + text-align: center; + margin-bottom: 1.4rem; +} + +.family-grid-overall .big-pct { + font-family: var(--serif); + font-size: 2.2rem; + font-weight: 600; + color: var(--sage-deep); +} + +.family-grid-overall .big-pct-label { + display: block; + font-size: 0.78rem; + color: var(--ink-soft); + text-transform: uppercase; + letter-spacing: 0.06em; + margin-top: 0.2rem; +} + +.family-grid-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: 1.4rem; + margin-bottom: 1.6rem; +} + +.family-grid-row .grid-tile { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + overflow: hidden; + box-shadow: var(--shadow-sm); +} + +.family-grid-row .grid-tile img { + width: 100%; + display: block; + background: var(--bg-alt); +} + +.family-grid-row .grid-tile .tile-label { + padding: 0.55rem 0.8rem; + font-size: 0.82rem; + color: var(--ink-soft); + border-top: 1px solid var(--border); + text-transform: capitalize; +} + +.family-grid-matches { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 1rem; + max-width: 720px; + margin: 0 auto; +} + +.family-match { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.3rem; + background: var(--surface); + border: 1px solid var(--border); + border-radius: 12px; + padding: 0.7rem 0.9rem; + min-width: 120px; +} + +.family-match .rank { + font-size: 0.7rem; + color: var(--ink-soft); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.family-match .area-pct { + font-size: 0.82rem; + font-weight: 600; + color: var(--ink); +} + +.family-match .sub-pct { + font-size: 0.7rem; + color: var(--ink-soft); +} + +.shape-visual, .texture-visual { + margin-top: 2rem; + padding-top: 1.8rem; + border-top: 1px dashed var(--border); +} + +.texture-glcm-table { + max-width: 520px; + margin: 1.2rem auto 0; + display: flex; + flex-direction: column; + gap: 0.4rem; +} + +.texture-glcm-table .row { + display: grid; + grid-template-columns: 1fr auto auto auto; + gap: 0.7rem; + align-items: baseline; + font-size: 0.8rem; + padding: 0.3rem 0; + border-bottom: 1px solid var(--border); +} + +.texture-glcm-table .row.head { + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--ink-soft); + border-bottom: 1px solid var(--ink-soft); +} + +.texture-glcm-table .prop-name { + text-transform: capitalize; + color: var(--ink); +} + +.texture-glcm-table .value { text-align: right; color: var(--ink-soft); min-width: 3.5em; } + +/* ---------- AI verification (fluid glass card) ---------- */ + +.verify-section { + margin-top: 2.6rem; + padding-top: 2.2rem; + border-top: 1px solid var(--border); +} + +.verify-section h3 { + font-family: var(--serif); + font-size: 1.7rem; + margin: 0 0 0.3rem; + text-align: center; +} + +.verify-sub { + text-align: center; + color: var(--ink-soft); + font-size: 0.86rem; + margin: 0 0 1.6rem; +} + +.verify-sub strong { text-transform: capitalize; color: var(--ink); } + +.verify-blob { + position: relative; + max-width: 820px; + margin: 0 auto; + padding: 2.2rem; +} + +.verify-blob::before, +.verify-blob::after { + content: ""; + position: absolute; + inset: -10%; + z-index: 0; + border-radius: 60% 40% 55% 45% / 45% 55% 45% 55%; + filter: blur(38px); + opacity: 0.55; + background: + radial-gradient(closest-side at 25% 30%, var(--blob-a), transparent), + radial-gradient(closest-side at 75% 40%, var(--blob-b), transparent), + radial-gradient(closest-side at 50% 80%, var(--blob-c), transparent); + animation: blob-drift 18s ease-in-out infinite; +} + +.verify-blob::after { + animation-duration: 24s; + animation-direction: reverse; + opacity: 0.35; +} + +@keyframes blob-drift { + 0%, 100% { transform: translate(0, 0) scale(1) rotate(0deg); } + 33% { transform: translate(2%, -3%) scale(1.05) rotate(8deg); } + 66% { transform: translate(-3%, 2%) scale(0.97) rotate(-6deg); } +} + +@media (prefers-reduced-motion: reduce) { + .verify-blob::before, .verify-blob::after { animation: none; } +} + +.verify-glass { + position: relative; + z-index: 1; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 28px; + backdrop-filter: blur(18px) saturate(140%); + -webkit-backdrop-filter: blur(18px) saturate(140%); + box-shadow: var(--shadow); + padding: 3rem 3.2rem; + text-align: center; + min-height: 96px; +} + +.verify-glass .verify-loading { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.7rem; + color: var(--ink-soft); + font-size: 0.9rem; +} + +.verify-images { + display: flex; + align-items: center; + justify-content: center; + gap: 2rem; + margin-bottom: 1.8rem; +} + +.verify-image-tile { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.6rem; +} + +.verify-image-tile img { + width: 168px; + height: 168px; + object-fit: cover; + border-radius: 18px; + background: var(--bg-alt); + box-shadow: var(--shadow); +} + +.verify-image-tile span { + font-size: 0.86rem; + color: var(--ink-soft); + text-transform: capitalize; +} + +.verify-vs { + font-family: var(--serif); + font-style: italic; + color: var(--ink-soft); + font-size: 1.3rem; + padding-bottom: 1.8rem; +} + +.verify-match-line { + font-size: 1.15rem; + margin: 0 0 0.9rem; + display: flex; + align-items: baseline; + justify-content: center; + gap: 0.7rem; + flex-wrap: wrap; +} + +.verify-match-line .match-label { + font-family: var(--serif); + color: var(--ink-soft); +} + +.verify-match-line .match-value { + font-family: var(--serif); + font-weight: 600; + font-size: 1.3rem; +} + +.verify-match-line.yes .match-value { color: var(--match-yes); } +.verify-match-line.no .match-value { color: var(--match-no); } +.verify-match-line.partial .match-value { color: var(--match-partial); } +.verify-match-line.unknown .match-value { color: var(--ink-soft); } + +.verify-match-line .verify-confidence { + font-size: 0.72rem; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--ink-soft); + align-self: center; +} + +.verify-description { + font-size: 1rem; + line-height: 1.7; + color: var(--ink); + max-width: 58ch; + margin: 0 auto 1.3rem; + text-align: justify; + text-justify: inter-word; +} + +.verify-description .match-label { + font-weight: 600; + color: var(--ink); +} + +.read-more-toggle { + color: var(--sage-deep); + font-size: 0.84rem; + font-weight: 600; + text-decoration: none; + white-space: nowrap; +} + +.read-more-toggle:hover { text-decoration: underline; } + +.verify-footnote { + font-size: 0.72rem; + color: var(--ink-soft); + opacity: 0.75; +} + +.verify-error { + color: var(--ink-soft); + font-size: 0.9rem; +} + +/* ---------- Footer ---------- */ + +.site-footer { + text-align: center; + padding: 2rem 1.5rem 3rem; + color: var(--ink-soft); + font-size: 0.82rem; +} + +@media (max-width: 600px) { + .hero { padding: 4.5rem 1.2rem 3rem; } + .section { padding: 2.6rem 1.2rem; } + .overall-card { flex-direction: column; text-align: center; } + .weighted-card { flex-direction: column; text-align: center; } + .weighted-card .weighted-breakdown { margin-left: 0; align-items: center; } + .weighted-card .weighted-thumbs { justify-content: center; } + .verify-blob { padding: 0.8rem; } + .verify-glass { padding: 1.8rem 1.4rem; } + .verify-image-tile img { width: 100px; height: 100px; } + .verify-images { gap: 1rem; } + .verify-description { text-align: left; } +} diff --git a/static/js/main.js b/static/js/main.js new file mode 100644 index 0000000..a5f4969 --- /dev/null +++ b/static/js/main.js @@ -0,0 +1,988 @@ +(() => { + const templatesData = JSON.parse(document.getElementById("templates-data").textContent); + const templateFileByName = {}; + templatesData.forEach(t => { templateFileByName[t.name] = t.filename; }); + + const fileInput = document.getElementById("file-input"); + const dropzone = document.getElementById("dropzone"); + const dropzoneEmpty = document.getElementById("dropzone-empty"); + const previewImg = document.getElementById("preview-img"); + const submitBtn = document.getElementById("submit-btn"); + const clearBtn = document.getElementById("clear-btn"); + const errorMsg = document.getElementById("error-msg"); + const loading = document.getElementById("loading"); + const loadingText = document.getElementById("loading-text"); + const resultsSection = document.getElementById("results"); + const totalTimeEl = document.getElementById("total-time"); + const overallCard = document.getElementById("overall-card"); + const queryRow = document.getElementById("query-row"); + const methodGrid = document.getElementById("method-grid"); + const inputPalette = document.getElementById("input-palette"); + const colorGrid = document.getElementById("color-grid"); + const shapeGrid = document.getElementById("shape-grid"); + const shapeVisual = document.getElementById("shape-visual"); + const shapeOverall = document.getElementById("shape-overall"); + const shapeVisualRow = document.getElementById("shape-visual-row"); + const textureGrid = document.getElementById("texture-grid"); + const textureVisual = document.getElementById("texture-visual"); + const textureOverall = document.getElementById("texture-overall"); + const textureVisualRow = document.getElementById("texture-visual-row"); + const textureGlcmTable = document.getElementById("texture-glcm-table"); + const weightedSub = document.getElementById("weighted-sub"); + const weightedCard = document.getElementById("weighted-card"); + const weightedRanked = document.getElementById("weighted-ranked"); + const weightedFlowerCheck = document.getElementById("weighted-flower-check"); + const weightedFlowerCheckLoading = document.getElementById("weighted-flower-check-loading"); + const weightedFlowerCheckBody = document.getElementById("weighted-flower-check-body"); + const weightedFlowerCheckError = document.getElementById("weighted-flower-check-error"); + const wfcCountValue = document.getElementById("wfc-count-value"); + const wfcClipValue = document.getElementById("wfc-clip-value"); + const familyGridSection = document.getElementById("family-grid-section"); + const familyGridTemplateName = document.getElementById("family-grid-template-name"); + const familyGridOverall = document.getElementById("family-grid-overall"); + const familyGridRow = document.getElementById("family-grid-row"); + const familyGridMatches = document.getElementById("family-grid-matches"); + const verifySection = document.getElementById("verify-section"); + const verifyTemplateName = document.getElementById("verify-template-name"); + const verifyGlass = document.getElementById("verify-glass"); + const countFlowersBtn = document.getElementById("count-flowers-btn"); + const flowerCountLoading = document.getElementById("flower-count-loading"); + const flowerCountError = document.getElementById("flower-count-error"); + const flowerCountResult = document.getElementById("flower-count-result"); + const flowerCountImage = document.getElementById("flower-count-image"); + const flowerCountTotal = document.getElementById("flower-count-total"); + const flowerCountClusters = document.getElementById("flower-count-clusters"); + const flowerCountTime = document.getElementById("flower-count-time"); + const yoloCountImage = document.getElementById("yolo-count-image"); + const yoloCountTotal = document.getElementById("yolo-count-total"); + const vaseCompare = document.getElementById("vase-compare"); + const vaseCompareError = document.getElementById("vase-compare-error"); + const vaseCompareBody = document.getElementById("vase-compare-body"); + const vaseCropInput = document.getElementById("vase-crop-input"); + const vaseCropTemplate = document.getElementById("vase-crop-template"); + const vaseCropTemplateName = document.getElementById("vase-crop-template-name"); + const vaseVerdictPill = document.getElementById("vase-verdict-pill"); + const vaseDinoBar = document.getElementById("vase-dino-bar"); + const vaseDinoValue = document.getElementById("vase-dino-value"); + const vaseClipBar = document.getElementById("vase-clip-bar"); + const vaseClipValue = document.getElementById("vase-clip-value"); + const vaseCombinedBar = document.getElementById("vase-combined-bar"); + const vaseCombinedValue = document.getElementById("vase-combined-value"); + const flowerCountMismatch = document.getElementById("flower-count-mismatch"); + const flowerCountMismatchText = document.getElementById("flower-count-mismatch-text"); + + let selectedFile = null; + let currentRequestId = null; + let currentWeightedBest = null; + + function showError(msg) { + errorMsg.textContent = msg; + errorMsg.hidden = !msg; + } + + function setSelectedFile(file) { + if (!file) return; + if (!file.type.startsWith("image/")) { + showError("Please choose an image file."); + return; + } + showError(""); + selectedFile = file; + + const reader = new FileReader(); + reader.onload = e => { + previewImg.src = e.target.result; + previewImg.hidden = false; + dropzoneEmpty.hidden = true; + }; + reader.readAsDataURL(file); + + submitBtn.disabled = false; + clearBtn.hidden = false; + } + + fileInput.addEventListener("change", () => setSelectedFile(fileInput.files[0])); + + ["dragover", "dragenter"].forEach(evt => + dropzone.addEventListener(evt, e => { + e.preventDefault(); + dropzone.classList.add("dragover"); + }) + ); + ["dragleave", "drop"].forEach(evt => + dropzone.addEventListener(evt, e => { + e.preventDefault(); + dropzone.classList.remove("dragover"); + }) + ); + dropzone.addEventListener("drop", e => { + const file = e.dataTransfer.files[0]; + if (file) setSelectedFile(file); + }); + + clearBtn.addEventListener("click", e => { + e.preventDefault(); + selectedFile = null; + fileInput.value = ""; + previewImg.hidden = true; + dropzoneEmpty.hidden = false; + submitBtn.disabled = true; + clearBtn.hidden = true; + showError(""); + resultsSection.hidden = true; + }); + + const LOADING_MESSAGES = [ + "Removing background…", + "Extracting SIFT & ORB keypoints…", + "Running SuperPoint + LightGlue…", + "Running LoFTR…", + "Scoring templates…", + ]; + + function cycleLoadingMessages() { + let i = 0; + loadingText.textContent = LOADING_MESSAGES[0]; + return setInterval(() => { + i = (i + 1) % LOADING_MESSAGES.length; + loadingText.textContent = LOADING_MESSAGES[i]; + }, 1400); + } + + submitBtn.addEventListener("click", async () => { + if (!selectedFile) return; + showError(""); + submitBtn.disabled = true; + resultsSection.hidden = true; + loading.hidden = false; + const msgTimer = cycleLoadingMessages(); + + try { + const form = new FormData(); + form.append("image", selectedFile); + + const res = await fetch("/api/match", { method: "POST", body: form }); + const data = await res.json(); + + if (!res.ok) { + throw new Error(data.error || "Something went wrong."); + } + + renderResults(data); + } catch (err) { + showError(err.message || String(err)); + } finally { + clearInterval(msgTimer); + loading.hidden = true; + submitBtn.disabled = false; + } + }); + + function el(tag, className, text) { + const node = document.createElement(tag); + if (className) node.className = className; + if (text !== undefined) node.textContent = text; + return node; + } + + function uploadUrl(requestId, filename) { + return `/uploads/${requestId}/${filename}`; + } + + function renderResults(data) { + currentRequestId = data.request_id; + currentWeightedBest = data.weighted_best; + flowerCountResult.hidden = true; + flowerCountError.hidden = true; + flowerCountLoading.hidden = true; + vaseCompare.hidden = true; + flowerCountMismatch.hidden = true; + weightedFlowerCheck.hidden = true; + countFlowersBtn.disabled = false; + countFlowersBtn.textContent = "Count flowers"; + + totalTimeEl.textContent = + `Total processing time: ${data.total_time_sec.toFixed(2)}s ` + + `(background removal: ${data.bg_removal_time_sec.toFixed(2)}s)`; + + // --- weighted final match (rendered first -- it now leads #results so + // the final verdict is visible without scrolling past every card) --- + renderWeighted(data); + + // --- overall best --- + overallCard.innerHTML = ""; + if (data.overall_best) { + const filename = templateFileByName[data.overall_best]; + if (filename) { + const img = el("img", "overall-thumb"); + img.src = `/template_image/${encodeURIComponent(filename)}`; + img.alt = data.overall_best; + overallCard.appendChild(img); + } + const textWrap = el("div", "overall-text"); + textWrap.appendChild(el("p", "label", "Overall best match")); + textWrap.appendChild(el("h3", null, data.overall_best)); + overallCard.appendChild(textWrap); + } else { + overallCard.appendChild(el("p", null, "No confident match found across any method.")); + } + + // --- query row: original + background removed --- + queryRow.innerHTML = ""; + queryRow.appendChild(buildQueryTile( + uploadUrl(data.request_id, data.upload_original_file), "Your upload" + )); + queryRow.appendChild(buildQueryTile( + uploadUrl(data.request_id, data.upload_nobg_file), "Background removed" + )); + + // --- per-method cards (Color is excluded here -- it has its own + // dedicated section below and only participates in the weighted + // verdict, not this grid) --- + methodGrid.innerHTML = ""; + Object.entries(data.methods).forEach(([methodKey, m]) => { + if (methodKey === "Color") return; + methodGrid.appendChild(buildMethodCard(data.request_id, methodKey, m)); + }); + + // --- color space section (own display; also weighted into the verdict) --- + renderColorAnalysis(data); + + // --- shape matching + texture matching (independent sections, no + // score/verdict involvement at all) --- + renderShapeAnalysis(data); + renderTextureAnalysis(data); + + // --- color family grid (visual, tied to the weighted-best template) --- + renderFamilyGrid(data); + + resultsSection.hidden = false; + resultsSection.scrollIntoView({ behavior: "smooth", block: "start" }); + + // --- AI verification (fires after everything above is already on + // screen; a slow or unreachable external endpoint should never block + // or affect the core match results) --- + if (data.weighted_best) { + runVerification(data, data.weighted_best); + runFlowerSummary(data.request_id, data.weighted_best); + } + } + + async function runFlowerSummary(requestId, template) { + weightedFlowerCheck.hidden = false; + weightedFlowerCheckLoading.hidden = false; + weightedFlowerCheckBody.hidden = true; + weightedFlowerCheckError.hidden = true; + + try { + const res = await fetch("/api/flower_summary", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ request_id: requestId, template }), + }); + const data = await res.json(); + + if (!res.ok) { + throw new Error(data.error || "Flower check failed."); + } + if (data.error) { + throw new Error(data.error); + } + + const fc = data.flower_count_comparison; + wfcCountValue.textContent = fc ? `${fc.input_count} vs ${fc.template_count}` : "n/a"; + wfcCountValue.title = fc ? fc.message : ""; + wfcClipValue.textContent = data.flower_clip_similarity_pct != null + ? `${data.flower_clip_similarity_pct}%` : "n/a"; + + weightedFlowerCheckLoading.hidden = true; + weightedFlowerCheckBody.hidden = false; + } catch (err) { + weightedFlowerCheckLoading.hidden = true; + weightedFlowerCheckError.textContent = err.message || String(err); + weightedFlowerCheckError.hidden = false; + } + } + + async function runVerification(matchData, template) { + verifySection.hidden = false; + verifyTemplateName.textContent = template; + + verifyGlass.innerHTML = ""; + const loadingWrap = el("div", "verify-loading"); + loadingWrap.appendChild(el("div", "spinner")); + loadingWrap.appendChild(el("p", null, "Cross-checking with an AI vision model…")); + verifyGlass.appendChild(loadingWrap); + + try { + const res = await fetch("/api/verify", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ request_id: matchData.request_id, template }), + }); + const data = await res.json(); + + if (!res.ok) { + throw new Error(data.error || "Verification failed."); + } + + renderVerification(matchData, template, data); + } catch (err) { + verifyGlass.innerHTML = ""; + verifyGlass.appendChild(el("p", "verify-error", + `AI verification is unavailable right now (${err.message || err}).`)); + } + } + + const DESCRIPTION_PREVIEW_LEN = 220; + + function combinedDescription(data) { + const hasDiscrepancies = data.discrepancies && data.discrepancies.toLowerCase() !== "none"; + if (data.description && hasDiscrepancies) { + return `${data.description} Discrepancies: ${data.discrepancies}`; + } + if (data.description) return data.description; + if (hasDiscrepancies) return `Discrepancies: ${data.discrepancies}`; + return "No discrepancies were found between the two images."; + } + + function renderVerification(matchData, template, data) { + verifyGlass.innerHTML = ""; + + // --- the two photos being compared --- + const imagesRow = el("div", "verify-images"); + const uploadTile = el("div", "verify-image-tile"); + const uploadImg = el("img"); + uploadImg.src = uploadUrl(matchData.request_id, matchData.upload_original_file); + uploadImg.alt = "Your upload"; + uploadTile.appendChild(uploadImg); + uploadTile.appendChild(el("span", null, "Your upload")); + imagesRow.appendChild(uploadTile); + + imagesRow.appendChild(el("span", "verify-vs", "vs")); + + const templateTile = el("div", "verify-image-tile"); + const templateFilename = templateFileByName[template]; + if (templateFilename) { + const templateImg = el("img"); + templateImg.src = `/template_image/${encodeURIComponent(templateFilename)}`; + templateImg.alt = template; + templateTile.appendChild(templateImg); + } + templateTile.appendChild(el("span", null, template)); + imagesRow.appendChild(templateTile); + + verifyGlass.appendChild(imagesRow); + + // --- Match: Yes/No/Partial --- + const matchKey = (data.match || "unknown").toLowerCase(); + const matchValue = { yes: "Yes", no: "No", partial: "Partial" }[matchKey] || "Unclear"; + const matchLine = el("p", `verify-match-line ${matchKey}`); + matchLine.appendChild(el("span", "match-label", "Match: ")); + matchLine.appendChild(el("span", "match-value", matchValue)); + if (data.confidence) { + matchLine.appendChild(el("span", "verify-confidence", `Confidence: ${data.confidence}`)); + } + verifyGlass.appendChild(matchLine); + + // --- Description: truncated, with a Read more / Show less toggle --- + const fullText = combinedDescription(data); + const descWrap = el("p", "verify-description"); + const label = el("span", "match-label", "Description: "); + const textSpan = el("span", "verify-description-text"); + descWrap.appendChild(label); + descWrap.appendChild(textSpan); + verifyGlass.appendChild(descWrap); + + if (fullText.length <= DESCRIPTION_PREVIEW_LEN) { + textSpan.textContent = fullText; + } else { + let expanded = false; + const toggle = el("a", "read-more-toggle", "Read more"); + toggle.href = "#"; + const renderText = () => { + textSpan.textContent = expanded + ? fullText + " " + : fullText.slice(0, DESCRIPTION_PREVIEW_LEN).trim() + "… "; + toggle.textContent = expanded ? "Show less" : "Read more"; + }; + toggle.addEventListener("click", e => { + e.preventDefault(); + expanded = !expanded; + renderText(); + }); + renderText(); + descWrap.appendChild(toggle); + } + + if (data.pixel_precheck) { + const { hash_distance, verdict } = data.pixel_precheck; + verifyGlass.appendChild(el("p", "verify-footnote", + `Pixel pre-check: ${verdict} (hash distance ${hash_distance})`)); + } + } + + countFlowersBtn.addEventListener("click", async () => { + if (!currentRequestId) return; + countFlowersBtn.disabled = true; + flowerCountError.hidden = true; + flowerCountResult.hidden = true; + flowerCountLoading.hidden = false; + + try { + const res = await fetch("/api/count_flowers", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ request_id: currentRequestId, template: currentWeightedBest }), + }); + const data = await res.json(); + + if (!res.ok) { + throw new Error(data.error || "Flower counting failed."); + } + + renderFlowerCount(data); + } catch (err) { + flowerCountError.textContent = err.message || String(err); + flowerCountError.hidden = false; + } finally { + flowerCountLoading.hidden = true; + countFlowersBtn.disabled = false; + countFlowersBtn.textContent = "Recount"; + } + }); + + function renderFlowerCount(data) { + const sam = data.sam || {}; + const yolo = data.yolo || {}; + + if (sam.error && yolo.error) { + flowerCountError.textContent = sam.error || yolo.error; + flowerCountError.hidden = false; + return; + } + + if (!sam.error) { + flowerCountImage.hidden = false; + flowerCountImage.src = `${uploadUrl(data.request_id, sam.visual_file)}?t=${Date.now()}`; + flowerCountTotal.textContent = `${sam.total_count} flower${sam.total_count === 1 ? "" : "s"} detected`; + + flowerCountClusters.innerHTML = ""; + (sam.clusters || []).forEach(c => { + const chip = el("span", "flower-cluster-chip"); + const swatch = el("span", "swatch"); + swatch.style.background = rgbCss(c.color_rgb); + chip.appendChild(swatch); + chip.appendChild(el("span", null, `${c.count}`)); + flowerCountClusters.appendChild(chip); + }); + if ((sam.clusters || []).length > 1) { + flowerCountClusters.appendChild( + el("span", "flower-cluster-hint", `~${sam.clusters.length} distinct kinds (by color)`) + ); + } + } else { + flowerCountImage.hidden = true; + flowerCountTotal.textContent = `SAM unavailable: ${sam.error}`; + flowerCountClusters.innerHTML = ""; + } + + if (!yolo.error) { + yoloCountImage.hidden = false; + yoloCountImage.src = `${uploadUrl(data.request_id, yolo.visual_file)}?t=${Date.now()}`; + const parts = [`${yolo.flower_count} flower region${yolo.flower_count === 1 ? "" : "s"}`]; + if (yolo.vase_count) parts.push(`${yolo.vase_count} vase`); + if (yolo.ribbon_count) parts.push(`${yolo.ribbon_count} ribbon/bow`); + yoloCountTotal.textContent = parts.join(" · "); + } else { + yoloCountImage.hidden = true; + yoloCountTotal.textContent = `YOLO-World unavailable: ${yolo.error}`; + } + + flowerCountTime.hidden = false; + flowerCountTime.textContent = `Processed in ${data.time_sec.toFixed(2)}s`; + flowerCountResult.hidden = false; + + renderFlowerCountMismatch(data.flower_count_comparison); + renderVaseComparison(data.vase_comparison); + } + + function renderFlowerCountMismatch(fc) { + if (!fc) { + flowerCountMismatch.hidden = true; + return; + } + flowerCountMismatch.hidden = false; + flowerCountMismatchText.textContent = fc.error + ? `Flower-count comparison unavailable: ${fc.error}` + : fc.message; + flowerCountMismatch.classList.toggle("is-mismatch", !fc.error && fc.diff !== 0); + } + + function renderVaseComparison(vc) { + if (!vc) { + vaseCompare.hidden = true; + return; + } + vaseCompare.hidden = false; + + if (vc.error) { + vaseCompareError.textContent = vc.error; + vaseCompareError.hidden = false; + vaseCompareBody.hidden = true; + return; + } + vaseCompareError.hidden = true; + vaseCompareBody.hidden = false; + + vaseCropInput.src = `${uploadUrl(currentRequestId, vc.input_crop_file)}?t=${Date.now()}`; + vaseCropTemplate.src = `${uploadUrl(currentRequestId, vc.template_crop_file)}?t=${Date.now()}`; + vaseCropTemplateName.textContent = vc.template; + + const verdictLabel = { same: "Same vase", uncertain: "Uncertain", different: "Different vase" }[vc.verdict] + || vc.verdict; + vaseVerdictPill.textContent = `${verdictLabel} — ${vc.combined_pct}% combined similarity`; + vaseVerdictPill.className = `vase-verdict-pill ${vc.verdict}`; + + vaseDinoBar.style.width = `${vc.dino_similarity_pct}%`; + vaseDinoValue.textContent = `${vc.dino_similarity_pct}%`; + vaseClipBar.style.width = `${vc.clip_similarity_pct}%`; + vaseClipValue.textContent = `${vc.clip_similarity_pct}%`; + vaseCombinedBar.style.width = `${vc.combined_pct}%`; + vaseCombinedValue.textContent = `${vc.combined_pct}%`; + } + + function rgbCss(rgb) { + return `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`; + } + + function renderColorAnalysis(data) { + const analysis = data.color_analysis || { input_dominant_colors: [], templates: [] }; + + inputPalette.innerHTML = ""; + if (analysis.input_dominant_colors.length) { + inputPalette.appendChild(el("span", "palette-label", "Your photo's colors:")); + analysis.input_dominant_colors.forEach(c => { + const chip = el("span", "swatch-chip"); + const swatch = el("span", "swatch"); + swatch.style.background = rgbCss(c.rgb); + chip.appendChild(swatch); + chip.appendChild(document.createTextNode(`${c.pct}%`)); + inputPalette.appendChild(chip); + }); + } else if (data.color_analysis_error) { + inputPalette.appendChild(el("p", "verify-error", + `Color analysis unavailable (${data.color_analysis_error}).`)); + } + + colorGrid.innerHTML = ""; + analysis.templates.forEach(t => { + colorGrid.appendChild(buildColorCard(t)); + }); + } + + function buildColorCard(t) { + const card = el("div", "color-card"); + + const head = el("div", "color-card-head"); + const filename = templateFileByName[t.template]; + if (filename) { + const img = el("img"); + img.src = `/template_image/${encodeURIComponent(filename)}`; + img.alt = t.template; + head.appendChild(img); + } + head.appendChild(el("span", "name", t.template)); + card.appendChild(head); + + const matchRow = el("div", "color-match-row"); + const track = el("div", "score-bar-track"); + const fill = el("div", "score-bar-fill"); + fill.style.width = `${Math.max(2, t.match_pct)}%`; + track.appendChild(fill); + matchRow.appendChild(track); + matchRow.appendChild(el("span", "match-pct", `${t.match_pct}% match`)); + card.appendChild(matchRow); + + const pairs = el("div", "color-pairs"); + t.color_pairs.forEach(p => { + const pair = el("div", "color-pair"); + const swatches = el("div", "pair-swatches"); + + const inputSwatch = el("span", "swatch"); + inputSwatch.style.background = rgbCss(p.input_rgb); + inputSwatch.title = `Your photo — ${p.input_pct}%`; + swatches.appendChild(inputSwatch); + + swatches.appendChild(el("span", "pair-arrow", "→")); + + const templateSwatch = el("span", "swatch"); + templateSwatch.style.background = rgbCss(p.template_rgb); + templateSwatch.title = `${t.template} — ${p.template_pct}%`; + swatches.appendChild(templateSwatch); + + pair.appendChild(swatches); + pair.appendChild(el("span", "pair-similarity", `${p.similarity}% alike`)); + pairs.appendChild(pair); + }); + card.appendChild(pairs); + + return card; + } + + function renderShapeAnalysis(data) { + const analysis = data.shape_analysis || { results: [], visuals: null, error: null }; + + shapeGrid.innerHTML = ""; + if (!analysis.results.length && analysis.error) { + shapeGrid.appendChild(el("p", "verify-error", `Shape analysis unavailable (${analysis.error}).`)); + } else { + analysis.results.forEach(t => shapeGrid.appendChild(buildShapeCard(t))); + } + + const best = analysis.results[0]; + if (analysis.visuals && best && data.weighted_best) { + shapeVisual.hidden = false; + shapeOverall.innerHTML = ""; + const wrap = el("div"); + const bestForWeighted = analysis.results.find(r => r.template === data.weighted_best) || best; + wrap.appendChild(el("span", "big-pct", `${bestForWeighted.match_pct}%`)); + wrap.appendChild(el("span", "big-pct-label", `Overall shape match vs ${data.weighted_best}`)); + shapeOverall.appendChild(wrap); + + shapeVisualRow.innerHTML = ""; + shapeVisualRow.appendChild(buildGridTile( + uploadUrl(data.request_id, analysis.visuals.input_file), "Your upload")); + shapeVisualRow.appendChild(buildGridTile( + uploadUrl(data.request_id, analysis.visuals.template_file), data.weighted_best)); + shapeVisualRow.appendChild(buildGridTile( + uploadUrl(data.request_id, analysis.visuals.overlay_file), "Overlap")); + } else { + shapeVisual.hidden = true; + } + } + + function buildShapeCard(t) { + const card = el("div", "shape-card"); + + const head = el("div", "shape-card-head"); + const filename = templateFileByName[t.template]; + if (filename) { + const img = el("img"); + img.src = `/template_image/${encodeURIComponent(filename)}`; + img.alt = t.template; + head.appendChild(img); + } + head.appendChild(el("span", "name", t.template)); + card.appendChild(head); + + const matchRow = el("div", "shape-match-row"); + const track = el("div", "score-bar-track"); + const fill = el("div", "score-bar-fill"); + fill.style.width = `${Math.max(2, t.match_pct)}%`; + track.appendChild(fill); + matchRow.appendChild(track); + matchRow.appendChild(el("span", "match-pct", `${t.match_pct}% match`)); + card.appendChild(matchRow); + + card.appendChild(el("p", "shape-subscores", + `Hu-moment similarity ${t.hu_similarity_pct}% · silhouette overlap ${t.iou_pct}%`)); + + return card; + } + + function renderTextureAnalysis(data) { + const analysis = data.texture_analysis || { results: [], visuals: null, error: null }; + + textureGrid.innerHTML = ""; + if (!analysis.results.length && analysis.error) { + textureGrid.appendChild(el("p", "verify-error", `Texture analysis unavailable (${analysis.error}).`)); + } else { + analysis.results.forEach(t => textureGrid.appendChild(buildTextureCard(t))); + } + + const best = analysis.results[0]; + const bestForWeighted = data.weighted_best + ? analysis.results.find(r => r.template === data.weighted_best) + : null; + + if (analysis.visuals && best && bestForWeighted) { + textureVisual.hidden = false; + textureOverall.innerHTML = ""; + const wrap = el("div"); + wrap.appendChild(el("span", "big-pct", `${bestForWeighted.match_pct}%`)); + wrap.appendChild(el("span", "big-pct-label", `Overall texture match vs ${data.weighted_best}`)); + textureOverall.appendChild(wrap); + + textureVisualRow.innerHTML = ""; + textureVisualRow.appendChild(buildGridTile( + uploadUrl(data.request_id, analysis.visuals.input_file), "Your upload (LBP)")); + textureVisualRow.appendChild(buildGridTile( + uploadUrl(data.request_id, analysis.visuals.template_file), `${data.weighted_best} (LBP)`)); + + textureGlcmTable.innerHTML = ""; + const head = el("div", "row head"); + head.appendChild(el("span", "prop-name", "GLCM property")); + head.appendChild(el("span", "value", "Yours")); + head.appendChild(el("span", "value", data.weighted_best)); + head.appendChild(el("span", "value", "Alike")); + textureGlcmTable.appendChild(head); + + Object.keys(bestForWeighted.input_glcm_features).forEach(prop => { + const a = bestForWeighted.input_glcm_features[prop]; + const b = bestForWeighted.template_glcm_features[prop]; + const scale = Math.max(Math.abs(a), Math.abs(b), 1e-9); + const alike = Math.max(0, 100 * (1 - Math.abs(a - b) / scale)); + const row = el("div", "row"); + row.appendChild(el("span", "prop-name", prop)); + row.appendChild(el("span", "value", String(a))); + row.appendChild(el("span", "value", String(b))); + row.appendChild(el("span", "value", `${alike.toFixed(1)}%`)); + textureGlcmTable.appendChild(row); + }); + } else { + textureVisual.hidden = true; + } + } + + function buildTextureCard(t) { + const card = el("div", "texture-card"); + + const head = el("div", "texture-card-head"); + const filename = templateFileByName[t.template]; + if (filename) { + const img = el("img"); + img.src = `/template_image/${encodeURIComponent(filename)}`; + img.alt = t.template; + head.appendChild(img); + } + head.appendChild(el("span", "name", t.template)); + card.appendChild(head); + + const matchRow = el("div", "texture-match-row"); + const track = el("div", "score-bar-track"); + const fill = el("div", "score-bar-fill"); + fill.style.width = `${Math.max(2, t.match_pct)}%`; + track.appendChild(fill); + matchRow.appendChild(track); + matchRow.appendChild(el("span", "match-pct", `${t.match_pct}% match`)); + card.appendChild(matchRow); + + card.appendChild(el("p", "texture-subscores", + `LBP pattern ${t.lbp_similarity_pct}% · GLCM statistics ${t.glcm_similarity_pct}%`)); + + return card; + } + + function buildGridTile(src, label) { + const tile = el("div", "grid-tile"); + const img = el("img"); + img.src = src; + img.alt = label; + tile.appendChild(img); + tile.appendChild(el("div", "tile-label", label)); + return tile; + } + + function renderFamilyGrid(data) { + const fg = data.family_grid; + if (!fg || fg.error || !fg.input_grid_file) { + familyGridSection.hidden = true; + return; + } + + familyGridSection.hidden = false; + familyGridTemplateName.textContent = fg.template; + + familyGridOverall.innerHTML = ""; + if (fg.overall_area_match_pct != null) { + const wrap = el("div"); + wrap.appendChild(el("span", "big-pct", `${fg.overall_area_match_pct}%`)); + wrap.appendChild(el("span", "big-pct-label", "Overall area match")); + familyGridOverall.appendChild(wrap); + } + + familyGridRow.innerHTML = ""; + familyGridRow.appendChild( + buildGridTile(uploadUrl(data.request_id, fg.input_grid_file), "Your upload") + ); + familyGridRow.appendChild( + buildGridTile(uploadUrl(data.request_id, fg.template_grid_file), fg.template) + ); + + familyGridMatches.innerHTML = ""; + (fg.matches || []).forEach(m => { + const chip = el("div", "family-match"); + chip.appendChild(el("span", "rank", `Region #${m.rank}`)); + + const swatches = el("div", "pair-swatches"); + const inputSwatch = el("span", "swatch"); + inputSwatch.style.background = rgbCss(m.input_rgb); + const templateSwatch = el("span", "swatch"); + templateSwatch.style.background = rgbCss(m.template_rgb); + swatches.appendChild(inputSwatch); + swatches.appendChild(el("span", "pair-arrow", "→")); + swatches.appendChild(templateSwatch); + chip.appendChild(swatches); + + chip.appendChild(el("span", "area-pct", `${m.area_match_pct}% area match`)); + chip.appendChild(el("span", "sub-pct", `${m.input_pct}% vs ${m.template_pct}%`)); + familyGridMatches.appendChild(chip); + }); + } + + function renderWeighted(data) { + const weights = data.method_weights || {}; + const labelFor = method => (data.methods[method] && data.methods[method].label) || method; + + weightedSub.textContent = "Weights — " + Object.entries(weights) + .map(([method, w]) => `${labelFor(method)} ${Math.round(w * 100)}%`) + .join(" · "); + + weightedCard.innerHTML = ""; + const ranked = data.weighted_scores || []; + if (data.weighted_best && ranked.length) { + const top = ranked[0]; + + // Input vs. matched template, side by side -- purely a display + // addition, doesn't touch which template won. + const thumbs = el("div", "weighted-thumbs"); + const inputImg = el("img"); + inputImg.src = uploadUrl(data.request_id, data.upload_nobg_file); + inputImg.alt = "Your upload"; + thumbs.appendChild(inputImg); + thumbs.appendChild(el("span", "arrow", "→")); + const filename = templateFileByName[data.weighted_best]; + if (filename) { + const templateImg = el("img"); + templateImg.src = `/template_image/${encodeURIComponent(filename)}`; + templateImg.alt = data.weighted_best; + thumbs.appendChild(templateImg); + } + weightedCard.appendChild(thumbs); + + const textWrap = el("div", "weighted-text"); + textWrap.appendChild(el("p", "label", "Weighted final match")); + textWrap.appendChild(el("h4", null, data.weighted_best)); + textWrap.appendChild(el("p", "weighted-total", `Total weighted score: ${top.weighted_score}`)); + + // Shape/texture are informational only here too -- reusing the + // scores already computed for their own sections, not recomputed + // and not fed back into the weighting. + const shapeBest = ((data.shape_analysis && data.shape_analysis.results) || []) + .find(r => r.template === data.weighted_best); + const textureBest = ((data.texture_analysis && data.texture_analysis.results) || []) + .find(r => r.template === data.weighted_best); + if (shapeBest || textureBest) { + const parts = []; + if (shapeBest) parts.push(`Shape ${shapeBest.match_pct}%`); + if (textureBest) parts.push(`Texture ${textureBest.match_pct}%`); + textWrap.appendChild(el("p", "weighted-supporting", parts.join(" · "))); + } + + // Normalized confidence: how decisively the winner beat the + // runner-up, as a % of the winner's own score -- a display-only + // derivation from the already-final ranked list. It cannot change + // weighted_best; it only labels how strong/weak that result is. + const runnerUp = ranked.length > 1 ? ranked[1].weighted_score : 0; + const marginPct = top.weighted_score > 0 + ? Math.max(0, Math.min(100, Math.round(((top.weighted_score - runnerUp) / top.weighted_score) * 100))) + : 0; + const verdict = marginPct >= 50 ? "Strong match" + : marginPct >= 20 ? "Moderate match" + : "Weak match"; + textWrap.appendChild(el("span", "verdict-pill", `${verdict} — ${marginPct}% confidence`)); + + weightedCard.appendChild(textWrap); + + const breakdown = el("div", "weighted-breakdown"); + Object.entries(top.breakdown).forEach(([method, contribution]) => { + const methodResults = (data.methods[method] && data.methods[method].results) || []; + const rawRow = methodResults.find(r => r.template === data.weighted_best); + const rawScore = rawRow ? rawRow.score : 0; + const row = el("div", "row"); + row.appendChild(el("span", null, labelFor(method))); + row.appendChild(el("span", null, + `${Math.round((weights[method] || 0) * 100)}% × ${rawScore} = ${contribution}`)); + breakdown.appendChild(row); + }); + weightedCard.appendChild(breakdown); + } else { + weightedCard.appendChild(el("p", null, "No scores to weight yet.")); + } + + weightedRanked.innerHTML = ""; + const maxScore = Math.max(1, ...ranked.map(r => r.weighted_score)); + ranked.forEach((r, idx) => { + const row = el("div", `score-bar-row${idx === 0 ? " top" : ""}`); + row.appendChild(el("span", "name", r.template)); + const track = el("div", "score-bar-track"); + const fill = el("div", "score-bar-fill"); + fill.style.width = `${Math.max(2, (r.weighted_score / maxScore) * 100)}%`; + track.appendChild(fill); + row.appendChild(track); + row.appendChild(el("span", "value", String(r.weighted_score))); + weightedRanked.appendChild(row); + }); + } + + function buildQueryTile(src, label) { + const tile = el("div", "query-tile"); + const img = el("img"); + img.src = src; + img.alt = label; + tile.appendChild(img); + tile.appendChild(el("div", "tile-label", label)); + return tile; + } + + function buildMethodCard(requestId, methodKey, m) { + const card = el("div", "method-card"); + + const head = el("div", "method-card-head"); + head.appendChild(el("h4", null, m.label)); + head.appendChild(el("span", "time-badge", `${m.time_sec.toFixed(2)}s`)); + card.appendChild(head); + + if (m.best) { + const bestRow = el("div", "best-row"); + if (m.best_image_file) { + const img = el("img"); + img.src = uploadUrl(requestId, m.best_image_file); + img.alt = m.best.template; + bestRow.appendChild(img); + } + const info = el("div"); + info.appendChild(el("div", "best-name", m.best.template)); + info.appendChild(el("div", "best-score", + `Score ${m.best.score} · ${m.best.confidence}% inliers`)); + const pill = el("span", + `confidence-pill ${m.is_confident ? "confident" : "weak"}`, + m.is_confident ? "Confident match" : "Weak match"); + info.appendChild(pill); + bestRow.appendChild(info); + card.appendChild(bestRow); + } else if (m.error) { + card.appendChild(el("p", "error-msg", `This method failed: ${m.error}`)); + } else { + card.appendChild(el("p", "best-score", "No match found.")); + } + + const bars = el("div", "score-bars"); + const maxScore = Math.max(1, ...m.results.map(r => r.score)); + m.results.forEach((r, idx) => { + const row = el("div", `score-bar-row${idx === 0 ? " top" : ""}`); + row.appendChild(el("span", "name", r.template)); + const track = el("div", "score-bar-track"); + const fill = el("div", "score-bar-fill"); + fill.style.width = `${Math.max(2, (r.score / maxScore) * 100)}%`; + track.appendChild(fill); + row.appendChild(track); + row.appendChild(el("span", "value", String(r.score))); + bars.appendChild(row); + }); + card.appendChild(bars); + + return card; + } +})(); diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..a4d0e32 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,251 @@ + + + + + + Vase Matcher + + + + + + + +
+
+

feature matching, four ways

+

Vase Matcher

+

Photograph a vase and see which reference template it resembles most — + judged independently by four different computer-vision methods.

+ + Browse the templates + + + + +
+
+ + + +
+
+

Find your match

+

Upload a photo — background removal and all four matchers run automatically.

+
+ +
+ + +
+ + +
+ + +
+ + +
+ + + +
+

Vase Matcher · SIFT & ORB (classical) + SuperPoint/LightGlue & LoFTR (deep learning)

+
+ + + + + diff --git a/testVaseMatcher.py b/testVaseMatcher.py new file mode 100644 index 0000000..d73b6ff --- /dev/null +++ b/testVaseMatcher.py @@ -0,0 +1,353 @@ +""" +testVaseMatcher.py -- batch-test the Vase Matcher pipeline against a +labeled test set. + +Expects a folder of subfolders, each named after an existing template +(e.g. SKU_1/, SKU_2/, ...), each containing photos that are expected to +match that same-named template: + + TEST_SKU_S/ + SKU_1/ photo1.jpg photo2.jpg ... + SKU_2/ ... + +For every test image, runs the exact same per-image computation the web +app uses -- SIFT, ORB, SuperPoint+LightGlue, LoFTR, the weighted verdict +(now including Color at weight 0.7, same as config.METHOD_WEIGHTS), the +Borda-count overall verdict (still just the original four methods, Color +doesn't participate there), the color-space comparison, and the color +family-grid area-match (numbers only here -- no grid images are rendered +for a bulk run) -- against the live template set (config.TEMPLATE_IMAGES_DIR), +then reports whether each method's pick (and the color-space pick) matches +the expected template. Writes a detailed per-image CSV plus a per-method +accuracy summary. + +Usage: + cd /media/suman/Backup_of_extra_/Sasi/featureTransform + python3 testVaseMatcher.py + python3 testVaseMatcher.py /path/to/other/test/set --csv my_report.csv + python3 testVaseMatcher.py --limit 3 # only first 3 images/folder + +Resource notes -- this reuses the exact same pipeline modules the Flask app +uses, so the same CUDA-OOM safeguards apply automatically: + - every image is downscaled to config.MAX_IMAGE_DIM before touching any + model (bg removal, SIFT/ORB, SuperPoint, LoFTR all cap to this) + - images are processed strictly one at a time, and within each image the + four methods run sequentially (not concurrently) -- there is never more + than one heavy CPU/GPU operation in flight + - torch.cuda.empty_cache() runs after every method AND after every image + - a failure on one image or one method (including a CUDA OOM) is caught, + logged, and recorded as "no result" for that cell instead of aborting + the whole run + +Caveat: this script loads its own copy of every model onto the GPU. If the +Flask app (app.py) is ALSO running at the same time, that's two separate +processes both holding GPU memory -- normally fine (each is a few hundred +MB), but worth knowing if you ever do see a CUDA OOM here. The script prints +current GPU memory usage at startup so you can check before a big run. +""" + +import argparse +import csv +import gc +import logging +import os +import sys +import time +import warnings + +import config # noqa: F401 -- must import first, caps thread envs / sets PYTORCH_CUDA_ALLOC_CONF + +import cv2 +import torch +from PIL import Image + +from pipeline import bg_removal, color, color_grid, engine + +warnings.filterwarnings("ignore", category=Image.DecompressionBombWarning) + +logging.basicConfig(level=logging.INFO, + format="%(asctime)s %(levelname)-7s [%(name)s] %(message)s") +logger = logging.getLogger("testVaseMatcher") + +DEFAULT_TEST_DIR = "/media/suman/Backup_of_extra_/Sasi/TEST_SKU_S" + + +def log_gpu_memory(): + if not torch.cuda.is_available(): + return + try: + import subprocess + out = subprocess.check_output( + ["nvidia-smi", "--query-compute-apps=pid,used_memory", + "--format=csv,noheader"], + text=True, timeout=5, + ).strip() + logger.info("Current GPU memory in use by other processes:\n%s", + out or "(none)") + except Exception: + pass # purely advisory, never fatal + + +def release_gpu(): + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + + +def list_expected_folders(test_dir): + return sorted( + d for d in os.listdir(test_dir) + if os.path.isdir(os.path.join(test_dir, d)) + ) + + +def list_test_images(folder, limit=None): + files = sorted( + f for f in os.listdir(folder) + if f.lower().endswith(config.VALID_EXTS) + ) + return files[:limit] if limit else files + + +def _timed_with_oom_retry(method, fn, bgr, mask, max_retries=1): + """Same contract as engine._timed (returns results, elapsed, error) but + retries once after a hard cache-clear if the failure was a CUDA OOM -- + that's usually transient allocator fragmentation from back-to-back + images of varying sizes, not a real per-image failure, and a tight + 56-image loop is far more likely to hit it than the web app's sporadic + single requests. Any other kind of error still fails immediately, same + as engine._timed.""" + start = time.perf_counter() + attempt = 0 + while True: + try: + result = fn(bgr, mask) + error = None + break + except Exception as e: + is_oom = "out of memory" in str(e).lower() + if is_oom and attempt < max_retries: + logger.warning("%s hit a CUDA OOM -- clearing cache and retrying once...", + method) + release_gpu() + time.sleep(1) + attempt += 1 + continue + logger.exception("Method %s failed", method) + result = [] + error = str(e) + break + elapsed = time.perf_counter() - start + return result, elapsed, error + + +def run_single_image(image_bytes, cache_dir): + """Mirrors pipeline.engine._process_upload_locked's core computation, + minus the request-folder/annotated-image file writes that only matter + for the web UI -- this just needs the numbers.""" + rgba, _ = bg_removal.remove_background_bytes(image_bytes, cache_dir) + bgr, _, mask = bg_removal.split_rgba(rgba) + + method_results = {} + for method in engine.METHODS: + results, elapsed, error = _timed_with_oom_retry( + method, engine._METHOD_RUNNERS[method], bgr, mask + ) + method_results[method] = {"results": results, "time_sec": elapsed, "error": error} + release_gpu() + + # Borda-count overall verdict: unchanged, still just the original four + # methods -- Color doesn't participate here, same as engine.py. + overall_best = engine._overall_best(method_results) + + try: + color_analysis = color.compare_input_to_templates(bgr, mask) + color_error = None + except Exception: + logger.exception("color analysis failed") + color_analysis = {"input_dominant_colors": [], "templates": []} + color_error = "color analysis failed" + + # Weighted verdict now folds Color in too (config.METHOD_WEIGHTS["Color"]), + # via the exact same reshaping engine._process_upload_locked uses -- kept + # separate from method_results so it still doesn't show up as if it were + # a 5th method result anywhere else in this script. + methods_with_color = dict(method_results) + methods_with_color["Color"] = engine._color_as_method_result(color_analysis, 0.0, color_error) + weighted_best, _weighted_scores = engine._weighted_scores(methods_with_color) + + # Color family grid: numbers only here (no grid images rendered/saved + # for a bulk run) -- how well the winning template's color regions + # actually line up with the upload's, area-wise. + family_area_match_pct = None + if weighted_best is not None: + try: + input_families = color_grid.cluster_families(bgr, mask) + template_rgba = cv2.imread( + engine.templates_meta()[weighted_best]["nobg_path"], cv2.IMREAD_UNCHANGED + ) + template_bgr, _, template_mask = bg_removal.split_rgba(template_rgba) + template_families = color_grid.cluster_families(template_bgr, template_mask) + matches = color_grid.match_families(input_families, template_families) + family_area_match_pct = color_grid.overall_area_match(matches) + except Exception: + logger.exception("family grid failed") + + return { + "method_results": method_results, + "weighted_best": weighted_best, + "overall_best": overall_best, + "color_analysis": color_analysis, + "family_area_match_pct": family_area_match_pct, + } + + +def top_pick(results_list): + return results_list[0]["template"] if results_list else None + + +def color_top_pick(color_analysis): + templates = color_analysis.get("templates", []) + if not templates: + return None, None + top = max(templates, key=lambda t: t["match_pct"]) + return top["template"], top["match_pct"] + + +def color_pct_for(color_analysis, template_name): + for t in color_analysis.get("templates", []): + if t["template"] == template_name: + return t["match_pct"] + return None + + +def new_tally(): + return {"correct": 0, "total": 0} + + +def record(tally_entry, correct): + tally_entry["total"] += 1 + tally_entry["correct"] += int(bool(correct)) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("test_dir", nargs="?", default=DEFAULT_TEST_DIR, + help=f"Folder of per-template subfolders (default: {DEFAULT_TEST_DIR})") + parser.add_argument("--csv", default="test_results.csv", + help="Where to write the detailed per-image CSV report") + parser.add_argument("--limit", type=int, default=None, + help="Only test the first N images per folder (quick smoke test)") + args = parser.parse_args() + + if not os.path.isdir(args.test_dir): + logger.error("Test folder not found: %s", args.test_dir) + sys.exit(1) + + log_gpu_memory() + + logger.info("Bootstrapping templates from %s ...", config.TEMPLATE_IMAGES_DIR) + engine.bootstrap() + + expected_folders = list_expected_folders(args.test_dir) + known_templates = set(engine.templates_meta().keys()) + + unknown = [f for f in expected_folders if f not in known_templates] + if unknown: + logger.warning("These test folders don't match any known template " + "and will be skipped: %s", unknown) + + method_names = list(engine.METHODS) + tally = {m: new_tally() for m in method_names} + tally["Weighted"] = new_tally() + tally["Overall"] = new_tally() + tally["Color"] = new_tally() + + rows = [] + total_start = time.perf_counter() + + for expected in expected_folders: + if expected not in known_templates: + continue + + folder = os.path.join(args.test_dir, expected) + images = list_test_images(folder, args.limit) + logger.info("=== %s: %d test image(s), expected match = %s ===", + expected, len(images), expected) + + for fname in images: + path = os.path.join(folder, fname) + with open(path, "rb") as f: + image_bytes = f.read() + + img_start = time.perf_counter() + try: + outcome = run_single_image(image_bytes, config.UPLOADS_NOBG_CACHE) + except Exception: + logger.exception("FAILED on %s/%s -- skipping", expected, fname) + release_gpu() + continue + img_elapsed = time.perf_counter() - img_start + + row = {"expected": expected, "file": fname, "time_sec": round(img_elapsed, 2)} + + for method in method_names: + mr = outcome["method_results"][method] + pick = top_pick(mr["results"]) + score = mr["results"][0]["score"] if mr["results"] else None + correct = pick == expected + row[f"{method}_pick"] = pick + row[f"{method}_score"] = score + row[f"{method}_correct"] = correct + record(tally[method], correct) + + weighted_correct = outcome["weighted_best"] == expected + row["weighted_pick"] = outcome["weighted_best"] + row["weighted_correct"] = weighted_correct + record(tally["Weighted"], weighted_correct) + + overall_correct = outcome["overall_best"] == expected + row["overall_pick"] = outcome["overall_best"] + row["overall_correct"] = overall_correct + record(tally["Overall"], overall_correct) + + c_pick, c_pct = color_top_pick(outcome["color_analysis"]) + c_correct = c_pick == expected + row["color_pick"] = c_pick + row["color_match_pct"] = c_pct + row["color_pct_for_expected"] = color_pct_for(outcome["color_analysis"], expected) + row["color_correct"] = c_correct + record(tally["Color"], c_correct) + + row["family_area_match_pct"] = outcome.get("family_area_match_pct") + + rows.append(row) + + status = "OK " if weighted_correct else "MISS" + logger.info(" [%s] %-24s weighted -> %-14s color -> %-14s (%.2fs)", + status, fname, outcome["weighted_best"], c_pick, img_elapsed) + + release_gpu() + + total_elapsed = time.perf_counter() - total_start + + if rows: + with open(args.csv, "w", newline="") as f: + writer = csv.DictWriter(f, fieldnames=list(rows[0].keys())) + writer.writeheader() + writer.writerows(rows) + logger.info("Wrote detailed report: %s", os.path.abspath(args.csv)) + + print("\n" + "=" * 58) + print(f"{'Method':<12}{'Correct':>10}{'Total':>8}{'Accuracy':>13}") + print("-" * 58) + for name, t in tally.items(): + acc = (t["correct"] / t["total"] * 100) if t["total"] else 0.0 + print(f"{name:<12}{t['correct']:>10}{t['total']:>8}{acc:>12.1f}%") + print("=" * 58) + print(f"Images tested: {len(rows)} Total time: {total_elapsed:.1f}s") + + +if __name__ == "__main__": + main() diff --git a/test_reports/SKU_5_IMG_3151.png b/test_reports/SKU_5_IMG_3151.png new file mode 100644 index 0000000..7007aa2 Binary files /dev/null and b/test_reports/SKU_5_IMG_3151.png differ diff --git a/test_reports/SKU_5_IMG_3152.png b/test_reports/SKU_5_IMG_3152.png new file mode 100644 index 0000000..7fbb0ea Binary files /dev/null and b/test_reports/SKU_5_IMG_3152.png differ diff --git a/test_reports/SKU_5_IMG_3153.png b/test_reports/SKU_5_IMG_3153.png new file mode 100644 index 0000000..c59254f Binary files /dev/null and b/test_reports/SKU_5_IMG_3153.png differ diff --git a/test_reports/SKU_5_IMG_3154.png b/test_reports/SKU_5_IMG_3154.png new file mode 100644 index 0000000..7dcad98 Binary files /dev/null and b/test_reports/SKU_5_IMG_3154.png differ diff --git a/test_reports/SKU_5_IMG_3156.png b/test_reports/SKU_5_IMG_3156.png new file mode 100644 index 0000000..2ed3d70 Binary files /dev/null and b/test_reports/SKU_5_IMG_3156.png differ diff --git a/test_reports/SKU_5_IMG_3157.png b/test_reports/SKU_5_IMG_3157.png new file mode 100644 index 0000000..0fc9ec8 Binary files /dev/null and b/test_reports/SKU_5_IMG_3157.png differ diff --git a/test_reports/SKU_5_IMG_3158.png b/test_reports/SKU_5_IMG_3158.png new file mode 100644 index 0000000..fed4344 Binary files /dev/null and b/test_reports/SKU_5_IMG_3158.png differ diff --git a/test_reports/SKU_5_IMG_3159.png b/test_reports/SKU_5_IMG_3159.png new file mode 100644 index 0000000..0ba476d Binary files /dev/null and b/test_reports/SKU_5_IMG_3159.png differ diff --git a/test_reports/SKU_5_IMG_3160.png b/test_reports/SKU_5_IMG_3160.png new file mode 100644 index 0000000..9e3ad1c Binary files /dev/null and b/test_reports/SKU_5_IMG_3160.png differ diff --git a/test_reports/SKU_5_IMG_3161.png b/test_reports/SKU_5_IMG_3161.png new file mode 100644 index 0000000..b14d2d9 Binary files /dev/null and b/test_reports/SKU_5_IMG_3161.png differ diff --git a/test_reports/SKU_5_IMG_3162.png b/test_reports/SKU_5_IMG_3162.png new file mode 100644 index 0000000..db1d25b Binary files /dev/null and b/test_reports/SKU_5_IMG_3162.png differ diff --git a/test_reports/SKU_5_IMG_3163.png b/test_reports/SKU_5_IMG_3163.png new file mode 100644 index 0000000..9d3427a Binary files /dev/null and b/test_reports/SKU_5_IMG_3163.png differ diff --git a/test_reports/SKU_5_IMG_3164.png b/test_reports/SKU_5_IMG_3164.png new file mode 100644 index 0000000..3ee5702 Binary files /dev/null and b/test_reports/SKU_5_IMG_3164.png differ diff --git a/test_reports/SKU_5_IMG_3165.png b/test_reports/SKU_5_IMG_3165.png new file mode 100644 index 0000000..46b138d Binary files /dev/null and b/test_reports/SKU_5_IMG_3165.png differ diff --git a/test_reports/SKU_5_IMG_3166.png b/test_reports/SKU_5_IMG_3166.png new file mode 100644 index 0000000..0651deb Binary files /dev/null and b/test_reports/SKU_5_IMG_3166.png differ diff --git a/test_reports/SKU_5_IMG_3167.png b/test_reports/SKU_5_IMG_3167.png new file mode 100644 index 0000000..64774bd Binary files /dev/null and b/test_reports/SKU_5_IMG_3167.png differ diff --git a/test_reports/SKU_5_thumb-IMG_3152.png b/test_reports/SKU_5_thumb-IMG_3152.png new file mode 100644 index 0000000..103b0c8 Binary files /dev/null and b/test_reports/SKU_5_thumb-IMG_3152.png differ diff --git a/test_reports/SKU_5_thumb-IMG_3154.png b/test_reports/SKU_5_thumb-IMG_3154.png new file mode 100644 index 0000000..d93b363 Binary files /dev/null and b/test_reports/SKU_5_thumb-IMG_3154.png differ diff --git a/test_results.csv b/test_results.csv new file mode 100644 index 0000000..04dd3f9 --- /dev/null +++ b/test_results.csv @@ -0,0 +1,154 @@ +expected,file,time_sec,SIFT_pick,SIFT_score,SIFT_correct,ORB_pick,ORB_score,ORB_correct,SuperGlue_pick,SuperGlue_score,SuperGlue_correct,LoFTR_pick,LoFTR_score,LoFTR_correct,weighted_pick,weighted_correct,overall_pick,overall_correct,color_pick,color_match_pct,color_pct_for_expected,color_correct,family_area_match_pct +SKU_1,20260727_193449.jpg,2.78,SKU_5,20,False,SKU_5,13,False,SKU_4,25,False,SKU_5,8,False,SKU_1,True,SKU_5,False,SKU_1,66.9,66.9,True,68.1 +SKU_1,20260727_193610.jpg,2.14,SKU_5,10,False,SKU_5,14,False,SKU_5,44,False,SKU_5,7,False,SKU_5,False,SKU_5,False,SKU_5,51.8,50.0,False,86.0 +SKU_1,20260727_193751.jpg,2.21,SKU_5,12,False,SKU_5,13,False,SKU_5,25,False,SKU_1,6,True,SKU_5,False,SKU_1,True,SKU_5,54.8,51.7,False,82.7 +SKU_1,20260727_193931.jpg,2.32,SKU_ULTRA_6,11,False,SKU_1,15,True,SKU_2,21,False,SKU_1,7,True,SKU_1,True,SKU_5,False,SKU_1,43.2,43.2,True,53.8 +SKU_1,20260727_194102.jpg,2.11,SKU_5,11,False,SKU_5,13,False,SKU_5,18,False,SKU_1,8,True,SKU_1,True,SKU_5,False,SKU_1,53.0,53.0,True,60.1 +SKU_1,20260727_194235.jpg,2.36,SKU_5,19,False,SKU_1,16,True,SKU_5,39,False,SKU_1,13,True,SKU_1,True,SKU_5,False,SKU_1,66.2,66.2,True,64.5 +SKU_1,20260727_194450.jpg,2.32,SKU_5,14,False,SKU_5,13,False,SKU_1,26,True,SKU_1,10,True,SKU_1,True,SKU_1,True,SKU_1,55.7,55.7,True,67.7 +SKU_1,20260727_194619.jpg,2.21,SKU_5,16,False,SKU_1,17,True,SKU_1,22,True,SKU_5,12,False,SKU_1,True,SKU_1,True,SKU_1,62.3,62.3,True,63.4 +SKU_1,WhatsApp Image 2026-07-13 at 6.14.52 PM.jpeg,14.38,SKU_1,8,True,SKU_1,14,True,SKU_1,32,True,SKU_1,9,True,SKU_1,True,SKU_1,True,SKU_1,52.4,52.4,True,78.8 +SKU_1,WhatsApp Image 2026-07-13 at 6.14.53 PM (1).jpeg,11.88,SKU_5,14,False,SKU_5,12,False,SKU_1,22,True,SKU_1,7,True,SKU_1,True,SKU_1,True,SKU_1,54.7,54.7,True,68.0 +SKU_1,WhatsApp Image 2026-07-13 at 6.14.53 PM (2).jpeg,11.68,SKU_1,11,True,SKU_1,17,True,SKU_1,16,True,SKU_1,8,True,SKU_1,True,SKU_1,True,SKU_1,56.5,56.5,True,70.0 +SKU_1,WhatsApp Image 2026-07-13 at 6.14.53 PM (3).jpeg,11.77,SKU_5,9,False,SKU_5,11,False,SKU_1,13,True,SKU_1,13,True,SKU_1,True,SKU_1,True,SKU_1,55.9,55.9,True,70.6 +SKU_1,WhatsApp Image 2026-07-13 at 6.14.53 PM.jpeg,11.86,SKU_5,11,False,SKU_5,11,False,SKU_1,28,True,SKU_1,13,True,SKU_1,True,SKU_1,True,SKU_1,54.4,54.4,True,78.1 +SKU_1,WhatsApp Image 2026-07-13 at 6.14.54 PM (1).jpeg,11.56,SKU_5,10,False,SKU_1,11,True,SKU_5,17,False,SKU_1,8,True,SKU_1,True,SKU_5,False,SKU_1,56.5,56.5,True,66.5 +SKU_1,WhatsApp Image 2026-07-13 at 6.14.54 PM (2).jpeg,11.65,SKU_5,13,False,SKU_1,11,True,SKU_5,11,False,SKU_1,10,True,SKU_1,True,SKU_1,True,SKU_1,50.2,50.2,True,65.0 +SKU_1,WhatsApp Image 2026-07-13 at 6.14.54 PM (3).jpeg,11.68,SKU_5,13,False,SKU_1,14,True,SKU_ULTRA_6,13,False,SKU_1,10,True,SKU_1,True,SKU_1,True,SKU_1,53.2,53.2,True,63.7 +SKU_1,WhatsApp Image 2026-07-13 at 6.14.54 PM.jpeg,11.65,SKU_1,8,True,SKU_5,9,False,SKU_1,10,True,SKU_1,14,True,SKU_1,True,SKU_1,True,SKU_1,56.9,56.9,True,68.5 +SKU_1,WhatsApp Image 2026-07-13 at 6.14.55 PM.jpeg,11.78,SKU_5,21,False,SKU_1,13,True,SKU_5,12,False,SKU_ULTRA_6,6,False,SKU_1,True,SKU_5,False,SKU_1,56.1,56.1,True,61.0 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.15 PM (1).jpeg,2.39,SKU_5,25,False,SKU_5,13,False,SKU_2,9,False,SKU_1,8,True,SKU_1,True,SKU_1,True,SKU_1,55.1,55.1,True,62.9 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.15 PM (2).jpeg,2.76,SKU_5,23,False,SKU_1,12,True,SKU_2,22,False,SKU_1,6,True,SKU_1,True,SKU_1,True,SKU_1,54.9,54.9,True,57.8 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.15 PM (3).jpeg,11.72,SKU_5,14,False,SKU_5,11,False,SKU_5,11,False,SKU_5,6,False,SKU_1,True,SKU_5,False,SKU_1,57.7,57.7,True,68.6 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.15 PM.jpeg,11.77,SKU_5,24,False,SKU_1,12,True,SKU_2,11,False,SKU_2,6,False,SKU_1,True,SKU_1,True,SKU_1,56.3,56.3,True,60.3 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.16 PM (1).jpeg,11.84,SKU_5,15,False,SKU_1,13,True,SKU_5,11,False,SKU_1,8,True,SKU_1,True,SKU_5,False,SKU_1,56.5,56.5,True,77.6 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.16 PM (2).jpeg,11.78,SKU_5,13,False,SKU_5,12,False,SKU_5,24,False,SKU_1,7,True,SKU_1,True,SKU_5,False,SKU_1,52.5,52.5,True,82.7 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.16 PM (3).jpeg,11.78,SKU_1,17,True,SKU_5,12,False,SKU_5,25,False,SKU_1,8,True,SKU_1,True,SKU_1,True,SKU_1,53.0,53.0,True,83.1 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.16 PM (4).jpeg,11.93,SKU_1,15,True,SKU_1,14,True,SKU_ULTRA_6,16,False,SKU_1,7,True,SKU_1,True,SKU_1,True,SKU_1,53.8,53.8,True,90.8 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.16 PM (5).jpeg,11.96,SKU_5,18,False,SKU_1,11,True,SKU_5,16,False,SKU_1,5,True,SKU_1,True,SKU_5,False,SKU_1,53.5,53.5,True,83.3 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.16 PM.jpeg,11.79,SKU_5,18,False,SKU_1,14,True,SKU_ULTRA_6,13,False,SKU_1,7,True,SKU_1,True,SKU_1,True,SKU_1,57.5,57.5,True,74.2 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.17 PM (1).jpeg,11.93,SKU_5,16,False,SKU_5,14,False,SKU_3,6,False,SKU_4,6,False,SKU_1,True,SKU_5,False,SKU_1,54.4,54.4,True,63.2 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.17 PM (2).jpeg,2.55,SKU_5,11,False,SKU_5,14,False,SKU_1,27,True,SKU_1,6,True,SKU_1,True,SKU_1,True,SKU_1,55.0,55.0,True,72.2 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.17 PM (3).jpeg,11.96,SKU_5,13,False,SKU_ULTRA_6,14,False,SKU_3,20,False,SKU_1,5,True,SKU_1,True,SKU_ULTRA_6,False,SKU_1,54.4,54.4,True,64.1 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.17 PM.jpeg,11.97,SKU_5,20,False,SKU_1,9,True,SKU_1,8,True,SKU_1,6,True,SKU_1,True,SKU_1,True,SKU_1,53.5,53.5,True,72.8 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.18 PM (1).jpeg,11.93,SKU_5,13,False,SKU_1,11,True,SKU_1,27,True,SKU_1,10,True,SKU_1,True,SKU_1,True,SKU_1,52.5,52.5,True,73.5 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.18 PM (2).jpeg,11.78,SKU_5,17,False,SKU_5,12,False,SKU_1,24,True,SKU_1,12,True,SKU_1,True,SKU_1,True,SKU_1,48.1,48.1,True,70.8 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.18 PM (3).jpeg,11.74,SKU_5,15,False,SKU_5,12,False,SKU_1,15,True,SKU_1,8,True,SKU_1,True,SKU_1,True,SKU_1,51.0,51.0,True,66.1 +SKU_1,WhatsApp Image 2026-07-13 at 6.15.18 PM.jpeg,11.87,SKU_5,17,False,SKU_1,14,True,SKU_3,11,False,SKU_ULTRA_6,5,False,SKU_1,True,SKU_3,False,SKU_1,54.7,54.7,True,66.4 +SKU_2,20260727_163536.jpg,2.34,SKU_5,13,False,SKU_1,10,False,SKU_2,38,True,SKU_2,31,True,SKU_2,True,SKU_1,False,SKU_2,58.3,58.3,True,85.7 +SKU_2,20260727_163548.jpg,2.44,SKU_1,13,False,SKU_5,13,False,SKU_2,48,True,SKU_2,29,True,SKU_2,True,SKU_2,True,SKU_2,59.0,59.0,True,85.7 +SKU_2,20260727_163614.jpg,2.56,SKU_2,13,True,SKU_2,10,True,SKU_2,42,True,SKU_2,23,True,SKU_2,True,SKU_2,True,SKU_2,62.1,62.1,True,85.3 +SKU_2,20260727_163706.jpg,2.5,SKU_5,14,False,SKU_5,11,False,SKU_2,46,True,SKU_2,24,True,SKU_2,True,SKU_2,True,SKU_2,50.3,50.3,True,92.4 +SKU_2,20260727_163815.jpg,2.49,SKU_5,16,False,SKU_1,12,False,SKU_2,43,True,SKU_2,21,True,SKU_2,True,SKU_2,True,SKU_2,55.6,55.6,True,82.4 +SKU_2,20260727_164054.jpg,2.43,SKU_1,12,False,SKU_1,9,False,SKU_2,49,True,SKU_2,31,True,SKU_2,True,SKU_2,True,SKU_2,58.6,58.6,True,89.1 +SKU_2,20260727_164129.jpg,2.43,SKU_2,10,True,SKU_5,13,False,SKU_2,46,True,SKU_2,20,True,SKU_2,True,SKU_2,True,SKU_2,56.5,56.5,True,86.3 +SKU_2,20260727_164133.jpg,2.51,SKU_2,11,True,SKU_5,13,False,SKU_2,45,True,SKU_2,25,True,SKU_2,True,SKU_2,True,SKU_2,57.0,57.0,True,93.4 +SKU_2,20260727_164138.jpg,2.39,SKU_1,11,False,SKU_5,13,False,SKU_2,32,True,SKU_2,20,True,SKU_2,True,SKU_1,False,SKU_2,57.4,57.4,True,88.3 +SKU_2,20260727_164319.jpg,2.34,SKU_5,12,False,SKU_5,12,False,SKU_2,42,True,SKU_2,24,True,SKU_2,True,SKU_2,True,SKU_2,56.2,56.2,True,87.4 +SKU_2,20260727_164323.jpg,2.45,SKU_1,15,False,SKU_5,10,False,SKU_2,40,True,SKU_2,19,True,SKU_2,True,SKU_2,True,SKU_2,56.4,56.4,True,87.3 +SKU_2,20260727_164326.jpg,2.31,SKU_2,12,True,SKU_5,10,False,SKU_2,40,True,SKU_2,24,True,SKU_2,True,SKU_2,True,SKU_2,56.7,56.7,True,88.7 +SKU_2,20260727_164330.jpg,2.34,SKU_1,12,False,SKU_5,12,False,SKU_2,39,True,SKU_2,25,True,SKU_2,True,SKU_2,True,SKU_2,56.4,56.4,True,85.5 +SKU_2,20260727_164512.jpg,2.31,SKU_1,11,False,SKU_5,10,False,SKU_2,39,True,SKU_2,25,True,SKU_2,True,SKU_2,True,SKU_2,59.3,59.3,True,89.7 +SKU_2,20260727_164516.jpg,2.44,SKU_4,15,False,SKU_5,12,False,SKU_2,35,True,SKU_2,20,True,SKU_2,True,SKU_2,True,SKU_2,58.5,58.5,True,84.6 +SKU_2,20260727_164521.jpg,2.39,SKU_2,12,True,SKU_3,10,False,SKU_2,38,True,SKU_2,18,True,SKU_2,True,SKU_2,True,SKU_2,58.4,58.4,True,80.2 +SKU_2,20260727_164524.jpg,2.43,SKU_2,12,True,SKU_1,10,False,SKU_2,41,True,SKU_2,20,True,SKU_2,True,SKU_2,True,SKU_2,59.9,59.9,True,86.4 +SKU_2,20260727_181816.jpg,2.19,SKU_2,10,True,SKU_1,14,False,SKU_5,29,False,SKU_2,9,True,SKU_2,True,SKU_2,True,SKU_2,42.4,42.4,True,78.9 +SKU_2,20260727_181827.jpg,2.37,SKU_5,13,False,SKU_5,13,False,SKU_2,38,True,SKU_2,26,True,SKU_2,True,SKU_5,False,SKU_2,50.1,50.1,True,79.8 +SKU_2,20260727_181832.jpg,2.31,SKU_1,11,False,SKU_1,10,False,SKU_2,45,True,SKU_2,24,True,SKU_2,True,SKU_2,True,SKU_2,48.3,48.3,True,88.6 +SKU_2,20260727_181835.jpg,2.39,SKU_5,10,False,SKU_1,9,False,SKU_2,32,True,SKU_2,23,True,SKU_2,True,SKU_2,True,SKU_2,48.5,48.5,True,83.8 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (1).jpeg,11.93,SKU_5,26,False,SKU_1,11,False,SKU_4,41,False,SKU_2,19,True,SKU_2,True,SKU_2,True,SKU_4,41.5,30.5,False,56.5 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (10).jpeg,11.92,SKU_1,24,False,SKU_5,11,False,SKU_2,21,True,SKU_2,19,True,SKU_2,True,SKU_5,False,SKU_2,50.3,50.3,True,87.8 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (11).jpeg,11.83,SKU_1,22,False,SKU_1,11,False,SKU_2,23,True,SKU_2,21,True,SKU_2,True,SKU_1,False,SKU_2,51.3,51.3,True,75.2 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (12).jpeg,11.85,SKU_5,26,False,SKU_5,17,False,SKU_2,10,True,SKU_2,10,True,SKU_2,True,SKU_2,True,SKU_2,44.1,44.1,True,62.8 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (13).jpeg,11.96,SKU_5,27,False,SKU_1,14,False,SKU_4,19,False,SKU_2,11,True,SKU_2,True,SKU_2,True,SKU_2,46.2,46.2,True,63.1 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (14).jpeg,11.89,SKU_5,16,False,SKU_5,16,False,SKU_2,25,True,SKU_4,13,False,SKU_4,False,SKU_2,True,SKU_ULTRA_6,45.9,41.6,False,84.1 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (15).jpeg,12.0,SKU_5,17,False,SKU_5,17,False,SKU_2,14,True,SKU_4,9,False,SKU_5,False,SKU_5,False,SKU_ULTRA_6,47.0,40.2,False,77.9 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (16).jpeg,12.08,SKU_1,21,False,SKU_1,11,False,SKU_4,15,False,SKU_4,6,False,SKU_ULTRA_6,False,SKU_1,False,SKU_ULTRA_6,50.4,33.2,False,72.2 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (17).jpeg,12.03,SKU_1,15,False,SKU_1,14,False,SKU_4,16,False,SKU_4,7,False,SKU_1,False,SKU_1,False,SKU_ULTRA_6,49.2,33.3,False,87.6 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (18).jpeg,11.97,SKU_1,19,False,SKU_1,14,False,SKU_4,23,False,SKU_4,7,False,SKU_ULTRA_6,False,SKU_1,False,SKU_ULTRA_6,49.4,32.4,False,70.7 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (19).jpeg,11.84,SKU_5,17,False,SKU_1,9,False,SKU_4,14,False,SKU_3,7,False,SKU_2,True,SKU_4,False,SKU_2,44.5,44.5,True,73.5 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (2).jpeg,11.74,SKU_3,10,False,SKU_1,10,False,SKU_2,36,True,SKU_2,22,True,SKU_2,True,SKU_2,True,SKU_4,43.8,41.1,False,86.3 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (20).jpeg,11.9,SKU_5,30,False,SKU_1,15,False,SKU_4,15,False,SKU_4,6,False,SKU_2,True,SKU_1,False,SKU_2,46.3,46.3,True,73.7 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (21).jpeg,11.93,SKU_5,19,False,SKU_1,14,False,SKU_4,18,False,SKU_ULTRA_6,7,False,SKU_2,True,SKU_1,False,SKU_2,46.2,46.2,True,77.1 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (22).jpeg,12.03,SKU_5,25,False,SKU_1,11,False,SKU_2,22,True,SKU_2,17,True,SKU_2,True,SKU_1,False,SKU_2,49.2,49.2,True,69.0 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (23).jpeg,2.47,SKU_5,12,False,SKU_1,11,False,SKU_2,19,True,SKU_2,14,True,SKU_2,True,SKU_2,True,SKU_4,46.0,45.3,False,80.0 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (3).jpeg,11.98,SKU_5,40,False,SKU_1,10,False,SKU_2,34,True,SKU_2,22,True,SKU_2,True,SKU_2,True,SKU_2,47.7,47.7,True,71.5 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (4).jpeg,12.03,SKU_5,42,False,SKU_5,15,False,SKU_2,23,True,SKU_2,21,True,SKU_2,True,SKU_2,True,SKU_2,47.7,47.7,True,66.0 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (5).jpeg,11.89,SKU_5,20,False,SKU_1,12,False,SKU_2,24,True,SKU_2,18,True,SKU_2,True,SKU_2,True,SKU_4,45.9,44.9,False,80.1 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (6).jpeg,12.04,SKU_1,28,False,SKU_5,10,False,SKU_2,32,True,SKU_2,17,True,SKU_2,True,SKU_2,True,SKU_2,51.6,51.6,True,86.4 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (7).jpeg,12.2,SKU_5,23,False,SKU_1,14,False,SKU_4,25,False,SKU_2,17,True,SKU_2,True,SKU_2,True,SKU_2,51.0,51.0,True,75.4 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (8).jpeg,12.05,SKU_5,28,False,SKU_5,14,False,SKU_4,20,False,SKU_2,17,True,SKU_2,True,SKU_2,True,SKU_2,50.8,50.8,True,71.1 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM (9).jpeg,11.95,SKU_5,39,False,SKU_1,21,False,SKU_2,25,True,SKU_2,17,True,SKU_2,True,SKU_2,True,SKU_2,47.7,47.7,True,68.0 +SKU_2,WhatsApp Image 2026-07-13 at 5.44.09 PM.jpeg,11.73,SKU_3,9,False,SKU_5,14,False,SKU_2,28,True,SKU_ULTRA_6,7,False,SKU_2,True,SKU_2,True,SKU_2,50.4,50.4,True,75.5 +SKU_3,20260727_174422.jpg,2.43,SKU_5,16,False,SKU_1,15,False,SKU_ULTRA_6,37,False,SKU_1,8,False,SKU_3,True,SKU_1,False,SKU_3,52.8,52.8,True,82.7 +SKU_3,20260727_174426.jpg,2.34,SKU_5,11,False,SKU_5,11,False,SKU_ULTRA_6,42,False,SKU_3,8,True,SKU_3,True,SKU_ULTRA_6,False,SKU_3,51.2,51.2,True,85.3 +SKU_3,20260727_174430.jpg,2.28,SKU_5,8,False,SKU_5,16,False,SKU_4,23,False,SKU_3,7,True,SKU_3,True,SKU_5,False,SKU_3,51.5,51.5,True,79.8 +SKU_3,20260727_174451.jpg,2.35,SKU_1,12,False,SKU_1,15,False,SKU_3,24,True,SKU_3,7,True,SKU_3,True,SKU_1,False,SKU_3,52.3,52.3,True,86.4 +SKU_3,20260727_174505.jpg,2.33,SKU_5,16,False,SKU_5,19,False,SKU_3,26,True,SKU_3,13,True,SKU_3,True,SKU_3,True,SKU_3,52.0,52.0,True,79.8 +SKU_3,20260727_174509.jpg,2.36,SKU_5,12,False,SKU_5,16,False,SKU_4,14,False,SKU_3,11,True,SKU_3,True,SKU_3,True,SKU_3,50.8,50.8,True,82.0 +SKU_3,20260727_174513.jpg,2.44,SKU_2,11,False,SKU_5,21,False,SKU_4,20,False,SKU_3,10,True,SKU_3,True,SKU_1,False,SKU_3,48.9,48.9,True,81.4 +SKU_3,20260727_174516.jpg,2.45,SKU_5,12,False,SKU_5,13,False,SKU_5,18,False,SKU_3,10,True,SKU_3,True,SKU_5,False,SKU_3,51.5,51.5,True,82.9 +SKU_3,20260727_174520.jpg,2.38,SKU_5,9,False,SKU_5,16,False,SKU_3,27,True,SKU_3,10,True,SKU_3,True,SKU_5,False,SKU_3,53.6,53.6,True,84.5 +SKU_3,20260727_174608.jpg,2.33,SKU_1,6,False,SKU_5,14,False,SKU_3,33,True,SKU_3,7,True,SKU_3,True,SKU_3,True,SKU_3,59.9,59.9,True,86.7 +SKU_3,20260727_174612.jpg,2.07,SKU_1,9,False,SKU_5,14,False,SKU_3,49,True,SKU_3,10,True,SKU_3,True,SKU_1,False,SKU_3,62.1,62.1,True,81.7 +SKU_3,20260727_174946.jpg,2.35,SKU_5,13,False,SKU_5,14,False,SKU_3,36,True,SKU_3,10,True,SKU_3,True,SKU_3,True,SKU_5,47.6,39.8,False,79.9 +SKU_3,20260727_174949.jpg,2.42,SKU_5,16,False,SKU_5,14,False,SKU_3,22,True,SKU_3,14,True,SKU_3,True,SKU_3,True,SKU_5,45.5,41.6,False,92.9 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.36 PM (1).jpeg,12.13,SKU_5,25,False,SKU_1,11,False,SKU_5,10,False,SKU_3,9,True,SKU_3,True,SKU_1,False,SKU_3,58.0,58.0,True,92.2 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.36 PM.jpeg,11.97,SKU_5,16,False,SKU_2,15,False,SKU_3,13,True,SKU_3,8,True,SKU_3,True,SKU_3,True,SKU_3,57.5,57.5,True,91.3 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (1).jpeg,12.07,SKU_5,21,False,SKU_5,14,False,SKU_3,23,True,SKU_3,8,True,SKU_3,True,SKU_1,False,SKU_3,54.1,54.1,True,74.2 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (10).jpeg,12.08,SKU_5,28,False,SKU_5,13,False,SKU_3,25,True,SKU_1,4,False,SKU_ULTRA_6,False,SKU_1,False,SKU_ULTRA_6,52.1,47.5,False,62.3 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (11).jpeg,12.13,SKU_5,41,False,SKU_1,15,False,SKU_3,50,True,SKU_3,5,True,SKU_3,True,SKU_5,False,SKU_1,48.9,42.8,False,76.4 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (12).jpeg,12.21,SKU_5,40,False,SKU_1,11,False,SKU_3,26,True,SKU_3,6,True,SKU_ULTRA_6,False,SKU_5,False,SKU_ULTRA_6,49.5,39.9,False,68.4 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (2).jpeg,12.07,SKU_5,26,False,SKU_5,12,False,SKU_3,10,True,SKU_1,5,False,SKU_3,True,SKU_5,False,SKU_3,52.8,52.8,True,86.1 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (3).jpeg,11.96,SKU_5,26,False,SKU_1,16,False,SKU_ULTRA_6,18,False,SKU_3,7,True,SKU_3,True,SKU_1,False,SKU_3,61.2,61.2,True,73.5 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (4).jpeg,11.92,SKU_5,32,False,SKU_1,18,False,SKU_2,15,False,SKU_3,6,True,SKU_3,True,SKU_3,True,SKU_3,62.5,62.5,True,71.6 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (5).jpeg,12.02,SKU_5,21,False,SKU_1,16,False,SKU_ULTRA_6,23,False,SKU_3,6,True,SKU_3,True,SKU_5,False,SKU_3,63.4,63.4,True,75.8 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (6).jpeg,11.98,SKU_5,19,False,SKU_1,13,False,SKU_3,21,True,SKU_3,10,True,SKU_3,True,SKU_1,False,SKU_3,56.0,56.0,True,89.0 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (7).jpeg,12.14,SKU_5,17,False,SKU_2,9,False,SKU_3,47,True,SKU_3,7,True,SKU_3,True,SKU_5,False,SKU_3,56.0,56.0,True,87.9 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (8).jpeg,12.0,SKU_5,30,False,SKU_1,13,False,SKU_ULTRA_6,16,False,SKU_3,8,True,SKU_3,True,SKU_5,False,SKU_3,53.1,53.1,True,87.4 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM (9).jpeg,12.02,SKU_5,21,False,SKU_5,11,False,SKU_ULTRA_6,18,False,SKU_3,7,True,SKU_3,True,SKU_5,False,SKU_3,52.8,52.8,True,80.2 +SKU_3,WhatsApp Image 2026-07-13 at 3.37.37 PM.jpeg,11.95,SKU_5,19,False,SKU_2,12,False,SKU_4,12,False,SKU_3,15,True,SKU_3,True,SKU_5,False,SKU_3,57.5,57.5,True,91.1 +SKU_4,20260727_160751.jpg,2.49,SKU_2,10,False,SKU_1,13,False,SKU_4,33,True,SKU_4,17,True,SKU_4,True,SKU_2,False,SKU_4,59.5,59.5,True,77.5 +SKU_4,20260727_160846.jpg,3.44,SKU_5,15,False,SKU_5,14,False,SKU_3,81,False,SKU_4,12,True,SKU_4,True,SKU_1,False,SKU_4,60.9,60.9,True,81.4 +SKU_4,20260727_161051.jpg,2.51,SKU_1,10,False,SKU_1,11,False,SKU_3,78,False,SKU_3,11,False,SKU_4,True,SKU_1,False,SKU_4,60.9,60.9,True,88.8 +SKU_4,20260727_161053.jpg,2.51,SKU_5,12,False,SKU_5,13,False,SKU_3,107,False,SKU_4,9,True,SKU_4,True,SKU_5,False,SKU_4,62.4,62.4,True,88.9 +SKU_4,20260727_161234.jpg,2.52,SKU_1,16,False,SKU_5,9,False,SKU_4,25,True,SKU_4,10,True,SKU_4,True,SKU_3,False,SKU_4,63.3,63.3,True,76.2 +SKU_4,20260727_161237.jpg,2.44,SKU_5,15,False,SKU_5,12,False,SKU_3,53,False,SKU_4,7,True,SKU_4,True,SKU_5,False,SKU_4,62.9,62.9,True,76.7 +SKU_4,20260727_161343.jpg,2.57,SKU_5,19,False,SKU_5,12,False,SKU_3,70,False,SKU_4,18,True,SKU_4,True,SKU_5,False,SKU_4,63.3,63.3,True,79.3 +SKU_4,20260727_161346.jpg,2.56,SKU_5,18,False,SKU_5,14,False,SKU_3,27,False,SKU_4,12,True,SKU_4,True,SKU_1,False,SKU_4,64.1,64.1,True,83.6 +SKU_4,20260727_161508.jpg,2.63,SKU_5,20,False,SKU_5,18,False,SKU_4,34,True,SKU_4,14,True,SKU_4,True,SKU_4,True,SKU_4,61.3,61.3,True,86.6 +SKU_4,20260727_161510.jpg,2.52,SKU_5,16,False,SKU_1,10,False,SKU_4,37,True,SKU_4,10,True,SKU_4,True,SKU_5,False,SKU_4,62.0,62.0,True,85.0 +SKU_4,20260727_161610.jpg,2.48,SKU_5,18,False,SKU_5,11,False,SKU_4,33,True,SKU_4,16,True,SKU_4,True,SKU_4,True,SKU_4,63.5,63.5,True,88.0 +SKU_4,20260727_161653.jpg,2.5,SKU_5,12,False,SKU_1,13,False,SKU_3,21,False,SKU_1,5,False,SKU_4,True,SKU_1,False,SKU_4,57.7,57.7,True,84.6 +SKU_4,20260727_161748.jpg,2.49,SKU_5,12,False,SKU_5,14,False,SKU_3,24,False,SKU_4,8,True,SKU_4,True,SKU_5,False,SKU_4,59.4,59.4,True,83.7 +SKU_4,20260727_161750.jpg,2.45,SKU_1,14,False,SKU_5,16,False,SKU_ULTRA_6,18,False,SKU_4,6,True,SKU_4,True,SKU_5,False,SKU_4,59.8,59.8,True,82.7 +SKU_4,20260727_161942.jpg,2.4,SKU_5,12,False,SKU_1,10,False,SKU_4,54,True,SKU_4,8,True,SKU_4,True,SKU_4,True,SKU_4,52.7,52.7,True,80.3 +SKU_4,20260727_161945.jpg,2.44,SKU_1,11,False,SKU_5,13,False,SKU_3,27,False,SKU_4,10,True,SKU_4,True,SKU_2,False,SKU_4,52.4,52.4,True,71.9 +SKU_4,20260727_162200.jpg,2.38,SKU_1,13,False,SKU_1,15,False,SKU_3,20,False,SKU_4,8,True,SKU_4,True,SKU_1,False,SKU_4,48.8,48.8,True,71.1 +SKU_4,20260727_162213.jpg,2.55,SKU_2,11,False,SKU_2,11,False,SKU_4,43,True,SKU_4,10,True,SKU_4,True,SKU_2,False,SKU_4,54.0,54.0,True,80.0 +SKU_4,WhatsApp Image 2026-07-13 at 3.44.01 PM (1).jpeg,12.21,SKU_5,42,False,SKU_1,14,False,SKU_4,14,True,SKU_4,7,True,SKU_4,True,SKU_4,True,SKU_4,53.4,53.4,True,74.0 +SKU_4,WhatsApp Image 2026-07-13 at 3.44.01 PM (2).jpeg,12.06,SKU_5,24,False,SKU_5,13,False,SKU_4,10,True,SKU_4,6,True,SKU_4,True,SKU_4,True,SKU_4,52.3,52.3,True,67.5 +SKU_4,WhatsApp Image 2026-07-13 at 3.44.01 PM (3).jpeg,12.13,SKU_5,29,False,SKU_1,14,False,SKU_4,16,True,SKU_4,5,True,SKU_4,True,SKU_5,False,SKU_4,52.2,52.2,True,70.4 +SKU_4,WhatsApp Image 2026-07-13 at 3.44.01 PM (4).jpeg,12.29,SKU_5,50,False,SKU_1,16,False,SKU_3,10,False,SKU_4,7,True,SKU_4,True,SKU_5,False,SKU_4,55.3,55.3,True,77.9 +SKU_4,WhatsApp Image 2026-07-13 at 3.44.01 PM (5).jpeg,2.93,SKU_5,44,False,SKU_1,18,False,SKU_4,9,True,SKU_4,12,True,SKU_4,True,SKU_1,False,SKU_4,54.8,54.8,True,79.9 +SKU_4,WhatsApp Image 2026-07-13 at 3.44.01 PM (6).jpeg,12.24,SKU_5,40,False,SKU_1,10,False,SKU_4,13,True,SKU_4,7,True,SKU_4,True,SKU_1,False,SKU_4,53.7,53.7,True,66.9 +SKU_4,WhatsApp Image 2026-07-13 at 3.44.01 PM.jpeg,12.05,SKU_5,32,False,SKU_5,12,False,SKU_2,11,False,SKU_4,7,True,SKU_4,True,SKU_2,False,SKU_4,61.7,61.7,True,80.7 +SKU_4,WhatsApp Image 2026-07-13 at 3.44.02 PM (1).jpeg,12.13,SKU_5,25,False,SKU_5,11,False,SKU_5,13,False,SKU_3,5,False,SKU_4,True,SKU_5,False,SKU_4,62.4,62.4,True,58.3 +SKU_4,WhatsApp Image 2026-07-13 at 3.44.02 PM (2).jpeg,12.06,SKU_5,16,False,SKU_5,11,False,SKU_ULTRA_6,7,False,SKU_4,6,True,SKU_4,True,SKU_1,False,SKU_4,62.2,62.2,True,58.5 +SKU_4,WhatsApp Image 2026-07-13 at 3.44.02 PM.jpeg,12.01,SKU_5,28,False,SKU_1,12,False,SKU_4,8,True,SKU_4,6,True,SKU_4,True,SKU_5,False,SKU_4,62.5,62.5,True,59.6 +SKU_5,20260727_154535.jpg,2.27,SKU_5,7,True,SKU_5,12,True,SKU_3,18,False,SKU_5,7,True,SKU_5,True,SKU_5,True,SKU_5,60.5,60.5,True,79.3 +SKU_5,20260727_154538.jpg,2.06,SKU_5,13,True,SKU_5,13,True,SKU_2,18,False,SKU_ULTRA_6,7,False,SKU_5,True,SKU_5,True,SKU_5,59.3,59.3,True,71.0 +SKU_5,20260727_154750.jpg,2.12,SKU_5,8,True,SKU_5,10,True,SKU_4,25,False,SKU_5,6,True,SKU_5,True,SKU_5,True,SKU_5,62.0,62.0,True,76.1 +SKU_5,20260727_154753.jpg,2.14,SKU_1,6,False,SKU_5,14,True,SKU_5,26,True,SKU_1,8,False,SKU_5,True,SKU_1,False,SKU_5,61.3,61.3,True,77.4 +SKU_5,20260727_154911.jpg,2.3,SKU_5,13,True,SKU_5,22,True,SKU_5,19,True,SKU_5,11,True,SKU_5,True,SKU_5,True,SKU_5,66.1,66.1,True,72.9 +SKU_5,20260727_154914.jpg,2.21,SKU_5,11,True,SKU_5,17,True,SKU_5,37,True,SKU_1,4,False,SKU_5,True,SKU_5,True,SKU_5,66.1,66.1,True,71.4 +SKU_5,20260727_155040.jpg,2.04,SKU_1,14,False,SKU_5,18,True,SKU_5,17,True,SKU_4,5,False,SKU_5,True,SKU_5,True,SKU_5,62.5,62.5,True,87.4 +SKU_5,20260727_155043.jpg,2.2,SKU_5,12,True,SKU_5,15,True,SKU_5,15,True,SKU_1,7,False,SKU_5,True,SKU_1,False,SKU_5,61.7,61.7,True,86.8 +SKU_5,20260727_155201.jpg,2.28,SKU_5,10,True,SKU_5,16,True,SKU_5,41,True,SKU_5,9,True,SKU_5,True,SKU_5,True,SKU_5,56.6,56.6,True,87.2 +SKU_5,20260727_155203.jpg,2.16,SKU_5,6,True,SKU_1,14,False,SKU_5,90,True,SKU_1,12,False,SKU_5,True,SKU_5,True,SKU_5,60.4,60.4,True,76.2 +SKU_5,20260727_155336.jpg,2.18,SKU_5,11,True,SKU_5,14,True,SKU_5,27,True,SKU_1,13,False,SKU_5,True,SKU_5,True,SKU_5,61.5,61.5,True,87.0 +SKU_5,20260727_155338.jpg,1.95,SKU_5,11,True,SKU_5,14,True,SKU_1,12,False,SKU_1,4,False,SKU_5,True,SKU_5,True,SKU_5,61.5,61.5,True,89.4 +SKU_5,20260727_155536.jpg,1.79,SKU_5,7,True,SKU_5,14,True,SKU_2,26,False,SKU_2,6,False,SKU_5,True,SKU_2,False,SKU_5,51.0,51.0,True,78.1 +SKU_5,20260727_155539.jpg,2.22,SKU_1,8,False,SKU_5,13,True,SKU_2,24,False,SKU_1,8,False,SKU_5,True,SKU_5,True,SKU_5,57.0,57.0,True,92.5 +SKU_5,20260727_155804.jpg,2.23,SKU_1,9,False,SKU_5,13,True,SKU_5,33,True,SKU_2,6,False,SKU_5,True,SKU_5,True,SKU_5,54.4,54.4,True,83.0 +SKU_5,20260727_155827.jpg,2.3,SKU_5,11,True,SKU_1,19,False,SKU_5,11,True,SKU_1,7,False,SKU_5,True,SKU_5,True,SKU_5,61.3,61.3,True,77.3 diff --git a/test_results_OLD_1.csv b/test_results_OLD_1.csv new file mode 100644 index 0000000..92cbbc6 --- /dev/null +++ b/test_results_OLD_1.csv @@ -0,0 +1,77 @@ +expected,file,time_sec,SIFT_pick,SIFT_score,SIFT_correct,ORB_pick,ORB_score,ORB_correct,SuperGlue_pick,SuperGlue_score,SuperGlue_correct,LoFTR_pick,LoFTR_score,LoFTR_correct,weighted_pick,weighted_correct,overall_pick,overall_correct,color_pick,color_match_pct,color_pct_for_expected,color_correct +SKU_1,20260727_193449.jpg,8.35,SKU_5,20,False,SKU_5,13,False,SKU_4,25,False,SKU_5,8,False,SKU_5,False,SKU_5,False,SKU_1,66.9,66.9,True +SKU_1,20260727_193610.jpg,2.19,SKU_5,10,False,SKU_5,17,False,SKU_5,44,False,SKU_5,7,False,SKU_5,False,SKU_5,False,SKU_5,51.8,50.0,False +SKU_1,20260727_193751.jpg,2.22,SKU_1,12,True,SKU_1,11,True,SKU_5,25,False,SKU_1,6,True,SKU_1,True,SKU_1,True,SKU_5,54.8,51.7,False +SKU_1,20260727_193931.jpg,2.32,SKU_ULTRA_6,12,False,SKU_5,12,False,SKU_2,21,False,SKU_1,7,True,SKU_5,False,SKU_5,False,SKU_1,43.2,43.2,True +SKU_1,20260727_194102.jpg,2.14,SKU_5,11,False,SKU_1,11,True,SKU_5,18,False,SKU_1,8,True,SKU_1,True,SKU_5,False,SKU_1,53.0,53.0,True +SKU_1,20260727_194235.jpg,2.31,SKU_5,19,False,SKU_5,13,False,SKU_5,39,False,SKU_1,13,True,SKU_5,False,SKU_5,False,SKU_1,66.2,66.2,True +SKU_1,20260727_194450.jpg,2.34,SKU_5,15,False,SKU_1,13,True,SKU_1,26,True,SKU_1,10,True,SKU_1,True,SKU_1,True,SKU_1,55.7,55.7,True +SKU_1,20260727_194619.jpg,2.27,SKU_5,11,False,SKU_5,11,False,SKU_1,22,True,SKU_5,12,False,SKU_5,False,SKU_5,False,SKU_1,62.3,62.3,True +SKU_2,20260727_163536.jpg,2.27,SKU_1,14,False,SKU_5,10,False,SKU_2,38,True,SKU_2,31,True,SKU_2,True,SKU_1,False,SKU_2,58.3,58.3,True +SKU_2,20260727_163548.jpg,2.39,SKU_1,17,False,SKU_5,15,False,SKU_2,48,True,SKU_2,29,True,SKU_2,True,SKU_1,False,SKU_2,59.0,59.0,True +SKU_2,20260727_163614.jpg,2.33,SKU_5,16,False,SKU_2,10,True,SKU_2,42,True,SKU_2,23,True,SKU_2,True,SKU_2,True,SKU_2,62.1,62.1,True +SKU_2,20260727_163706.jpg,2.44,SKU_5,14,False,SKU_5,11,False,SKU_2,46,True,SKU_2,24,True,SKU_2,True,SKU_2,True,SKU_2,50.3,50.3,True +SKU_2,20260727_163815.jpg,2.46,SKU_5,16,False,SKU_5,14,False,SKU_2,43,True,SKU_2,21,True,SKU_2,True,SKU_2,True,SKU_2,55.6,55.6,True +SKU_2,20260727_164054.jpg,2.4,SKU_1,12,False,SKU_5,14,False,SKU_2,49,True,SKU_2,31,True,SKU_2,True,SKU_2,True,SKU_2,58.6,58.6,True +SKU_2,20260727_164129.jpg,2.43,SKU_2,10,True,SKU_5,10,False,SKU_2,46,True,SKU_2,20,True,SKU_2,True,SKU_2,True,SKU_2,56.5,56.5,True +SKU_2,20260727_164133.jpg,2.47,SKU_2,11,True,SKU_5,9,False,SKU_2,45,True,SKU_2,25,True,SKU_2,True,SKU_2,True,SKU_2,57.0,57.0,True +SKU_2,20260727_164138.jpg,2.35,SKU_2,12,True,SKU_5,9,False,SKU_2,32,True,SKU_2,20,True,SKU_2,True,SKU_2,True,SKU_2,57.4,57.4,True +SKU_2,20260727_164319.jpg,2.31,SKU_5,12,False,SKU_1,8,False,SKU_2,42,True,SKU_2,24,True,SKU_2,True,SKU_2,True,SKU_2,56.2,56.2,True +SKU_2,20260727_164323.jpg,2.43,SKU_4,13,False,SKU_1,9,False,SKU_2,40,True,SKU_2,19,True,SKU_2,True,SKU_2,True,SKU_2,56.4,56.4,True +SKU_2,20260727_164326.jpg,2.26,SKU_1,11,False,SKU_1,9,False,SKU_2,40,True,SKU_2,24,True,SKU_2,True,SKU_1,False,SKU_2,56.7,56.7,True +SKU_2,20260727_164330.jpg,2.32,SKU_1,12,False,SKU_2,9,True,SKU_2,39,True,SKU_2,25,True,SKU_2,True,SKU_2,True,SKU_2,56.4,56.4,True +SKU_2,20260727_164512.jpg,2.28,SKU_1,11,False,SKU_5,9,False,SKU_2,39,True,SKU_2,25,True,SKU_2,True,SKU_2,True,SKU_2,59.3,59.3,True +SKU_2,20260727_164516.jpg,2.43,SKU_4,14,False,SKU_5,10,False,SKU_2,35,True,SKU_2,20,True,SKU_2,True,SKU_2,True,SKU_2,58.5,58.5,True +SKU_2,20260727_164521.jpg,2.35,SKU_2,12,True,SKU_1,10,False,SKU_2,38,True,SKU_2,18,True,SKU_2,True,SKU_2,True,SKU_2,58.4,58.4,True +SKU_2,20260727_164524.jpg,2.41,SKU_2,12,True,SKU_1,10,False,SKU_2,41,True,SKU_2,20,True,SKU_2,True,SKU_2,True,SKU_2,59.9,59.9,True +SKU_2,20260727_181816.jpg,2.14,SKU_2,10,True,SKU_5,17,False,SKU_5,29,False,SKU_2,9,True,SKU_2,True,SKU_2,True,SKU_2,42.4,42.4,True +SKU_2,20260727_181827.jpg,2.31,SKU_5,15,False,SKU_5,9,False,SKU_2,38,True,SKU_2,26,True,SKU_2,True,SKU_5,False,SKU_2,50.1,50.1,True +SKU_2,20260727_181832.jpg,2.31,SKU_1,10,False,SKU_5,11,False,SKU_2,45,True,SKU_2,24,True,SKU_2,True,SKU_2,True,SKU_2,48.3,48.3,True +SKU_2,20260727_181835.jpg,2.38,SKU_5,13,False,SKU_5,11,False,SKU_2,32,True,SKU_2,23,True,SKU_2,True,SKU_5,False,SKU_2,48.5,48.5,True +SKU_3,20260727_174422.jpg,2.31,SKU_5,16,False,SKU_5,16,False,SKU_ULTRA_6,37,False,SKU_1,8,False,SKU_ULTRA_6,False,SKU_5,False,SKU_3,52.8,52.8,True +SKU_3,20260727_174426.jpg,2.29,SKU_5,12,False,SKU_5,10,False,SKU_4,39,False,SKU_3,8,True,SKU_ULTRA_6,False,SKU_5,False,SKU_3,51.2,51.2,True +SKU_3,20260727_174430.jpg,2.19,SKU_2,7,False,SKU_1,13,False,SKU_4,23,False,SKU_3,7,True,SKU_4,False,SKU_3,True,SKU_3,51.5,51.5,True +SKU_3,20260727_174451.jpg,2.28,SKU_1,11,False,SKU_5,16,False,SKU_3,24,True,SKU_3,7,True,SKU_3,True,SKU_1,False,SKU_3,52.3,52.3,True +SKU_3,20260727_174505.jpg,2.25,SKU_5,16,False,SKU_5,15,False,SKU_3,26,True,SKU_3,13,True,SKU_3,True,SKU_5,False,SKU_3,52.0,52.0,True +SKU_3,20260727_174509.jpg,2.3,SKU_5,13,False,SKU_5,16,False,SKU_4,14,False,SKU_3,11,True,SKU_3,True,SKU_3,True,SKU_3,50.8,50.8,True +SKU_3,20260727_174513.jpg,2.34,SKU_2,11,False,SKU_5,21,False,SKU_4,20,False,SKU_3,10,True,SKU_3,True,SKU_4,False,SKU_3,48.9,48.9,True +SKU_3,20260727_174516.jpg,2.31,SKU_5,13,False,SKU_5,11,False,SKU_5,18,False,SKU_3,10,True,SKU_3,True,SKU_5,False,SKU_3,51.5,51.5,True +SKU_3,20260727_174520.jpg,2.29,SKU_5,11,False,SKU_5,18,False,SKU_3,27,True,SKU_3,10,True,SKU_3,True,SKU_3,True,SKU_3,53.6,53.6,True +SKU_3,20260727_174608.jpg,2.22,SKU_3,7,True,SKU_5,17,False,SKU_3,33,True,SKU_3,7,True,SKU_3,True,SKU_3,True,SKU_3,59.9,59.9,True +SKU_3,20260727_174612.jpg,1.96,SKU_1,9,False,SKU_5,13,False,SKU_3,49,True,SKU_3,10,True,SKU_3,True,SKU_1,False,SKU_3,62.1,62.1,True +SKU_3,20260727_174946.jpg,2.23,SKU_5,14,False,SKU_5,21,False,SKU_3,36,True,SKU_3,10,True,SKU_3,True,SKU_3,True,SKU_5,47.6,39.8,False +SKU_3,20260727_174949.jpg,2.32,SKU_5,15,False,SKU_5,20,False,SKU_3,22,True,SKU_3,14,True,SKU_3,True,SKU_2,False,SKU_5,45.5,41.6,False +SKU_4,20260727_160751.jpg,2.39,SKU_5,15,False,SKU_1,11,False,SKU_4,33,True,SKU_4,17,True,SKU_4,True,SKU_5,False,SKU_4,59.5,59.5,True +SKU_4,20260727_160846.jpg,2.42,SKU_5,14,False,SKU_5,12,False,SKU_3,81,False,SKU_4,12,True,SKU_3,False,SKU_1,False,SKU_4,60.9,60.9,True +SKU_4,20260727_161051.jpg,2.4,SKU_1,10,False,SKU_1,12,False,SKU_3,78,False,SKU_3,11,False,SKU_3,False,SKU_3,False,SKU_4,60.9,60.9,True +SKU_4,20260727_161053.jpg,2.42,SKU_5,12,False,SKU_1,12,False,SKU_3,107,False,SKU_4,9,True,SKU_3,False,SKU_3,False,SKU_4,62.4,62.4,True +SKU_4,20260727_161234.jpg,2.38,SKU_1,15,False,SKU_5,11,False,SKU_4,25,True,SKU_4,10,True,SKU_4,True,SKU_4,True,SKU_4,63.3,63.3,True +SKU_4,20260727_161237.jpg,2.31,SKU_1,13,False,SKU_5,12,False,SKU_3,53,False,SKU_4,7,True,SKU_3,False,SKU_2,False,SKU_4,62.9,62.9,True +SKU_4,20260727_161343.jpg,2.47,SKU_5,19,False,SKU_ULTRA_6,11,False,SKU_3,70,False,SKU_4,18,True,SKU_3,False,SKU_2,False,SKU_4,63.3,63.3,True +SKU_4,20260727_161346.jpg,2.45,SKU_5,21,False,SKU_5,11,False,SKU_3,27,False,SKU_4,12,True,SKU_4,True,SKU_4,True,SKU_4,64.1,64.1,True +SKU_4,20260727_161508.jpg,2.5,SKU_5,27,False,SKU_5,13,False,SKU_4,34,True,SKU_4,14,True,SKU_4,True,SKU_5,False,SKU_4,61.3,61.3,True +SKU_4,20260727_161510.jpg,2.4,SKU_5,21,False,SKU_5,12,False,SKU_4,37,True,SKU_4,10,True,SKU_4,True,SKU_5,False,SKU_4,62.0,62.0,True +SKU_4,20260727_161610.jpg,2.39,SKU_5,18,False,SKU_5,12,False,SKU_4,33,True,SKU_4,16,True,SKU_4,True,SKU_5,False,SKU_4,63.5,63.5,True +SKU_4,20260727_161653.jpg,2.4,SKU_5,15,False,SKU_1,12,False,SKU_3,21,False,SKU_1,5,False,SKU_3,False,SKU_1,False,SKU_4,57.7,57.7,True +SKU_4,20260727_161748.jpg,2.37,SKU_5,13,False,SKU_1,14,False,SKU_3,24,False,SKU_4,8,True,SKU_4,True,SKU_1,False,SKU_4,59.4,59.4,True +SKU_4,20260727_161750.jpg,2.43,SKU_1,14,False,SKU_5,15,False,SKU_ULTRA_6,18,False,SKU_4,6,True,SKU_5,False,SKU_5,False,SKU_4,59.8,59.8,True +SKU_4,20260727_161942.jpg,2.33,SKU_5,10,False,SKU_2,14,False,SKU_4,54,True,SKU_4,8,True,SKU_4,True,SKU_4,True,SKU_4,52.7,52.7,True +SKU_4,20260727_161945.jpg,2.34,SKU_5,14,False,SKU_1,12,False,SKU_3,27,False,SKU_4,10,True,SKU_4,True,SKU_2,False,SKU_4,52.4,52.4,True +SKU_4,20260727_162200.jpg,2.33,SKU_5,14,False,SKU_1,16,False,SKU_3,20,False,SKU_4,8,True,SKU_4,True,SKU_1,False,SKU_4,48.8,48.8,True +SKU_4,20260727_162213.jpg,2.47,SKU_2,12,False,SKU_1,11,False,SKU_4,43,True,SKU_4,10,True,SKU_4,True,SKU_2,False,SKU_4,54.0,54.0,True +SKU_5,20260727_154535.jpg,2.19,SKU_5,7,True,SKU_5,12,True,SKU_3,18,False,SKU_5,7,True,SKU_5,True,SKU_5,True,SKU_5,60.5,60.5,True +SKU_5,20260727_154538.jpg,2.01,SKU_5,13,True,SKU_5,21,True,SKU_2,18,False,SKU_ULTRA_6,7,False,SKU_5,True,SKU_5,True,SKU_5,59.3,59.3,True +SKU_5,20260727_154750.jpg,2.0,SKU_5,9,True,SKU_5,16,True,SKU_4,25,False,SKU_5,6,True,SKU_5,True,SKU_5,True,SKU_5,62.0,62.0,True +SKU_5,20260727_154753.jpg,2.0,SKU_1,7,False,SKU_5,13,True,SKU_5,26,True,SKU_1,8,False,SKU_5,True,SKU_1,False,SKU_5,61.3,61.3,True +SKU_5,20260727_154911.jpg,2.29,SKU_5,12,True,SKU_5,15,True,SKU_5,19,True,SKU_5,11,True,SKU_5,True,SKU_5,True,SKU_5,66.1,66.1,True +SKU_5,20260727_154914.jpg,2.19,SKU_5,10,True,SKU_5,17,True,SKU_5,37,True,SKU_1,4,False,SKU_5,True,SKU_5,True,SKU_5,66.1,66.1,True +SKU_5,20260727_155040.jpg,1.97,SKU_1,13,False,SKU_5,12,True,SKU_5,17,True,SKU_4,5,False,SKU_5,True,SKU_5,True,SKU_5,62.5,62.5,True +SKU_5,20260727_155043.jpg,2.18,SKU_5,12,True,SKU_1,13,False,SKU_5,15,True,SKU_1,7,False,SKU_1,False,SKU_1,False,SKU_5,61.7,61.7,True +SKU_5,20260727_155201.jpg,2.27,SKU_5,10,True,SKU_5,15,True,SKU_5,41,True,SKU_5,9,True,SKU_5,True,SKU_5,True,SKU_5,56.6,56.6,True +SKU_5,20260727_155203.jpg,2.16,SKU_1,6,False,SKU_5,16,True,SKU_5,90,True,SKU_1,12,False,SKU_5,True,SKU_1,False,SKU_5,60.4,60.4,True +SKU_5,20260727_155336.jpg,2.16,SKU_5,10,True,SKU_5,16,True,SKU_5,27,True,SKU_1,13,False,SKU_1,False,SKU_5,True,SKU_5,61.5,61.5,True +SKU_5,20260727_155338.jpg,1.95,SKU_3,5,False,SKU_5,21,True,SKU_1,12,False,SKU_1,4,False,SKU_5,True,SKU_1,False,SKU_5,61.5,61.5,True +SKU_5,20260727_155536.jpg,1.78,SKU_5,7,True,SKU_1,11,False,SKU_2,26,False,SKU_2,6,False,SKU_2,False,SKU_2,False,SKU_5,51.0,51.0,True +SKU_5,20260727_155539.jpg,2.12,SKU_5,9,True,SKU_1,10,False,SKU_2,24,False,SKU_1,8,False,SKU_5,True,SKU_5,True,SKU_5,57.0,57.0,True +SKU_5,20260727_155804.jpg,2.09,SKU_1,7,False,SKU_5,16,True,SKU_5,33,True,SKU_2,6,False,SKU_5,True,SKU_5,True,SKU_5,54.4,54.4,True +SKU_5,20260727_155827.jpg,2.13,SKU_5,12,True,SKU_5,18,True,SKU_5,11,True,SKU_1,7,False,SKU_1,False,SKU_5,True,SKU_5,61.3,61.3,True diff --git a/test_results_OLD_2.csv b/test_results_OLD_2.csv new file mode 100644 index 0000000..24a57ef --- /dev/null +++ b/test_results_OLD_2.csv @@ -0,0 +1,77 @@ +expected,file,time_sec,SIFT_pick,SIFT_score,SIFT_correct,ORB_pick,ORB_score,ORB_correct,SuperGlue_pick,SuperGlue_score,SuperGlue_correct,LoFTR_pick,LoFTR_score,LoFTR_correct,weighted_pick,weighted_correct,overall_pick,overall_correct,color_pick,color_match_pct,color_pct_for_expected,color_correct +SKU_1,20260727_193449.jpg,2.87,SKU_5,20,False,SKU_5,13,False,SKU_4,25,False,SKU_5,8,False,SKU_5,False,SKU_5,False,SKU_1,66.9,66.9,True +SKU_1,20260727_193610.jpg,2.17,SKU_5,10,False,SKU_5,17,False,SKU_5,44,False,SKU_5,7,False,SKU_5,False,SKU_5,False,SKU_5,51.8,50.0,False +SKU_1,20260727_193751.jpg,2.2,SKU_1,12,True,SKU_1,11,True,SKU_5,25,False,SKU_1,6,True,SKU_1,True,SKU_1,True,SKU_5,54.8,51.7,False +SKU_1,20260727_193931.jpg,2.32,SKU_ULTRA_6,11,False,SKU_5,12,False,SKU_2,21,False,SKU_1,7,True,SKU_5,False,SKU_5,False,SKU_1,43.2,43.2,True +SKU_1,20260727_194102.jpg,2.15,SKU_5,11,False,SKU_1,11,True,SKU_5,18,False,SKU_1,8,True,SKU_1,True,SKU_5,False,SKU_1,53.0,53.0,True +SKU_1,20260727_194235.jpg,2.34,SKU_5,19,False,SKU_5,13,False,SKU_5,39,False,SKU_1,13,True,SKU_5,False,SKU_5,False,SKU_1,66.2,66.2,True +SKU_1,20260727_194450.jpg,2.33,SKU_5,15,False,SKU_1,13,True,SKU_1,26,True,SKU_1,10,True,SKU_1,True,SKU_1,True,SKU_1,55.7,55.7,True +SKU_1,20260727_194619.jpg,2.29,SKU_5,11,False,SKU_5,11,False,SKU_1,22,True,SKU_5,12,False,SKU_5,False,SKU_5,False,SKU_1,62.3,62.3,True +SKU_2,20260727_163536.jpg,2.26,SKU_1,14,False,SKU_5,10,False,SKU_2,38,True,SKU_2,31,True,SKU_2,True,SKU_1,False,SKU_2,58.3,58.3,True +SKU_2,20260727_163548.jpg,2.37,SKU_1,17,False,SKU_5,15,False,SKU_2,48,True,SKU_2,29,True,SKU_2,True,SKU_1,False,SKU_2,59.0,59.0,True +SKU_2,20260727_163614.jpg,2.33,SKU_5,16,False,SKU_2,10,True,SKU_2,42,True,SKU_2,23,True,SKU_2,True,SKU_2,True,SKU_2,62.1,62.1,True +SKU_2,20260727_163706.jpg,2.46,SKU_5,14,False,SKU_5,11,False,SKU_2,46,True,SKU_2,24,True,SKU_2,True,SKU_2,True,SKU_2,50.3,50.3,True +SKU_2,20260727_163815.jpg,2.49,SKU_5,16,False,SKU_5,14,False,SKU_2,43,True,SKU_2,21,True,SKU_2,True,SKU_2,True,SKU_2,55.6,55.6,True +SKU_2,20260727_164054.jpg,2.43,SKU_1,12,False,SKU_5,14,False,SKU_2,49,True,SKU_2,31,True,SKU_2,True,SKU_2,True,SKU_2,58.6,58.6,True +SKU_2,20260727_164129.jpg,2.45,SKU_2,10,True,SKU_5,10,False,SKU_2,46,True,SKU_2,20,True,SKU_2,True,SKU_2,True,SKU_2,56.5,56.5,True +SKU_2,20260727_164133.jpg,2.54,SKU_2,11,True,SKU_5,9,False,SKU_2,45,True,SKU_2,25,True,SKU_2,True,SKU_2,True,SKU_2,57.0,57.0,True +SKU_2,20260727_164138.jpg,2.4,SKU_2,12,True,SKU_5,9,False,SKU_2,32,True,SKU_2,20,True,SKU_2,True,SKU_2,True,SKU_2,57.4,57.4,True +SKU_2,20260727_164319.jpg,2.33,SKU_5,12,False,SKU_1,8,False,SKU_2,42,True,SKU_2,24,True,SKU_2,True,SKU_2,True,SKU_2,56.2,56.2,True +SKU_2,20260727_164323.jpg,2.48,SKU_4,13,False,SKU_1,9,False,SKU_2,40,True,SKU_2,19,True,SKU_2,True,SKU_2,True,SKU_2,56.4,56.4,True +SKU_2,20260727_164326.jpg,2.31,SKU_1,11,False,SKU_1,9,False,SKU_2,40,True,SKU_2,24,True,SKU_2,True,SKU_1,False,SKU_2,56.7,56.7,True +SKU_2,20260727_164330.jpg,2.36,SKU_1,12,False,SKU_2,9,True,SKU_2,39,True,SKU_2,25,True,SKU_2,True,SKU_2,True,SKU_2,56.4,56.4,True +SKU_2,20260727_164512.jpg,2.34,SKU_1,11,False,SKU_5,9,False,SKU_2,39,True,SKU_2,25,True,SKU_2,True,SKU_2,True,SKU_2,59.3,59.3,True +SKU_2,20260727_164516.jpg,2.46,SKU_4,14,False,SKU_5,10,False,SKU_2,35,True,SKU_2,20,True,SKU_2,True,SKU_2,True,SKU_2,58.5,58.5,True +SKU_2,20260727_164521.jpg,2.4,SKU_2,12,True,SKU_1,10,False,SKU_2,38,True,SKU_2,18,True,SKU_2,True,SKU_2,True,SKU_2,58.4,58.4,True +SKU_2,20260727_164524.jpg,2.48,SKU_2,12,True,SKU_1,10,False,SKU_2,41,True,SKU_2,20,True,SKU_2,True,SKU_2,True,SKU_2,59.9,59.9,True +SKU_2,20260727_181816.jpg,2.19,SKU_2,10,True,SKU_5,17,False,SKU_5,29,False,SKU_2,9,True,SKU_2,True,SKU_2,True,SKU_2,42.4,42.4,True +SKU_2,20260727_181827.jpg,2.33,SKU_5,15,False,SKU_5,9,False,SKU_2,38,True,SKU_2,26,True,SKU_2,True,SKU_5,False,SKU_2,50.1,50.1,True +SKU_2,20260727_181832.jpg,2.33,SKU_1,10,False,SKU_5,11,False,SKU_2,45,True,SKU_2,24,True,SKU_2,True,SKU_2,True,SKU_2,48.3,48.3,True +SKU_2,20260727_181835.jpg,2.37,SKU_5,13,False,SKU_5,11,False,SKU_2,32,True,SKU_2,23,True,SKU_2,True,SKU_5,False,SKU_2,48.5,48.5,True +SKU_3,20260727_174422.jpg,2.34,SKU_5,16,False,SKU_5,16,False,SKU_ULTRA_6,37,False,SKU_1,8,False,SKU_ULTRA_6,False,SKU_5,False,SKU_3,52.8,52.8,True +SKU_3,20260727_174426.jpg,2.3,SKU_5,12,False,SKU_5,10,False,SKU_ULTRA_6,42,False,SKU_3,8,True,SKU_ULTRA_6,False,SKU_ULTRA_6,False,SKU_3,51.2,51.2,True +SKU_3,20260727_174430.jpg,2.24,SKU_2,7,False,SKU_1,13,False,SKU_4,23,False,SKU_3,7,True,SKU_4,False,SKU_3,True,SKU_3,51.5,51.5,True +SKU_3,20260727_174451.jpg,2.44,SKU_1,11,False,SKU_5,16,False,SKU_3,24,True,SKU_3,7,True,SKU_3,True,SKU_1,False,SKU_3,52.3,52.3,True +SKU_3,20260727_174505.jpg,2.4,SKU_5,16,False,SKU_5,15,False,SKU_3,26,True,SKU_3,13,True,SKU_3,True,SKU_5,False,SKU_3,52.0,52.0,True +SKU_3,20260727_174509.jpg,2.48,SKU_5,13,False,SKU_5,16,False,SKU_4,14,False,SKU_3,11,True,SKU_3,True,SKU_3,True,SKU_3,50.8,50.8,True +SKU_3,20260727_174513.jpg,2.47,SKU_2,11,False,SKU_5,21,False,SKU_4,20,False,SKU_3,10,True,SKU_3,True,SKU_4,False,SKU_3,48.9,48.9,True +SKU_3,20260727_174516.jpg,2.41,SKU_5,13,False,SKU_5,11,False,SKU_5,18,False,SKU_3,10,True,SKU_3,True,SKU_5,False,SKU_3,51.5,51.5,True +SKU_3,20260727_174520.jpg,2.5,SKU_5,11,False,SKU_5,18,False,SKU_3,27,True,SKU_3,10,True,SKU_3,True,SKU_3,True,SKU_3,53.6,53.6,True +SKU_3,20260727_174608.jpg,2.35,SKU_3,7,True,SKU_5,17,False,SKU_3,33,True,SKU_3,7,True,SKU_3,True,SKU_3,True,SKU_3,59.9,59.9,True +SKU_3,20260727_174612.jpg,2.1,SKU_1,9,False,SKU_5,13,False,SKU_3,49,True,SKU_3,10,True,SKU_3,True,SKU_1,False,SKU_3,62.1,62.1,True +SKU_3,20260727_174946.jpg,2.3,SKU_5,14,False,SKU_5,21,False,SKU_3,36,True,SKU_3,10,True,SKU_3,True,SKU_3,True,SKU_5,47.6,39.8,False +SKU_3,20260727_174949.jpg,2.39,SKU_5,15,False,SKU_5,20,False,SKU_3,22,True,SKU_3,14,True,SKU_3,True,SKU_2,False,SKU_5,45.5,41.6,False +SKU_4,20260727_160751.jpg,2.41,SKU_5,15,False,SKU_1,11,False,SKU_4,33,True,SKU_4,17,True,SKU_4,True,SKU_5,False,SKU_4,59.5,59.5,True +SKU_4,20260727_160846.jpg,2.41,SKU_5,14,False,SKU_5,12,False,SKU_3,81,False,SKU_4,12,True,SKU_3,False,SKU_1,False,SKU_4,60.9,60.9,True +SKU_4,20260727_161051.jpg,2.45,SKU_1,10,False,SKU_1,12,False,SKU_3,78,False,SKU_3,11,False,SKU_3,False,SKU_3,False,SKU_4,60.9,60.9,True +SKU_4,20260727_161053.jpg,2.47,SKU_5,12,False,SKU_1,12,False,SKU_3,107,False,SKU_4,9,True,SKU_3,False,SKU_3,False,SKU_4,62.4,62.4,True +SKU_4,20260727_161234.jpg,2.45,SKU_1,15,False,SKU_5,11,False,SKU_4,25,True,SKU_4,10,True,SKU_4,True,SKU_4,True,SKU_4,63.3,63.3,True +SKU_4,20260727_161237.jpg,2.39,SKU_1,13,False,SKU_5,12,False,SKU_3,53,False,SKU_4,7,True,SKU_3,False,SKU_2,False,SKU_4,62.9,62.9,True +SKU_4,20260727_161343.jpg,2.52,SKU_5,19,False,SKU_ULTRA_6,11,False,SKU_3,70,False,SKU_4,18,True,SKU_3,False,SKU_2,False,SKU_4,63.3,63.3,True +SKU_4,20260727_161346.jpg,2.5,SKU_5,21,False,SKU_5,11,False,SKU_3,27,False,SKU_4,12,True,SKU_4,True,SKU_4,True,SKU_4,64.1,64.1,True +SKU_4,20260727_161508.jpg,2.54,SKU_5,27,False,SKU_5,13,False,SKU_4,34,True,SKU_4,14,True,SKU_4,True,SKU_5,False,SKU_4,61.3,61.3,True +SKU_4,20260727_161510.jpg,2.45,SKU_5,21,False,SKU_5,12,False,SKU_4,37,True,SKU_4,10,True,SKU_4,True,SKU_5,False,SKU_4,62.0,62.0,True +SKU_4,20260727_161610.jpg,2.44,SKU_5,18,False,SKU_5,12,False,SKU_4,33,True,SKU_4,16,True,SKU_4,True,SKU_5,False,SKU_4,63.5,63.5,True +SKU_4,20260727_161653.jpg,2.46,SKU_5,15,False,SKU_1,12,False,SKU_3,21,False,SKU_1,5,False,SKU_3,False,SKU_1,False,SKU_4,57.7,57.7,True +SKU_4,20260727_161748.jpg,2.4,SKU_5,13,False,SKU_1,14,False,SKU_3,24,False,SKU_4,8,True,SKU_4,True,SKU_1,False,SKU_4,59.4,59.4,True +SKU_4,20260727_161750.jpg,2.48,SKU_1,14,False,SKU_5,15,False,SKU_ULTRA_6,18,False,SKU_4,6,True,SKU_5,False,SKU_5,False,SKU_4,59.8,59.8,True +SKU_4,20260727_161942.jpg,2.38,SKU_5,10,False,SKU_2,14,False,SKU_4,54,True,SKU_4,8,True,SKU_4,True,SKU_4,True,SKU_4,52.7,52.7,True +SKU_4,20260727_161945.jpg,2.38,SKU_5,14,False,SKU_1,12,False,SKU_3,27,False,SKU_4,10,True,SKU_4,True,SKU_2,False,SKU_4,52.4,52.4,True +SKU_4,20260727_162200.jpg,2.4,SKU_5,14,False,SKU_1,16,False,SKU_3,20,False,SKU_4,8,True,SKU_4,True,SKU_1,False,SKU_4,48.8,48.8,True +SKU_4,20260727_162213.jpg,2.51,SKU_2,12,False,SKU_1,11,False,SKU_4,43,True,SKU_4,10,True,SKU_4,True,SKU_2,False,SKU_4,54.0,54.0,True +SKU_5,20260727_154535.jpg,2.21,SKU_5,7,True,SKU_5,12,True,SKU_3,18,False,SKU_5,7,True,SKU_5,True,SKU_5,True,SKU_5,60.5,60.5,True +SKU_5,20260727_154538.jpg,2.05,SKU_5,13,True,SKU_5,21,True,SKU_2,18,False,SKU_ULTRA_6,7,False,SKU_5,True,SKU_5,True,SKU_5,59.3,59.3,True +SKU_5,20260727_154750.jpg,2.06,SKU_5,9,True,SKU_5,16,True,SKU_4,25,False,SKU_5,6,True,SKU_5,True,SKU_5,True,SKU_5,62.0,62.0,True +SKU_5,20260727_154753.jpg,2.13,SKU_1,7,False,SKU_5,13,True,SKU_5,26,True,SKU_1,8,False,SKU_5,True,SKU_1,False,SKU_5,61.3,61.3,True +SKU_5,20260727_154911.jpg,2.29,SKU_5,12,True,SKU_5,15,True,SKU_5,19,True,SKU_5,11,True,SKU_5,True,SKU_5,True,SKU_5,66.1,66.1,True +SKU_5,20260727_154914.jpg,2.21,SKU_5,10,True,SKU_5,17,True,SKU_5,37,True,SKU_1,4,False,SKU_5,True,SKU_5,True,SKU_5,66.1,66.1,True +SKU_5,20260727_155040.jpg,2.01,SKU_1,13,False,SKU_5,12,True,SKU_5,17,True,SKU_4,5,False,SKU_5,True,SKU_5,True,SKU_5,62.5,62.5,True +SKU_5,20260727_155043.jpg,2.17,SKU_5,12,True,SKU_1,13,False,SKU_5,15,True,SKU_1,7,False,SKU_1,False,SKU_1,False,SKU_5,61.7,61.7,True +SKU_5,20260727_155201.jpg,2.29,SKU_5,10,True,SKU_5,15,True,SKU_5,41,True,SKU_5,9,True,SKU_5,True,SKU_5,True,SKU_5,56.6,56.6,True +SKU_5,20260727_155203.jpg,2.17,SKU_1,6,False,SKU_5,16,True,SKU_5,90,True,SKU_1,12,False,SKU_5,True,SKU_1,False,SKU_5,60.4,60.4,True +SKU_5,20260727_155336.jpg,2.17,SKU_5,10,True,SKU_5,16,True,SKU_5,27,True,SKU_1,13,False,SKU_1,False,SKU_5,True,SKU_5,61.5,61.5,True +SKU_5,20260727_155338.jpg,1.93,SKU_3,5,False,SKU_5,21,True,SKU_1,12,False,SKU_1,4,False,SKU_5,True,SKU_1,False,SKU_5,61.5,61.5,True +SKU_5,20260727_155536.jpg,1.77,SKU_5,7,True,SKU_1,11,False,SKU_2,26,False,SKU_2,6,False,SKU_2,False,SKU_2,False,SKU_5,51.0,51.0,True +SKU_5,20260727_155539.jpg,2.12,SKU_5,9,True,SKU_1,10,False,SKU_2,24,False,SKU_1,8,False,SKU_5,True,SKU_5,True,SKU_5,57.0,57.0,True +SKU_5,20260727_155804.jpg,2.1,SKU_1,7,False,SKU_5,16,True,SKU_5,33,True,SKU_2,6,False,SKU_5,True,SKU_5,True,SKU_5,54.4,54.4,True +SKU_5,20260727_155827.jpg,2.16,SKU_5,12,True,SKU_5,18,True,SKU_5,11,True,SKU_1,7,False,SKU_1,False,SKU_5,True,SKU_5,61.3,61.3,True diff --git a/tester.py b/tester.py new file mode 100644 index 0000000..f9d3ef5 --- /dev/null +++ b/tester.py @@ -0,0 +1,284 @@ +""" +tester.py -- simple batch accuracy check for the Vase Matcher pipeline. + +Expects a folder of subfolders, each named after an existing template (e.g. +SKU_1/, SKU_2/, ...), each containing photos expected to match that +same-named template: + + flowers/ + SKU_1/ photo1.jpg photo2.jpg ... + SKU_2/ ... + +For every image, runs the exact same code path the web app's /api/match +uses (pipeline.engine.process_upload -- no reimplementation of the scoring +logic here), checks whether the weighted final match picked the expected +template, then (unless --skip-flowers) also runs the same SAM3-based flower +count + vase comparison the "Count flowers" button runs +(pipeline.engine.count_flowers) and saves one combined report image per +test photo to --report-dir, showing side by side: + + - your photo's flower segmentation vs the matched template's + - flower counts on both sides (+ the same mismatch note the web UI shows) + - the vase-identity comparison (DINOv2 + CLIP crops + verdict) + +Prints a pass/fail line per image, then a per-SKU and overall accuracy +summary. Note: the flower/vase step adds real time per image (SAM3 loads +in a subprocess, plus YOLO-World and DINOv2/CLIP) -- expect roughly +15-25s/image on top of the ~2-3s the match itself takes; use --skip-flowers +for a fast accuracy-only pass. + +Usage: + python3 tester.py # uses ./flowers + python3 tester.py /path/to/flowers + python3 tester.py --limit 3 # only first 3 images per SKU folder + python3 tester.py --skip-flowers # fast pass, no report images +""" + +import argparse +import gc +import os +import sys +import time + +import config # noqa: F401 -- must import first, caps thread envs + +import cv2 +import numpy as np +import torch + +from pipeline import engine + +DEFAULT_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "flowers") +DEFAULT_REPORT_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_reports") + +REPORT_W = 900 +IMG_ROW_H = 340 +VASE_ROW_H = 200 +BAR_H = 34 +BG = (24, 22, 19) +PANEL_BG = (250, 250, 250) + + +def release_gpu(): + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + + +def _fit_into(img, w, h): + canvas = np.full((h, w, 3), BG, dtype=np.uint8) + if img is None: + cv2.putText(canvas, "unavailable", (10, h // 2), cv2.FONT_HERSHEY_SIMPLEX, + 0.6, (140, 140, 140), 1, cv2.LINE_AA) + return canvas + ih, iw = img.shape[:2] + scale = min(w / iw, h / ih) + nw, nh = max(1, int(iw * scale)), max(1, int(ih * scale)) + resized = cv2.resize(img, (nw, nh), interpolation=cv2.INTER_AREA) + x_off, y_off = (w - nw) // 2, (h - nh) // 2 + canvas[y_off:y_off + nh, x_off:x_off + nw] = resized + return canvas + + +def _wrap_text(text, max_width, font=cv2.FONT_HERSHEY_SIMPLEX, scale=0.52, thickness=1): + words = text.split() + lines, current = [], "" + for word in words: + trial = f"{current} {word}".strip() + (tw, _), _ = cv2.getTextSize(trial, font, scale, thickness) + if tw > max_width and current: + lines.append(current) + current = word + else: + current = trial + if current: + lines.append(current) + return lines + + +def _text_panel(lines, w, line_h=22, pad=10, color=(30, 30, 30)): + h = pad * 2 + max(1, len(lines)) * line_h + canvas = np.full((h, w, 3), PANEL_BG, dtype=np.uint8) + for i, line in enumerate(lines): + y = pad + (i + 1) * line_h - 6 + cv2.putText(canvas, line, (16, y), cv2.FONT_HERSHEY_SIMPLEX, 0.52, color, 1, cv2.LINE_AA) + return canvas + + +def _bar(text, w, color=(30, 30, 30), bg=PANEL_BG, h=BAR_H): + canvas = np.full((h, w, 3), bg, dtype=np.uint8) + cv2.putText(canvas, text, (16, h - 12), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 1, cv2.LINE_AA) + return canvas + + +def build_report_image(request_dir, fname, expected, picked, correct, score, + flower_result, flower_count_comparison): + half_w = REPORT_W // 2 + + def load(rel): + if not rel: + return None + p = os.path.join(request_dir, rel) + return cv2.imread(p) if os.path.isfile(p) else None + + sam = flower_result.get("sam", {}) + sam_t = flower_result.get("sam_template", {}) + vase = flower_result.get("vase_comparison") or {} + + status = "MATCH" if correct else "MISMATCH" + status_color = (90, 140, 90) if correct else (60, 60, 200) + top_bar = _bar( + f"{fname} expected={expected} picked={picked} [{status}] weighted_score={score}", + REPORT_W, color=status_color, + ) + + label_bar = np.full((BAR_H, REPORT_W, 3), PANEL_BG, dtype=np.uint8) + cv2.putText(label_bar, f"Your upload -- {sam.get('total_count', 0)} flowers", + (16, BAR_H - 12), cv2.FONT_HERSHEY_SIMPLEX, 0.56, (30, 30, 30), 1, cv2.LINE_AA) + cv2.putText(label_bar, f"{picked} -- {sam_t.get('total_count', 0)} flowers", + (half_w + 16, BAR_H - 12), cv2.FONT_HERSHEY_SIMPLEX, 0.56, (30, 30, 30), 1, cv2.LINE_AA) + + seg_row = cv2.hconcat([ + _fit_into(load(sam.get("visual_file")), half_w, IMG_ROW_H), + _fit_into(load(sam_t.get("visual_file")), half_w, IMG_ROW_H), + ]) + + if flower_count_comparison and not flower_count_comparison.get("error"): + fc_lines = _wrap_text(flower_count_comparison["message"], REPORT_W - 32) + elif flower_count_comparison: + fc_lines = [f"Flower-count comparison unavailable: {flower_count_comparison['error']}"] + else: + fc_lines = ["Flower-count comparison not run (no matched template)."] + fc_panel = _text_panel(fc_lines, REPORT_W) + + vase_row = cv2.hconcat([ + _fit_into(load(vase.get("input_crop_file")), half_w, VASE_ROW_H), + _fit_into(load(vase.get("template_crop_file")), half_w, VASE_ROW_H), + ]) + if vase.get("error"): + vase_lines = [f"Vase comparison unavailable: {vase['error']}"] + elif vase: + vase_lines = [ + f"Vase match: {vase.get('verdict', '?').upper()} (DINOv2 " + f"{vase.get('dino_similarity_pct')}%, CLIP {vase.get('clip_similarity_pct')}%, " + f"combined {vase.get('combined_pct')}%)" + ] + else: + vase_lines = ["Vase comparison not run (no matched template)."] + vase_bar = _text_panel(vase_lines, REPORT_W) + + return cv2.vconcat([top_bar, label_bar, seg_row, fc_panel, vase_bar, vase_row]) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("test_dir", nargs="?", default=DEFAULT_DIR, + help=f"Folder of per-template subfolders (default: {DEFAULT_DIR})") + parser.add_argument("--limit", type=int, default=None, + help="Only test the first N images per folder") + parser.add_argument("--report-dir", default=DEFAULT_REPORT_DIR, + help=f"Where to save combined report images (default: {DEFAULT_REPORT_DIR})") + parser.add_argument("--skip-flowers", action="store_true", + help="Skip the SAM3 flower-count/vase-comparison step and report images " + "(much faster -- accuracy summary only)") + args = parser.parse_args() + + if not os.path.isdir(args.test_dir): + print(f"Test folder not found: {args.test_dir}") + sys.exit(1) + + if not args.skip_flowers: + os.makedirs(args.report_dir, exist_ok=True) + + print(f"Bootstrapping templates from {config.TEMPLATE_IMAGES_DIR} ...") + engine.bootstrap() + known_templates = set(engine.templates_meta().keys()) + + per_sku = {} + total_correct = 0 + total_count = 0 + start = time.perf_counter() + + for expected in sorted(os.listdir(args.test_dir)): + folder = os.path.join(args.test_dir, expected) + if not os.path.isdir(folder): + continue + if expected not in known_templates: + print(f"Skipping {expected}/ -- no template with that name") + continue + + images = sorted(f for f in os.listdir(folder) if f.lower().endswith(config.VALID_EXTS)) + if args.limit: + images = images[:args.limit] + + sku_correct = 0 + print(f"\n=== {expected}: {len(images)} image(s) ===") + + for fname in images: + path = os.path.join(folder, fname) + with open(path, "rb") as f: + image_bytes = f.read() + + img_start = time.perf_counter() + try: + result = engine.process_upload(image_bytes, fname) + except Exception as e: + print(f" [ERR ] {fname}: {e}") + release_gpu() + continue + + picked = result.get("weighted_best") + score = next( + (row["weighted_score"] for row in result.get("weighted_scores", []) + if row["template"] == picked), + None, + ) + correct = picked == expected + sku_correct += int(correct) + total_correct += int(correct) + total_count += 1 + + report_note = "" + if not args.skip_flowers: + try: + flower_result = engine.count_flowers(result["request_id"], template=picked) + request_dir = os.path.join(config.UPLOADS_DIR, result["request_id"]) + report = build_report_image( + request_dir, fname, expected, picked, correct, score, + flower_result, flower_result.get("flower_count_comparison"), + ) + stem = os.path.splitext(fname)[0] + report_path = os.path.join(args.report_dir, f"{expected}_{stem}.png") + cv2.imwrite(report_path, report) + report_note = f" [report: {os.path.basename(report_path)}]" + except Exception as e: + report_note = f" [report failed: {e}]" + release_gpu() + + img_elapsed = time.perf_counter() - img_start + status = "OK " if correct else "MISS" + print(f" [{status}] {fname:<40} -> {picked!s:<14} " + f"(score {score}, {img_elapsed:.2f}s){report_note}") + + release_gpu() + + per_sku[expected] = (sku_correct, len(images)) + + elapsed = time.perf_counter() - start + + print("\n" + "=" * 46) + print(f"{'SKU':<20}{'Correct':>10}{'Total':>8}{'Accuracy':>8}") + print("-" * 46) + for sku, (correct, total) in per_sku.items(): + acc = (correct / total * 100) if total else 0.0 + print(f"{sku:<20}{correct:>10}{total:>8}{acc:>7.1f}%") + print("=" * 46) + overall_acc = (total_correct / total_count * 100) if total_count else 0.0 + print(f"Overall: {total_correct}/{total_count} correct ({overall_acc:.1f}%) in {elapsed:.1f}s") + if not args.skip_flowers: + print(f"Report images: {os.path.abspath(args.report_dir)}") + + +if __name__ == "__main__": + main() diff --git a/uploads/2cf537d4aaa4/LoFTR_best.png b/uploads/2cf537d4aaa4/LoFTR_best.png new file mode 100644 index 0000000..fc78e56 Binary files /dev/null and b/uploads/2cf537d4aaa4/LoFTR_best.png differ diff --git a/uploads/2cf537d4aaa4/ORB_best.png b/uploads/2cf537d4aaa4/ORB_best.png new file mode 100644 index 0000000..f26d93f Binary files /dev/null and b/uploads/2cf537d4aaa4/ORB_best.png differ diff --git a/uploads/2cf537d4aaa4/SIFT_best.png b/uploads/2cf537d4aaa4/SIFT_best.png new file mode 100644 index 0000000..4da7c90 Binary files /dev/null and b/uploads/2cf537d4aaa4/SIFT_best.png differ diff --git a/uploads/2cf537d4aaa4/SuperGlue_best.png b/uploads/2cf537d4aaa4/SuperGlue_best.png new file mode 100644 index 0000000..b236042 Binary files /dev/null and b/uploads/2cf537d4aaa4/SuperGlue_best.png differ diff --git a/uploads/2cf537d4aaa4/input_family_grid.png b/uploads/2cf537d4aaa4/input_family_grid.png new file mode 100644 index 0000000..b641922 Binary files /dev/null and b/uploads/2cf537d4aaa4/input_family_grid.png differ diff --git a/uploads/2cf537d4aaa4/input_lbp.png b/uploads/2cf537d4aaa4/input_lbp.png new file mode 100644 index 0000000..b8848ef Binary files /dev/null and b/uploads/2cf537d4aaa4/input_lbp.png differ diff --git a/uploads/2cf537d4aaa4/input_silhouette.png b/uploads/2cf537d4aaa4/input_silhouette.png new file mode 100644 index 0000000..26d6779 Binary files /dev/null and b/uploads/2cf537d4aaa4/input_silhouette.png differ diff --git a/uploads/2cf537d4aaa4/nobg.png b/uploads/2cf537d4aaa4/nobg.png new file mode 100644 index 0000000..155a328 Binary files /dev/null and b/uploads/2cf537d4aaa4/nobg.png differ diff --git a/uploads/2cf537d4aaa4/original.jpg b/uploads/2cf537d4aaa4/original.jpg new file mode 100644 index 0000000..7f8cee8 Binary files /dev/null and b/uploads/2cf537d4aaa4/original.jpg differ diff --git a/uploads/2cf537d4aaa4/shape_overlay.png b/uploads/2cf537d4aaa4/shape_overlay.png new file mode 100644 index 0000000..3361d8c Binary files /dev/null and b/uploads/2cf537d4aaa4/shape_overlay.png differ diff --git a/uploads/2cf537d4aaa4/template_family_grid.png b/uploads/2cf537d4aaa4/template_family_grid.png new file mode 100644 index 0000000..f5dcd9f Binary files /dev/null and b/uploads/2cf537d4aaa4/template_family_grid.png differ diff --git a/uploads/2cf537d4aaa4/template_lbp.png b/uploads/2cf537d4aaa4/template_lbp.png new file mode 100644 index 0000000..aa18517 Binary files /dev/null and b/uploads/2cf537d4aaa4/template_lbp.png differ diff --git a/uploads/2cf537d4aaa4/template_silhouette.png b/uploads/2cf537d4aaa4/template_silhouette.png new file mode 100644 index 0000000..1441fe1 Binary files /dev/null and b/uploads/2cf537d4aaa4/template_silhouette.png differ diff --git a/uploads/328a5fd253cf/LoFTR_best.png b/uploads/328a5fd253cf/LoFTR_best.png new file mode 100644 index 0000000..fc78e56 Binary files /dev/null and b/uploads/328a5fd253cf/LoFTR_best.png differ diff --git a/uploads/328a5fd253cf/ORB_best.png b/uploads/328a5fd253cf/ORB_best.png new file mode 100644 index 0000000..f26d93f Binary files /dev/null and b/uploads/328a5fd253cf/ORB_best.png differ diff --git a/uploads/328a5fd253cf/SIFT_best.png b/uploads/328a5fd253cf/SIFT_best.png new file mode 100644 index 0000000..4da7c90 Binary files /dev/null and b/uploads/328a5fd253cf/SIFT_best.png differ diff --git a/uploads/328a5fd253cf/SuperGlue_best.png b/uploads/328a5fd253cf/SuperGlue_best.png new file mode 100644 index 0000000..b236042 Binary files /dev/null and b/uploads/328a5fd253cf/SuperGlue_best.png differ diff --git a/uploads/328a5fd253cf/input_family_grid.png b/uploads/328a5fd253cf/input_family_grid.png new file mode 100644 index 0000000..7f10730 Binary files /dev/null and b/uploads/328a5fd253cf/input_family_grid.png differ diff --git a/uploads/328a5fd253cf/input_lbp.png b/uploads/328a5fd253cf/input_lbp.png new file mode 100644 index 0000000..b8848ef Binary files /dev/null and b/uploads/328a5fd253cf/input_lbp.png differ diff --git a/uploads/328a5fd253cf/input_silhouette.png b/uploads/328a5fd253cf/input_silhouette.png new file mode 100644 index 0000000..26d6779 Binary files /dev/null and b/uploads/328a5fd253cf/input_silhouette.png differ diff --git a/uploads/328a5fd253cf/nobg.png b/uploads/328a5fd253cf/nobg.png new file mode 100644 index 0000000..155a328 Binary files /dev/null and b/uploads/328a5fd253cf/nobg.png differ diff --git a/uploads/328a5fd253cf/original.jpg b/uploads/328a5fd253cf/original.jpg new file mode 100644 index 0000000..7f8cee8 Binary files /dev/null and b/uploads/328a5fd253cf/original.jpg differ diff --git a/uploads/328a5fd253cf/shape_overlay.png b/uploads/328a5fd253cf/shape_overlay.png new file mode 100644 index 0000000..3361d8c Binary files /dev/null and b/uploads/328a5fd253cf/shape_overlay.png differ diff --git a/uploads/328a5fd253cf/template_family_grid.png b/uploads/328a5fd253cf/template_family_grid.png new file mode 100644 index 0000000..4b07f57 Binary files /dev/null and b/uploads/328a5fd253cf/template_family_grid.png differ diff --git a/uploads/328a5fd253cf/template_lbp.png b/uploads/328a5fd253cf/template_lbp.png new file mode 100644 index 0000000..aa18517 Binary files /dev/null and b/uploads/328a5fd253cf/template_lbp.png differ diff --git a/uploads/328a5fd253cf/template_silhouette.png b/uploads/328a5fd253cf/template_silhouette.png new file mode 100644 index 0000000..1441fe1 Binary files /dev/null and b/uploads/328a5fd253cf/template_silhouette.png differ diff --git a/uploads/a12c1ff544a1/LoFTR_best.png b/uploads/a12c1ff544a1/LoFTR_best.png new file mode 100644 index 0000000..819fde8 Binary files /dev/null and b/uploads/a12c1ff544a1/LoFTR_best.png differ diff --git a/uploads/a12c1ff544a1/ORB_best.png b/uploads/a12c1ff544a1/ORB_best.png new file mode 100644 index 0000000..7d80d35 Binary files /dev/null and b/uploads/a12c1ff544a1/ORB_best.png differ diff --git a/uploads/a12c1ff544a1/SIFT_best.png b/uploads/a12c1ff544a1/SIFT_best.png new file mode 100644 index 0000000..100cce7 Binary files /dev/null and b/uploads/a12c1ff544a1/SIFT_best.png differ diff --git a/uploads/a12c1ff544a1/SuperGlue_best.png b/uploads/a12c1ff544a1/SuperGlue_best.png new file mode 100644 index 0000000..f6a2904 Binary files /dev/null and b/uploads/a12c1ff544a1/SuperGlue_best.png differ diff --git a/uploads/a12c1ff544a1/flower_count_sam.png b/uploads/a12c1ff544a1/flower_count_sam.png new file mode 100644 index 0000000..efdddcf Binary files /dev/null and b/uploads/a12c1ff544a1/flower_count_sam.png differ diff --git a/uploads/a12c1ff544a1/flower_count_sam_template.png b/uploads/a12c1ff544a1/flower_count_sam_template.png new file mode 100644 index 0000000..2eecefc Binary files /dev/null and b/uploads/a12c1ff544a1/flower_count_sam_template.png differ diff --git a/uploads/a12c1ff544a1/flower_count_yolo.png b/uploads/a12c1ff544a1/flower_count_yolo.png new file mode 100644 index 0000000..ef96177 Binary files /dev/null and b/uploads/a12c1ff544a1/flower_count_yolo.png differ diff --git a/uploads/a12c1ff544a1/input_family_grid.png b/uploads/a12c1ff544a1/input_family_grid.png new file mode 100644 index 0000000..4a4e34d Binary files /dev/null and b/uploads/a12c1ff544a1/input_family_grid.png differ diff --git a/uploads/a12c1ff544a1/input_lbp.png b/uploads/a12c1ff544a1/input_lbp.png new file mode 100644 index 0000000..75a600c Binary files /dev/null and b/uploads/a12c1ff544a1/input_lbp.png differ diff --git a/uploads/a12c1ff544a1/input_silhouette.png b/uploads/a12c1ff544a1/input_silhouette.png new file mode 100644 index 0000000..5de51d4 Binary files /dev/null and b/uploads/a12c1ff544a1/input_silhouette.png differ diff --git a/uploads/a12c1ff544a1/nobg.png b/uploads/a12c1ff544a1/nobg.png new file mode 100644 index 0000000..04dbfe7 Binary files /dev/null and b/uploads/a12c1ff544a1/nobg.png differ diff --git a/uploads/a12c1ff544a1/original.jpeg b/uploads/a12c1ff544a1/original.jpeg new file mode 100644 index 0000000..988a9ea Binary files /dev/null and b/uploads/a12c1ff544a1/original.jpeg differ diff --git a/uploads/a12c1ff544a1/shape_overlay.png b/uploads/a12c1ff544a1/shape_overlay.png new file mode 100644 index 0000000..b8a5e92 Binary files /dev/null and b/uploads/a12c1ff544a1/shape_overlay.png differ diff --git a/uploads/a12c1ff544a1/template_family_grid.png b/uploads/a12c1ff544a1/template_family_grid.png new file mode 100644 index 0000000..8391ad6 Binary files /dev/null and b/uploads/a12c1ff544a1/template_family_grid.png differ diff --git a/uploads/a12c1ff544a1/template_lbp.png b/uploads/a12c1ff544a1/template_lbp.png new file mode 100644 index 0000000..e8b98a9 Binary files /dev/null and b/uploads/a12c1ff544a1/template_lbp.png differ diff --git a/uploads/a12c1ff544a1/template_silhouette.png b/uploads/a12c1ff544a1/template_silhouette.png new file mode 100644 index 0000000..dfdb625 Binary files /dev/null and b/uploads/a12c1ff544a1/template_silhouette.png differ diff --git a/uploads/a12c1ff544a1/vase_crop_input.png b/uploads/a12c1ff544a1/vase_crop_input.png new file mode 100644 index 0000000..7c9da25 Binary files /dev/null and b/uploads/a12c1ff544a1/vase_crop_input.png differ diff --git a/uploads/a12c1ff544a1/vase_crop_template.png b/uploads/a12c1ff544a1/vase_crop_template.png new file mode 100644 index 0000000..b5d4abf Binary files /dev/null and b/uploads/a12c1ff544a1/vase_crop_template.png differ diff --git a/uploads/ccacbc49c4c2/LoFTR_best.png b/uploads/ccacbc49c4c2/LoFTR_best.png new file mode 100644 index 0000000..fc78e56 Binary files /dev/null and b/uploads/ccacbc49c4c2/LoFTR_best.png differ diff --git a/uploads/ccacbc49c4c2/ORB_best.png b/uploads/ccacbc49c4c2/ORB_best.png new file mode 100644 index 0000000..7d80d35 Binary files /dev/null and b/uploads/ccacbc49c4c2/ORB_best.png differ diff --git a/uploads/ccacbc49c4c2/SIFT_best.png b/uploads/ccacbc49c4c2/SIFT_best.png new file mode 100644 index 0000000..100cce7 Binary files /dev/null and b/uploads/ccacbc49c4c2/SIFT_best.png differ diff --git a/uploads/ccacbc49c4c2/SuperGlue_best.png b/uploads/ccacbc49c4c2/SuperGlue_best.png new file mode 100644 index 0000000..b236042 Binary files /dev/null and b/uploads/ccacbc49c4c2/SuperGlue_best.png differ diff --git a/uploads/ccacbc49c4c2/input_family_grid.png b/uploads/ccacbc49c4c2/input_family_grid.png new file mode 100644 index 0000000..d7a155d Binary files /dev/null and b/uploads/ccacbc49c4c2/input_family_grid.png differ diff --git a/uploads/ccacbc49c4c2/input_lbp.png b/uploads/ccacbc49c4c2/input_lbp.png new file mode 100644 index 0000000..b8848ef Binary files /dev/null and b/uploads/ccacbc49c4c2/input_lbp.png differ diff --git a/uploads/ccacbc49c4c2/input_silhouette.png b/uploads/ccacbc49c4c2/input_silhouette.png new file mode 100644 index 0000000..26d6779 Binary files /dev/null and b/uploads/ccacbc49c4c2/input_silhouette.png differ diff --git a/uploads/ccacbc49c4c2/nobg.png b/uploads/ccacbc49c4c2/nobg.png new file mode 100644 index 0000000..155a328 Binary files /dev/null and b/uploads/ccacbc49c4c2/nobg.png differ diff --git a/uploads/ccacbc49c4c2/original.jpg b/uploads/ccacbc49c4c2/original.jpg new file mode 100644 index 0000000..7f8cee8 Binary files /dev/null and b/uploads/ccacbc49c4c2/original.jpg differ diff --git a/uploads/ccacbc49c4c2/shape_overlay.png b/uploads/ccacbc49c4c2/shape_overlay.png new file mode 100644 index 0000000..e6a8f5f Binary files /dev/null and b/uploads/ccacbc49c4c2/shape_overlay.png differ diff --git a/uploads/ccacbc49c4c2/template_family_grid.png b/uploads/ccacbc49c4c2/template_family_grid.png new file mode 100644 index 0000000..cd98592 Binary files /dev/null and b/uploads/ccacbc49c4c2/template_family_grid.png differ diff --git a/uploads/ccacbc49c4c2/template_lbp.png b/uploads/ccacbc49c4c2/template_lbp.png new file mode 100644 index 0000000..d4328cb Binary files /dev/null and b/uploads/ccacbc49c4c2/template_lbp.png differ diff --git a/uploads/ccacbc49c4c2/template_silhouette.png b/uploads/ccacbc49c4c2/template_silhouette.png new file mode 100644 index 0000000..97daee7 Binary files /dev/null and b/uploads/ccacbc49c4c2/template_silhouette.png differ