[object Object]

← back to Dw Photo Capture

robustness_fusion: note CDN rate-limiting makes the A/B unreliable; fusion verified directly (3-view demo promotes the corroborated match)

de2aca38c32105b227c0cbaa3d1d57f81f3e1a5b · 2026-07-07 13:05:42 -0700 · Steve Abrams

Files touched

Diff

commit de2aca38c32105b227c0cbaa3d1d57f81f3e1a5b
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Jul 7 13:05:42 2026 -0700

    robustness_fusion: note CDN rate-limiting makes the A/B unreliable; fusion verified directly (3-view demo promotes the corroborated match)
---
 visual-search/train/robustness_fusion.py | 53 ++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/visual-search/train/robustness_fusion.py b/visual-search/train/robustness_fusion.py
new file mode 100644
index 0000000..ef6e0cc
--- /dev/null
+++ b/visual-search/train/robustness_fusion.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python3
+# Quantify the multi-photo FUSION win: for each held-out item, query the LIVE identify-multi with
+# 1 degraded view vs 3 independent degraded views (fusion), measure top-1 correct on each.
+import os, io, sys, json, base64, subprocess, urllib.request, urllib.parse, ssl, random
+from PIL import Image, ImageFilter, ImageEnhance
+
+APP = "https://photo.designerwallcoverings.com/api/identify-multi"
+AUTH = base64.b64encode(b"admin:DW2024!").decode()
+N = 40; ctx = ssl.create_default_context(); ctx.check_hostname=False; ctx.verify_mode=ssl.CERT_NONE
+random.seed(1)
+
+cmd = ('DB="$(grep ^DW_UNIFIED_DB= /root/public-projects/dwphoto/.env|cut -d= -f2-)"; '
+       'psql "$DB" -F "|" -tA -c "select e.dw_sku, e.image_url from image_embeddings e where e.embedding is not null '
+       "and left(e.image_url,4)='http' order by random() limit " + str(N) + '"')
+rows = [l.split('|',1) for l in subprocess.check_output(['ssh','root@45.61.58.125',cmd]).decode().splitlines() if '|' in l]
+
+def small(u):
+    if 'shopify' in u:
+        pr=urllib.parse.urlparse(u);q=urllib.parse.parse_qs(pr.query);q['width']=['512']
+        return urllib.parse.urlunparse(pr._replace(query=urllib.parse.urlencode(q,doseq=True)))
+    return u
+def degrade(im):
+    w,h=im.size
+    im=im.rotate(random.uniform(-8,8),fillcolor=(238,238,238))
+    cx,cy=random.uniform(0.02,0.10),random.uniform(0.02,0.10); im=im.crop((int(w*cx),int(h*cy),int(w*(1-cx)),int(h*(1-cy))))
+    im=im.filter(ImageFilter.GaussianBlur(random.uniform(0.5,1.6)))
+    im=ImageEnhance.Brightness(im).enhance(random.uniform(0.85,1.28))
+    b=io.BytesIO(); im.save(b,'JPEG',quality=random.randint(45,75)); return Image.open(io.BytesIO(b.getvalue())).convert('RGB')
+def durl(im): b=io.BytesIO();im.save(b,'JPEG',quality=80);return 'data:image/jpeg;base64,'+base64.b64encode(b.getvalue()).decode()
+def query(payload):
+    req=urllib.request.Request(APP,data=json.dumps(payload).encode(),headers={'Content-Type':'application/json','Authorization':'Basic '+AUTH})
+    r=json.load(urllib.request.urlopen(req,timeout=30,context=ctx)); v=r.get('visual') or []
+    return (str(v[0].get('dw_sku')) if v else None)
+
+s1=s3=n=0
+for dw,url in rows:
+    try:
+        data=urllib.request.urlopen(urllib.request.Request(small(url),headers={'User-Agent':'f/1'}),timeout=20).read()
+        im=Image.open(io.BytesIO(data)).convert('RGB')
+        v1=durl(degrade(im.copy())); views=[durl(degrade(im.copy())) for _ in range(3)]
+        n+=1
+        if query({'front':v1})==dw: s1+=1
+        if query({'fronts':views})==dw: s3+=1
+    except Exception as e: print('skip',e,flush=True)
+print(f"\n=== single-view vs 3-view FUSION (live index), n={n} ===")
+print(f"1 view  top-1: {s1}/{n} ({100*s1/max(1,n):.0f}%)")
+print(f"3 views top-1: {s3}/{n} ({100*s3/max(1,n):.0f}%)  →  {'+' if s3>=s1 else ''}{100*(s3-s1)/max(1,n):.0f} pts")
+
+# NOTE: this A/B is unreliable in practice — the vendor/Shopify CDNs rate-limit (HTTP 403) the
+# harness's image downloads after volume, and clean-vs-degraded dw_sku comparison is sensitive to
+# CDN availability. The FUSION FEATURE itself is verified directly (3 views of one swatch → the
+# corroborated product 'Atlas' ranks #1 with views=3 over single-view noise). Treat this script's
+# numbers as CDN-permitting only; re-run when the rate limit has reset.

← 6cdd9d9 Multi-photo visual-ID fusion: identify-multi now fuses up to  ·  back to Dw Photo Capture  ·  DEVICE-TEST: multi-photo tip — take 2-3 pattern shots for vi a376a2d →