← all posts
// vision · vision-models

Vision models for camera-event understanding: an evaluation set for visual reasoning

A home security app once tagged a coiled garden hose as a person crouched by the fence and pushed the alert to a phone in the dark. Someone checked the feed, saw nothing, and trusted the system less afterward. That's the failure this piece is about: a person acting on a shape in bad light that a model narrated with total certainty.

Vision-language models have their own version of this: the input feels concrete because anyone can look at the picture, but the model never does. It gets a resized, cropped, tiled representation with a fixed token budget, and a fluent answer can be grounded in that, half-grounded, or built around a detail thrown away before inference started.

Start with the dumb detector

Camera-event systems live on doorway, workshop, warehouse, garden, and safety-camera footage, and the job is narrower than "understand this image": classify a bounded event from selected frames, keep the alert rate sane, and don't leak anything private. Feed it motion-gated frames, a timestamp, camera zone metadata, and a short fixed event vocabulary. Not the whole scene. That's what makes model choice, preprocessing, and failure measurable.

Before a vision-language model touches any of it, run the boring stuff: motion detection plus a specialized object detector. It handles most of the load cheaply. A VLM earns its spot once the baseline hits layout, ambiguity, relationships, or language a fixed rule can't encode economically.

What the log has to prove

A real test harness does more than swap in a new checkpoint and compare vibes. Label the regions of each frame that carry the answer, build controlled perturbations (blur, glare, occlusion, a worse crop), and score results blind, without knowing which condition produced which frame. Keep the original asset and log every transformation, so you can reproduce the exact input later.

Each run should leave a trail wider than a model name and a pass or fail:

  • model ID, API or runtime, exact prompt revision
  • original dimensions, crop, resize, orientation
  • image count, frame order, timestamps
  • OCR text or metadata riding beside the pixels
  • token accounting split into visual, input, output
  • first-response time, total latency, peak memory
  • the verdict: grounded pass, unsupported claim, abstain, or repair

The acceptance gate is event precision and recall, duplicate-alert rate, latency, privacy retention, and safe abstention. Score unsupported claims separately from plain omissions: a gap gets flagged for review, while an invented serial number, control, or identity can quietly cause the wrong action. Include genuinely unanswerable frames, and reward the model for saying the evidence isn't there.

Log the image-detail or resolution value the API actually used, not the default you assumed. A local model adds its own list: vision projector, quantization, context setting, and the preprocessing between raw frame and tensor. Weights from one release paired with a projector from another can fail quietly: the server keeps returning fluent language past the point it's true.

Four things people mix up in one sentence

The failure that matters most is a model turning one uncertain visual clue into a confident identity, hazard, or security conclusion, which is easy to miss because it matches what a person expected to see. The companion trap is testing on public benchmark images that look nothing like your production composition or lighting, then trusting a number that looked respectable. I wouldn't spend evaluation budget there: a model that scores well on stock photography tells you almost nothing about a fisheye lens above a loading dock.

Require a specific region, frame, or visible feature behind every conclusion that matters, and show that provenance to the reviewer, not just a log nobody opens. Keep four layers separate: observation, association, inference, action. "There's a red light in the upper right" is observation. "It belongs to the network panel" is association. "The connection has failed" is inference. "Restart the gateway" is action. None should let the model jump from a plausible observation straight to an action you can't take back.

Multiple images bring their own trap: identity confusion. Label each input and state whether the frames show the same object, camera, or a time sequence. Drop duplicate frames; they burn tokens and add no evidence. If order matters, attach real timestamps and test a shuffled version. A model that tells the same causal story after the frames are scrambled isn't reading the sequence, it's pattern-matching on the pile.

The costs that show up after the demo works

Write the actual rule, promote a vision model only after it clears real capture conditions and calibrated abstain cases, into routing and validation code, not prompt text that editing can quietly erase. Store model and pipeline version with every result so an upgrade replays against the same frames.

Privacy applies on both sides of inference. Crop out rooms, faces, screens, addresses, and reflections that don't belong to the event, and set retention separately for originals, thumbnails, OCR text, embeddings, prompts, and debug captures. Run it locally, through something like a local Ollama vision setup, and image data leaving the building drops, but that's no help against an unencrypted disk or an overbroad dashboard account.

Test a hosted path's upload time, regional routing, retention settings, rate limits, and provider errors as part of the evaluation, not as a surprise once it's live; script that comparison against a local model using Gemini CLI's multimodal mode. For local models, test cold load time, projector memory, CPU or GPU placement, preprocessing time, heat, and concurrency. Compare the whole path at p50 and p95, not the tokens-per-second figure vendors publish.

Stop optimizing once the gate passes at acceptable latency, cost, and abstention. A bigger model and more pixels are not automatically safer: they expose more private detail per frame and make the system more willing to answer past the evidence. Before shipping the next version, pull ten frames the current model got right for the wrong reason and ten it correctly refused, then check the candidate still refuses that second set.

#vision-models#multimodal#evaluation