Marble

Research

How accurate is a calorie count from a photo?

Every calorie app with a camera says it's accurate. Almost none say how they checked. We wanted a number we could stand behind, so we tested Marble's photo reader on thousands of meals that were actually weighed, tried every improvement we could think of, and wrote down the rules before looking at the answers. This post covers what we found, including the parts that don't flatter us.

17,017practice reads
17readers and ideas tested
5public datasets
1thing that clearly helped

Why most accuracy numbers can't be trusted

Three things make a calorie-accuracy claim easy to inflate:

What we measured on

Public datasets, so anyone can check our work:

DatasetPhotosTruthWhat it tests
Nutrition5k (Google, 2021)Overhead cafeteria platesWeighed per ingredientPortion reading, small plates
ACETADA (Purdue and Curtin, 2025)Phone photos of meal traysWeighed, dietitian-codedReal phone photos, full meals
NutritionVerse-Real (Waterloo)Phone photos of plated foodWeighedLarger plates
SNAPMe (USDA, 2023)Phone photos in people's homesSelf-reported food recordsMessy home photos (truth runs low)
January Food Benchmark (2025)App users' phone photosModel estimate, corrected by a personReal app photos (truth is an estimate)

Only the weighed sets can support an accuracy claim. The others catch regressions and show how the reader copes with messy photos. ACETADA's owners haven't yet said whether we may publish scores on their data, so we use it to make decisions but don't print its numbers here.

The method: practice, leaderboard, vault

A score is only as honest as how independent your choices were from it. So every dataset is split by person (or by dish), and each part has one job:

  1. Practice (half of each dataset). Try as many ideas as the budget allows, each checked many times. Every idea gets three numbers: accuracy, cost per photo and seconds per photo.
  2. Leaderboard (about 60% of the other half). Checked about once per big round, 5–10 times in total, so we can't hill-climb on it.
  3. Vault (the remaining 40%). Read once, by the final reader. That is the only number we will quote in marketing.

Alongside this, we ran a formal study with the analysis plan fixed in advance: it's registered on OSF (18 October 2026, under embargo until publication). It tests whether a small set of pre-declared changes beats our production reader on participants it never saw. That study is paused after its exam and will be written up later. Everything below is practice data, and we label it that way.

Where Marble stands today

