Can a Photograph Count Food-Bank Stock? An Exhaustive ML Lab Notebook

A complete lab notebook: food-bank discovery, counting research, labelled internet photos, VLM guesses, a 314-configuration search, held-out results, and reproducible evidence.

Can a phone photograph become a useful food-bank stock update? We built an image-only benchmark, asked vision-language models to count, expanded the reference corpus to 493 externally annotated food images, and searched 314 configurations. The experiments produced a working research pipeline and a much narrower product claim than the original idea.

On 24 held-out grocery proxy images, the validation-selected automatic method averaged 16.74 items of count error. FamNet, given three example boxes in each test image, averaged 10.19. On the original food-bank photographs, the larger language model got 17 of 30 package counts exactly right; always guessing one got 20.

These results support further work on reviewed photo suggestions. They do not establish reliable automatic inventory updates, and they do not show that modern counting research has reached its limit.

This is an AI-assisted lab notebook for the work completed on September 6, 2026. It documents the motivation, research context, source images, annotation choices, inference code, unsuccessful attempts, search space, frozen selection, held-out results, and proposed food-bank workflow. The appendices include every original count label, the full image/category evidence, all 24 held-out cases, and all 314 validation configurations. Reported results are measurements from saved predictions; proposed product behavior and future experiments are identified as proposals.

1. The question started with a trip, not a camera

The food-bank application came from a discovery interview with Zongze Wu about Seattle Digital Commons. The relevant need in our working notes was knowing whether useful food categories would be available before making a trip. Uncertainty about availability can make a visit difficult to fit around an existing schedule. A useful system would communicate what was recently verified, with little additional work for staff and a budget compatible with a small nonprofit.

That is a product hypothesis informed by a discovery conversation. It is not a finding from interviews with a representative group of food-bank staff. We had not validated the receiving, sorting, storage, or distribution workflow with operators. This article paraphrases the application context; it does not reproduce the private interview or turn personal background into benchmark evidence.

The initial technical idea was appealing: a volunteer photographs donations or a shelf, a model recognizes and counts the food, and a stock view updates. Each step hides a different question. Is the photo of a new delivery, an existing shelf, a recipient's haul, or food that has already left? Does a visible package represent one distributable unit or multiple contents? Is the food ready to distribute? How long will the observation remain useful? Does a second image show a new item or the same one from another angle?

Need from the application Candidate behavior What this study measured
Know useful categories before travel Show recently verified category availability Image/category presence on a small proxy sample
Reduce staff data entry Suggest categories and counts for review Raw count and presence predictions
Use ordinary phones Accept ordinary photographs Internet photographs and captured image crops
Avoid misleading stock information Keep uncertainty, provenance, and verification time Annotation uncertainty and model output coverage
Keep operation affordable Measure correction time and compute cost A CPU implementation and a partial cloud usage estimate
Avoid duplicate donations Associate observations with a receiving session Source grouping in the benchmark; no operational ledger

The value proposition is therefore broader than count accuracy. A model could count visible objects correctly and still create a false stock update by assigning the wrong event type. Conversely, a coarse but recently verified category status could help someone plan a visit without claiming an exact quantity. Both possibilities require field evidence that this experiment does not supply.

2. What the original paper actually contributes

The starting paper was Hoser and Żebrowska-Suchodolska's 2023 article, An algorithm for estimating the number of objects in a selected area of space based on ordinary photos. It addresses overlap in a two-dimensional projection of objects occupying three-dimensional space. Its statistical estimator supplements image analysis to estimate obscured objects. The illustrated application is bird counting, with assumptions including similar apparent object sizes and an estimate of average object area. Paper and DOI, author-uploaded text.

The connection to food banks is conceptual: occlusion can make visible detections an incomplete account of a scene. Applying that observation to mixed groceries requires new assumptions. Cartons, bags, cans, produce, and trays have different sizes; shelves have depth; closed packages hide contents; products can be stacked systematically. A correction based on one average object area cannot simply be transferred across those conditions. We did not implement or reproduce the paper's estimator in this study.

For an inventory application, estimating a hidden quantity is also a different output from reporting a visible count. The benchmark deliberately asks for visible units. If a later system estimates hidden stock, it should report the estimate separately, identify its assumptions, and be tested against physical inventory.

3. The research frontier, and why “SOTA” needs a protocol

The relevant field includes text-conditioned counting, counting with visual examples, instance localization, density estimation, segmentation, and multimodal language models. The strongest published result depends on the dataset, whether examples are supplied, whether counting-specific training is allowed, and whether the model must reject the wrong category. A single leaderboard number does not answer whether a mixed food-bank table can safely update a ledger.

The following is a dated reading map, checked on September 6, 2026. It separates papers considered from implementations executed here.

Work Relevant contribution Status in this project
CountGD++, CVPR 2026 More flexible prompts, including exclusions, automatically obtained pseudo-exemplars, external examples, and a counting expert used by an LLM Research candidate; not run
Count Anything, May 2026 Text-guided instance points with sparse and dense counters; introduces the cross-domain CLOC dataset Research candidate; not run
AdaCount, July 2026 Training-free adaptation of SAM3 using target similarity to guide spatial and feature adaptation Research candidate; not run
MixCount, May 2026 A synthetic mixed-object counting dataset and training approach targeting failures in mixed scenes Added to the follow-up reading list while documenting; not used as evaluation data
FSC147 / FamNet, CVPR 2021 Published point annotations and exemplar-assisted density counting Data and assisted baseline used
OWL-v2 and Grounding DINO General open-vocabulary object detection Executed with the implementation settings below
Qwen3-VL 2B, SmolVLM 500M, and hosted Qwen 3.8 27B Image-conditioned language generation Executed, with different coverage and tasks

Count Anything's May 2026 paper describes CLOC as approximately 220,000 images, 619 categories, and 15 million instances across six visual domains. Its discrete point output is relevant because it gives a reviewer spatial evidence to inspect alongside the count. These are the authors' dataset and method descriptions, not measurements reproduced here. Count Anything.

An instructive comparison is AdaCount's own reported performance: FSC-147 MAE 18.97, CARPK MAE 1.99, and OmniCount Fruits MAE 0.37. Those radically different errors come from different benchmarks. They must not be compared with our 24-image food subset as if every row measured the same task. AdaCount also depends on its initial SAM3 detections providing useful examples. AdaCount, Tables 1–2 and limitations.

There is also a naming trap: the “Count Anything” entry dated 2023 in AdaCount's comparison table refers to an older SAM study, not Lei and colleagues' May 2026 paper. A title match alone is insufficient to identify the method.

My practical reading is to test specialized point- or instance-producing methods next, while retaining language models for category interpretation and interaction. That is an inference about the application, not a claim that any untested method will win on food-bank photos. Our detector baselines are not the contemporary performance ceiling, and the 314-configuration search does not establish global optimality.

4. Turn the idea into falsifiable questions

We separated the broad idea into several questions, because a single “accuracy” score would conceal the most important failures.

Question Operational test Evidence boundary
Can general detectors identify visible food categories? Presence precision and recall on the original photos Assistant-annotated image/category labels
Can they count visible packages? Exact count, MAE, and error direction on supported positive counts Thirty weakly labelled targets
Do VLM guesses improve on the detector implementations? Same original photos, units, and reference labels Repeated exploratory evaluation; not an untouched test
Can systematic configuration search improve dense counting? Training calibration, validation selection, then frozen held-out evaluation A small, class-disjoint grocery proxy study
Does supplying visual examples help? Separate assisted track with published example boxes Extra input changes the task
Is the result ready for automatic stock updates? Would require a real receiving and distribution study Not tested

The initial detector run established an executable baseline. The LLM comparison tested the user's suggestion that a model might do better by looking and guessing. The expanded pipeline made the search reproducible and constrained selection to validation data. These were successive stages, not a single preregistered research program conceived before any observation.

The original-photo LLM prompt was frozen before those LLM calls, but its design benefited from the earlier detector experience. The proxy selection file was frozen before proxy held-out inference. A local protocol file is a useful audit artifact; it is not an external preregistration service, a cryptographic enforcement boundary, or proof that Internet pretraining excluded the photographs.

5. Two datasets, two counting units

The central distinction in the study is between real recipient haul photographs and externally annotated grocery counting proxies.

Property Original food-bank sample Expanded FSC147 subset
Acquired images 11 493 additional images
Sources Three public Reddit posts Pinned image mirror plus original authors' annotations
Scene independence Nine images are overlapping views of one haul Official splits retained; hash checks for cross-split duplicates
Target classes Fixed 25-category inventory taxonomy Fifteen selected food-related categories
Count reference Thirty source-supported positive package counts 25,895 published target points across the acquired subset
Presence reference 273 scored pairs: 51 positive and 222 negative; two unknown Other categories unlabelled, not negative
Primary unit Visible package; selected loose produce counted individually Published target instance, including individual eggs and berries
Executed evaluation All 11 photos 24 calibration + 24 validation + 24 held-out images
Independent physical inventory None None

The acquired corpus contains 504 image files across both sources, but that is not 504 independently evaluated receiving sessions. The expanded search used 72 images. The original nine-view gallery remains a single source group. The two sets' count errors must not be pooled into an overall number.

An egg carton demonstrates why. In the original task, one closed carton is one unit. In FSC147, an egg target is an individual egg annotated with a point. A model could be correct under one definition and wrong under the other while describing the same physical objects. A count without a unit is an incomplete result.

6. Where the food-bank images came from

The original sources were public posts by people showing food received from a pantry or food bank. They resemble a sorting-table capture in some visual respects, but they do not show remaining food-bank stock.

Source group Public source Images used Reference limitations
University pantry QuietlyBleeding's university pantry post university.jpg Quantities and pictured items were reconciled; unpictured food excluded
February 2025 haul lrc2188's food-bank haul haul2025.jpg Busy table and overlap leave many counts unknown
April 2026 gallery fineman1097's April pickup gallery gallery01.jpg through gallery09.jpg Repeated views of one household haul; unpictured extras excluded

Image acquisition encountered restrictions on direct downloads and on an initially considered annotated Roboflow dataset. The Roboflow route reached a bot challenge and was not bypassed. Browser captures of accessible public photographs were used for the first test, with surrounding gallery UI cropped away. A small position indicator remains in some gallery images. The resulting inputs are captured crops, not original-resolution camera files. The manifest records their exact hashes.

Only filenames registered in inputs.json were model inputs. Failed or unused captures in the working directory were not added opportunistically. Reacquiring the same post later could change the crop, compression, dimensions, or available image. Source URLs establish provenance; matching SHA-256 hashes establish the exact evaluated bytes.

The appendix shows all 11 input views so the repeated scene structure remains visible. It would be a serious error to add counts across the nine gallery views and call the sum new donations.

7. How the original labels were made

Count references were transcribed before inference from original-poster quantities or singular item descriptions, then normalized to distinguishable visible units. A carton described as a dozen eggs became one carton. A pack of ten tortillas became one package. Three separate noodle cups remained three. This is source-supported weak supervision, not an independently audited item-by-item physical stock count.

Presence labels were different: the assistant performed a visual audit using the photo and source context. They are image-level positives, negatives, and unknowns. They are not externally supplied detection boxes. Two uncertain presence labels were masked, and counts that could not be supported were left missing. Missing never meant zero.

Reference count Number of labelled targets Share of the 30 targets
1 20 66.7%
2 6 20.0%
3 3 10.0%
6 1 3.3%

There are 47 total labelled instance-query units across those targets. Because some packages recur across images, that is not 47 unique donations. The distribution also means that a constant-one predictor scores 66.7% exact accuracy without seeing any pixels.

The taxonomy intentionally separates macaroni-and-cheese meals from dry pasta and cheese; packaged fish fillets from meat; milk from yogurt, sour cream, and egg substitutes; and human food cans from drink or pet-food cans. Some photographs contain objects outside all 25 categories. Those objects are not forced into the nearest class. The complete taxonomy, prompt, and all evidence rows appear in the appendices and download.

No external instance boxes were available for this sample. Therefore a correct count can still be produced by detections on the wrong objects. We score numerical agreement and image-level presence, not localization mAP.

8. The first detector implementation

The first runnable baseline used Google OWL-v2 and Grounding DINO, with pinned model revisions. Each received the same image and fixed category prompts. Inference did not receive reference labels, source captions, or author quantities. Text physically printed on a package was naturally present in the image.

OWL-v2 used its supplied object-detection postprocessor. Grounding DINO ultimately used a conservative food-identity adapter. Both used class-specific greedy nonmaximum suppression with an intersection-over-union threshold of 0.5. The count was the number of remaining boxes. There were no manual count corrections, package-content multipliers, or fitted thresholds in the primary original-photo comparison.

The registered primary score thresholds were 0.10 for OWL-v2 and 0.25 for the corrected DINO adapter. Additional thresholds were retained as sensitivity analyses. A score threshold is an implementation control over accepted boxes, not a calibrated probability that a stock count is correct.

A detector adapter bug mattered more than its name

An initial DINO adapter allowed a strong generic token match, such as “jar,” to support a specific class such as peanut butter. That can return plausible boxes while failing the intended food-identity question. Inspection of the official postprocessor exposed the mapping problem.

The corrected adapter scored the food-identity subtokens conservatively using their minimum probability. Generic packaging words alone could not establish food identity. Prompts, labels, and the threshold grid were unchanged. The original output remains diagnostic data rather than being silently deleted.

This correction was informed by an image audit. It is therefore an exploratory adapter change, not a paper-standard Grounding DINO benchmark or an independently validated category-mapping method. The later FSC147 pipeline used a standard single-target phrase path instead; those two DINO implementations should not be conflated.

What the detector results meant

OWL-v2's original settings found most positive categories but produced many false positives and duplicate or inappropriate object boxes. It achieved 48 true positives, 105 false positives, and three false negatives on category presence. Its count MAE was 7.80, with only six of 30 counts exact.

The conservative DINO adapter traded away recall: ten true positives, 17 false positives, and 41 false negatives. Its count MAE was 1.53, with one of 30 counts exact. The lower count error did not imply a better inventory recognizer; predicting little or nothing is relatively close to a reference distribution dominated by one.

At OWL-v2 threshold 0.30, the saved sensitivity analysis gave approximately 55.9% presence precision, 64.7% recall, 30% exact counts, and 1.07 MAE. That is useful diagnostic evidence about the precision-recall tradeoff. It was not retrospectively promoted into the original primary result.

9. Asking the language models to guess

The next hypothesis was that image-conditioned language models might interpret packages and categories better than the detector pipelines. We evaluated local Qwen3-VL 2B, local SmolVLM 500M, and subsequently a larger Qwen 3.8 27B model through Cloudflare Workers AI.

For the original task, each model received one image in a fresh conversation and a fixed instruction asking for all 25 categories as nonnegative integer counts. The instruction explicitly defined visible units, partly visible identifiable packages, category exclusions, zero for visible absence, and the prohibition on inferring hidden stock or typical food-bank quantities. It also excluded pictures printed on packaging.

The local Qwen and SmolVLM runs used greedy decoding, four CPU threads, and a 640-token output cap. Qwen's processor had a minimum of 65,536 pixels and maximum of 589,824 pixels. The original local runs used bfloat16. These settings were selected for a repeatable CPU experiment; they are not identical to every model-card generation recommendation.

The hosted 27B run kept the same task prompt but added a strict JSON schema, disabled thinking, used temperature zero, and allowed 768 completion tokens. Consequently, this comparison changes both the model and the output-format enforcement. It cannot identify a causal effect of parameter count alone.

Original-photo run Input Output contract Outcome
Qwen3-VL 2B One image + fixed taxonomy Prompt-requested 25-key JSON All 11 images completed with usable counts
SmolVLM 500M Same task Prompt-requested 25-key JSON No usable complete structured answers
Hosted Qwen 3.8 27B Same task Strict 25-key JSON schema All 11 images completed with usable counts

SmolVLM's original responses included short fragments and an extended continuation that did not satisfy the inventory schema. That is an output-contract failure. It should not be described as if a valid integer prediction were obtained for every object and all of those predictions were wrong. In the later, simpler one-category proxy task, the same small model could return usable outputs.

Parsing was part of the experiment

The scorer allowed a surrounding JSON fence but rejected duplicate keys, non-integer counts, negative values, and missing category answers. It did not repair a model's guesses or replace malformed output with zero. Raw text was saved so parsing decisions could be audited.

Exact-count success used the full denominator of 30 labelled targets, so missing answers did not disappear from the headline. MAE and presence precision/recall were conditional on valid answers and reported alongside coverage. Otherwise a model could appear accurate merely by failing to answer difficult cases.

No image filenames, source captions, source quantities, reference labels, or earlier detector predictions were included in the model's task input. Public provenance information used to verify the cloud disclosure sat outside the model request body. Internet pretraining overlap remains unknown.

10. The original-photo results

Original photographs: fixed package units and reference labels
MethodCount coverageExact / all 30Count MAECount RMSEPresence precisionPresence recall
Always one100.0%20/300.571.2018.7%100.0%
Always absent100.0%0/301.571.890.0%
OWL-v2, score 0.10100.0%6/307.8012.6631.4%94.1%
DINO + identity gate, score 0.25100.0%1/301.531.8837.0%19.6%
Qwen3-VL 2B100.0%15/300.731.2174.5%74.5%
Qwen 3.8 27B + JSON schema100.0%17/300.570.9582.6%74.5%
SmolVLM 500M0.0%0 usable targets

Qwen 27B's presence precision was substantially more useful than either original detector configuration: 38 true positives and eight false positives, with 13 missed positives. Qwen 2B found the same number of positives but added 13 false positives. Both had 74.5% recall. This is evidence that the evaluated VLM implementations were better category suggesters on this convenience sample.

