| --- |
| license: mit |
| tags: [food, nutrition, multi-label, conformal-prediction, reconciliation, nutrition5k] |
| --- |
| # NutriIngredientNet v3 |
|
|
| Itemised, energy-consistent nutrition from one overhead RGB photo (Nutrition5k, official RGB split). |
| v3 adds a **direct totals head** and **reconciles** the itemised breakdown to it, buying top-down |
| accuracy without giving up the audit trail. Scaling all grams by one factor preserves the Atwater |
| identity exactly (verified numerically in §12). |
|
|
| ## Test results (official RGB split, calibrated T=1.02, thr=0.68, TTA=True) |
| - Detection: P 0.61 / R 0.62 / F1 0.62 (freq-prior F1 0.22) |
| - Grams MAE: 18.7 g (oracle-presence mean-gram baseline 23.5 g) |
| - Per-ingredient kcal MAE (reconciled, TPs): 25.8 kcal |
| - Dish kcal MAE by estimator (vs T2 real vocab-covered): |
| hard 118.3 |
| soft 77.1 |
| direct 84.5 |
| recon 83.8 |
| - Best estimator: **soft** | T3 (paper-comparable) 76.5 kcal |
| - reference: Nutrition5k RGB-only 2D-direct baseline = 70.6 kcal (26.1%) |
| - previous version (v2, bottom-up only) = 117.8 kcal (46.6%) |
| - OOV ceiling: 7.7 kcal | cost of exact energy consistency: +0.0 kcal |
| - Conformal set (lambda=0.25): target recall >= 90%, empirical 0.848, |
| avg set size 11.6 |
| - Gram intervals: +/- 0.81 x mean_gram, empirical coverage 0.876 |
| |
| ## Honest limitations |
| - **Fixed camera geometry.** Nutrition5k's camera height never changes, which is the only reason |
| apparent size maps to grams. On an uncalibrated phone photo, scale is unrecoverable from a single |
| view — this model is NOT validated for in-the-wild phone photos. |
| - Nutrition = grams x a fixed per-gram table; the network does detection + portion only. That is |
| what buys exact energy consistency and auditability. |
| - 164-ingredient vocabulary; out-of-vocab food is invisible (8 kcal ceiling). |
| - Conformal guarantees assume val/test exchangeability, which the official split does not perfectly |
| satisfy; empirical numbers above. |
| - Depth-as-privileged-information head: enabled (deleted at inference). |
|
|