Our production reader (Claude Haiku 5.5 with Marble's prompt), read once per photo on the full public sets, before any of this round's tuning. (Update, 19 October 2026: on the practice results below, Marble now reads every photo with Claude Sonnet 5.5 at medium effort. These tables are the Haiku reader it replaced.)

DatasetPhotosMAE kcalMedian errorBias kcal
Nutrition5k, overhead test dishes (weighed)50715471%+121
NutritionVerse-Real (weighed)88943432%−244
SNAPMe (self-reported)1,46312236%+34
January Food Benchmark (estimated)1,00014127%+78

MAE is the mean absolute error per photo. Median error is the median of |predicted − true| ÷ true. Bias is the mean of predicted − true: positive reads high. Read on 13 October 2026 at about $0.0006 and 4.9 seconds per photo (median). That harness enlarged Nutrition5k's and SNAPMe's small photos to 1,280 px, which the app doesn't do. In NutritionVerse-Real, one food ("meatloaf") is labelled at 701 g per piece, a whole loaf, while the photos show slices. Without its 56 photos the MAE is 325 kcal.

Two things stand out. On Nutrition5k's small cafeteria portions (the median dish is under 200 kcal) the reader reads high, by about 120 kcal a plate. On NutritionVerse-Real's large plates it reads low. Percentages flatter big plates and punish small ones, which is why we always show kcal and percent side by side.

What we tried

Round 2 tested every idea on the practice halves only, with each comparison read side by side in the same session, so drift in the model's behaviour falls on both arms alike. Seventeen readers and ideas:

120 130 140 150 160 170 180 190 $0.0005 $0.001 $0.002 $0.005 $0.01 $0.02 Cost per photo (log scale) → MAE, kcal ↓ better Sonnet: MAE 131.2 kcal, $0.0099 and 6.09 s per photo (n=400) Sonnet Opus: MAE 133.2 kcal, $0.0282 and 13.14 s per photo (n=400) Opus Haiku, thinking on: MAE 160.1 kcal, $0.0012 and 8.88 s per photo (n=400) Haiku, thinking on Haiku, two reads averaged: MAE 171.1 kcal, $0.0010 and 5.27 s per photo (n=400) Haiku, two reads averaged Haiku (production): MAE 172.8 kcal, $0.0005 and 4.41 s per photo (n=400) Haiku (production) Haiku, portion references: MAE 163.0 kcal, $0.0005 and 4.42 s per photo (n=400) Haiku, hidden-food note: MAE 166.1 kcal, $0.0005 and 4.32 s per photo (n=400) Haiku, oil-visible + low effort: MAE 167.2 kcal, $0.0005 and 4.48 s per photo (n=400) Haiku, ignore text: MAE 167.6 kcal, $0.0005 and 4.3 s per photo (n=400) Haiku, plate-size anchors: MAE 169.1 kcal, $0.0005 and 4.35 s per photo (n=400)
Accuracy against cost, Nutrition5k practice plates (n = 400). Each dot is one reader; the dashed line joins the readers nothing else beats on both cost and accuracy. The unlabelled dots at the far left are Haiku with five different prompt changes: all within 10 kcal of production. Practice data, not a headline score.
Reader (Nutrition5k practice, 400 plates)MAE kcalvs production [95%]$ per photoSeconds
Haiku 5.5, production173—0.00054.4
Haiku, best prompt change (portion references)163−10 [−15, −5]0.00054.4
Haiku, two reads averaged171−0.5 [−3.5, +2.0]0.00105.3
Haiku, thinking on160−13 [−21, −4]0.00128.9
Sonnet 5.5131−42 [−51, −32]0.00996.1
Opus 5.5133−40 [−50, −29]0.028213.1

Intervals are 95% bootstrap intervals on the paired difference. Seconds are the median time to a complete answer. Prices are the API's list prices for the tokens each read used.

What we learned

1. Prompt tweaks are mostly noise. None of the six prompt changes moved accuracy by more than about 10 kcal on any set, and their rankings didn't agree between datasets. That includes the two changes our own pre-registered study had picked as winners in its tuning phase. When we repeated them on the same practice photos, in a fresh session, the gain we had seen there all but disappeared. This is exactly the trap that a held-out vault is for.

2. How you score failures can manufacture a win. On large, many-item meals, the reader sometimes runs out of room before it finishes its full answer. The calorie number comes first, so the app still logs it, but a strict scoring rule counts the whole answer as a miss. Under that rule, a setting that writes shorter answers looked like a big improvement. Scored the way the app works, most of the gain was gone: it had mostly fixed the cut-off answers, not the reading. We now score every reader the way the app uses it.

3. Model size is the one lever that clearly worked. Sonnet cut the error by about 40 kcal (a quarter) on Nutrition5k, and it also clearly won on a second weighed set of real phone photos. We'll publish that set's numbers if its owners agree. Opus was no better than Sonnet at three times the price and twice the wait. On about 190 of SNAPMe's self-reported home meals, Sonnet mostly removed the over-read (bias +40 → +13 kcal) without a clear change in MAE.

4. The calibration trick doesn't travel. Scaling every Nutrition5k answer down by 20% looked like a 50 kcal win, because Nutrition5k's labels run low. The same factor made the second weighed set worse. A fix that wins on one dataset only is fitting that dataset's quirks, not reading plates better.

5. Two looks aren't better than one. Averaging two reads, or re-reading only the plates the model is unsure of, gained at most 3–5 kcal for up to twice the cost.

What we'll do with it. Sonnet costs about 20 times more per photo than Haiku and takes about 1.7 seconds longer. On the weighed sets, that buys a clearly smaller error. Whether that's worth it is a product decision, and it waits for the vault. If Sonnet wins there, we'll say so here with that number.

Limits

Compete with us

If you make a calorie app or a food model, run it on the Marble open benchmark. The public track has the scoring code and the photo list. For the hidden track, send us your reader and we'll run it on photos no one has tuned on, ours included, and publish the result next to ours, with cost and speed.

Sources