`catalog_hash` hashed the CSV and the view *names*, so replacing `sku_l09.jpg` with a different product's packshot left the hash unchanged and a report could claim the same catalog while every l09 decision in it had moved. It hashes each view's bytes now. `identity_lanes` carried its own `normalize_text` and `bigrams`, near-copies of the ones in `rebuild_catalog` that had already drifted (the lane's table folded ユ to itself, the catalog's did not). The lane imports the catalog's now, so one read scores the same either way. `evidence/image6_v2.json` was byte-identical to `eval/labels/image6.json`; the evidence scripts and the decision document point at the canonical file and the copy is gone. `score_crop`'s docstring now states the contract its callers already depend on: the dict's insertion order is the lane's ranking, and re-sorting by value names a different SKU than the lane chose. Tests: the lane is shared by the classify pool, so a concurrent-ranking test pins that one BFMatcher does not cross crops under eight threads.
22 lines
1.3 KiB
Python
22 lines
1.3 KiB
Python
"""Build the leave-facing-out catalogs: cat_pack (packshots only) and cat_full
|
|
(packshots + the widest facing of each in-catalog SKU as a shelf view), and
|
|
image6_v2_lfo.json with those reference facings excluded from scoring.
|
|
Same-photo references make this an optimistic proxy, not a held-out result."""
|
|
import json, cv2, os, shutil, collections
|
|
E = os.path.dirname(os.path.abspath(__file__))
|
|
L = json.load(open(f'{E}/../../../../eval/labels/image6.json')); im = cv2.imread('add/image6.jpg')
|
|
by = collections.defaultdict(list)
|
|
for f in L['facings']:
|
|
if f['label'] not in ('unknown', 'exclude'): by[f['label']].append(f)
|
|
refs = {k: max(fs, key=lambda f: f['box'][2] - f['box'][0])['index'] for k, fs in by.items() if len(fs) >= 2}
|
|
for cat in ('cat_pack', 'cat_full'):
|
|
d = f'{E}/{cat}'; shutil.rmtree(d, ignore_errors=True); os.makedirs(d)
|
|
for p in os.listdir('stock-lopia-clean'):
|
|
if p.endswith('.jpg'): shutil.copy(f'stock-lopia-clean/{p}', d)
|
|
if cat == 'cat_full':
|
|
for k, i in refs.items():
|
|
x1, y1, x2, y2 = L['facings'][i]['box']; cv2.imwrite(f'{d}/{k}_shelf.jpg', im[y1:y2, x1:x2])
|
|
for f in L['facings']:
|
|
if f['index'] in refs.values(): f['label'] = 'exclude'
|
|
json.dump(L, open(f'{E}/image6_v2_lfo.json', 'w'), ensure_ascii=False)
|
|
print('shelf references', refs)
|