The count result is less encouraging. Qwen 2B got 15 of 30 counts exactly right, and none of the ten counts greater than one. Qwen 27B improved to 17 of 30, including three of the ten nonsingleton counts. Always guessing one still got 20 of 30. Qwen 27B's MAE of 0.57 matched the constant-one baseline, although their error distributions differed.

Original package-count exact matches: always one 20 of 30, Qwen 27B 17, Qwen 2B 15, OWL-v2 6, and corrected DINO 1.
Exact counts on the thirty labelled positive targets. The constant predictor reveals the singleton-heavy label distribution. SmolVLM is omitted from the bars because its original output contract failed.

Presence accuracy has its own misleading baseline: saying every category is absent gives 222/273, or 81.3%, overall accuracy. It also misses all 51 positives. Neither that result nor the constant-one count result would make a useful stock system. Precision, recall, count error, and output coverage must be read together.

This sample is too small and too correlated for strong generalization claims. Nine views of one haul are not nine independent trials. We do not claim statistical significance from treating the 30 targets or 273 category pairs as independent draws from all food banks. The row-level appendix is more informative than a single percentage presented without its denominator.

11. Expanding the labelled corpus

The next step was to build a reusable corpus with external instance annotations. We selected fifteen food-related categories from FSC147, retained the authors' point labels and exemplar boxes, and acquired images from a pinned Hugging Face mirror. The original food-bank sample stayed separate.

All eligible images in those categories numbered 1,186. Before expanded inference, the first study adopted a cap of 48 images per category, selecting by a stable hash of the filename. Smaller categories contributed fewer than 48. The final curated subset contained 493 images and 25,895 points. Counts and model performance were not used to choose the retained images.

Acquisition decision Purpose Remaining limitation
Fifteen explicit food-related categories Keep the study relevant to produce and packaged stock Category selection is a deliberate domain filter
Stable filename-hash selection Make the cap reproducible without count-based selection This is not a random sample of food-bank operations
Pinned author annotations Preserve external reference labels Published labels can still contain mistakes
Pinned image mirror Stabilize acquisition Underlying source photos may have separate rights
Image and manifest hashes Detect changed evaluation inputs Does not detect training-set memorization
Keep official partitions Respect the benchmark's class-disjoint structure Only two relevant validation categories remain

Each corpus record includes the filename, category, official split, unit, actual image dimensions, SHA-256, perceptual hash, source image URL, annotation source, point locations, derived count, exemplar boxes, and annotation-bound checks. The derived count is exactly the number of published points. It is not an LLM-generated label.

All 493 acquired proxy images; only the registered 72-image subset was evaluated
CategoryAcquiredTrainValidationTestPointsCount rangeMedian count
apples480048291610–62133.50
bananas1414005768–11527.50
bread rolls4848006328–3012.00
cans48480041138–167237.00
eggs48004814448–14523.00
grapes480480404411–30659.00
instant noodles33005412–2814.00
milk cartons140140101022–18566.00
oranges484800323614–25049.50
peppers13130024310–4713.00
potatoes48480016178–15925.50
rice bags22007626–5038.00
sauce bottles15001552014–6834.00
strawberries480048259710–25039.00
tomatoes48480028178–45028.50

Label checks and their limits

All published point coordinates in the selected subset were checked against the actual downloaded image dimensions; none were outside the image. Exact hashes and a conservative difference-hash comparison, with Hamming distance at most four, found no cross-split duplicates under those checks. Those checks cannot prove that every correlated scene or near duplicate has been removed.

Twelve illustrative label overlays were visually inspected in the executed study. That establishes that the coordinate interpretation and some examples are sensible. It is not an independent reannotation of all 25,895 objects. The article's held-out overlays are additional visualizations of the saved labels; creating them does not upgrade the annotation provenance.

Twelve FSC147 grocery photographs with published target points in red and supplied exemplar boxes in green.
The original illustrative annotation audit. Red points define the target-instance count; green rectangles are supplied examples available to the assisted method. These are grocery counting proxies, not additional donation photographs. Annotation source; image mirror.

Most selected images have three exemplar boxes: 485 have three, seven have four, and one has five. The executed calibration and held-out subsets each have three boxes per image. Validation has 22 images with three, one with four, and one with five. The assisted runner passed all supplied boxes, so “three examples everywhere” would have been an inaccurate description.

12. The calibration, validation, and test boundary

The acquired subset retained 272 images in the official training partition, 62 in validation, and 159 in test. The initial executed study used 24 from each partition, chosen by category round robin followed by stable filename hash.

Study stage Source partition Images used Role
Calibration Official training split 24 Fit multiplicative count corrections and a median baseline
Validation Official validation split 24 Rank configurations and select one winner per input track
Held-out evaluation Official test split 24 Evaluate frozen recipes and declared comparison baselines

Validation contains twelve grape images and twelve milk-carton images. Test contains six each of apples, eggs, sauce bottles, and strawberries. Categories are disjoint between these official splits. That avoids simply selecting on the same categories later reported as unseen, but it makes the validation problem unusually narrow. A scalar correction selected around dense grapes and cartons need not transfer to eggs or mixed bags of donated food.

The selection file records both winners, their recipes, their validation scores, the data-manifest hash, all three input-manifest hashes, and the selector source hash. Held-out inference requires the selection file to exist. Selection refuses to overwrite an already frozen file. These safeguards prevent accidental tuning against the test in the normal workflow; a researcher still has to respect the experimental boundary.

Once these held-out results influence the next model, prompt, resolution, or routing rule, they are development evidence. The next confirmatory comparison needs a new untouched holdout. Repeatedly improving this same 24-image score would turn it into another validation set.

13. What ran on the VM

Acquisition, local inference, checkpointing, calibration, configuration search, and scoring ran in a Python 3.12 environment on a CPU VM. There was no GPU. The environment exposed roughly eight CPUs of quota and about 22 GB of memory. Local model jobs generally used four Torch threads, with two concurrent jobs as the orchestration default.

The exact package lock is included. Its principal versions include CPU PyTorch 2.14.0, torchvision 0.29.0, transformers 4.57.3, NumPy 2.3.5, and Pillow 12.3.0. These are the recorded run's installed versions, not a recommendation to replace current dependencies in another environment.

The larger Qwen model ran remotely through an already connected Cloudflare Workers AI account. The VM stored its input identity, prompt, raw response, parsed result, usage, and timing. The hosted alias is not an immutable weight revision. Local models and the image source have pinned revisions; a future hosted rerun could change even when the request text is identical.

Detector views and resolution

Each detector could operate on the full image, four overlapping crops, or the union of both. The crops cover the top-left, top-right, bottom-left, and bottom-right, using normalized bounds 0–0.55 and 0.45–1 on each axis. Crop boxes are mapped back to full-image coordinates before suppression so overlap can be deduplicated.

The executed CPU search used OWL-v2 at 384 × 384 with positional-embedding interpolation, and DINO with short edge 384 and long-edge cap 640. Initial native-processor-resolution work was too slow for the intended sweep and remains diagnostic. Lower resolution may miss small items. These settings are implementation compromises, not official paper benchmark settings.

Direct and spatial VLM prompts

The proxy task supplies the target category and asks for a single count. One prompt requests a direct estimate. The other asks the model to count by spatial groups before returning the total. Each style uses a fresh conversation. There is no shared history containing another model's answer or a reference count.

Local SmolVLM used float32, disabled image splitting, greedy decoding, and a 32-token output cap. Hosted Qwen used temperature zero, thinking disabled, a strict schema with one nonnegative integer count, and a 256-token cap. A “spatial” instruction is only a prompt condition; without localized outputs it is not proof that a model enumerated every region faithfully.

The stopped Qwen 2B proxy pilot

The local Qwen 2B proxy adapter used float32, a 262,144-pixel cap, and a 32-token output budget. Eight calibration-image outputs were completed before the pilot was stopped. Latency was high, and explanatory spatial responses could exhaust the token cap before producing a usable count.

Those eight outputs are retained as diagnostics. They are not ranked as a complete study, and unrun images are not assigned invented predictions. The separate 11-photo original Qwen 2B comparison did complete. This distinction matters when summarizing “which models ran.”

FamNet and supplied examples

FamNet produces a density map conditioned on supplied visual examples. The raw prediction is the sum of that map. A second configuration divides the raw count by the median predicted density mass inside the exemplar boxes, with a denominator floor of 0.1. The search also considers training-calibrated versions of both.

FamNet receives the published example boxes, which identify representative target instances. It does not receive the reference count or the target-point annotations during inference. Its extra input places it in a separate assisted track. Its pretrained weights used FSC147's training partition, so calibration-split performance is not new evidence of generalization.

The vendored source and checkpoint are pinned. The model uses a pretrained ResNet50 backbone and the supplied FamNet counting head. This run does not claim to reproduce every adaptation or evaluation setting available in the original research code.

The request to “hillclimb” became a finite, auditable search. We cached expensive predictions, then evaluated a registered set of postprocessing, calibration, and ensemble choices. We did not train 314 independent neural networks.

Search component Calculation Configurations
OWL-v2 postprocessing 8 score thresholds × 3 NMS thresholds × 3 view modes 72
DINO postprocessing Same grid 72
VLM prompts 2 completed model families × 2 prompt styles 4
FamNet outputs Raw density sum or exemplar normalization 2
Constant-one baseline One fixed predictor 1
Base total 72 + 72 + 4 + 2 + 1 151
Training-calibrated versions One scalar correction for each base configuration 151
Training-median constant Median of calibration reference counts 1
Median ensembles All size-2, size-3, and size-4 subsets of four automatic family leaders 11
Total searched 151 + 151 + 1 + 11 314

Score thresholds were 0.03, 0.05, 0.10, 0.15, 0.20, 0.30, 0.40, and 0.50. NMS IoU thresholds were 0.30, 0.50, and 0.70. View modes were full image, crops only, and their union. Family leaders for the ensemble step came from OWL, DINO, Qwen 27B, and SmolVLM on validation. Assisted FamNet outputs were not smuggled into automatic ensembles.

The multiplicative calibration factor was the median of reference / prediction across calibration pairs with a positive prediction, clipped to [0.1, 10]. With no eligible pair, the factor was one. Predictions were scaled and clamped to nonnegative values. Zero predictions remain zero; calibration cannot recover a category that the detector entirely missed.

This correction adjusts numerical bias. It does not remove false boxes, supply missing locations, or make an incorrect category interpretation correct. A low MAE after calibration is not evidence that the underlying detections became trustworthy stock records.

Median ensembles required every member to return a valid value for that row. They did not quietly drop a failed member and change the ensemble definition on difficult images. The primary objective was lowest validation MAE with complete output coverage. Rounded exact accuracy broke ties. Results with incomplete coverage could not win by omitting difficult examples.

The 314 rows include some functionally redundant recipes, such as cases in which calibration leaves predictions unchanged. The number describes evaluated configuration records, not 314 distinct scientific ideas. More resolutions, specialized models, learned counting heads, task-specific training, and capture strategies remain outside this finite search.

15. Metrics and denominators

For a reference count g and prediction p, absolute error is abs(p - g). MAE averages that error over valid predictions. RMSE takes the square root of the mean squared error and gives large mistakes more influence. WAPE divides the sum of absolute errors by the sum of reference counts over valid pairs.

Metric Definition in this study Interpretation
Coverage Valid answers / all requested targets Did the model satisfy the output contract?
MAE Mean absolute numerical error over valid pairs Average number of target units wrong
RMSE Square root of mean squared error Sensitivity to large misses or overcounts
Rounded exact round(prediction) == reference Exact integer agreement; Python's rounding semantics
Within tolerance abs(p - g) <= max(1, 0.1 × g) At most one item or 10% error, whichever is larger
WAPE Total absolute error / total reference count Aggregate error relative to the counted volume
Presence precision True positives / predicted positives How often a suggested category is present
Presence recall True positives / labelled positives How many present categories are found

Rounded exact accuracy and tolerance success use the full target denominator, so invalid outputs remain unsuccessful. Fractional density and calibrated predictions remain fractional for MAE and RMSE. Rounding them before computing error would change the study.

The original package task additionally reports within-one accuracy and signed count error. A negative signed error indicates undercounting. These metrics apply to the supported positive count labels, not every absent category. FSC147 does not provide an exhaustive mixed-inventory negative label set, so the proxy test does not measure whether a model hallucinates categories that were never queried.

The held-out reference counts total 889 across 24 image queries, approximately 37.04 per image. That explains why a constant one is weak on the proxy test while it looks superficially strong on the original low-count package labels. The choice of benchmark changes what a trivial baseline can exploit.

16. Freeze the winners, then inspect the test

The automatic winner was full-image OWL-v2 at score threshold 0.03 and NMS IoU 0.30, multiplied by a training-derived factor of 0.5744814582023885. Validation MAE was 37.57. The assisted winner was raw FamNet density sum, with validation MAE 16.94.

Track Frozen recipe Validation MAE Validation rounded exact
Automatic, target category supplied Calibrated OWL-v2, global, score 0.03, NMS 0.30 37.57 1/24
Supplied visual examples FamNet raw density sum 16.94 2/24

The low detector threshold and correction factor are important to publish together. The reported automatic result is not simply “OWL-v2.” It is a particular resolution, prompt, postprocessor, suppression setting, and calibration recipe selected on a narrow validation subset.

Frozen held-out comparison; n = 24 per method
MethodMAE ↓RMSE ↓Rounded exactWithin toleranceWAPECoverage
Selected automatic OWL-v216.7419.620/248.3%45.2%100.0%
FamNet with supplied examples10.1917.181/2429.2%27.5%100.0%
Qwen 3.8 27B, direct23.3345.473/2433.3%63.0%100.0%
SmolVLM 500M, direct22.8340.363/2429.2%61.6%100.0%
Training median21.7137.421/2412.5%58.6%100.0%
Always one36.0450.420/240.0%97.3%100.0%
Mean absolute error on 24 held-out images: FamNet with examples 10.19, selected automatic OWL-v2 16.74, training median 21.71, SmolVLM 22.83, Qwen 27B 23.33, always one 36.04.
Held-out count error. The hatched assisted bar receives three target example boxes per image. All methods shown have complete answer coverage. Table values retain the precise measured scores.

The automatic winner reduced held-out MAE relative to the training-median baseline, but got zero of 24 rounded counts exactly right. Its WAPE was 45.2%. FamNet reduced aggregate error further but got only one count exact. Those are meaningful improvements over crude baselines and still poor foundations for automatically writing exact stock quantities.

Qwen 27B got three counts exact and one third within the tolerance, while having worse MAE than the selected automatic method. The metric conflict is real: a model can be right on several easier examples and make a few very large errors. It should not be hidden by promoting whichever metric flatters a preferred model.

The assisted winner and the famnet_raw baseline are the same recipe. The raw JSON retains both names to preserve the evaluation schema; the displayed main table counts them once. DINO did not run on the held-out set in this study because its recipes were not selected and it was not a declared final comparison baseline. Its complete development results remain in the validation appendix.

17. Category results expose the average's limits

Held-out category slices; six images each
CategoryImagesSelected OWL MAEFamNet MAEQwen 27B MAESmolVLM MAE
apples624.406.1748.3344.33
eggs613.7313.774.3313.33
sauce bottles618.2714.5923.3324.67
strawberries610.546.2317.339.00

The selected OWL recipe had no exact counts in any held-out category. FamNet was much stronger on apples than the language-model baselines, but its egg MAE was similar to OWL's. Qwen's egg MAE was considerably lower than its apple MAE. These are descriptive patterns from six images per category, not a stable category-routing policy.

A tempting next step would be to route eggs to Qwen and apples to FamNet because this table looks favorable. Doing that and reporting the resulting score on the same 24 images would select on the test. A routed system must be designed and tuned using development data, then evaluated on new held-out scenes.

The four largest absolute errors for the direct hosted Qwen prompt were:

ImageCategoryReferenceQwen predictionAbsolute error
2259.jpgapples1740.00174.00
4916.jpgstrawberries910.0091.00
6282.jpgapples660.0066.00
7438.jpgsauce bottles480.0048.00

These cases are selected by an explicitly stated error rule for diagnosis, not used to choose another winner.

The complete held-out appendix includes the published target points, supplied examples, reference counts, and each scored method's prediction for every image. It includes easy and difficult cases in the fixed test order. The count overlays illustrate the reference labels; they are not model detections.

18. Failures and corrections belong in the record

Event What happened Treatment in the final record
Original DINO generic-token mapping Packaging words could imply an unsupported food identity Corrected adapter; initial output preserved as diagnostic
SmolVLM inventory format Could not satisfy the original 25-category output contract Reported as zero structured coverage, not silently converted to zero counts
Native detector resolution Five-view CPU inference was too slow for the sweep Reduced-resolution study; native outputs excluded from rankings
Qwen 2B proxy pilot High latency and truncated explanatory outputs Eight completed calibration outputs retained; incomplete pilot excluded
Remote image URLs in hosted inference Provider did not allow fetching those URLs Used the provider's supported inline image-byte input
Public photo disclosure check Automatic approval review initially treated original photos as potentially private Verified public source provenance before the approved cloud calls
FamNet assistance description Metadata said three examples even when validation supplied four or five Corrected description and preserved old source; numerical outputs unchanged
Slow repeated NMS scoring The same box suppression was repeatedly recomputed Vectorized equivalent implementation and cached threshold work

