product-recognition-demo/recognization/stock-lopia-clean
kiyo9w 601d72296c fix(catalog): correct sku_l10 to 400g and enroll its packshot
Ajinomoto ピュアセレクト マヨネーズ has no 450g size: the official lineup is
250g/400g/600g/1kg, the shelf tag in add/image6.jpg reads 400g, and DECISION.md
already recorded the mismatch. Both CSVs carried 450g, so every l10 answer
shipped a wrong size.

The packshot is the exact 400g front (JAN 4901001114030, 1000x1000) with its
source URL and the 450g rejection recorded in
data/packshots/research/sku_l10/manifest.json.

Enrolling it moves the catalog ceiling from 69% to 87% of in-catalog facings
answerable by image (l10 was 11 unenrolled facings). Measured on the corrected
image6 labels: local lane 92% identity at 84% precision full, 85% at 91% live.

Also points external-eval defaults at the repository-local data path; the
licensed Wikimedia corpus remains uncommitted pending manifest review.
2026-09-29 02:45:21 +09:00
..
references/rejected feat(identity): local-feature matcher plus text lane as the default backend 2026-09-28 22:27:21 +09:00
README.md docs: match the false-accept record to the evaluator's own columns 2026-09-28 22:36:27 +09:00
sku_l01.jpg feat(identity): local-feature matcher plus text lane as the default backend 2026-09-28 22:27:21 +09:00
sku_l02.jpg feat(identity): local-feature matcher plus text lane as the default backend 2026-09-28 22:27:21 +09:00
sku_l03.jpg feat(identity): local-feature matcher plus text lane as the default backend 2026-09-28 22:27:21 +09:00
sku_l05.jpg feat(identity): local-feature matcher plus text lane as the default backend 2026-09-28 22:27:21 +09:00
sku_l06.jpg feat(identity): local-feature matcher plus text lane as the default backend 2026-09-28 22:27:21 +09:00
sku_l09.jpg Enroll from a repo data dir; read packshots in every orientation 2026-09-29 02:33:47 +09:00
sku_l11.jpg feat(identity): local-feature matcher plus text lane as the default backend 2026-09-28 22:27:21 +09:00
stock.csv fix(catalog): correct sku_l10 to 400g and enroll its packshot 2026-09-29 02:45:21 +09:00

LOPIA clean catalog

Official manufacturer pack shots, one front view per SKU. This replaces the views in ../stock-lopia/, which were 71-119 px crops cut from the test shelf add/image6.jpg itself: one 18 px sliver, duplicate crops, a wrong product on sku_l09, and five SKUs with no view at all. Enrolling from the test shelf is why every dark package collapsed onto one SKU and why the identity head was trained on its own exam.

Rebuild or extend with:

python code/rebuild_catalog.py --source stock-lopia-clean --output stock-lopia-clean \
    --replace --min-views 1 --csv stock-lopia/stock.csv

--min-views 1 because official pages publish a single front view per JAN. The default floor of 2 exists to catch accidental single-view enrollment from shelf crops, where several views are available.

Provenance

SKU Product Source Image
sku_l01 キユーピー エッグケア 305g kewpie.co.jp 4901577090301L.jpg
sku_l02 キユーピー 血圧ケア アマニ油マヨネーズ 200g kewpie.co.jp 4901577060052L.jpg
sku_l03 キユーピー からしマヨネーズ 200g kewpie.co.jp 4901577338779L.jpg
sku_l05 キユーピー ゼロ ノンコレステロール 310g kewpie.co.jp 4901577092381L.jpg
sku_l06 キユーピー 内臓脂肪ケア フィッテ 210g kewpie.co.jp (discontinued 2026秋) 4901577083600L.jpg
sku_l09 ピュアセレクト コクうま カロリーカット65% 360g ajinomoto.co.jp A140600321
sku_l11 キユーピー ハーフ 400g kewpie.co.jp 4901577031083L.jpg

Kewpie images follow https://img.kewpie.co.jp/products_src/g3/imgs/<JAN13>L.jpg; Ajinomoto images follow https://www.ajinomoto.co.jp/products/Image.aspx?PicType=0&PIMNO=<PIMNO>.

Known gaps

Five SKUs in ../stock-lopia/stock.csv have no official pack shot here, so no image lane can match them. They stay in stock.csv as text-only rows: the text lane builds a signature from the printed name, which is how it can name or veto a near-unknown the matcher cannot see. They are the current image-coverage ceiling, not a recognition failure:

SKU Catalog name Why it is missing
sku_l04 やまや めんたいマヨネーズタイプ 200g Yamaya's current lineup has no 200 g mentaiko mayo
sku_l07 丸和油脂 ラッキーマヨネーズ 200g Maruwa's current catalog has no 200 g Lucky Mayonnaise
sku_l08 スパイシーストーム ペリペリミックス 30g No official 30 g Peri-Peri Mix found
sku_l10 ピュアセレクト マヨネーズ 450g Ajinomoto's current lineup is 400/250/600 g/1 kg; no 450 g
sku_l12 焼肉のたれ 中辛 Brand not recorded in the catalog; ambiguous

The catalog names for these five disagree with the manufacturers' current lineups, so the shelf tags and the CSV need reconciling before enrollment.

Keep the text-only rows when rebuilding: the CSV carry-over must preserve every source row, not just the SKUs with a kept view. Dropping these five costs the text lane the signatures that cover them.

sku_l09.jpg is enrolled but only 305 px tall, below the 800 px source floor the enrollment protocol wants (§8 of the architecture decision). Its matcher scores dwarf the other references (85-129 inliers against 10-40), so it wins facings it should not; re-source it before trusting l09 precision. Measured on the corrected image6 labels, l09 is the largest single-SKU share of accepts at both resolutions: 18 of 48 accepts (37.5%) at full, 11 of 38 (28.9%) at live, against a true share of 13 of 61 facings (21.3%). That is a hubness ratio of 1.76 and 1.36 against the completion gate's limit of 2.0, so G7 passes; the stricter internal 30% share heuristic is what raises the alarm at full resolution. Re-sourcing the reference is the fix, not a threshold change.

Rejected

references/rejected/kewpie-mayonnaise-450g.jpg is Kewpie Mayonnaise 450g (JAN 4901577042072). It was briefly filed as sku_l09 and then as sku_l10 because the catalog's names pointed there, but it is neither product: l09 is Ajinomoto Pure Select コクうま カロリーカット 65% 360g and l10 is Pure Select マヨネーズ 450g. It is kept as provenance for that mix-up and is never enrolled.