The DINO and resolution changes affect the method and therefore its scientific interpretation. The FamNet metadata correction affects the description of extra input, not numerical predictions. The NMS optimization was verified for equivalence. Treating all changes as mere “cleanup” would obscure which results are comparable.

The cloud disclosure check was resolved by verifying that the images came from the requested public Internet benchmark. No private interview transcript, food-bank operational data, or account credential was sent as a counting input. No cloud token was extracted or saved in the deliverable. This was a finite execution, not a new standing service or recurring automation.

19. Reproducibility is more than a requirements file

The pipeline separates five kinds of state: input-only manifests, reference labels, raw inference checkpoints, selected recipes, and scored results. The inference paths use the manifests and images; the scorer joins predictions with labels afterward. FamNet's supplied examples are an explicit input exception and belong to its assisted track.

Artifact Role
inputs.json, labels.json, sources.json Original-photo inputs, frozen references, and provenance
protocol.json, llm_protocol.json Original detector and LLM task definitions
models.json, llm_models.json Pinned local model revisions
pipeline/corpus/manifest.json Acquired subset, source versions, hashes, and split identities
pipeline/corpus/*_inputs.json Separate calibration, validation, and held-out inputs
pipeline/corpus/labels.json Published point labels, examples, units, and image hashes
pipeline/predictions/ Local per-image raw outputs
pipeline/cloud-results/ Hosted prompts, responses, parsed outputs, and provenance
pipeline/study/selection.json Frozen winners and validation scores
pipeline/study/validation_leaderboard.json All 314 searched configurations and recipes
pipeline/study/holdout_results.json Held-out aggregate, per-category, and row-level results
pipeline/versions/ Archived selector and pre-correction runner source
pipeline/study/verification.json Verification evidence for the completed benchmark

Per-image checkpoints are keyed by source-code, input-manifest, and image hashes. Changed inputs or incompatible source cause a loud failure rather than silent reuse of stale predictions. The reduced-resolution scorer also checks the processor settings, so early native-resolution diagnostic outputs cannot accidentally enter the main sweep.

There is one explicitly documented compatibility migration for the metadata-only assistance correction. The original runner hash and source are preserved, and only the documented old/new source pair is accepted. That is a narrow exception, not a switch to ignore arbitrary cache mismatches. The selector source used at selection is retained at its recorded hash as well.

The original scoring code can replay saved guesses without loading neural weights. The proxy scorer imports more of the inference module and therefore uses the pinned environment. Replaying scores and rerunning models are different reproduction levels: the former checks arithmetic and selection logic; the latter also exercises dependency, model, and hosted-service behavior.

20. Exact model and source identities

Local model repositoryPinned revision
google/owlv2-base-patch16-ensemblecfd3195ba4ea9592eec887ded089f4c08eff231d
IDEA-Research/grounding-dino-tinya2bb814dd30d776dcf7e30523b00659f4f141c71
Qwen/Qwen3-VL-2B-Instruct89644892e4d85e24eaac8bacfd4f463576704203
HuggingFaceTB/SmolVLM-500M-Instructa7da5b986cb59b408707209984f360a5f4ad7e47

The FamNet counting-head checkpoint SHA-256 is 9fd1b35d7f9f4c1af736e4562389dd16ec2ce70a4b9c68dc61454aa631cc17c1. The official FSC147 source commit is 00ea1888c3a7c495ae06db0bddc3b90b7db8d52f. The image-mirror revision is 3e420cb6537e803dd6d4516623ce82a79c0317b8.

The hosted model identifier was @cf/qwen/qwen3.8-27b, verified through the connected account's model API. It is a dated provider alias rather than a repository revision that fixes exact weight bytes. Raw request and response records preserve what was requested and returned, but they cannot force a provider to serve identical weights in the future. GPT, Claude, Gemini, and the optional Mistral adapter were not evaluated.

ArtifactSHA-256
Selected labels7dddddd7606572abce4dfcda73db1032951270dee8be1804d0c95578a3643915
Corpus manifest180f728269a74e355cccb9d0b60148f97c69b43be5d2ef3b2fb990052487d16a
Frozen selectionc8ddf52a7c5e5258944ae0d4e02397bf6c6f77fdb77d3bf454bb65629d18a4d7
Selector at selection1868dfedd52967a09340a8eda8e7441a90d0d22a421fba02b08a428ff76cb452
calibrate inputs8972ff3d7bb4eb6421eef568e7d2655501d2d0c32c1c6b37a9374f8e1d81e612
validate inputs93b5c2cda7d819a795330dc06b5358177656c651d185f194dd37ba4cc1af9ddb
holdout inputs6ac14eb66ad856ad1cb73543888e68fe127af85c95c2e94e8deb9584c08f5a9f

The full downloaded upstream annotation file, class map, and split map are identified in the source acquisition code and manifests. The selected 493-image labels preserve the points needed for this study. Public image display copies may be compressed for the website; the manifest hashes refer to evaluation inputs, not to those display derivatives.

21. Replaying the study and starting a new one

Download and extract the reproduction kit first. It contains source, results, and the exact 11 original input captures required by the scorers' image-hash checks. The main archive is sufficient for the original-photo and held-out scoring commands and all 15 tests. Extract the detector development supplement into the same parent directory to add the 48 DINO calibration and validation records and obtain the complete development evidence. Both archives have the same root folder. Weights and the 493-image proxy corpus are acquired separately. The acquisition script downloads the pinned FSC147 inputs from their recorded source. The original capture files let the public kit replay the saved original-photo predictions without relying on a later recapture of a changing source page.

python3 -m venv .venv
.venv/bin/python -m pip install \
  --extra-index-url https://download.pytorch.org/whl/cpu \
  -r pipeline/requirements-lock.txt

# Inspect and score the saved original-photo outputs.
.venv/bin/python benchmark.py score
.venv/bin/python llm_benchmark.py score
.venv/bin/python score_cloud_original.py

# Replay the frozen proxy evaluation from saved predictions.
.venv/bin/python pipeline/study.py final

The archive's public manual explains the distinction between cached replay and fresh inference. The published selection.json remains frozen. Do not delete it, tune against the exposed held-out images, and call the resulting result a new independent test.

# Acquire the selected proxy photographs and pinned local weights.
.venv/bin/python pipeline/acquire.py
.venv/bin/python pipeline/bootstrap.py

# Run or resume the documented experiment.
.venv/bin/python pipeline/orchestrate.py --workers 2

For uncached hosted requests, the standalone runner expects CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN in the environment. Cached hosted outputs require no token. Use an appropriately scoped credential through your own environment; no credential is included here. Image bytes are passed inline because remote image URLs were unavailable in the executed provider configuration.

The default bootstrap, acquisition, and orchestrator commands reconstruct the selected proxy setup. The retained local Qwen proxy adapter can also be invoked individually, but its expensive eight-image pilot is not a required stage of the completed five-family study. The README distinguishes that diagnostic adapter from the hosted Qwen family used for selection.

To expand beyond the cap, create a separate experiment version and run acquisition with --max-per-class 0. That changes the corpus and therefore requires new manifests, appropriate model execution, and a new evaluation design. Never change a corpus underneath an already scored study and continue using its old result labels.

22. Verification and compute cost

Fifteen benchmark tests passed: five for the original evaluator, four for the LLM evaluator, and six for the expanded pipeline. Their role is to check concrete risks such as unknown-label handling, invalid model output, metric arithmetic, suppression behavior, and recipe handling. Passing them does not validate the model's understanding of a food bank.

The faster vectorized NMS scorer was compared with the original reference implementation on the selected detector outputs for all 24 held-out images and matched. The frozen selection remained unchanged. The archive was checked for ZIP integrity and inclusion of the intended evidence. These checks support the fidelity of the reported experiment, not its external validity.

The saved hosted experiment contains 155 completed requests: 48 for calibration, 48 for validation, 48 for held-out proxy prompts, and 11 original-photo inventory requests. The usage record totals 51,034 input tokens, 4,033 output tokens, and approximately 3,261 Neurons. At the documented rate used in the record, the nominal cost is about $0.036 before free allocation. This is a usage estimate, not an invoice; small diagnostic probes and failed requests are excluded. Cloudflare Workers AI pricing.

That low marginal hosted inference estimate is not the cost of running the proposed product. Image acquisition, annotation review, staff correction, failed captures, infrastructure, and maintenance were not priced. CPU timings were observed under shared execution conditions rather than a controlled performance benchmark. A model that saves fractions of a cent but adds a minute of volunteer correction may be the worse operational choice.

23. What this supports for a food-bank product

The useful near-term role is a reviewed observation, with an explicit unit and timestamp. The system can suggest that a category appears in a photograph and propose a quantity. A staff member can correct the category, unit, event type, and count before anything becomes a verified inventory event.

Layer Example record Meaning
Photo observation Image, capture time, station, source session What was observed at one place and time
Model suggestion Category, visible-unit estimate, model version An unverified interpretation of that observation
Reviewed observation Corrected category and count, reviewer, verified time A human-checked statement about the photo or station
Inventory event Receipt, distribution, waste, transfer, correction, or reconciliation A defined change or reconciliation in the stock ledger
Recipient-facing availability Category status with verification time A limited claim intended to help a person plan

An observation is not automatically a delta. A second photograph of the same shelf should not increment inventory. A recipient haul should not be imported as remaining stock. A receipt may add stock only after its relationship to previous observations and its distribution readiness are established.

An illustrative event model could retain observation_id, source_session_id, station_id, captured_at, category, unit, suggested_count, reviewed_count, event_type, verified_at, and supersedes_observation_id. Those fields are a proposal for implementation discussion, not a schema deployed by this experiment. A stable event identity would support idempotent submission; a reconciliation event would distinguish a stock snapshot from an incoming donation.

Recipient-facing output should follow the strength of the evidence. “Produce last verified at 10:20” makes a narrower claim than “37 apples available now.” Whether to show available, limited, unavailable, or unknown—and when to expire a status—needs staff and recipient research. This benchmark did not calibrate a confidence threshold or a freshness window for those decisions.

Package identity and distributable stock

A package's contents should not be multiplied from an uncertain guess. A carton may have a known printed capacity, but that does not prove it is full. A sealed case might have a documented receiving quantity, but that fact comes from packaging or a manifest and needs its own provenance. Weight-based produce should retain a weight unit rather than be converted to pieces without measurement.

The photograph also does not establish expiry, storage history, distribution eligibility, dietary suitability, or an organization's decision that an item is ready to distribute. A useful workflow must retain those operational distinctions. They are not additional labels the model can safely invent from the scene.

24. A next experiment that could change the decision

The next domain study should collect images from separate real receiving sessions and stations, with operator involvement in defining the task. The split unit should be a session or scene group, not an image filename. Multiple views of one delivery belong together. Future holdouts should be selected before inspecting candidate performance.

Proposed measurement Why it matters Reference or comparison
Category precision and recall Avoid sending people toward categories that are not present Independently reviewed category labels, including absent classes
Count error by unit Expose package-versus-content mistakes Visible package centers, quantity records, and adjudicated uncertainty
Correction time per observation Determine whether assistance saves staff effort Manual entry versus model-assisted entry
Duplicate event rate Prevent repeated photos inflating inventory Session identities and reconciled event history
Availability freshness Understand how quickly a verified status becomes stale Repeated station checks and distribution events
Abstention and review burden Evaluate whether uncertainty helps or merely shifts work Coverage-error curves and operator decisions
Recipient usefulness Test the original travel-planning hypothesis Appropriate field evaluation of availability information

At least two reviewers should establish the count unit and resolve ambiguous labels, with an adjudication trail. Labels should distinguish visible counts, known contents from another source, occluded or uncountable objects, and unknown stock. Model predictions may accelerate annotation, but unreviewed guesses must not become evaluation truth.

Specialized counting adapters should return localized evidence where possible. CountGD++, the 2026 Count Anything model, and AdaCount are candidates from the research review. A learned detector or segmentation model trained on real receiving-session data is another candidate. Barcode or OCR-assisted identity, controlled capture regions, a second viewpoint, and weighing are different techniques with different human and hardware costs. None has been tested in the current result table.

Training or fine-tuning should happen on development data, with evaluation by source/session groups. A nested validation design can reduce the optimism created by selecting among many recipes on a tiny validation set. If category routing or ensembles are added, the routing itself is a trained or selected component and belongs inside that development boundary.

Acceptance thresholds should be agreed with operators based on the cost of a false availability claim and the time available for review. We should not invent a universal “95% accurate” gate after seeing a convenient metric. The measurable decision is whether the entire workflow improves useful, recent stock information at an acceptable correction burden.

25. Threats to validity, explicitly

Limitation Consequence
Original photos are recipient hauls They do not measure remaining food-bank inventory
Three original source posts, nine overlapping gallery views Strong dependence and convenience-sampling bias
Weak original count labels Caption interpretation and package normalization can be wrong
Assistant-made presence labels No independent expert audit of category truth
Twenty of thirty counts equal one Exact accuracy is easy to inflate with a trivial predictor
No original localization ground truth Correct counts can come from wrong objects
FSC147 is a grocery proxy Improvement need not transfer to donated mixed packages
Only 72 proxy images evaluated The 493-image acquisition should not be mistaken for evaluation coverage
Only two validation and four test categories Configuration selection and transfer evidence are narrow
Public Internet inputs Pretraining overlap and memorization cannot be ruled out
FamNet receives example boxes and was pretrained on FSC147 train It has additional task information and different training exposure
Reduced detector resolution Accuracy may be limited by a CPU execution compromise
Larger Qwen also gets schema enforcement Model size and format effects are confounded
Hosted model alias Exact weight-level reproducibility is unavailable
Repeated exploratory stages Original-photo results are not an untouched confirmation test
No staff or recipient field test No measured improvement in correction time or avoided trips
Finite search and untested specialized methods No claim of exhaustive algorithm coverage or global SOTA

The exhaustive part of this article is the account of the executed study: its data, decisions, outputs, and limits. It is not a claim to have exhausted the research field. The result that matters today is that the pipeline is reusable, the evidence can be inspected, and the operational hypothesis is still open.

26. Evidence appendices

The remaining sections are generated from the saved machine-readable artifacts. They retain the original taxonomy, missing values, fixed image order, and frozen configuration names. A dash means unknown or unavailable; an explicit zero is a prediction or label of zero. Tables do not substitute a missing value with zero.

Image captions link to the original post or pinned dataset source. Published reference points and supplied example boxes are visually distinct. The photographs remain owned by their original creators; neither this article nor the code license grants blanket rights to the underlying image collection.

Appendix A. Every original positive count target

All thirty supported positive count labels, including repeated views
ImageCategoryReferenceQwen 2BQwen 27BReference basis
university.jpgegg_carton111Author: a dozen eggs; one closed carton; package-unit normalization, not twelve visible eggs.
university.jpginstant_noodles323Author: 3 cup ramen; three separate cartons visible.
university.jpgmac_cheese211Author: 2 kraft macaroni boxes; both boxes visible.
university.jpgdry_pasta112Author: 1 box of pasta; excludes the separate macaroni-and-cheese class.
university.jpgpeanut_butter111Author: a container of peanut butter; singular package.
university.jpgmeat111Author: turkey pepperoni; singular visible package; vegan crumbles explicitly not pictured.
university.jpgtortillas111Author: a pack of 10 corn tortillas; count one package, not contents.
haul2025.jpgmilk111Author lists vanilla almond milk; one visible jug. Includes dairy alternatives.
haul2025.jpgtortillas100Author lists whole wheat tortillas; one visible package.
gallery01.jpgegg_carton111Author: 1 dozen eggs; one carton, contents not inferred.
gallery01.jpgcheese101Author: 1 pack of cheese slices; visible blue packet.
gallery01.jpgmeat323Author: 1 ribs + 1 sausages + 1 turkey burgers; three visible packages, fish excluded.
gallery01.jpgfish121Author: 1 pack fish fillets; visible clear package.
gallery02.jpgmeat111Author: 1 large pack ribs; same ribs as gallery01, not an additional receipt.
gallery02.jpgstrawberries212Author: 2 large packs strawberry; two stacked containers visible. Additional unpictured pack excluded.
gallery02.jpggrapes213Author: 1 large red grape pack + 1 small green grape bag; both visible.
gallery02.jpgmushrooms111Author: 1 large pack mushrooms; additional unpictured pack excluded.
gallery02.jpgdip623Author: 6 veggie dips; three pairs of green-lidded tubs, right pair partly clipped.
gallery03.jpgstrawberries211Author: 2 large packs strawberry; same two stacked containers as gallery02.
gallery04.jpgcauliflower110Author: 1 head cauliflower; one wrapped head visible.
gallery06.jpgmac_cheese200Author: 2 boxes mac and cheese; Goodles and Annie boxes visible.
gallery06.jpgdry_pasta111Author: 1 pack linguine; elbow macaroni pack outside this view.
gallery06.jpgrice111Author: 1 bag basmati rice; same bag repeated in gallery07.
gallery07.jpgdry_pasta110Author: 1 large elbow macaroni pack; edge of the package visible at left.
gallery07.jpgrice111Author: 1 bag basmati rice; same bag as gallery06.
gallery07.jpgbroth304Author: 1 Tom yum + 1 chicken + 1 ramen broth; three cartons. Egg-white substitute cartons excluded.
gallery07.jpgjuice200Author: 2 boxes apple juice; two Allen cartons, one behind the other.
gallery08.jpgcereal100Author: 1 box cereal; Cheerios visible at back.
gallery09.jpgtortillas111Author: 1 large pack mini wraps; visible bag on top.
gallery09.jpgcereal100Author: 1 box cereal; same box as gallery08.

Appendix B. All original photos, labels, and LLM guesses

Presence labels are 1 (present), 0 (absent), or unknown. Count labels are only supplied where source evidence supports the unit and quantity. SmolVLM had no usable structured answers in this task. Each panel retains its raw model text.

university.jpg · source group university
Food-bank recipient haul benchmark image university.jpg
Input view used for evaluation. Photo: QuietlyBleeding. Original post. The gallery images share a haul.
CategoryPresence referenceCount referenceQwen 2BSmolVLMQwen 27BEvidence
egg_carton1111Author: a dozen eggs; one closed carton; package-unit normalization, not twelve visible eggs.
instant_noodles1323Author: 3 cup ramen; three separate cartons visible.
mac_cheese1211Author: 2 kraft macaroni boxes; both boxes visible.
dry_pasta1112Author: 1 box of pasta; excludes the separate macaroni-and-cheese class.
peanut_butter1111Author: a container of peanut butter; singular package.
milk000Presence: assistant visual audit; count unscored.
cheese010Presence: assistant visual audit; count unscored.
meat1111Author: turkey pepperoni; singular visible package; vegan crumbles explicitly not pictured.
fish000Presence: assistant visual audit; count unscored.
strawberries000Presence: assistant visual audit; count unscored.
grapes000Presence: assistant visual audit; count unscored.
mushrooms000Presence: assistant visual audit; count unscored.
dip010Presence: assistant visual audit; count unscored.
apple000Presence: assistant visual audit; count unscored.
orange000Presence: assistant visual audit; count unscored.
bell_pepper000Presence: assistant visual audit; count unscored.
zucchini000Presence: assistant visual audit; count unscored.
cauliflower000Presence: assistant visual audit; count unscored.
bagels000Presence: assistant visual audit; count unscored.
tortillas1111Author: a pack of 10 corn tortillas; count one package, not contents.
rice000Presence: assistant visual audit; count unscored.
broth000Presence: assistant visual audit; count unscored.
juice000Presence: assistant visual audit; count unscored.
cereal000Presence: assistant visual audit; count unscored.
canned_food154Presence: assistant visual audit; count unscored.
qwen3_vl_2b raw response
{
  "egg_carton": 1,
  "instant_noodles": 2,
  "mac_cheese": 1,
  "dry_pasta": 1,
  "peanut_butter": 1,
  "milk": 0,
  "cheese": 1,
  "meat": 1,
  "fish": 0,
  "strawberries": 0,
  "grapes": 0,
  "mushrooms": 0,
  "dip": 1,
  "apple": 0,
  "orange": 0,
  "bell_pepper": 0,
  "zucchini": 0,
  "cauliflower": 0,
  "bagels": 0,
  "tortillas": 1,
  "rice": 0,
  "broth": 0,
  "juice": 0,
  "cereal": 0,
  "canned_food": 5
}
smolvlm_500m raw response
 1.0.
qwen38 raw response
{
"apple": 0,
"bagels": 0,
"bell_pepper": 0,
"broth": 0,
"canned_food": 4,
"cauliflower": 0,
"cereal": 0,
"cheese": 0,
"dip": 0,
"dry_pasta": 2,
"egg_carton": 1,
"fish": 0,
"grapes": 0,
"instant_noodles": 3,
"juice": 0,
"mac_cheese": 1,
"meat": 1,
"milk": 0,
"mushrooms": 0,
"orange": 0,
"peanut_butter": 1,
"rice": 0,
"strawberries": 0,
"tortillas": 1,
"zucchini": 0
}
haul2025.jpg · source group haul2025
Food-bank recipient haul benchmark image haul2025.jpg
Input view used for evaluation. Photo: lrc2188. Original post. The gallery images share a haul.
CategoryPresence referenceCount referenceQwen 2BSmolVLMQwen 27BEvidence
egg_carton010Presence: assistant visual audit; count unscored.
instant_noodles000Presence: assistant visual audit; count unscored.
mac_cheese000Presence: assistant visual audit; count unscored.
dry_pasta00Presence: assistant visual audit; count unscored.
peanut_butter000Presence: assistant visual audit; count unscored.
milk1111Author lists vanilla almond milk; one visible jug. Includes dairy alternatives.
cheese100Presence: assistant visual audit; count unscored.
meat110Presence: assistant visual audit; count unscored.
fish000Presence: assistant visual audit; count unscored.
strawberries000Presence: assistant visual audit; count unscored.
grapes000Presence: assistant visual audit; count unscored.
mushrooms000Presence: assistant visual audit; count unscored.
dip000Presence: assistant visual audit; count unscored.
apple100Presence: assistant visual audit; count unscored.
orange144Presence: assistant visual audit; count unscored.
bell_pepper133Presence: assistant visual audit; count unscored.
zucchini111Presence: assistant visual audit; count unscored.
cauliflower010Presence: assistant visual audit; count unscored.
bagels010Presence: assistant visual audit; count unscored.
tortillas1100Author lists whole wheat tortillas; one visible package.
rice00Presence: assistant visual audit; count unscored.
broth000Presence: assistant visual audit; count unscored.
juice000Presence: assistant visual audit; count unscored.
cereal000Presence: assistant visual audit; count unscored.
canned_food113Presence: assistant visual audit; count unscored.
qwen3_vl_2b raw response
{
  "egg_carton": 1,
  "instant_noodles": 0,
  "mac_cheese": 0,
  "dry_pasta": 0,
  "peanut_butter": 0,
  "milk": 1,
  "cheese": 0,
  "meat": 1,
  "fish": 0,
  "strawberries": 0,
  "grapes": 0,
  "mushrooms": 0,
  "dip": 0,
  "apple": 0,
  "orange": 4,
  "bell_pepper": 3,
  "zucchini": 1,
  "cauliflower": 1,
  "bagels": 1,
  "tortillas": 0,
  "rice": 0,
  "broth": 0,
  "juice": 0,
  "cereal": 0,
  "canned_food": 1
}
smolvlm_500m raw response
 1.0.
qwen38 raw response
{
"apple": 0,
"bagels": 0,
"bell_pepper": 3,
"broth": 0,
"canned_food": 3,
"cauliflower": 0,
"cereal": 0,
"cheese": 0,
"dip": 0,
"dry_pasta": 0,
"egg_carton": 0,
"fish": 0,
"grapes": 0,
"instant_noodles": 0,
"juice": 0,
"mac_cheese": 0,
"meat": 0,
"milk": 1,
"mushrooms": 0,
"orange": 4,
"peanut_butter": 0,
"rice": 0,
"strawberries": 0,
"tortillas": 0,
"zucchini": 1
}
gallery01.jpg · source group april2026
Food-bank recipient haul benchmark image gallery01.jpg
Input view used for evaluation. Photo: fineman1097. Original post. The gallery images share a haul.
CategoryPresence referenceCount referenceQwen 2BSmolVLMQwen 27BEvidence
egg_carton1111Author: 1 dozen eggs; one carton, contents not inferred.
instant_noodles000Presence: assistant visual audit; count unscored.
mac_cheese000Presence: assistant visual audit; count unscored.
dry_pasta000Presence: assistant visual audit; count unscored.
peanut_butter000Presence: assistant visual audit; count unscored.
milk000Presence: assistant visual audit; count unscored.
cheese1101Author: 1 pack of cheese slices; visible blue packet.
meat1323Author: 1 ribs + 1 sausages + 1 turkey burgers; three visible packages, fish excluded.
fish1121Author: 1 pack fish fillets; visible clear package.
strawberries000Presence: assistant visual audit; count unscored.
grapes000Presence: assistant visual audit; count unscored.
mushrooms000Presence: assistant visual audit; count unscored.
dip000Presence: assistant visual audit; count unscored.
apple000Presence: assistant visual audit; count unscored.
orange000Presence: assistant visual audit; count unscored.
bell_pepper000Presence: assistant visual audit; count unscored.
zucchini000Presence: assistant visual audit; count unscored.
cauliflower000Presence: assistant visual audit; count unscored.
bagels000Presence: assistant visual audit; count unscored.
tortillas000Presence: assistant visual audit; count unscored.
rice011Presence: assistant visual audit; count unscored.
broth000Presence: assistant visual audit; count unscored.
juice000Presence: assistant visual audit; count unscored.
cereal000Presence: assistant visual audit; count unscored.
canned_food000Presence: assistant visual audit; count unscored.
qwen3_vl_2b raw response
```json
{
  "egg_carton": 1,
  "instant_noodles": 0,
  "mac_cheese": 0,
  "dry_pasta": 0,
  "peanut_butter": 0,
  "milk": 0,
  "cheese": 0,
  "meat": 2,
  "fish": 2,
  "strawberries": 0,
  "grapes": 0,
  "mushrooms": 0,
  "dip": 0,
  "apple": 0,
  "orange": 0,
  "bell_pepper": 0,
  "zucchini": 0,
  "cauliflower": 0,
  "bagels": 0,
  "tortillas": 0,
  "rice": 1,
  "broth": 0,
  "juice": 0,
  "cereal": 0,
  "canned_food": 0
}
```
smolvlm_500m raw response
 12
qwen38 raw response
{
"apple": 0,
"bagels": 0,
"bell_pepper": 0,
"broth": 0,
"canned_food": 0,
"cauliflower": 0,
"cereal": 0,
"cheese": 1,
"dip": 0,
"dry_pasta": 0,
"egg_carton": 1,
"fish": 1,
"grapes": 0,
"instant_noodles": 0,
"juice": 0,
"mac_cheese": 0,
"meat": 3,
"milk": 0,
"mushrooms": 0,
"orange": 0,
"peanut_butter": 0,
"rice": 1,
"strawberries": 0,
"tortillas": 0,
"zucchini": 0
}
gallery02.jpg · source group april2026
Food-bank recipient haul benchmark image gallery02.jpg
Input view used for evaluation. Photo: fineman1097. Original post. The gallery images share a haul.
CategoryPresence referenceCount referenceQwen 2BSmolVLMQwen 27BEvidence
egg_carton000Presence: assistant visual audit; count unscored.
instant_noodles000Presence: assistant visual audit; count unscored.
mac_cheese000Presence: assistant visual audit; count unscored.
dry_pasta000Presence: assistant visual audit; count unscored.
peanut_butter000Presence: assistant visual audit; count unscored.
milk000Presence: assistant visual audit; count unscored.
cheese000Presence: assistant visual audit; count unscored.
meat1111Author: 1 large pack ribs; same ribs as gallery01, not an additional receipt.
fish000Presence: assistant visual audit; count unscored.
strawberries1212Author: 2 large packs strawberry; two stacked containers visible. Additional unpictured pack excluded.
grapes1213Author: 1 large red grape pack + 1 small green grape bag; both visible.
mushrooms1111Author: 1 large pack mushrooms; additional unpictured pack excluded.
dip1623Author: 6 veggie dips; three pairs of green-lidded tubs, right pair partly clipped.
apple124Presence: assistant visual audit; count unscored.
orange000Presence: assistant visual audit; count unscored.
bell_pepper000Presence: assistant visual audit; count unscored.
zucchini000Presence: assistant visual audit; count unscored.
cauliflower000Presence: assistant visual audit; count unscored.
bagels000Presence: assistant visual audit; count unscored.
tortillas000Presence: assistant visual audit; count unscored.
rice010Presence: assistant visual audit; count unscored.
broth000Presence: assistant visual audit; count unscored.
juice000Presence: assistant visual audit; count unscored.
cereal000Presence: assistant visual audit; count unscored.
canned_food000Presence: assistant visual audit; count unscored.
qwen3_vl_2b raw response
```json
{
  "egg_carton": 0,
  "instant_noodles": 0,
  "mac_cheese": 0,
  "dry_pasta": 0,
  "peanut_butter": 0,
  "milk": 0,
  "cheese": 0,
  "meat": 1,
  "fish": 0,
  "strawberries": 1,
  "grapes": 1,
  "mushrooms": 1,
  "dip": 2,
  "apple": 2,
  "orange": 0,
  "bell_pepper": 0,
  "zucchini": 0,
  "cauliflower": 0,
  "bagels": 0,
  "tortillas": 0,
  "rice": 1,
  "broth": 0,
  "juice": 0,
  "cereal": 0,
  "canned_food": 0
}
```
smolvlm_500m raw response
 1.0.
qwen38 raw response
{
    "apple": 4,
    "bagels": 0,
    "bell_pepper": 0,
    "broth": 0,
    "canned_food": 0,
    "cauliflower": 0,
    "cereal": 0,
    "cheese": 0,
    "dip": 3,
    "dry_pasta": 0,
    "egg_carton": 0,
    "fish": 0,
    "grapes": 3,
    "instant_noodles": 0,
    "juice": 0,
    "mac_cheese": 0,
    "meat": 1,
    "milk": 0,
    "mushrooms": 1,
    "orange": 0,
    "peanut_butter": 0,
    "rice": 0,
    "strawberries": 2,
    "tortillas": 0,
    "zucchini": 0
}
gallery03.jpg · source group april2026
Food-bank recipient haul benchmark image gallery03.jpg
Input view used for evaluation. Photo: fineman1097. Original post. The gallery images share a haul.
CategoryPresence referenceCount referenceQwen 2BSmolVLMQwen 27BEvidence
egg_carton000Presence: assistant visual audit; count unscored.
instant_noodles000Presence: assistant visual audit; count unscored.
mac_cheese000Presence: assistant visual audit; count unscored.
dry_pasta000Presence: assistant visual audit; count unscored.
peanut_butter000Presence: assistant visual audit; count unscored.
milk000Presence: assistant visual audit; count unscored.
cheese000Presence: assistant visual audit; count unscored.
meat000Presence: assistant visual audit; count unscored.
fish000Presence: assistant visual audit; count unscored.
strawberries1211Author: 2 large packs strawberry; same two stacked containers as gallery02.
grapes000Presence: assistant visual audit; count unscored.
mushrooms111Presence: assistant visual audit; count unscored.
dip002Presence: assistant visual audit; count unscored.
apple1510Presence: assistant visual audit; count unscored.
orange1810Presence: assistant visual audit; count unscored.
bell_pepper011Presence: assistant visual audit; count unscored.
zucchini000Presence: assistant visual audit; count unscored.
cauliflower000Presence: assistant visual audit; count unscored.
bagels001Presence: assistant visual audit; count unscored.
tortillas000Presence: assistant visual audit; count unscored.
rice000Presence: assistant visual audit; count unscored.
broth001Presence: assistant visual audit; count unscored.
juice000Presence: assistant visual audit; count unscored.
cereal000Presence: assistant visual audit; count unscored.
canned_food010Presence: assistant visual audit; count unscored.
qwen3_vl_2b raw response
{
  "egg_carton": 0,
  "instant_noodles": 0,
  "mac_cheese": 0,
  "dry_pasta": 0,
  "peanut_butter": 0,
  "milk": 0,
  "cheese": 0,
  "meat": 0,
  "fish": 0,
  "strawberries": 1,
  "grapes": 0,
  "mushrooms": 1,
  "dip": 0,
  "apple": 5,
  "orange": 8,
  "bell_pepper": 1,
  "zucchini": 0,
  "cauliflower": 0,
  "bagels": 0,
  "tortillas": 0,
  "rice": 0,
  "broth": 0,
  "juice": 0,
  "cereal": 0,
  "canned_food": 1
}
smolvlm_500m raw response
 1.0.
qwen38 raw response
{
    "apple": 10,
    "bagels": 1,
    "bell_pepper": 1,
    "broth": 1,
    "canned_food": 0,
    "cauliflower": 0,
    "cereal": 0,
    "cheese": 0,
    "dip": 2,
    "dry_pasta": 0,
    "egg_carton": 0,
    "fish": 0,
    "grapes": 0,
    "instant_noodles": 0,
    "juice": 0,
    "mac_cheese": 0,
    "meat": 0,
    "milk": 0,
    "mushrooms": 1,
    "orange": 10,
    "peanut_butter": 0,
    "rice": 0,
    "strawberries": 1,
    "tortillas": 0,
    "zucchini": 0
}
gallery04.jpg · source group april2026
Food-bank recipient haul benchmark image gallery04.jpg
Input view used for evaluation. Photo: fineman1097. Original post. The gallery images share a haul.
CategoryPresence referenceCount referenceQwen 2BSmolVLMQwen 27BEvidence
egg_carton000Presence: assistant visual audit; count unscored.
instant_noodles000Presence: assistant visual audit; count unscored.
mac_cheese000Presence: assistant visual audit; count unscored.
dry_pasta000Presence: assistant visual audit; count unscored.
peanut_butter000Presence: assistant visual audit; count unscored.
milk000Presence: assistant visual audit; count unscored.
cheese000Presence: assistant visual audit; count unscored.
meat000Presence: assistant visual audit; count unscored.
fish000Presence: assistant visual audit; count unscored.
strawberries000Presence: assistant visual audit; count unscored.
grapes001Presence: assistant visual audit; count unscored.
mushrooms000Presence: assistant visual audit; count unscored.
dip000Presence: assistant visual audit; count unscored.
apple000Presence: assistant visual audit; count unscored.
orange11012Presence: assistant visual audit; count unscored.
bell_pepper010Presence: assistant visual audit; count unscored.
zucchini010Presence: assistant visual audit; count unscored.
cauliflower1110Author: 1 head cauliflower; one wrapped head visible.
bagels000Presence: assistant visual audit; count unscored.
tortillas000Presence: assistant visual audit; count unscored.
rice000Presence: assistant visual audit; count unscored.
broth000Presence: assistant visual audit; count unscored.
juice000Presence: assistant visual audit; count unscored.
cereal000Presence: assistant visual audit; count unscored.
canned_food030Presence: assistant visual audit; count unscored.
qwen3_vl_2b raw response
```json
{
  "egg_carton": 0,
  "instant_noodles": 0,
  "mac_cheese": 0,
  "dry_pasta": 0,
  "peanut_butter": 0,
  "milk": 0,
  "cheese": 0,
  "meat": 0,
  "fish": 0,
  "strawberries": 0,
  "grapes": 0,
  "mushrooms": 0,
  "dip": 0,
  "apple": 0,
  "orange": 10,
  "bell_pepper": 1,
  "zucchini": 1,
  "cauliflower": 1,
  "bagels": 0,
  "tortillas": 0,
  "rice": 0,
  "broth": 0,
  "juice": 0,
  "cereal": 0,
  "canned_food": 3
}
```
smolvlm_500m raw response
 1.0.
qwen38 raw response
{
    "apple": 0,
    "bagels": 0,
    "bell_pepper": 0,
    "broth": 0,
    "canned_food": 0,
    "cauliflower": 0,
    "cereal": 0,
    "cheese": 0,
    "dip": 0,
    "dry_pasta": 0,
    "egg_carton": 0,
    "fish": 0,
    "grapes": 1,
    "instant_noodles": 0,
    "juice": 0,
    "mac_cheese": 0,
    "meat": 0,
    "milk": 0,
    "mushrooms": 0,
    "orange": 12,
    "peanut_butter": 0,
    "rice": 0,
    "strawberries": 0,
    "tortillas": 0,
    "zucchini": 0
}
gallery05.jpg · source group april2026
Food-bank recipient haul benchmark image gallery05.jpg
Input view used for evaluation. Photo: fineman1097. Original post. The gallery images share a haul.
CategoryPresence referenceCount referenceQwen 2BSmolVLMQwen 27BEvidence
egg_carton000Presence: assistant visual audit; count unscored.
instant_noodles000Presence: assistant visual audit; count unscored.
mac_cheese000Presence: assistant visual audit; count unscored.
dry_pasta000Presence: assistant visual audit; count unscored.
peanut_butter000Presence: assistant visual audit; count unscored.
milk000Presence: assistant visual audit; count unscored.
cheese000Presence: assistant visual audit; count unscored.
meat000Presence: assistant visual audit; count unscored.
fish000Presence: assistant visual audit; count unscored.
strawberries000Presence: assistant visual audit; count unscored.
grapes000Presence: assistant visual audit; count unscored.
mushrooms000Presence: assistant visual audit; count unscored.
dip000Presence: assistant visual audit; count unscored.
apple000Presence: assistant visual audit; count unscored.
orange188Presence: assistant visual audit; count unscored.
bell_pepper000Presence: assistant visual audit; count unscored.
zucchini000Presence: assistant visual audit; count unscored.
cauliflower100Presence: assistant visual audit; count unscored.
bagels000Presence: assistant visual audit; count unscored.
tortillas000Presence: assistant visual audit; count unscored.
rice000Presence: assistant visual audit; count unscored.
broth000Presence: assistant visual audit; count unscored.
juice000Presence: assistant visual audit; count unscored.
cereal000Presence: assistant visual audit; count unscored.
canned_food000Presence: assistant visual audit; count unscored.
qwen3_vl_2b raw response
```json
{
  "egg_carton": 0,
  "instant_noodles": 0,
  "mac_cheese": 0,
  "dry_pasta": 0,
  "peanut_butter": 0,
  "milk": 0,
  "cheese": 0,
  "meat": 0,
  "fish": 0,
  "strawberries": 0,
  "grapes": 0,
  "mushrooms": 0,
  "dip": 0,
  "apple": 0,
  "orange": 8,
  "bell_pepper": 0,
  "zucchini": 0,
  "cauliflower": 0,
  "bagels": 0,
  "tortillas": 0,
  "rice": 0,
  "broth": 0,
  "juice": 0,
  "cereal": 0,
  "canned_food": 0
}
```
smolvlm_500m raw response
 [
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
qwen38 raw response
{
"apple": 0,
"bagels": 0,
"bell_pepper": 0,
"broth": 0,
"canned_food": 0,
"cauliflower": 0,
"cereal": 0,
"cheese": 0,
"dip": 0,
"dry_pasta": 0,
"egg_carton": 0,
"fish": 0,
"grapes": 0,
"instant_noodles": 0,
"juice": 0,
"mac_cheese": 0,
"meat": 0,
"milk": 0,
"mushrooms": 0,
"orange": 8,
"peanut_butter": 0,
"rice": 0,
"strawberries": 0,
"tortillas": 0,
"zucchini": 0
}
gallery06.jpg · source group april2026
Food-bank recipient haul benchmark image gallery06.jpg
Input view used for evaluation. Photo: fineman1097. Original post. The gallery images share a haul.
CategoryPresence referenceCount referenceQwen 2BSmolVLMQwen 27BEvidence
egg_carton000Presence: assistant visual audit; count unscored.
instant_noodles000Presence: assistant visual audit; count unscored.
mac_cheese1200Author: 2 boxes mac and cheese; Goodles and Annie boxes visible.
dry_pasta1111Author: 1 pack linguine; elbow macaroni pack outside this view.
peanut_butter001Presence: assistant visual audit; count unscored.
milk000Presence: assistant visual audit; count unscored.
cheese010Presence: assistant visual audit; count unscored.
meat000Presence: assistant visual audit; count unscored.
fish000Presence: assistant visual audit; count unscored.
strawberries000Presence: assistant visual audit; count unscored.
grapes000Presence: assistant visual audit; count unscored.
mushrooms000Presence: assistant visual audit; count unscored.
dip000Presence: assistant visual audit; count unscored.
apple000Presence: assistant visual audit; count unscored.
orange000Presence: assistant visual audit; count unscored.
bell_pepper000Presence: assistant visual audit; count unscored.
zucchini000Presence: assistant visual audit; count unscored.
cauliflower000Presence: assistant visual audit; count unscored.
bagels000Presence: assistant visual audit; count unscored.
tortillas000Presence: assistant visual audit; count unscored.
rice1111Author: 1 bag basmati rice; same bag repeated in gallery07.
broth000Presence: assistant visual audit; count unscored.
juice000Presence: assistant visual audit; count unscored.
cereal000Presence: assistant visual audit; count unscored.
canned_food112Presence: assistant visual audit; count unscored.
qwen3_vl_2b raw response
```json
{
  "egg_carton": 0,
  "instant_noodles": 0,
  "mac_cheese": 0,
  "dry_pasta": 1,
  "peanut_butter": 0,
  "milk": 0,
  "cheese": 1,
  "meat": 0,
  "fish": 0,
  "strawberries": 0,
  "grapes": 0,
  "mushrooms": 0,
  "dip": 0,
  "apple": 0,
  "orange": 0,
  "bell_pepper": 0,
  "zucchini": 0,
  "cauliflower": 0,
  "bagels": 0,
  "tortillas": 0,
  "rice": 1,
  "broth": 0,
  "juice": 0,
  "cereal": 0,
  "canned_food": 1
}
```
smolvlm_500m raw response
 10.0.
qwen38 raw response
{
    "apple": 0,
    "bagels": 0,
    "bell_pepper": 0,
    "broth": 0,
    "canned_food": 2,
    "cauliflower": 0,
    "cereal": 0,
    "cheese": 0,
    "dip": 0,
    "dry_pasta": 1,
    "egg_carton": 0,
    "fish": 0,
    "grapes": 0,
    "instant_noodles": 0,
    "juice": 0,
    "mac_cheese": 0,
    "meat": 0,
    "milk": 0,
    "mushrooms": 0,
    "orange": 0,
    "peanut_butter": 1,
    "rice": 1,
    "strawberries": 0,
    "tortillas": 0,
    "zucchini": 0
}
gallery07.jpg · source group april2026
Food-bank recipient haul benchmark image gallery07.jpg
Input view used for evaluation. Photo: fineman1097. Original post. The gallery images share a haul.
CategoryPresence referenceCount referenceQwen 2BSmolVLMQwen 27BEvidence
egg_carton000Presence: assistant visual audit; count unscored.
instant_noodles100Presence: assistant visual audit; count unscored.
mac_cheese000Presence: assistant visual audit; count unscored.
dry_pasta1110Author: 1 large elbow macaroni pack; edge of the package visible at left.
peanut_butter000Presence: assistant visual audit; count unscored.
milk000Presence: assistant visual audit; count unscored.
cheese000Presence: assistant visual audit; count unscored.
meat000Presence: assistant visual audit; count unscored.
fish000Presence: assistant visual audit; count unscored.
strawberries000Presence: assistant visual audit; count unscored.
grapes000Presence: assistant visual audit; count unscored.
mushrooms000Presence: assistant visual audit; count unscored.
dip000Presence: assistant visual audit; count unscored.
apple000Presence: assistant visual audit; count unscored.
orange000Presence: assistant visual audit; count unscored.
bell_pepper000Presence: assistant visual audit; count unscored.
zucchini000Presence: assistant visual audit; count unscored.
cauliflower000Presence: assistant visual audit; count unscored.
bagels000Presence: assistant visual audit; count unscored.
tortillas000Presence: assistant visual audit; count unscored.
rice1111Author: 1 bag basmati rice; same bag as gallery06.
broth1304Author: 1 Tom yum + 1 chicken + 1 ramen broth; three cartons. Egg-white substitute cartons excluded.
juice1200Author: 2 boxes apple juice; two Allen cartons, one behind the other.
cereal000Presence: assistant visual audit; count unscored.
canned_food11018Presence: assistant visual audit; count unscored.
qwen3_vl_2b raw response
```json
{
  "egg_carton": 0,
  "instant_noodles": 0,
  "mac_cheese": 0,
  "dry_pasta": 1,
  "peanut_butter": 0,
  "milk": 0,
  "cheese": 0,
  "meat": 0,
  "fish": 0,
  "strawberries": 0,
  "grapes": 0,
  "mushrooms": 0,
  "dip": 0,
  "apple": 0,
  "orange": 0,
  "bell_pepper": 0,
  "zucchini": 0,
  "cauliflower": 0,
  "bagels": 0,
  "tortillas": 0,
  "rice": 1,
  "broth": 0,
  "juice": 0,
  "cereal": 0,
  "canned_food": 10
}
```
smolvlm_500m raw response
 1.0.
qwen38 raw response
{
    "apple": 0,
    "bagels": 0,
    "bell_pepper": 0,
    "broth": 4,
    "canned_food": 18,
    "cauliflower": 0,
    "cereal": 0,
    "cheese": 0,
    "dip": 0,
    "dry_pasta": 0,
    "egg_carton": 0,
    "fish": 0,
    "grapes": 0,
    "instant_noodles": 0,
    "juice": 0,
    "mac_cheese": 0,
    "meat": 0,
    "milk": 0,
    "mushrooms": 0,
    "orange": 0,
    "peanut_butter": 0,
    "rice": 1,
    "strawberries": 0,
    "tortillas": 0,
    "zucchini": 0
}
gallery08.jpg · source group april2026
Food-bank recipient haul benchmark image gallery08.jpg
Input view used for evaluation. Photo: fineman1097. Original post. The gallery images share a haul.
CategoryPresence referenceCount referenceQwen 2BSmolVLMQwen 27BEvidence
egg_carton000Presence: assistant visual audit; count unscored.
instant_noodles100Presence: assistant visual audit; count unscored.
mac_cheese000Presence: assistant visual audit; count unscored.
dry_pasta000Presence: assistant visual audit; count unscored.
peanut_butter000Presence: assistant visual audit; count unscored.
milk000Presence: assistant visual audit; count unscored.
cheese000Presence: assistant visual audit; count unscored.
meat000Presence: assistant visual audit; count unscored.
fish000Presence: assistant visual audit; count unscored.
strawberries000Presence: assistant visual audit; count unscored.
grapes000Presence: assistant visual audit; count unscored.
mushrooms000Presence: assistant visual audit; count unscored.
dip000Presence: assistant visual audit; count unscored.
apple000Presence: assistant visual audit; count unscored.
orange000Presence: assistant visual audit; count unscored.
bell_pepper000Presence: assistant visual audit; count unscored.
zucchini000Presence: assistant visual audit; count unscored.
cauliflower000Presence: assistant visual audit; count unscored.
bagels000Presence: assistant visual audit; count unscored.
tortillas001Presence: assistant visual audit; count unscored.
rice000Presence: assistant visual audit; count unscored.
broth000Presence: assistant visual audit; count unscored.
juice000Presence: assistant visual audit; count unscored.
cereal1100Author: 1 box cereal; Cheerios visible at back.
canned_food1010Presence: assistant visual audit; count unscored.
qwen3_vl_2b raw response
```json
{
  "egg_carton": 0,
  "instant_noodles": 0,
  "mac_cheese": 0,
  "dry_pasta": 0,
  "peanut_butter": 0,
  "milk": 0,
  "cheese": 0,
  "meat": 0,
  "fish": 0,
  "strawberries": 0,
  "grapes": 0,
  "mushrooms": 0,
  "dip": 0,
  "apple": 0,
  "orange": 0,
  "bell_pepper": 0,
  "zucchini": 0,
  "cauliflower": 0,
  "bagels": 0,
  "tortillas": 0,
  "rice": 0,
  "broth": 0,
  "juice": 0,
  "cereal": 0,
  "canned_food": 0
}
```
smolvlm_500m raw response
 95.
qwen38 raw response
{
    "apple": 0,
    "bagels": 0,
    "bell_pepper": 0,
    "broth": 0,
    "canned_food": 10,
    "cauliflower": 0,
    "cereal": 0,
    "cheese": 0,
    "dip": 0,
    "dry_pasta": 0,
    "egg_carton": 0,
    "fish": 0,
    "grapes": 0,
    "instant_noodles": 0,
    "juice": 0,
    "mac_cheese": 0,
    "meat": 0,
    "milk": 0,
    "mushrooms": 0,
    "orange": 0,
    "peanut_butter": 0,
    "rice": 0,
    "strawberries": 0,
    "tortillas": 1,
    "zucchini": 0
}
gallery09.jpg · source group april2026
Food-bank recipient haul benchmark image gallery09.jpg
Input view used for evaluation. Photo: fineman1097. Original post. The gallery images share a haul.
CategoryPresence referenceCount referenceQwen 2BSmolVLMQwen 27BEvidence
egg_carton000Presence: assistant visual audit; count unscored.
instant_noodles000Presence: assistant visual audit; count unscored.
mac_cheese000Presence: assistant visual audit; count unscored.
dry_pasta000Presence: assistant visual audit; count unscored.
peanut_butter000Presence: assistant visual audit; count unscored.
milk000Presence: assistant visual audit; count unscored.
cheese000Presence: assistant visual audit; count unscored.
meat000Presence: assistant visual audit; count unscored.
fish000Presence: assistant visual audit; count unscored.
strawberries000Presence: assistant visual audit; count unscored.
grapes000Presence: assistant visual audit; count unscored.
mushrooms000Presence: assistant visual audit; count unscored.
dip000Presence: assistant visual audit; count unscored.
apple000Presence: assistant visual audit; count unscored.
orange000Presence: assistant visual audit; count unscored.
bell_pepper000Presence: assistant visual audit; count unscored.
zucchini000Presence: assistant visual audit; count unscored.
cauliflower000Presence: assistant visual audit; count unscored.
bagels111Presence: assistant visual audit; count unscored.
tortillas1111Author: 1 large pack mini wraps; visible bag on top.
rice000Presence: assistant visual audit; count unscored.
broth000Presence: assistant visual audit; count unscored.
juice000Presence: assistant visual audit; count unscored.
cereal1100Author: 1 box cereal; same box as gallery08.
canned_food000Presence: assistant visual audit; count unscored.
qwen3_vl_2b raw response
{
  "egg_carton": 0,
  "instant_noodles": 0,
  "mac_cheese": 0,
  "dry_pasta": 0,
  "peanut_butter": 0,
  "milk": 0,
  "cheese": 0,
  "meat": 0,
  "fish": 0,
  "strawberries": 0,
  "grapes": 0,
  "mushrooms": 0,
  "dip": 0,
  "apple": 0,
  "orange": 0,
  "bell_pepper": 0,
  "zucchini": 0,
  "cauliflower": 0,
  "bagels": 1,
  "tortillas": 1,
  "rice": 0,
  "broth": 0,
  "juice": 0,
  "cereal": 0,
  "canned_food": 0
}
smolvlm_500m raw response
 1.0.
qwen38 raw response
{
    "apple": 0,
    "bagels": 1,
    "bell_pepper": 0,
    "broth": 0,
    "canned_food": 0,
    "cauliflower": 0,
    "cereal": 0,
    "cheese": 0,
    "dip": 0,
    "dry_pasta": 0,
    "egg_carton": 0,
    "fish": 0,
    "grapes": 0,
    "instant_noodles": 0,
    "juice": 0,
    "mac_cheese": 0,
    "meat": 0,
    "milk": 0,
    "mushrooms": 0,
    "orange": 0,
    "peanut_butter": 0,
    "rice": 0,
    "strawberries": 0,
    "tortillas": 1,
    "zucchini": 0
}

Appendix C. All 24 held-out proxy images

Red circles mark the published target points. Green rectangles mark the three supplied example boxes used by FamNet. These are reference annotations, not model predictions. The unannotated photo remains beneath the overlay; every model ran before this visualization was made.

2181.jpg · apples · reference 12
FSC147 apples photograph 2181.jpg with 12 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v231.6019.60No
FamNet with supplied examples14.612.61No
Qwen 3.8 27B, direct13.001.00No
SmolVLM 500M, direct5.007.00No
Training median24.5012.50No
Always one1.0011.00No
7580.jpg · eggs · reference 15
FSC147 eggs photograph 7580.jpg with 15 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v225.8510.85No
FamNet with supplied examples17.212.21No
Qwen 3.8 27B, direct15.000.00Yes
SmolVLM 500M, direct15.000.00Yes
Training median24.509.50No
Always one1.0014.00No
7567.jpg · sauce bottles · reference 68
FSC147 sauce bottles photograph 7567.jpg with 68 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v270.662.66No
FamNet with supplied examples77.549.54No
Qwen 3.8 27B, direct60.008.00No
SmolVLM 500M, direct15.0053.00No
Training median24.5043.50No
Always one1.0067.00No
5837.jpg · strawberries · reference 18
FSC147 strawberries photograph 5837.jpg with 18 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v228.7210.72No
FamNet with supplied examples6.1011.90No
Qwen 3.8 27B, direct17.001.00No
SmolVLM 500M, direct17.001.00No
Training median24.506.50No
Always one1.0017.00No
6282.jpg · apples · reference 66
FSC147 apples photograph 6282.jpg with 66 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v246.5319.47No
FamNet with supplied examples72.696.69No
Qwen 3.8 27B, direct0.0066.00No
SmolVLM 500M, direct2.0064.00No
Training median24.5041.50No
Always one1.0065.00No
7145.jpg · eggs · reference 24
FSC147 eggs photograph 7145.jpg with 24 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v230.456.45No
FamNet with supplied examples20.933.07No
Qwen 3.8 27B, direct20.004.00No
SmolVLM 500M, direct25.001.00No
Training median24.500.50Yes
Always one1.0023.00No
6823.jpg · sauce bottles · reference 23
FSC147 sauce bottles photograph 6823.jpg with 23 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v254.5831.58No
FamNet with supplied examples24.121.12No
Qwen 3.8 27B, direct0.0023.00No
SmolVLM 500M, direct20.003.00No
Training median24.501.50No
Always one1.0022.00No
4916.jpg · strawberries · reference 91
FSC147 strawberries photograph 4916.jpg with 91 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v283.307.70No
FamNet with supplied examples79.5711.43No
Qwen 3.8 27B, direct0.0091.00No
SmolVLM 500M, direct42.0049.00No
Training median24.5066.50No
Always one1.0090.00No
2184.jpg · apples · reference 33
FSC147 apples photograph 2184.jpg with 33 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v257.4524.45No
FamNet with supplied examples33.640.64No
Qwen 3.8 27B, direct0.0033.00No
SmolVLM 500M, direct4.0029.00No
Training median24.508.50No
Always one1.0032.00No
5915.jpg · eggs · reference 12
FSC147 eggs photograph 5915.jpg with 12 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v222.9810.98No
FamNet with supplied examples22.6010.60No
Qwen 3.8 27B, direct10.002.00No
SmolVLM 500M, direct19.007.00No
Training median24.5012.50No
Always one1.0011.00No
7071.jpg · sauce bottles · reference 44
FSC147 sauce bottles photograph 7071.jpg with 44 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v252.288.28No
FamNet with supplied examples100.9456.94No
Qwen 3.8 27B, direct0.0044.00No
SmolVLM 500M, direct20.0024.00No
Training median24.5019.50No
Always one1.0043.00No
4900.jpg · strawberries · reference 14
FSC147 strawberries photograph 4900.jpg with 14 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v218.384.38No
FamNet with supplied examples7.176.83No
Qwen 3.8 27B, direct15.001.00No
SmolVLM 500M, direct11.003.00No
Training median24.5010.50No
Always one1.0013.00No
2259.jpg · apples · reference 174
FSC147 apples photograph 2259.jpg with 174 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v2127.5346.47No
FamNet with supplied examples180.016.01No
Qwen 3.8 27B, direct0.00174.00No
SmolVLM 500M, direct20.00154.00No
Training median24.50149.50No
Always one1.00173.00No
7128.jpg · eggs · reference 49
FSC147 eggs photograph 7128.jpg with 49 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v223.5525.45No
FamNet with supplied examples45.773.23No
Qwen 3.8 27B, direct48.001.00No
SmolVLM 500M, direct0.0049.00No
Training median24.5024.50No
Always one1.0048.00No
7438.jpg · sauce bottles · reference 48
FSC147 sauce bottles photograph 7438.jpg with 48 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v263.1915.19No
FamNet with supplied examples51.073.07No
Qwen 3.8 27B, direct0.0048.00No
SmolVLM 500M, direct20.0028.00No
Training median24.5023.50No
Always one1.0047.00No
4903.jpg · strawberries · reference 18
FSC147 strawberries photograph 4903.jpg with 18 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v228.7210.72No
FamNet with supplied examples22.094.09No
Qwen 3.8 27B, direct19.001.00No
SmolVLM 500M, direct17.001.00No
Training median24.506.50No
Always one1.0017.00No
2178.jpg · apples · reference 10
FSC147 apples photograph 2178.jpg with 10 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v235.0425.04No
FamNet with supplied examples14.054.05No
Qwen 3.8 27B, direct10.000.00Yes
SmolVLM 500M, direct12.002.00No
Training median24.5014.50No
Always one1.009.00No
5916.jpg · eggs · reference 38
FSC147 eggs photograph 5916.jpg with 38 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v260.9022.90No
FamNet with supplied examples87.6049.60No
Qwen 3.8 27B, direct54.0016.00No
SmolVLM 500M, direct17.0021.00No
Training median24.5013.50No
Always one1.0037.00No
7076.jpg · sauce bottles · reference 31
FSC147 sauce bottles photograph 7076.jpg with 31 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v260.9029.90No
FamNet with supplied examples33.762.76No
Qwen 3.8 27B, direct40.009.00No
SmolVLM 500M, direct12.0019.00No
Training median24.506.50No
Always one1.0030.00No
5828.jpg · strawberries · reference 12
FSC147 strawberries photograph 5828.jpg with 12 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v231.6019.60No
FamNet with supplied examples11.860.14Yes
Qwen 3.8 27B, direct12.000.00Yes
SmolVLM 500M, direct12.000.00Yes
Training median24.5012.50No
Always one1.0011.00No
6264.jpg · apples · reference 16
FSC147 apples photograph 6264.jpg with 16 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v24.6011.40No
FamNet with supplied examples33.0317.03No
Qwen 3.8 27B, direct0.0016.00No
SmolVLM 500M, direct6.0010.00No
Training median24.508.50No
Always one1.0015.00No
5940.jpg · eggs · reference 27
FSC147 eggs photograph 5940.jpg with 27 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v232.755.75No
FamNet with supplied examples13.0913.91No
Qwen 3.8 27B, direct30.003.00No
SmolVLM 500M, direct25.002.00No
Training median24.502.50No
Always one1.0026.00No
7586.jpg · sauce bottles · reference 36
FSC147 sauce bottles photograph 7586.jpg with 36 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v258.0222.02No
FamNet with supplied examples50.1214.12No
Qwen 3.8 27B, direct44.008.00No
SmolVLM 500M, direct15.0021.00No
Training median24.5011.50No
Always one1.0035.00No
286.jpg · strawberries · reference 10
FSC147 strawberries photograph 286.jpg with 10 published target points
Published FSC147 labels; individual target-instance units. Pinned source image · Author annotations.
MethodPredictionAbsolute errorRounded exact
Selected automatic OWL-v220.1110.11No
FamNet with supplied examples7.012.99No
Qwen 3.8 27B, direct0.0010.00No
SmolVLM 500M, direct10.000.00Yes
Training median24.5014.50No
Always one1.009.00No

Appendix D. Exact prompts and output settings

Original 25-category inventory prompt, verbatim
Inspect this photograph and estimate how many visible units belong to each food category below. Give your best visual guess. Count only what is visible in this one photograph; do not infer hidden stock or use typical food-bank quantities.

Count packages, not their contents: one egg carton, noodle cup, pasta package, cheese package, meat tray, fish package, fruit container, dip tub, bag of bagels, or tortilla package is one unit. Count distinct partly visible packages if identifiable. For loose apples, oranges, bell peppers, zucchini and cauliflower, count individual visible pieces. Do not count pictures printed on packaging.

Keep categories separate: mac_cheese means a packaged macaroni-and-cheese meal and is excluded from dry_pasta and cheese. meat includes poultry and cured meat but excludes fish. fish means packages of fish fillets, not canned fish. milk includes plant-based milk but excludes yogurt, sour cream and egg substitutes. dip excludes yogurt and sour cream. canned_food means human food cans (including canned fish), excluding drinks and pet food. The photograph can also contain foods or non-food objects outside these categories; ignore them.

Return only one JSON object with every category key listed below and a nonnegative integer count as its value. Use 0 when the category is not visibly present. Do not include explanations or Markdown.

egg_carton: a carton of eggs instant_noodles: a cup of instant noodles mac_cheese: a box of macaroni and cheese dry_pasta: a package of dry pasta peanut_butter: a jar of peanut butter milk: a container of milk cheese: a package of cheese meat: a package of meat fish: a package of fish fillets strawberries: a container of strawberries grapes: a bag or container of grapes mushrooms: a container of mushrooms dip: a tub of dip apple: an apple orange: an orange bell_pepper: a bell pepper zucchini: a zucchini cauliflower: a head of cauliflower bagels: a bag of bagels tortillas: a package of tortillas rice: a bag of rice broth: a carton of broth juice: a carton of juice cereal: a box of breakfast cereal canned_food: a can of food

Hosted proxy direct prompt: one calibration example
Count the visible bread rolls in this photograph. The counting unit is one individual visible item, including identifiable partially occluded units. Do not infer hidden stock or count pictures on packaging. Return only JSON with one nonnegative integer field named count.
Hosted proxy spatial prompt: one calibration example
Count the visible rice bags in this photograph. The counting unit is one package, including identifiable partially occluded units. Do not infer hidden stock or count pictures on packaging. Work through the spatial groups and avoid double-counting the same item. Return only JSON with one nonnegative integer field named count.

The order is the saved ranking: complete coverage first, then MAE, then rounded exact accuracy. Automatic and assisted tracks remain labelled. These are validation scores, not held-out scores. Full recipes are in the downloadable JSON.

Expand all 314 configurations
RankConfigurationTrackMAERMSEExact / 24Coverage
1famnet:rawexemplar_assisted16.9422.472/24100.0%
2famnet:exemplar_normalized:calibratedexemplar_assisted17.1021.050/24100.0%
3famnet:raw:calibratedexemplar_assisted17.2122.852/24100.0%
4famnet:exemplar_normalizedexemplar_assisted18.8122.640/24100.0%
5owl:global:threshold=0.03:nms=0.3:calibratedautomatic37.5759.661/24100.0%
6median(owl:global:threshold=0.03:nms=0.3:calibrated,qwen38:spatial)automatic37.7561.190/24100.0%
7median(owl:global:threshold=0.03:nms=0.3:calibrated,dino:global:threshold=0.03:nms=0.3,qwen38:spatial)automatic40.3561.040/24100.0%
8qwen38:spatialautomatic41.0471.061/24100.0%
9qwen38:spatial:calibratedautomatic41.0471.061/24100.0%
10owl:global:threshold=0.03:nms=0.5:calibratedautomatic41.0563.750/24100.0%
11owl:global:threshold=0.05:nms=0.3:calibratedautomatic41.5261.050/24100.0%
12owl:hybrid:threshold=0.05:nms=0.3:calibratedautomatic41.8659.700/24100.0%
13owl:hybrid:threshold=0.03:nms=0.3:calibratedautomatic41.9758.960/24100.0%
14owl:hybrid:threshold=0.03:nms=0.5:calibratedautomatic42.6661.650/24100.0%
15owl:tiled:threshold=0.05:nms=0.3:calibratedautomatic43.0361.450/24100.0%
16owl:tiled:threshold=0.03:nms=0.3:calibratedautomatic43.4059.730/24100.0%
17owl:global:threshold=0.05:nms=0.5:calibratedautomatic43.5065.380/24100.0%
18median(owl:global:threshold=0.03:nms=0.3:calibrated,dino:global:threshold=0.03:nms=0.3)automatic43.6362.421/24100.0%
19owl:hybrid:threshold=0.05:nms=0.5:calibratedautomatic43.6362.921/24100.0%
20owl:global:threshold=0.03:nms=0.7:calibratedautomatic44.5967.321/24100.0%
21owl:tiled:threshold=0.1:nms=0.3:calibratedautomatic45.2669.650/24100.0%
22owl:tiled:threshold=0.03:nms=0.5:calibratedautomatic45.3361.520/24100.0%
23owl:tiled:threshold=0.05:nms=0.5:calibratedautomatic45.4864.140/24100.0%
24owl:hybrid:threshold=0.1:nms=0.3:calibratedautomatic45.5367.200/24100.0%
25median(dino:global:threshold=0.03:nms=0.3,qwen38:spatial)automatic45.6766.210/24100.0%
26owl:hybrid:threshold=0.03:nms=0.7:calibratedautomatic46.0062.991/24100.0%
27median(owl:global:threshold=0.03:nms=0.3:calibrated,qwen38:spatial,smol:spatial:calibrated)automatic46.1673.851/24100.0%
28median(owl:global:threshold=0.03:nms=0.3:calibrated,dino:global:threshold=0.03:nms=0.3,qwen38:spatial,smol:spatial:calibrated)automatic46.2670.260/24100.0%
29median(owl:global:threshold=0.03:nms=0.3:calibrated,smol:spatial:calibrated)automatic47.0770.110/24100.0%
30owl:tiled:threshold=0.03:nms=0.7:calibratedautomatic47.1663.130/24100.0%
31owl:hybrid:threshold=0.05:nms=0.7:calibratedautomatic47.2065.801/24100.0%
32owl:tiled:threshold=0.05:nms=0.7:calibratedautomatic47.3965.770/24100.0%
33owl:tiled:threshold=0.1:nms=0.5:calibratedautomatic47.4771.970/24100.0%
34owl:global:threshold=0.05:nms=0.7:calibratedautomatic47.4969.160/24100.0%
35owl:tiled:threshold=0.1:nms=0.3automatic48.3368.211/24100.0%
36median(owl:global:threshold=0.03:nms=0.3:calibrated,dino:global:threshold=0.03:nms=0.3,smol:spatial:calibrated)automatic48.5871.710/24100.0%
37owl:hybrid:threshold=0.1:nms=0.5:calibratedautomatic48.6970.040/24100.0%
38owl:tiled:threshold=0.1:nms=0.7:calibratedautomatic48.9372.960/24100.0%
39median(qwen38:spatial,smol:spatial:calibrated)automatic49.8375.520/24100.0%
40owl:tiled:threshold=0.15:nms=0.3automatic49.8375.350/24100.0%
41median(dino:global:threshold=0.03:nms=0.3,smol:spatial:calibrated)automatic50.7374.170/24100.0%
42owl:hybrid:threshold=0.15:nms=0.3:calibratedautomatic50.9774.930/24100.0%
43owl:tiled:threshold=0.15:nms=0.3:calibratedautomatic51.5276.381/24100.0%
44owl:global:threshold=0.1:nms=0.3:calibratedautomatic51.5769.760/24100.0%
45dino:global:threshold=0.03:nms=0.3automatic52.2170.740/24100.0%
46owl:hybrid:threshold=0.1:nms=0.7:calibratedautomatic52.3672.420/24100.0%
47median(dino:global:threshold=0.03:nms=0.3,qwen38:spatial,smol:spatial:calibrated)automatic52.7879.811/24100.0%
48owl:hybrid:threshold=0.15:nms=0.3automatic53.3375.720/24100.0%
49dino:hybrid:threshold=0.03:nms=0.7:calibratedautomatic53.6774.490/24100.0%
50owl:tiled:threshold=0.15:nms=0.5automatic53.7977.981/24100.0%
51owl:global:threshold=0.05:nms=0.3automatic54.4666.470/24100.0%
52owl:global:threshold=0.1:nms=0.5:calibratedautomatic54.5372.550/24100.0%
53owl:global:threshold=0.03:nms=0.3automatic54.9665.220/24100.0%
54dino:global:threshold=0.03:nms=0.5automatic54.9667.390/24100.0%
55owl:hybrid:threshold=0.15:nms=0.7:calibratedautomatic55.1878.980/24100.0%
56owl:global:threshold=0.1:nms=0.3automatic55.2171.440/24100.0%
57owl:hybrid:threshold=0.15:nms=0.5:calibratedautomatic55.3578.901/24100.0%
58dino:global:threshold=0.03:nms=0.3:calibratedautomatic55.7979.220/24100.0%
59dino:tiled:threshold=0.03:nms=0.7:calibratedautomatic55.9176.700/24100.0%
60owl:global:threshold=0.15:nms=0.3automatic56.7179.081/24100.0%
61dino:global:threshold=0.03:nms=0.7automatic56.7167.190/24100.0%
62owl:tiled:threshold=0.15:nms=0.5:calibratedautomatic56.9879.150/24100.0%
63owl:global:threshold=0.15:nms=0.3:calibratedautomatic57.4579.361/24100.0%
64owl:global:threshold=0.1:nms=0.7:calibratedautomatic57.5974.450/24100.0%
65dino:tiled:threshold=0.05:nms=0.3:calibratedautomatic57.8480.600/24100.0%
66dino:hybrid:threshold=0.05:nms=0.3:calibratedautomatic57.8680.450/24100.0%
67dino:tiled:threshold=0.05:nms=0.3automatic57.8870.380/24100.0%
68dino:hybrid:threshold=0.05:nms=0.3automatic58.2570.150/24100.0%
69owl:tiled:threshold=0.15:nms=0.7automatic58.9282.380/24100.0%
70dino:global:threshold=0.03:nms=0.5:calibratedautomatic59.2481.070/24100.0%
71dino:global:threshold=0.05:nms=0.3:calibratedautomatic59.6085.341/24100.0%
72dino:global:threshold=0.05:nms=0.3automatic59.8882.750/24100.0%
73owl:tiled:threshold=0.15:nms=0.7:calibratedautomatic59.9380.740/24100.0%
74dino:global:threshold=0.03:nms=0.7:calibratedautomatic59.9380.670/24100.0%
75dino:global:threshold=0.05:nms=0.5automatic60.2980.580/24100.0%
76dino:global:threshold=0.05:nms=0.7automatic60.4677.120/24100.0%
77dino:tiled:threshold=0.1:nms=0.3:calibratedautomatic60.9886.851/24100.0%
78dino:global:threshold=0.05:nms=0.5:calibratedautomatic61.0586.100/24100.0%
79dino:hybrid:threshold=0.1:nms=0.3:calibratedautomatic61.0686.861/24100.0%
80dino:tiled:threshold=0.1:nms=0.3automatic61.1281.470/24100.0%
81owl:global:threshold=0.15:nms=0.5:calibratedautomatic61.2784.240/24100.0%
82dino:hybrid:threshold=0.1:nms=0.3automatic61.4281.530/24100.0%
83owl:tiled:threshold=0.2:nms=0.3:calibratedautomatic61.6183.080/24100.0%
84owl:hybrid:threshold=0.2:nms=0.3:calibratedautomatic61.7082.690/24100.0%
85owl:hybrid:threshold=0.2:nms=0.3automatic61.7182.780/24100.0%
86dino:tiled:threshold=0.03:nms=0.3:calibratedautomatic61.9080.800/24100.0%
87dino:tiled:threshold=0.15:nms=0.3automatic62.1286.670/24100.0%
88dino:hybrid:threshold=0.15:nms=0.5automatic62.1284.420/24100.0%
89dino:hybrid:threshold=0.03:nms=0.3:calibratedautomatic62.1480.820/24100.0%
90dino:hybrid:threshold=0.15:nms=0.3automatic62.2186.730/24100.0%
91dino:tiled:threshold=0.15:nms=0.5automatic62.2185.330/24100.0%
92dino:global:threshold=0.05:nms=0.7:calibratedautomatic62.4886.141/24100.0%
93dino:tiled:threshold=0.05:nms=0.5:calibratedautomatic62.5583.920/24100.0%
94dino:hybrid:threshold=0.15:nms=0.7automatic62.6282.110/24100.0%
95dino:tiled:threshold=0.15:nms=0.7automatic62.7183.770/24100.0%
96dino:tiled:threshold=0.1:nms=0.5:calibratedautomatic62.7588.090/24100.0%
97training_medianautomatic62.7583.900/24100.0%
98dino:hybrid:threshold=0.5:nms=0.3:calibratedautomatic63.1280.730/24100.0%
99dino:hybrid:threshold=0.1:nms=0.5:calibratedautomatic63.1388.080/24100.0%
100dino:hybrid:threshold=0.05:nms=0.5:calibratedautomatic63.1384.180/24100.0%
101owl:tiled:threshold=0.2:nms=0.5automatic63.2183.460/24100.0%
102owl:global:threshold=0.15:nms=0.7:calibratedautomatic63.2986.241/24100.0%
103owl:tiled:threshold=0.2:nms=0.3automatic63.4685.010/24100.0%
104dino:hybrid:threshold=0.5:nms=0.7:calibratedautomatic63.5881.180/24100.0%
105dino:tiled:threshold=0.03:nms=0.3automatic64.1276.380/24100.0%
106owl:hybrid:threshold=0.1:nms=0.3automatic64.1779.720/24100.0%
107owl:tiled:threshold=0.2:nms=0.5:calibratedautomatic64.2384.920/24100.0%
108owl:tiled:threshold=0.2:nms=0.7automatic64.3383.530/24100.0%
109dino:hybrid:threshold=0.5:nms=0.5:calibratedautomatic64.4182.200/24100.0%
110dino:tiled:threshold=0.1:nms=0.7:calibratedautomatic64.5188.500/24100.0%
111dino:hybrid:threshold=0.4:nms=0.3:calibratedautomatic64.7784.900/24100.0%
112dino:hybrid:threshold=0.03:nms=0.5:calibratedautomatic64.8583.530/24100.0%
113dino:tiled:threshold=0.03:nms=0.5:calibratedautomatic64.9383.770/24100.0%
114dino:tiled:threshold=0.05:nms=0.7:calibratedautomatic65.0385.950/24100.0%
115smol:spatial:calibratedautomatic65.2286.550/24100.0%
116owl:global:threshold=0.15:nms=0.5automatic65.2589.850/24100.0%
117dino:tiled:threshold=0.5:nms=0.5:calibratedautomatic65.3581.840/24100.0%
118dino:hybrid:threshold=0.2:nms=0.7automatic65.5088.560/24100.0%
119owl:tiled:threshold=0.2:nms=0.7:calibratedautomatic65.6785.780/24100.0%
120dino:tiled:threshold=0.5:nms=0.7:calibratedautomatic65.6881.950/24100.0%
121dino:hybrid:threshold=0.1:nms=0.7:calibratedautomatic65.8389.010/24100.0%
122dino:hybrid:threshold=0.03:nms=0.3automatic65.8878.370/24100.0%
123dino:tiled:threshold=0.15:nms=0.3:calibratedautomatic65.9290.440/24100.0%
124dino:hybrid:threshold=0.05:nms=0.7:calibratedautomatic66.1586.570/24100.0%
125dino:tiled:threshold=0.15:nms=0.5:calibratedautomatic66.2790.731/24100.0%
126dino:tiled:threshold=0.5:nms=0.3:calibratedautomatic66.3283.340/24100.0%
127dino:hybrid:threshold=0.15:nms=0.3:calibratedautomatic66.4390.842/24100.0%
128dino:hybrid:threshold=0.15:nms=0.5:calibratedautomatic66.5690.700/24100.0%
129dino:hybrid:threshold=0.2:nms=0.5automatic66.6290.320/24100.0%
130owl:hybrid:threshold=0.2:nms=0.5:calibratedautomatic66.7386.160/24100.0%
131dino:global:threshold=0.1:nms=0.7automatic66.8391.370/24100.0%
132dino:tiled:threshold=0.2:nms=0.7automatic67.0090.040/24100.0%
133smol:direct:calibratedautomatic67.2288.130/24100.0%
134dino:hybrid:threshold=0.15:nms=0.7:calibratedautomatic67.2790.531/24100.0%
135dino:tiled:threshold=0.1:nms=0.5automatic67.3382.740/24100.0%
136dino:hybrid:threshold=0.1:nms=0.5automatic67.4682.150/24100.0%
137dino:tiled:threshold=0.2:nms=0.5automatic67.4691.050/24100.0%
138dino:tiled:threshold=0.15:nms=0.7:calibratedautomatic67.7691.140/24100.0%
139owl:hybrid:threshold=0.2:nms=0.7:calibratedautomatic67.8686.960/24100.0%
140dino:global:threshold=0.1:nms=0.5automatic67.8892.590/24100.0%
141dino:global:threshold=0.1:nms=0.3automatic68.4693.560/24100.0%
142owl:global:threshold=0.2:nms=0.3automatic68.5089.930/24100.0%
143dino:global:threshold=0.1:nms=0.7:calibratedautomatic68.8392.660/24100.0%
144dino:tiled:threshold=0.4:nms=0.5:calibratedautomatic68.8588.381/24100.0%
145owl:hybrid:threshold=0.2:nms=0.5automatic68.9693.600/24100.0%
146owl:global:threshold=0.2:nms=0.3:calibratedautomatic68.9788.890/24100.0%
147dino:tiled:threshold=0.4:nms=0.3:calibratedautomatic69.1589.210/24100.0%
148dino:hybrid:threshold=0.4:nms=0.5:calibratedautomatic69.2089.100/24100.0%
149dino:global:threshold=0.1:nms=0.5:calibratedautomatic69.3793.481/24100.0%
150dino:tiled:threshold=0.2:nms=0.3automatic69.3892.600/24100.0%
151dino:hybrid:threshold=0.2:nms=0.3automatic69.3892.610/24100.0%
152dino:global:threshold=0.1:nms=0.3:calibratedautomatic69.4294.041/24100.0%
153dino:tiled:threshold=0.1:nms=0.7automatic69.6282.300/24100.0%
154dino:tiled:threshold=0.4:nms=0.7:calibratedautomatic70.1789.550/24100.0%
155dino:hybrid:threshold=0.4:nms=0.7:calibratedautomatic70.3189.890/24100.0%
156dino:hybrid:threshold=0.1:nms=0.7automatic70.7982.500/24100.0%
157dino:tiled:threshold=0.2:nms=0.5:calibratedautomatic71.3594.140/24100.0%
158dino:hybrid:threshold=0.2:nms=0.5:calibratedautomatic71.3894.071/24100.0%
159dino:hybrid:threshold=0.2:nms=0.7:calibratedautomatic71.4693.690/24100.0%
160dino:hybrid:threshold=0.2:nms=0.3:calibratedautomatic71.5794.460/24100.0%
161dino:tiled:threshold=0.2:nms=0.3:calibratedautomatic71.6194.490/24100.0%
162smol:directautomatic71.7991.460/24100.0%
163dino:tiled:threshold=0.2:nms=0.7:calibratedautomatic72.0994.360/24100.0%
164owl:global:threshold=0.2:nms=0.5:calibratedautomatic72.2190.850/24100.0%
165owl:global:threshold=0.2:nms=0.5automatic72.3891.040/24100.0%
166qwen38:directautomatic72.4698.360/24100.0%
167qwen38:direct:calibratedautomatic72.4698.360/24100.0%
168owl:hybrid:threshold=0.3:nms=0.5automatic72.7592.590/24100.0%
169owl:hybrid:threshold=0.3:nms=0.5:calibratedautomatic72.8592.790/24100.0%
170owl:global:threshold=0.2:nms=0.7:calibratedautomatic72.8891.770/24100.0%
171owl:hybrid:threshold=0.3:nms=0.3:calibratedautomatic73.3593.030/24100.0%
172dino:tiled:threshold=0.05:nms=0.5automatic73.3887.860/24100.0%
173dino:hybrid:threshold=0.3:nms=0.7:calibratedautomatic73.4093.640/24100.0%
174owl:tiled:threshold=0.05:nms=0.3automatic73.5088.531/24100.0%
175owl:global:threshold=0.2:nms=0.7automatic73.5493.240/24100.0%
176owl:tiled:threshold=0.3:nms=0.5:calibratedautomatic73.6992.870/24100.0%
177owl:tiled:threshold=0.3:nms=0.3:calibratedautomatic73.7892.600/24100.0%
178owl:hybrid:threshold=0.3:nms=0.7automatic73.7992.250/24100.0%
179dino:hybrid:threshold=0.3:nms=0.5:calibratedautomatic73.9494.070/24100.0%
180owl:tiled:threshold=0.3:nms=0.7automatic73.9693.120/24100.0%
181dino:global:threshold=0.4:nms=0.5:calibratedautomatic74.2191.120/24100.0%
182dino:global:threshold=0.4:nms=0.7:calibratedautomatic74.2191.120/24100.0%
183owl:tiled:threshold=0.3:nms=0.5automatic74.2593.360/24100.0%
184owl:hybrid:threshold=0.3:nms=0.7:calibratedautomatic74.4893.900/24100.0%
185dino:global:threshold=0.3:nms=0.7:calibratedautomatic74.4892.440/24100.0%
186dino:tiled:threshold=0.3:nms=0.5:calibratedautomatic74.5794.660/24100.0%
187dino:tiled:threshold=0.3:nms=0.7:calibratedautomatic74.5994.680/24100.0%
188dino:hybrid:threshold=0.05:nms=0.5automatic74.7989.670/24100.0%
189dino:global:threshold=0.3:nms=0.5:calibratedautomatic74.9493.010/24100.0%
190dino:global:threshold=0.4:nms=0.3:calibratedautomatic74.9691.240/24100.0%
191owl:hybrid:threshold=0.3:nms=0.3automatic75.0094.380/24100.0%
192owl:tiled:threshold=0.3:nms=0.7:calibratedautomatic75.0594.080/24100.0%
193dino:hybrid:threshold=0.3:nms=0.7automatic75.0894.920/24100.0%
194dino:hybrid:threshold=0.3:nms=0.3:calibratedautomatic75.2295.290/24100.0%
195dino:tiled:threshold=0.3:nms=0.3:calibratedautomatic75.2495.220/24100.0%
196smol:spatialautomatic75.8894.520/24100.0%
197owl:tiled:threshold=0.3:nms=0.3automatic76.2194.850/24100.0%
198owl:hybrid:threshold=0.2:nms=0.7automatic76.33108.730/24100.0%
199dino:tiled:threshold=0.3:nms=0.7automatic76.5496.160/24100.0%
200dino:global:threshold=0.3:nms=0.3:calibratedautomatic76.5494.120/24100.0%
201dino:hybrid:threshold=0.3:nms=0.5automatic76.6296.130/24100.0%
202dino:global:threshold=0.5:nms=0.3:calibratedautomatic76.6293.900/24100.0%
203dino:global:threshold=0.5:nms=0.5:calibratedautomatic76.6293.900/24100.0%
204dino:global:threshold=0.5:nms=0.7:calibratedautomatic76.6293.900/24100.0%
205owl:tiled:threshold=0.1:nms=0.5automatic76.7198.190/24100.0%
206always_one:calibratedautomatic77.0495.200/24100.0%
207dino:global:threshold=0.15:nms=0.7automatic77.5096.840/24100.0%
208dino:tiled:threshold=0.3:nms=0.5automatic77.5496.920/24100.0%
209owl:global:threshold=0.15:nms=0.7automatic77.71101.020/24100.0%
210dino:global:threshold=0.15:nms=0.5automatic78.0097.450/24100.0%
211dino:global:threshold=0.15:nms=0.7:calibratedautomatic78.0397.180/24100.0%
212owl:hybrid:threshold=0.5:nms=0.5:calibratedautomatic78.0496.500/24100.0%
213dino:global:threshold=0.15:nms=0.5:calibratedautomatic78.4197.700/24100.0%
214dino:tiled:threshold=0.3:nms=0.3automatic78.7197.880/24100.0%
215dino:global:threshold=0.15:nms=0.3automatic78.7598.180/24100.0%
216dino:hybrid:threshold=0.3:nms=0.3automatic78.8398.031/24100.0%
217dino:global:threshold=0.15:nms=0.3:calibratedautomatic78.9998.310/24100.0%
218owl:tiled:threshold=0.4:nms=0.3:calibratedautomatic79.0296.840/24100.0%
219owl:hybrid:threshold=0.5:nms=0.3:calibratedautomatic79.2496.920/24100.0%
220owl:tiled:threshold=0.4:nms=0.7:calibratedautomatic79.3797.060/24100.0%
221owl:tiled:threshold=0.4:nms=0.5:calibratedautomatic79.4397.080/24100.0%
222owl:tiled:threshold=0.5:nms=0.5:calibratedautomatic79.4596.910/24100.0%
223owl:tiled:threshold=0.5:nms=0.3:calibratedautomatic79.5496.870/24100.0%
224owl:hybrid:threshold=0.4:nms=0.5:calibratedautomatic79.7197.200/24100.0%
225owl:hybrid:threshold=0.5:nms=0.7:calibratedautomatic79.7597.730/24100.0%
226owl:hybrid:threshold=0.4:nms=0.7:calibratedautomatic79.7897.390/24100.0%
227dino:global:threshold=0.2:nms=0.7:calibratedautomatic79.9297.830/24100.0%
228dino:global:threshold=0.2:nms=0.5:calibratedautomatic80.0298.190/24100.0%
229owl:hybrid:threshold=0.4:nms=0.3:calibratedautomatic80.0897.500/24100.0%
230dino:global:threshold=0.2:nms=0.3:calibratedautomatic80.1598.250/24100.0%
231owl:global:threshold=0.3:nms=0.3:calibratedautomatic80.4998.950/24100.0%
232dino:hybrid:threshold=0.4:nms=0.7automatic80.8398.230/24100.0%
233owl:tiled:threshold=0.5:nms=0.7:calibratedautomatic81.0898.210/24100.0%
234owl:hybrid:threshold=0.4:nms=0.7automatic81.1298.380/24100.0%
235owl:global:threshold=0.3:nms=0.5:calibratedautomatic81.2399.620/24100.0%
236dino:hybrid:threshold=0.4:nms=0.5automatic81.3398.660/24100.0%
237owl:hybrid:threshold=0.4:nms=0.5automatic81.5498.580/24100.0%
238owl:global:threshold=0.3:nms=0.7:calibratedautomatic81.6299.640/24100.0%
239owl:global:threshold=0.3:nms=0.7automatic81.79100.280/24100.0%
240owl:tiled:threshold=0.4:nms=0.7automatic81.8398.860/24100.0%
241owl:tiled:threshold=0.4:nms=0.5automatic81.8898.880/24100.0%
242dino:tiled:threshold=0.4:nms=0.7automatic82.0499.150/24100.0%
243dino:tiled:threshold=0.4:nms=0.5automatic82.1799.220/24100.0%
244owl:global:threshold=0.3:nms=0.5automatic82.25100.430/24100.0%
245dino:global:threshold=0.2:nms=0.7automatic82.3899.720/24100.0%
246owl:hybrid:threshold=0.4:nms=0.3automatic82.5099.350/24100.0%
247dino:tiled:threshold=0.4:nms=0.3automatic82.5499.700/24100.0%
248owl:tiled:threshold=0.4:nms=0.3automatic82.5899.460/24100.0%
249dino:global:threshold=0.2:nms=0.5automatic82.62100.090/24100.0%
250dino:hybrid:threshold=0.4:nms=0.3automatic82.8399.960/24100.0%
251owl:global:threshold=0.3:nms=0.3automatic82.96100.690/24100.0%
252dino:hybrid:threshold=0.5:nms=0.7automatic83.1299.800/24100.0%
253dino:global:threshold=0.2:nms=0.3automatic83.17100.470/24100.0%
254dino:hybrid:threshold=0.5:nms=0.5automatic83.33100.010/24100.0%
255owl:global:threshold=0.4:nms=0.3:calibratedautomatic83.62100.620/24100.0%
256dino:tiled:threshold=0.5:nms=0.7automatic83.83100.380/24100.0%
257dino:tiled:threshold=0.5:nms=0.5automatic83.88100.400/24100.0%
258dino:tiled:threshold=0.5:nms=0.3automatic84.08100.640/24100.0%
259owl:global:threshold=0.4:nms=0.7:calibratedautomatic84.20101.090/24100.0%
260owl:global:threshold=0.5:nms=0.3:calibratedautomatic84.23101.870/24100.0%
261owl:global:threshold=0.5:nms=0.5:calibratedautomatic84.23101.870/24100.0%
262owl:global:threshold=0.5:nms=0.7:calibratedautomatic84.23101.870/24100.0%
263dino:hybrid:threshold=0.5:nms=0.3automatic84.25100.890/24100.0%
264owl:global:threshold=0.4:nms=0.5:calibratedautomatic84.31101.150/24100.0%
265dino:global:threshold=0.3:nms=0.7automatic84.58101.260/24100.0%
266dino:global:threshold=0.3:nms=0.5automatic84.67101.370/24100.0%
267dino:global:threshold=0.3:nms=0.3automatic84.96101.590/24100.0%
268dino:global:threshold=0.4:nms=0.5automatic85.12101.850/24100.0%
269dino:global:threshold=0.4:nms=0.7automatic85.12101.850/24100.0%
270dino:global:threshold=0.4:nms=0.3automatic85.25101.890/24100.0%
271owl:hybrid:threshold=0.5:nms=0.7automatic85.58102.200/24100.0%
272owl:hybrid:threshold=0.5:nms=0.5automatic85.71102.300/24100.0%
273dino:global:threshold=0.5:nms=0.3automatic85.75102.330/24100.0%
274dino:global:threshold=0.5:nms=0.5automatic85.75102.330/24100.0%
275dino:global:threshold=0.5:nms=0.7automatic85.75102.330/24100.0%
276owl:tiled:threshold=0.5:nms=0.5automatic85.92102.410/24100.0%
277owl:tiled:threshold=0.5:nms=0.7automatic85.92102.410/24100.0%
278owl:global:threshold=0.4:nms=0.7automatic85.96102.510/24100.0%
279owl:hybrid:threshold=0.5:nms=0.3automatic85.96102.440/24100.0%
280owl:global:threshold=0.4:nms=0.3automatic86.00102.540/24100.0%
281owl:global:threshold=0.4:nms=0.5automatic86.00102.540/24100.0%
282owl:tiled:threshold=0.5:nms=0.3automatic86.00102.470/24100.0%
283always_oneautomatic86.04102.620/24100.0%
284owl:global:threshold=0.5:nms=0.3automatic86.67103.220/24100.0%
285owl:global:threshold=0.5:nms=0.5automatic86.67103.220/24100.0%
286owl:global:threshold=0.5:nms=0.7automatic86.67103.220/24100.0%
287owl:hybrid:threshold=0.15:nms=0.5automatic88.08116.460/24100.0%
288owl:global:threshold=0.1:nms=0.5automatic90.92105.030/24100.0%
289owl:hybrid:threshold=0.05:nms=0.3automatic95.83108.830/24100.0%
290dino:tiled:threshold=0.05:nms=0.7automatic96.21118.940/24100.0%
291owl:tiled:threshold=0.03:nms=0.3automatic96.54113.360/24100.0%
292owl:tiled:threshold=0.1:nms=0.7automatic99.88133.831/24100.0%
293dino:hybrid:threshold=0.05:nms=0.7automatic104.62128.610/24100.0%
294owl:global:threshold=0.05:nms=0.5automatic109.96123.000/24100.0%
295owl:hybrid:threshold=0.15:nms=0.7automatic118.58160.780/24100.0%
296owl:global:threshold=0.03:nms=0.5automatic119.62130.320/24100.0%
297owl:hybrid:threshold=0.03:nms=0.3automatic120.04137.190/24100.0%
298owl:global:threshold=0.1:nms=0.7automatic122.88142.280/24100.0%
299dino:tiled:threshold=0.03:nms=0.5automatic128.92152.350/24100.0%
300dino:hybrid:threshold=0.03:nms=0.5automatic138.83161.870/24100.0%
301owl:hybrid:threshold=0.1:nms=0.5automatic140.42175.410/24100.0%
302owl:tiled:threshold=0.05:nms=0.5automatic163.67194.730/24100.0%
303owl:global:threshold=0.05:nms=0.7automatic169.17191.060/24100.0%
304owl:global:threshold=0.03:nms=0.7automatic188.12207.860/24100.0%
305owl:tiled:threshold=0.03:nms=0.5automatic224.29262.590/24100.0%
306dino:tiled:threshold=0.03:nms=0.7automatic227.67260.400/24100.0%
307owl:hybrid:threshold=0.1:nms=0.7automatic228.71291.810/24100.0%
308owl:hybrid:threshold=0.05:nms=0.5automatic246.04285.860/24100.0%
309dino:hybrid:threshold=0.03:nms=0.7automatic251.96287.410/24100.0%
310owl:tiled:threshold=0.05:nms=0.7automatic258.50314.650/24100.0%
311owl:hybrid:threshold=0.03:nms=0.5automatic317.54357.040/24100.0%
312owl:tiled:threshold=0.03:nms=0.7automatic371.83437.070/24100.0%
313owl:hybrid:threshold=0.05:nms=0.7automatic448.00525.700/24100.0%
314owl:hybrid:threshold=0.03:nms=0.7automatic583.33662.690/24100.0%

Appendix F. Exact study split membership

calibrate · 24 images
ImageCategoryPublished countExamplesImage SHA-256
4523.jpgbananas115303844e7594c13c2712bbe6e5b812f17be7ad09de52b669529d91b5a4af0c8fce
5723.jpgbread rolls933ce6771982a2937f300757510f0a449f91737f1d97c554cdc26850345f870b51
2784.jpgcans2334e89dabaebdab501bf0430027243ee0e1b823222e1433670f17924bd5e691751
3445.jpginstant noodles12330dbf074e11a743ec28534bbedb74b6ea4318f259d6a078bf3567911280b2c72
2749.jpgoranges108324b1f63ff5ca14f889547448f4fdc2a9e5f6db78250e81ab5f26de8169350124
4430.jpgpeppers1034628513b3734d3d219f224329b306daf7125bc91f235cf1b7781b1fb3bed572c
3905.jpgpotatoes723ed99968892de6aa7731216375b87de92b9ce90c3f5d745ebfe7f926b6df5f02a
4100.jpgrice bags50317621575670a934cc9bf59ed51131fbb0f08c35d0a6982e42a949c88d7837d28
4447.jpgtomatoes11355389da51a39affb6a9c8c32af2ec8dac39685459add7af805b13e7c22f9bb1f
4526.jpgbananas5339bc399d9719330ef1a27ad9d974c3d5e5e76eec661a8ab04fd5256ff430ddd79
5728.jpgbread rolls103bd497c8173c101f362e3ab496a6682c943f426dd361e5f40471db7d522bef634
7559.jpgcans34356f9e488ee900f50fc37a317cf44d8823f2f3a1e4c86dd0efbc6242d04f39cda
3446.jpginstant noodles1432f8306a1d4a373da5a1e51a895f595ed58fbb22bcb3c915cc3a127819594cf7a
2764.jpgoranges4936fc88c3c99597e25d5a85c0aea0d07c5b55abd5a8c1cf30ff299b62d7caa0aca
4428.jpgpeppers223f6ffdb03263357c8d4bed7468335ab9add44567890a9f0daa91af39c741b99b8
5698.jpgpotatoes21360840e44c089bdc78552f9cee6bf3e47a16480a227d4cc7842a5486349d50b24
4099.jpgrice bags263325425f8f5c793a8fd92749e820d7cd55fcfc8640fe2a1246fd13ed76b2926dd
6170.jpgtomatoes42366d2b84462531b352d016071cf2d89974aca99fafd67e5d8274ac4b6ebc1a457
4525.jpgbananas153017095e36b347fe0ddda4bc97fc623ea2ae377276aeb8de86545498b269a7343
3353.jpgbread rolls153e8eeb2ffa15e897c91755e97294807c66eb51747e92a6c7395f138e4f3de9b8f
7320.jpgcans3430c4d307422f745b3d59dd245dc5b10043191251041b7d8b59169eea2ec401a17
3444.jpginstant noodles2837b980b7bd165ac30aeb67817c1c989d401120356186d9d086e31e0bfcdfcd8af
6966.jpgoranges35392e28d7e00516405a3d4f9bb6d3429e2d3b4b4c34abe36cf75d403b1cd9c7003
7.jpgpeppers13336813c98a94c202fcde75d73896e1a3f47c9d6e0390d6cc3acd3152264e1542d
validate · 24 images
ImageCategoryPublished countExamplesImage SHA-256
4831.jpggrapes1223ecc02e3d7175519599c01459fe0fbc80dbb3a33f4564b2f596377f0db34d7485
6897.jpgmilk cartons593bb87288fec64ee4e730f409c14f3439ca88424363158056bd71777d82e57e2c0
5872.jpggrapes1163b53dab471b50fc3742d7485ee58a6de93f8990d310a373308d2c0742f4d1faa5
6872.jpgmilk cartons493100cc21e3d46f008c6760902804bb9f7b8ab6f94e5dad0cdb175f0e2ffc3c434
4811.jpggrapes21337b624a2cf5368ac05a6c5211e6ecef3af8faa730824f2f32276de20630fb14d8
7315.jpgmilk cartons71400ebbffa91d38a73884af9e42b6d2e3bc71b5081d798295ff66881e8c00fc49a
4794.jpggrapes5531a825146d77b889dfa283e08af3874f05f594bf5c927c458b84d296fe2a76aba
7143.jpgmilk cartons1213914c6dfb9442a36fec05bf7882ef3791decf470e1a7878853916d4cbb38be46b
4854.jpggrapes363682582476dc233036d8c0fa52352e15dd15406e740b70c5737a3aae3d836fee9
7326.jpgmilk cartons185565ab8da0aa0c7992daf5f3ff6ab4fd6d8c170bd520cd2b3a80e823608878ae65
217.jpggrapes603b0763a1eacad8bfabf5b383395545e1026628fc3cde3706e8fa2faf4751cac89
7541.jpgmilk cartons693909ebb35ce65695c4acdb2c36f3d0c229d56a8f8629e460399f8f5dc103d582b
219.jpggrapes4738b183cc3b4079d263f0506400e946e68733c15ec40bfa9ba6d7de5cc46a72824
7461.jpgmilk cartons223da699d26cc76da4c08cb98a75fe5a2c7106d7f01d71c16f4ca5f320d1d06ac54
253.jpggrapes19237e22fb30cb112c2cdf69877ae9a70e84468941b6eff2cdb6295e7db6b41c9711
7100.jpgmilk cartons27306e1025213e0bec410727ab40db187b1bd00323ec9b75a2509b07976e63fadba
5864.jpggrapes81340f2486d6bf823fef4b7ecf55e2c0d717d36d855bfe92dcb1af253fee499b786
7537.jpgmilk cartons3939fdba65d02ff3cc1d61cfa2b358af74c08be2b4c58e30763b8c718b22ce6ba95
4850.jpggrapes10137355f9471202fe9bda61e7125852a10cf4759e55b16c802ec68442043ddff0c0
7169.jpgmilk cartons343a5f0bd41f1e6da2bbeaf9675224ba804dbcb5487c203ad79e618f3fa682052c4
4801.jpggrapes603e8a1e81eec5a388d3f0f8a8df931fd052d9b10a68f8e82b6ad0bfb69d5a9cdc9
6772.jpgmilk cartons68390ae6890f2bc4cf56e4c1a2a8daa2e9d267ad174638dfad7866cdc670d4a9cf2
4796.jpggrapes1963c85a9c937ede54c007b1a96d659f841785f2d67c1dc8b17579c4f1909330dde6
7012.jpgmilk cartons66302f426223048c3e59bab3e92cff5df968612eae34de5f0cdf23625edbba3a54b
holdout · 24 images
ImageCategoryPublished countExamplesImage SHA-256
2181.jpgapples1236fab040ef72919903bec4067c59489789e464ac4d75f4e9d1b19ca39fefe81d4
7580.jpgeggs153c871089ec0c8e42f311d04a9ceb402830ec25b4788f575a767a390110a275c0a
7567.jpgsauce bottles683a674606e409a5af4b9255c17a9717db63bc5c80b611248beb27eef3cdd251476
5837.jpgstrawberries18395b085ffb6b40615b312c08c86e16c300b01fc92cf0f60dbdbc53013bb0eaf9d
6282.jpgapples663e93faf377406fbf16a1bc2f34efe7671f42362dd6d1a992a86a834a94894e95d
7145.jpgeggs243cb0c2855443376df2ae249029ad77bda50169ea009dc2a53f119769607ca1fca
6823.jpgsauce bottles2335e0f35c3aab5b620e0f653d11a8434fc6166baf93128c5e27deefb53be47cf22
4916.jpgstrawberries913cae1642ce46629c7f96b8b10b79abf003f26540b835ded3e7b76f054de5b6951
2184.jpgapples3330d494cb1cde6713f4ce8f58315c811ad8da0d4c469dbe97363f05589794f2795
5915.jpgeggs12331822032b7e6038c50ff6a0acfd081ae051dcb08463457dc66f24fd0ef072b0b
7071.jpgsauce bottles4438729254f15441299a7cf46232ff88fea8b8aa37d72babdb678ae0042ccaa8b9f
4900.jpgstrawberries1439ceb7e20fd833cb12dfbf952a977af0807810af5cb3092ae9f5e8238caff27e8
2259.jpgapples1743f3f99f84d0073b44797925abf4ba127d65c54b282fae8229b74fe62f09db7da4
7128.jpgeggs493e8c8a39f6f9ec8738a97401977d85d4f11e96f05a80fec36cdd0a0a089faf7b7
7438.jpgsauce bottles483dccca38e45c2c99bdc7ddffa4f268a3823f6b48367eac8c883763cbd4400788c
4903.jpgstrawberries183695b7ccade071b4ac818f2e925ce0137a502c3a09de02fdb64ed3af1ffcbc378
2178.jpgapples103c2a992dd1c1d2f1e866555b12ded8d225d61e74611e74f2d11d2911e7a27c8dd
5916.jpgeggs383b2cc40ca39ea84d636141e85508e8f816050bedc2210d92059f1c7ddfc35e4c7
7076.jpgsauce bottles313253bb1b29fade924f8bba51520bd8f35dfd7997f4ebe8e7c3a723817d482378f
5828.jpgstrawberries12378bc31e72ea61bf7c5a5b4d433b326c923dd7ff617ac3b7eb1aba6c51ca430f9
6264.jpgapples16343b0402b2cb0e62733b2337060f09474a15e34e7e815ca6c37000b87bda0487b
5940.jpgeggs27383e58a091ff7f43a313f3c7bae85279b6c94c13edab8cb5e0c9ae9397a973edb
7586.jpgsauce bottles36332a6d684c0b9601c9a8794bd4d6ba64c17ccac68351fe9a875af36554ac99055
286.jpgstrawberries1039bd2cd7e01804ff1684310a538ebc0ccad23c0c6512ae6a7f3c458db3b43885a

Appendix G. Executed, diagnostic, and proposed work

ItemStatus
Original detector comparisonExecuted; exploratory adapter correction documented
Original Qwen 2B and Qwen 27BExecuted and scored
Original SmolVLMExecuted; structured output failure
493-image acquisitionExecuted; 25,895 external reference points
72-image proxy studyExecuted calibration, validation, and held-out stages
314 configuration searchExecuted on validation
Native-resolution detector trialsDiagnostics only
Qwen 2B proxy runEight-image calibration pilot; stopped
CountGD++, Count Anything, AdaCountReviewed, not executed
MixCountReading follow-up, not used
Fine-tuning on food-bank operationsNot executed
Inventory ledger and recipient availability systemProposed, not deployed
Staff correction-time or recipient outcome studyNot executed

27. Sources and attribution

The research descriptions above link to primary papers or author repositories. The measurements come from the linked code-and-results distribution and its frozen manifests, not from paper leaderboards. Bibliographic status is recorded as checked on September 6, 2026.

The new benchmark code and assistant-created annotations have the reuse terms recorded in the reproduction kit. Upstream code, pretrained weights, source text, and photographs retain their own terms. The FSC147 mirror's declared license should not be interpreted as independent clearance of every underlying Internet photograph.